느린 시스템 호출과 빠른 시스템 호출의 차이점


13

느린 시스템 호출과 빠른 시스템 호출의 차이점은 무엇입니까? 적발 된 신호가 차단 된 시스템 호출을 깨울 수 있기 때문에 프로세스가 일부 신호를 잡으면 느린 시스템 호출이 차단 될 수 있다는 것을 알게되었지만이 메커니즘을 정확히 이해할 수는 없습니다. 모든 예가 이해 될 것이다.

답변:


19

실제로 시스템 호출에는 3 가지 그라데이션이 있습니다.

  1. 일부 시스템 호출은 즉시 반환됩니다. "즉시"는 필요한 유일한 프로세서 시간입니다. 소요 시간에 대한 제한은 없지만 ( 실시간 시스템 제외 ) 이러한 통화는 예약이 완료되는 즉시 반환됩니다.
    이러한 호출을 일반적으로 비 차단 이라고 합니다. 비 블로킹 호출의 예는 다음과 같은 단지 시스템 상태의 비트를 읽거나 시스템 상태에 대한 간단한 변경을 호출이다 getpid, gettimeofday, getuid또는 setuid. 상황에 따라 일부 시스템 호출이 차단되거나 차단되지 않을 수 있습니다. 예를 들어 read, 파일이 비 블로킹 읽기를 지원하는 파이프 또는 다른 유형이고 O_NONBLOCK플래그 가 설정된 경우 차단하지 않습니다 .
  2. 일부 시스템 호출은 완료하는 데 시간이 걸리지 만 영원히는 아닙니다. 일반적인 예는 sleep입니다.
  3. 일부 외부 이벤트가 발생할 때까지 일부 시스템 호출이 반환되지 않습니다. 이 전화는 차단 되고 있다고합니다 . 예를 들어, read차단 파일 디스크립터 에서 호출되어 차단 중입니다 wait.

"빠른"시스템 호출과 "느린"시스템 호출의 차이점은 비 차단 vs. 차단에 가깝지만 이번에는 커널 구현 자의 관점에서 볼 때. 빠른 시스템 콜은 막거나 기다리지 않고 완료 할 수있는 것으로 알려져 있습니다. 커널이 빠른 syscall을 만나면 syscall을 즉시 실행하고 동일한 프로세스를 예약 된 상태로 유지할 수 있다는 것을 알게됩니다. ( 비 선점 형 멀티 태스킹 이있는 일부 운영 체제 에서는 빠른 시스템 콜이 선점 형이 아닐 수 있습니다. 일반적인 유닉스 시스템에서는 그렇지 않습니다.) 반면에 느린 시스템 콜은 다른 작업이 완료 될 때까지 기다려야합니다. 따라서 커널 호출 프로세스를 일시 정지하고 다른 태스크를 실행할 준비를해야합니다.

어떤 경우는 약간 회색 영역입니다. 예를 들어, read일반 파일에서 읽은 디스크 는 일반적으로 다른 프로세스를 기다리지 않기 때문에 비 블로킹으로 간주됩니다. 디스크를 기다리는 것입니다. 일반적으로 응답하는 데 약간의 시간이 걸리지 만 영원히 걸리지 않습니다 (따라서 위의 경우 2). 그러나 커널의 관점에서 볼 때 프로세스는 디스크 드라이버가 완료 될 때까지 기다려야하므로 시스템 호출이 느립니다.


고마워요! 그러나 파일이 파이프 인 경우 파일을 블로킹하지 않습니까? 참조 www2.hawaii.edu/~esb/2007spring.ics612/apr10.html
KayKay

"느린 읽기 / 쓰기 (예 : 파이프 또는 터미널)"
KayKay

@KayKay : 파이프의 경우 O_NONBLOCK플래그 상태에 따라 둘 다 가질 수 있습니다 . 플래그가 설정되면 syscall은 다른 것을 기다리지 않고 완료 될 수 있으므로 차단되지 않으며 커널은이를 빠른 syscall로 처리 할 수 ​​있습니다.
Gilles 'SO- 악마 그만'

O_NONBLOCK 플래그에 의존한다는 것을 의미합니다!
KayKay

3

느린 시스템 호출은 TCP 소켓 read ()와 같습니다. O_ASYNC (또는 무엇이든)가 설정되어 있지 않으면 기다릴 수 있습니다.

빠른 시스템 호출은 gettimeofday () 또는 getpid ()와 비슷합니다. 둘 다 커널이 즉시 사용할 수있는 프로세스로 정보를 반환합니다.

디스크 읽기는 느린 시스템 호출 범주에 속합니다. 프로세스가 실제 디스크 파일 인 파일 디스크립터에서 read ()를 수행하는 경우, 커널은 읽기를 만족시키기 위해 하나 이상의 디스크 블록을 읽어야 할 수도 있습니다. 기본 파일 시스템의 디스크 내 구조에 따라, 이것은 "indirect block"의 디스크 블록 번호를 얻기 위해 온 디스크 -inode를 읽고, 데이터 블록을 얻기 위해 간접 블록을 읽은 다음 데이터 블록 자체를 읽는 것을 의미 할 수 있습니다. . 적어도 디스크 액세스 당 CPU주기와 관련하여 상당한 시간이 소요될 수 있습니다. 아마도 Good Old Days보다 더 나쁠 것입니다.

나는 이것을 오랫동안 보지 못했지만, 오래된 유닉스 디스크 드라이브 장치 드라이버 코드의 "하단"은 신호 / 인터럽트를 차단하여 디스크상의 파일 시스템 무결성을 유지하는 것이 더 쉬웠습니다. 때때로, 버그가있는 드라이버 나 고장난 디스크는 프로세스가 요청한 디스크 블록을 전달하지 않았으며 프로세스가 영원히 잠들었습니다. 살인 -9조차도 아무것도하지 않았습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.