Unix 프로세스 스케줄러는 프로세스 자체입니까, 아니면 시스템 호출(커널 비트가 설정된 사용자 프로세스에서 커널 코드 실행)과 같은 다른 프로세스에 피기백되어 있습니까?
답변1
Unix 프로세스 스케줄러는 실제로 시스템 호출을 "피기백"하지 않습니다. 스케줄러 실행은 거의 모든 시스템 호출의 일부입니다.
시스템 read()
호출 또는 exit()
시스템 호출은 반드시 스케줄러가 실행되도록 해야 합니다. 디스크 액세스의 경우 read()
시간이 오래 걸릴 수 있습니다. 모든 작업을 극도로 느리게 하고 싶지 않다면 스케줄러를 실행하여 첫 번째 프로세스가 디스크에서 데이터가 돌아올 때까지 기다리는 동안 어떤 프로세스를 실행해야 하는지 확인해야 합니다. 이는 소켓에서 발생할 수 있습니다 read()
. 일부 원격 서버에서 데이터가 반환되는 데 걸리는 시간은 정의되지 않습니다. 커널은 다른 프로세스를 다시 예약해야 합니다. 이 경우 exit()
시스템 호출을 수행하는 프로세스는 더 이상 존재하지 않기 때문에 다른 프로세스를 예약해야 합니다. a pause()
또는 an 의 경우 alarm()
프로세스가 미래의 어느 시점에 실행되기를 원합니다. 마찬가지로 스케줄러는 실행할 다른 프로세스를 선택해야 합니다.
나는 대부분의(전부는 아님) 시스템 호출로 인해 Unix/Linux/*BSD 스케줄러가 실행된다고 생각합니다. 때로는 gettimeofday()
스케줄러가 실행되지 않는 경우도 있습니다. 이는 Solaris가 예전에 작동했던 방식입니다. 그러나 일반적으로 시스템 호출은 작업 수행(NIC를 통한 데이터 전송, 디스크 읽기 또는 쓰기 설정, 프로세스 종료 작업 수행, 분기 등), 스케줄러 실행 및 그에 따른 모든 작업을 수행하는 것으로 안전하게 생각할 수 있습니다. 다음 프로세스가 실행 중이어야 합니다. 때로는 시스템 호출을 만드는 것과 동일한 프로세스이지만 그렇지 않은 경우도 많습니다.