2011-11-11 2 views
1

커널이 intterupted되지 않는다면, 특정 크기 (PIPE_BUF, 4096Bytes가되도록 saied)가 원자 적으로 기록된다는 것을 알고 있습니다. 이는 블록을 읽으려는 다른 프로세스를 의미합니다.Linux Syscall write : 커널이 데이터 쓰기 순서를 보장합니까?

그러나 나는 커널이 작업을 수행하는 동안 더 많은 데이터 블록 (예 : "abc ... [x bytes] ... xyz")을 저장 장치에 쓰면, 커널은 abc를 먼저 쓰고 xyz는 마지막으로 쓸 것인가?

그렇지 않으면 쓰기 작업이 완료되기 전에 "* ... [x bytes] ... xyz"을 읽는 다른 프로세스가 발생할 수 있습니다. 그것은 많은 응용 프로그램에 대한 재앙입니다.

누군가가 구현을 알고 있습니까? 아니면 커널 소스에서 대답을 찾을 수 있습니까?

답장을 기다리십시오! 감사!

[업데이트 2011년 11월 12일]

나는 소스 코드에 보였다,하지만 난 그것을 충분히 이해할 수 없다. I가 호출 체인 발견 "기록 -> vfs_write -> do_sync_write [루프] -> generic_file_aio_write [inode_mutex] -> __generic_file_aio_write -> ... -> generic_perform_write -> ... - (N, 내지)> __copy_from_user

__copy_from_user는 아키텍처 의존적 인 asm 코드로 구현 된 매크로/함수이며, 지금은 이해할 수 없습니다.하지만 대부분의 사람들이 생각해야 할 코더가 그것을 수행 할 것이라고 생각합니다 ...

희망 더 furthur 해명 ~에 대한

+2

"내 데이터를 먹어 라"를 시작으로 살펴보십시오. http://flamingspork.com/talks/ –

+0

감사합니다. 프레젠테이션을 읽었습니다. 그것은 실용적이고 많은 문제를 묘사하지만, 충분히 깊지는 않습니다. – felix021

답변

2

올바른 순서는 항상.

순종 그러나하는 비 원자 쓰기에 여러 작성자가있는 싱크대에 수신 된 데이터에 "abc...[n bytes]...[data from other writer]...[m bytes]...xyz" (예 : n+m=x)이 포함될 수 있습니다.

따라서 데이터가 완전히 다른 데이터 블록에 삽입됩니다.

원자 적 쓰기에서 이러한 일은 발생하지 않습니다.

편집 : 이것은 파이프와 FIFO에 관한 것입니다. 파일은 어떨까요, 모르겠습니다.

+0

so ... 커널은 어떤 조건에서 쓰기를 원자 단위로 취급합니까? – felix021

+0

당신의 질문에서 말했듯이 - 쓰기 크기가'PIPE_BUF'보다 낮 으면 : [{PIPE_BUF} 바이트 이하의 쓰기 요청은 같은 파이프에서 쓰기를하고있는 다른 프로세스의 데이터로 인터리빙해서는 안됩니다. {PIPE_BUF} 바이트보다 큰 쓰기는 파일 상태 플래그의 O_NONBLOCK 플래그가 설정되었는지 여부에 관계없이 임의의 경계에서 다른 프로세스가 기록한 데이터를 인터리브 할 수 있습니다.] (http://pubs.opengroup.org/onlinepubs /007904975/functions/write.html) – glglgl

+0

감사합니다. 필자는 PIPE_BUF를 파이프/FIFO에만 관련시키는 맨 페이지를 읽었다 ("다음의 예외가있다"). 일반 파일과 비슷한 상수가 있는지 궁금합니다 ... – felix021

3

데이터는 실제로 작성한 순서대로 디스크에 플러시되지 않을 수 있습니다. 따라서 작성 중에 컴퓨터가 다운되면 일 수 있습니다. 시스템이 다시 부팅 된 후 "abc"없이 "xyz"가 표시됩니다. 그러나 기계가 계속 실행 중이라고 가정하면 커널은 모든 쓰기가 올바른 순서로 수행되도록합니다.

+0

그래, 나는 커널의 캐싱 구현에 대해 충분히 이해하고있다. 하지만 쓰기 순서를 확인하는 증거가 필요합니다 ... 소스 코드를 조사해야합니까? – felix021

0

내가 4k 인 abc와 4k 인 def를 작성한다고 가정 해 보겠습니다.

커널은 8k 청크에 "abcdef"라고 쓰면 다른 프로세스가 "abc"를 보지 못하고 "def"를 두 개의 별도 쓰기로 보지 않는다고 보장하지 않습니다.

하지만 난 그냥 다른 프로세스 후 "C"당신은 다른에있어

http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_14.html#SEC215

의 ""다음 "B"를 보지 못할 것이라는 커널 보장 "ABC"의 4K를 작성하는 경우 선로. 당신이 원하는 보증은 "xyz"가 "abc"전에는 읽히지 않을 것이라는 것입니다.이것은 완전히 다른 보증입니다. 사실 그것은 보증 이상의 것입니다. 그것은 단지 간다. 그리고 그것은 디스크에 플러시 블록과 관련이 없습니다. 그것은 시스템의 다른 레벨입니다.

관련 문제