Turbo-C
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
터보-C 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
Lua 게시판
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C/C++ Q/A
[5665] Re:fopen, _open 없이 파일 읽기
Hwan [] 2809 읽음    2006-03-29 14:44
서수원 님이 쓰신 글 :
: 안녕하세요. 이제 봄이 오려는지 날씨가 하루하루 다르군요.
:
: fopen이나 _open 혹은 open같은 함수 없이 바로 파일을 읽을 수 있는 방법은 없을까요?
: biosdisk나 absread같은 함수는 물리적인 주소로 디스크의 내용을 읽는다지만 파일이
: 어디에 있는지 알수가 없으니...
:
: 적을 용량의 많은 수의 파일을 빠르게 읽기 위해서 open함수를 되도록이면 안쓸려고 하는데...
: 여러분의 힘이 필요해요. 도와주세요.

소스까지 공개된 라이브러리의 open 함수를 한번 살펴 보시는게 좋을 듯 하네요.


파일의 열기는 다음의 과정으로 수행됩니다.

1) system의 파일시스템이 무엇인지를 파악

2) 파일시스템의 media descriptor 정보를 불러들임 (대부분의 경우 파일시스템의 가장 처음 부분에 파일이름과 생성날짜, 크기에 대한 정보가 들어 있으며 이는 디스크 편집기 등으로 쉽게 확인 가능합니다. BIOS Interrupt 0x13h / AH=02h 에 디스크 절대 읽기 서비스가 제공되네요.)

3) 해당 파일 이름이 매핑된 디스크의 절대주소를 가져옴

(4) 해당 오프셋으로부터 파일이름의 사이즈만큼을 fread 함수 등으로 읽어들임.

여기서 (4) 의 과정은 이용자가 사용하는 함수에 따라 다르게 구현되는데

디스크에서 레코드 단위로 읽던, 줄단위로 읽던, 글자 단위로 읽던 결국 물리적인 디스크 상에서는

바이트 단위로 읽어들이면서 wrapper 함수에 맞게 적절히 처리해 주는 것입니다.

이를 직접 구현하려면 일단 위에서 말한 1~3 의 단계를 수행해야 할 텐데요


특히 1~2의 단계를 직접 구현해 주어야 하는데 이는

파일시스템을 파악 -> File system 에 관련된 운영체제별 interrupt service 의 매뉴얼을 참조

media descriptor parsing -> 각 File system 별 구조에 대한 지식 필요

의 scheme 가 필요할 것으로 생각됩니다.


사실 이름이라는 것은 어디까지나 사람이 이해하기 쉽게 하기 위한 장치일 뿐 컴퓨터에게는 모든 것이 주소로 통용됩니다. 그런데 우리가 보통 파일을 입출력 할 때, 해당 파일의 '이름' 을 가지고 조작을 하지 않습니까? (FILE 구조체는 해당 파일의 '이름' 에 대한 포인터를 갖는다는 사실에 유의하세요)

이것을 주소로 바로 조작하는 것도 물론 가능하지만, 만약 어떤 파일의 입출력을 절대주소 값으로 행할 경우

A 시스템에서는 xxxx 번지에 해당 파일이 저장됨 / B 시스템에서는 xxxx+10 번지에 해당 파일이 저장되어 있음

위의 두 가지 경우를 생각해 볼 때, 소스 레벨에서 번지값을 모두 다르게 써 줘야 하는 사태가 발생하게 됩니다.

해당 파일이 위치한 절대주소를 이름을 통한 상대주소로 바꿔 주는 과정은 운영체제의 파일 시스템이 담당하는 것이고요.



결국 질문하시는 내용은 좀더 compact 한 성능의 open 함수는 없는 것인가? 라는 것으로 귀결되는데요,

이는 소스가 공개되지 않은 라이브러리를 사용하실 경우 성능개선을 원하신다면 이것을 일일이 disassemble 하셔서 필요없는 부분을 빼고 직접 optimization 해 주시는 방법 밖에는 없다고 생각됩니다.


저도 아직 실력이 그리 뛰어난 편이 아니라서 제가 생각할 때 open 함수 없이 디스크 입출력을 하시려면

위의 과정을 일일이 구현하시는 수 밖에 없다고 생각 되는데

하드디스크의 물리적인 구조를 생각해 볼 때 보통 media descriptor 는 디스크의 앞부분에 위치한 경우가 대부분이므로 파일을 하나씩 읽어들인다면

1) media descriptor 를 해독하기 위하여 디스크의 헤드를 가장 처음 부분으로 이동

2) 매핑된 파일의 주소를 오프셋으로 하여 해당 길이만큼 파일을 읽어들임

의 과정이 반복되리라 생각하는데 이 과정에서 헤드의 이동시간을 줄일수록 읽어들이는 속도는 빨라지겠지요.



이 과정의 반복에서 헤드의 이동을 줄이려면 media descriptor 를 일괄적으로 읽어 들이고

해당 파일들이 위치한 주소 (트랙과 섹터의 위치) 를 순차적으로 정렬한 후, (메모리에 이용자 나름대로의 자료구조를 이용하여 저장)

최소한의 디스크 회전으로 최대한 많은 내용을 읽어들이게 하는 수 밖에 없다고 생각됩니다.



도움이 되셨는지 모르겟네요.

+ -

관련 글 리스트
5658 fopen, _open 없이 파일 읽기 서수원 1818 2006/03/28
5665     Re:fopen, _open 없이 파일 읽기 Hwan 2809 2006/03/29
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.