2011-01-05 3 views
1

Linux에서 pthreads를 사용하고 있습니다. 내 스레드 중 하나가 주기적으로 장치 파일 설명자에서 쓰기 기능을 호출합니다. 쓰기 호출이 완료되는 데 시간이 걸리면 내 스레드가 일시 중단되어 다른 스레드가 실행될 수 있습니까? pthreads의 일정 기능을 설정하지 않았기 때문에 내 질문은 기본 스레드 동작에 관한 것입니다.스레드에서 입출력 차단에 대한 질문이 있으십니까?

답변

4

다른 리소스가 같은 리소스에 쓰려고하지 않는 한 다른 스레드는 쓰기 쓰레드가 쓰기를 기다리는 동안 실행해야합니다.

+0

이것은 의미가있는 것처럼 보이지만 pthread의 기본 스케줄링 동작을 설명하는 문서를 찾을 수 없습니다. – Ravi

+0

나는 이것을 흥미로운 것으로 읽었다. http://www.icir.org/gregor/tools/pthread-scheduling.html – cubic1271

+0

고마워, 도움이된다. – Ravi

0

장치 파일 설명자가 공유 리소스 인 경우 잠금을 처리해야합니다. 그러나 일단 스레드로부터 안전하다면, 그러한 공유 리소스에 대한 호출은 직렬화됩니다. 따라서 한 스레드가 쓰면 나머지는 차단됩니다. 잠금이 구현되지 않으면 데이터가 왜곡 될 수 있습니다.

+0

내 파일 디스크립터가 공유되지 않았습니다. 하나의 스레드에만 해당됩니다. 해당 스레드가 완료하는 데 시간이 오래 걸리는 경우 일정이 잡히지 않습니까? – Ravi

+0

각 스레드가 고유 한 파일 설명자를 갖고 있으면 경합이 없으므로 다른 스레드가 차단 될 이유가 없습니다. 그러나 귀하의 질문에 상태는 파일 설명 자이며 여러 스레드가 있으므로 파일 설명자가 공유되었다고 가정합니다. – Schultz9999

+0

그것은 논쟁에 대한 질문이 아닙니다. 문제는 한 스레드가 파일 디스크립터에 대한 쓰기를 완료하는 데 오랜 시간이 걸리는 경우 다른 스레드가 스케줄링되는 방법입니다. – Ravi

2

write() 호출 블록 인 경우 호출 스레드 만 일시 중단됩니다. 이것은 POSIX spec for write()에 설명되어 있습니다 : 즉시 를 작성하도록 요청 모든 데이터를위한 충분한 공간이

경우, 구현 그렇게해야한다. 그렇지 않으면 호출하는 스레드 이 차단 될 수 있습니다. 즉, 쓰기 공간이 충분할 때까지 잠시 멈추십시오. 이 과정를 호출하지, 스레드 전화 말한다

참고. 동작을 차단하는 것은 명시 적으로 원칙적으로 여기 http://www.akkadia.org/drepper/nptl-design.pdf

1

참조, YES, 다른 스레드를 실행할 수 있습니다.

그러나 일부 파일 시스템에는 단일 파일에 대해 하나의 동시 IO 작업 만 허용하는 잠금 메커니즘이 있습니다. 그래서 다른 스레드가 같은 파일에 다른 IO를 수행하면 (다른 파일 디스크립터를 경유하더라도) write() 시스템 호출의 일부 기간 동안 다른 스레드를 차단할 수있다.

다른 facililties에 대한 커널 내부 잠금도 있습니다. 그러나 대부분의 사용자는 밀접한 관련 활동을 수행하지 않는 한 다른 스레드가 실행되는 것을 차단하지 않습니다.

관련 문제