2016-12-14 1 views
0

POSIX standard에 따르면 파이프에 대한 쓰기는 데이터 크기가 PIPE_BUF보다 작 으면 원자 단위로 보장됩니다.POSIX 파이프의 원 자성의 의미

필자가 이해하는 한, 이것은 파이프에 쓰려고하는 모든 스레드가 다른 스레드의 쓰는 중간에 파이프에 절대 액세스하지 않는다는 것을 의미합니다. 나에게 명확하지 않은 점은 이것이 달성되는 방법과이 원 자성 보장이 다른 의미를 갖는지 여부입니다.

단순히 쓰기 스레드가 쓰기 함수의 어딘가에 잠금을 가져 오는 것을 의미합니까?

파이프에 쓰는 스레드가 쓰기 작업 중에 컨텍스트 밖으로 스케줄되지 않도록 보장되어 있습니까?

+0

귀하의 추론은 표준에 의해 보장되지 않으므로 그 내용을 그대로 사용하십시오. 아시다시피, 당신의 글은 다른 글과 인터리빙되지 않을 것입니다. 더 중요한 것은 구현 세부 사항이며, 표준이 스케쥴링 보장을한다고 생각하지 않습니다. 그것이 의미하는 유일한 것은 다른 스레드가 파이프에 쓰기를 할 수 있다는 것입니다. 쓰기가 보류 중일 때, write()가 호출 된 시간 사이에 스케쥴러와 쓰레드간에 일어난 일은 아무 것도 반환되지 않습니다. 당신의 사업 :) – iluvcapra

답변

0

파이프 쓰기는 파이프 크기까지 가능합니다. 파이프 크기가 ​​4kb라고 가정하면, 쓰기는 data_size < 4kb까지 원자 적입니다. POSIX 시스템에서 커널은 내부 mutex를 사용하고 파이프에 대한 파일 설명자를 잠급니다. 그런 다음 요청 스레드가 쓰기를 허용합니다. 다른 스레드 요청이이 시점에서 쓰면, 첫 번째 스레드를 기다려야합니다. 그 후 파일 디스크립터는 잠금 해제되므로 다른 대기중인 스레드가 파이프에 쓸 수있다. 그래서 예, 커널은 동시에 하나 이상의 쓰레드가 파이프에 쓰는 것을 허용하지 않습니다.

그러나 생각할 수있는 단점이 있습니다. 4KB에 가까운 크기의 데이터가 이미 쓰여지고 읽기가 아직 완료되지 않은 경우 파이프가 스레드로부터 안전하지 않을 수 있습니다. 이 시점에서 파이프에 쓰여진 총 바이트가 4kb 제한을 초과 할 수 있기 때문일 수 있습니다.