느린 시스템 호출과 빠른 시스템 호출의 차이점은 무엇입니까? 프로세스가 일부 신호를 포착하면 느린 시스템 호출이 차단될 수 있다는 점을 이해합니다. 포착된 신호가 차단된 시스템 호출을 깨울 수 있기 때문입니다. 그러나 이 메커니즘을 완전히 이해할 수는 없습니다. 어떤 예라도 크게 감사하겠습니다.
답변1
실제로 시스템 호출은 세 가지 수준으로 나뉩니다.
- 일부 시스템 호출은 즉시 반환됩니다. "즉시"는 필요한 유일한 것은 약간의 프로세서 시간뿐이라는 의미입니다. 지출할 수 있는 기간에는 엄격한 제한이 없습니다.실시간 시스템), 하지만 이러한 통화는 충분히 오랫동안 예약된 후에 다시 돌아옵니다.
이러한 전화는 종종 호출됩니다.비차단. 비차단 호출의 예로는 시스템 상태를 약간만 읽는 호출이나 다음과 같이 시스템 상태를 간단하게 변경하는 호출이 있습니다.getpid
,gettimeofday
,getuid
또는setuid
. 예를 들어 일부 시스템 호출은 상황에 따라 차단되거나 비차단될 수 있습니다.read
파일이 비차단 읽기를 지원하는 파이프 또는 기타 유형인 경우 차단하지 마십시오.O_NONBLOCK
배너설정되었습니다. - 일부 시스템 호출은 완료하는 데 시간이 걸릴 수 있지만 영원히는 아닙니다. 전형적인 예는 다음과 같습니다
sleep
. - 일부 시스템 호출은 특정 외부 이벤트가 발생한 후에만 반환됩니다. 이러한 통화는 다음과 같다고 합니다.차단하다. 예를 들어,
read
차단 파일 설명자에 대한 호출은 차단이므로wait
.
"빠른" 시스템 호출과 "느린" 시스템 호출의 차이는 비차단 대 차단에 가깝지만 이번에는 커널 구현자의 관점에서 본 것입니다. 빠른 시스템 호출은 차단이나 대기 없이 완료되는 것으로 알려진 시스템 호출입니다. 커널은 빠른 시스템 호출을 만나면 즉시 시스템 호출을 실행하고 동일한 프로세스를 예약할 수 있다는 것을 알고 있습니다. (일부 운영 체제에서는비선점형멀티태스킹, 빠른 시스템 호출은 비선점형일 수 있습니다. 일반 UNIX 시스템에서는 그렇지 않습니다. ) 반면에 느린 시스템 호출은 다른 작업이 완료될 때까지 기다려야 할 수 있으므로 커널은 호출 프로세스를 일시 중지하고 다른 작업을 실행할 준비를 해야 합니다.
어떤 경우에는 약간 회색 영역입니다. 예를 들어, 일반 파일에서 디스크 읽기는 read
일반적으로 다른 프로세스를 기다리지 않고 디스크를 기다리기 때문에 비차단으로 간주됩니다. 일반적으로 응답하는 데는 몇 분밖에 걸리지 않고 영원히 기다리지는 않습니다. (그래서 이것은 위의 2의 경우입니다). 그러나 커널의 관점에서 프로세스는 디스크 드라이버가 완료될 때까지 기다려야 하므로 이는 확실히 느린 시스템 호출입니다.
답변2
느린 시스템 호출은 TCP 소켓 read()와 유사합니다. O_ASYNC(또는 기타)를 설정하지 않으면 영원히 기다릴 수 있습니다.
빠른 시스템 호출은 커널에서 즉시 사용할 수 있는 정보를 프로세스에 반환하는 gettimeofday() 또는 getpid()와 유사합니다.
디스크 읽기는 느린 시스템 호출 범주에 속합니다. 프로세스가 실제 디스크 파일, 파일 설명자에 대해 read()를 수행하는 경우 커널은 읽기 요청을 만족시키기 위해 하나 이상의 디스크 블록을 읽어야 할 수도 있습니다. 기본 파일 시스템의 디스크 구조에 따라 이는 "간접 블록"의 디스크 블록 번호를 얻기 위해 디스크 inode를 읽고, 데이터 블록을 얻기 위해 간접 블록을 읽은 다음, 데이터 블록 자체를 읽는 것을 의미할 수 있습니다. 적어도 디스크 액세스당 CPU 주기 측면에서 볼 때 꽤 시간이 많이 소요되며 아마도 예전보다 지금이 더 나쁠 것입니다.
나는 이런 일이 일어나는 것을 오랫동안 본 적이 없지만, 오래된 Unix 디스크 드라이브 장치 드라이버 코드의 "하위 절반"은 디스크 파일 시스템의 무결성을 더 쉽게 유지할 수 있도록 신호/인터럽트를 차단합니다. 때로는 문제가 있는 드라이버나 장애가 발생한 디스크가 프로세스에서 요청한 디스크 블록을 제공하지 않아 프로세스가 영원히 절전 모드로 전환되는 경우도 있습니다. kill-9도 도움이 되지 않습니다.