2017-11-25 1 views
0

사용자 수준 스레드 라이브러리를 사용하는 다중 스레드 프로세스가 해당 스레드 중 하나가 I/O를 기다리는 경우 차단되는 이유는 무엇입니까? 이것은 의미가 있지만 더 많이 생각하면 질문이 튀어 나옵니다. 사용자 수준의 스레드 라이브러리가 다른 스레드를 예약 할 수 있습니까?스레드가 여러 매핑에서 I/O를 기다리는 경우 프로세스가 차단되는 이유

+0

당신이 무엇을 요구하고 있는지 분명하지 않습니다. 특정 프로그래밍 언어에 대한 질문이 있으십니까? 특정 운영 체제? 특정 도서관? 예상대로 작동하지 않는 코드의 예가 있습니까? –

+2

이 경우 OS가 스레딩을 인식하지 못하기 때문입니다. 사용자 수준 라이브러리가 다른 스레드를 예약하도록하려면 실행해야합니다. OS에 관한 한 I/O 요청으로 인해 프로세스가 차단됩니다. –

+0

@jameslarge이 질문은 매우 광범위하며 특정 운영 체제 나 프로그래밍 언어와 관련이 없습니다. –

답변

1

OS는 프로세스 (또는 작업) 만 예약 할 수 있으므로 프로그램 내의 스레드를 전혀 알지 못하므로 원하는대로 예약 할 수 없습니다. 프로세스의 일부 (여기서는 I/O로 인해 차단 된 스레드)가 I/O 작업을 위해 차단되면 os는 전체 프로세스를 일시 중단합니다. os는 프로세스 만 처리하기 때문에 (프로세스 내의 스레드가 아닌) . 많은 모델에서와 같이 단일 커널 만 존재하므로 스레드가 차단 된 프로세스는 차단 된 스레드가 다시 시작될 때까지 실행될 수 없습니다. 반면에 many to many 또는 one to one 모델에서는 각 커널이 코드 조각을 실행하고 다른 커널에서 차단 된 스레드를 알지 못합니다.

1

두 가지 유형의 스레드가 있습니다. OS 쓰레드, 그린 쓰레드 (당신이 말하는 것에 대한 것입니다.

OS 스레드는 운영 체제에 의해 예약되며 사용자가 의도적으로 동기화 할 항목 (예 : 세마포)을 사용하지 않는 한 다른 스레드는 차단하지 않습니다.

프로세스가 다른 실행 경로를 예약하는 녹색 스레드는 스케줄러가 똑똑하고 잠재적으로 모든 블로킹 함수 호출을 제공하여 스케줄링 기회로 사용하지 않는 한 차단됩니다. 이는 협업 멀티 태스킹과도 밀접한 관련이 있습니다.

그래서 대답은 '예'이지만, 그런 식으로 작성된 경우에만 가능합니다. 파이썬의 스레드는이 방법으로 작성되지 않았고, GIL을 읽었으므로 문제가 끝나지 않을 것입니다. 파이썬은 이제 이것을 고칠 수 있습니다.

관련 문제