2011-11-14 2 views
3

(p.1367)는파일 기술자 기아 및 차단 파일 기술자 리눅스 프로그래밍 인터페이스 책에서

기아 고려 사항은 , 적용 할 수 있습니다 트리거 통지 메커니즘. 대조적으로,대조적으로 기아 고려 사항은 수준 트리거 알림 메커니즘을 사용하는 응용 프로그램에 반드시 적용되는 것은 아닙니다. 우리가 레벨 트리거 통지에 차단 파일 기술자를 고용하고 지속적으로 준비를위한 설명을 확인하는 루프를 사용하고 한 번 더 준비 파일 설명을 점검하기 전에 준비 기술자에 대한 몇 가지 I/O를 수행 할 수 있기 때문 입니다 .

'차단'부분의 의미를 이해하지 못합니다. 블로킹 I/O 또는 비 블로킹 I/O를 사용하는지 여부는 관계가 없다고 생각합니다. (저자는 또한 level-triggered 또는 edge-triggered 통지에 관계없이 nonblocking I/O가 일반적으로 사용된다는 챕터의 초기에 말합니다)

+0

"레벨 트리거 알림을 사용하여 파일 설명자를 차단할 수 있습니다"vs "가장자리 트리거 알림을 사용하여 파일 설명자를 안정적으로 사용할 수 없다"고 생각합니다. 어쨌든, 나는 파일 기술자를 차단하는 것이 항상 레벨 트리거 통지로 막지 않을 것이라고 생각하지 않는다. 그래서 블로킹을 원하지 않으면 비 블로킹 소켓을 사용하십시오. – ninjalj

답변

1

그럼, IO eh? 글쎄요, IO는 인간의 은유로 갈 수 있도록 "일을 처리"합니다. 사장님을 위해 시스템을 완성하는 과정이라고 상상해보십시오.

IO를 차단하는 것은 치과에가는 것과 고객과의 면담을하는 것과 같습니다. 이 두 가지 시나리오 모두에서, 당신이 그 사건을 수행하기 위해 갈 때, 당신은 당신의 책상에서 벗어나기 때문에 당신이 당신의 책상으로 돌아올 때까지는 다른 일을 전혀 할 수 없습니다. 기회는 대기실에서 시간을 낭비하거나 모임에서 유휴 잡담을하거나 사람들이 나타나기를 기다리는 것입니다.

IO 차단은 이와 유사합니다. IO가 "희생"(내가 스레드를 효과적으로 잃어 버리기 때문에 이것을 말합니다) 문제의 스레드를 차단합니다. 차단되어있는 동안 다른 용도로는 사용할 수 없습니다. IO가 발생하기를 기다리고 있습니다.

대조적으로 비 차단 IO는 전화를받는 것과 같습니다. 전화를 할 때 Stack Overflow에 대한 답변을 작성하는 동안 해당 IO에 참여할 수 있습니다! 이러한 입출력은 비동기식이라고 할 수 있습니다. 입출력 요청을 받아들이고 처리를 시작하지만 처리가 완료되는 동안 다른 요청을 처리 할 수 ​​있습니다.

이제 이런 종류의 자료에 대한 가장 좋은 자료는 c10k problem 페이지입니다. 나는 당신이 옳다고 말하고 싶습니다 - 논 블로킹 IO를 사용할 시간의 99 % (사실, OS는 항상 비 블로킹 IO를 수행하고 있습니다), 대부분 각 스레드를 사용하기 때문에 들어오는 입출력 작업은 쓰레드와 프로세스가 똑같은 (작업) Linux 에서조차 매우 비효율적이며 상당히 가볍습니다.

경계 트리거 된 알림 유형과 레벨 트리거 통지 유형의 차이는 어쨌든 차단 사례와 관련이 없기 때문에 비 차단 연결에 더 많이 적용됩니다. 내가 알고 있듯이 가장자리 트리거 알림은 상태 업데이트를 요청한 마지막 순간의 새 데이터가있을 때 준비된 것으로 만 설명자를 표시하고 레벨 트리거는 사용 가능한 데이터가있을 때마다 처리 할 준비가 된 설명자를 표시합니다. 즉, 다시 알림을받지 않으므로 handle the incoming data when you see it해야하므로 에지로 트리거 된 인터페이스는 considered a bit more tricky입니다. 이론적으로는보다 효율적이어야합니다 (알림 횟수 감소).

tl; dr - edge 대 레벨 준비 상태는 비 차단 설계와 비교하여 약간 다른 고려 사항입니다. 즉, 비 차단 IO를 수행하는 여러 가지 방법과 실제로 IO를 차단하는 방법이 있습니다.

관련 문제