2012-02-03 2 views
1

C (Ubuntu 플랫폼 및 gcc 컴파일러)에서 fopen()을 사용하여 파일을 열고 파일에 쓸 때 파일이있는 하드 디스크 주소에 내용이 직접 쓰여지거나 처음 사용됩니까? 1 차 기억으로 가져 왔니? Linux에서 C 프로그램을 통해 파일을 하드 디스크의 해당 위치에서 쓰거나 읽을 수있는 실제 프로세스는 무엇입니까?C 프로그램을 통한 파일 쓰기

답변

1

UNIX와 유사한 시스템에서는 일반적으로 디스크의 파일에 정보를 쓸 때 두 가지 수준의 캐싱이 있습니다.

첫 번째 파일은 버퍼링 될 가능성이있는 C 런타임 라이브러리에 있습니다 (어떤 방식 으로든 버퍼링을 해제하지 않는 한). fflush과 같은 C 호출을 사용하여 이러한 버퍼를 플러시 할 수 있습니다.

두 번째는 실제 디스크에 기록되기 전에 버퍼가 보관되는 운영 체제 수준입니다. fsync을 호출하면 이러한 버퍼를 강제로 디스크로 플러시 할 수 있습니다.

2

C 라이브러리는 실제로 디스크에 기록하지 않습니다. 그것은 운영 체제의 일입니다. C 라이브러리는 커널에 시스템 호출을 만들어 디스크에 기록합니다. 시스템 호출 횟수를 최소화하기 위해 버퍼를 구현할 수도 있습니다. 또한 커널은 디스크에 실제 쓰기를 최적화하기 위해 버퍼를 구현합니다. 일반적으로 C로 작업 할 때이 레벨은별로 낮지 않습니다. 그러나 파일을 올바르게 닫아야합니다. 실제 디스크 관리는 OS의 작업입니다.

The Design of the UNIX Operating System Maurice J. Bach의 Unix 커널에 대한 좋은 설명이 포함되어 있습니다. 당신은 시작으로 보일 수 있습니다.

+0

그래서 파일에 쓰는 책임이있는 write()를 호출하면 쓰기 작업이 수행되며 하드 디스크에 직접 쓰거나 실제 프로세스는 무엇입니까? 커널 시스템 호출 코드가 쓸 수 있는지 여부는 의심 스럽습니다. 하드 디스크 주소로 직접 또는 아닌지? –

+0

대답은 디스크마다 다르지만 커널마다 다릅니다. 나는이 분야에 많은 전문가가 아닙니다. 기본 아이디어는 커널이 메모리 버퍼를 사용할 것이라는 것입니다. 즉, write()는 디스크에 즉시 쓰지 않습니다. 이 버퍼는 커널이 쓰기에 최적이라고 판단 할 때 디스크로 플러시됩니다. 모든 디스크는 고유 한 버퍼를 가질 수있는 디스크 컨트롤러와 연결되어 있습니다. 커널, 디스크 컨트롤러는 실제 쓰기 횟수를 줄이고 디스크 헤드의 움직임을 최소화하는 등의 작업을 최적화하려고 시도합니다. – taskinoor

+0

Google 검색 결과 : http://www.ibm.com/developerworks/linux/library/l -linux-filesystem /. 고수준 아키텍처 섹션을 면밀히 확인하십시오. 이렇게하면 검색하는 몇 가지 사항이 명확 해집니다. – taskinoor