OS 스케줄러는 어떻게 CPU를 다시 제어합니까?
나는 최근에 CPU와 운영 체제가 어떻게 작동하는지 배우기 시작했고, 멀티 태스킹을 제공하는 운영 체제가있는 단일 CPU 시스템의 작동에 대해 약간 혼란스러워했습니다.
따라서 내 컴퓨터에 단일 CPU가 있다고 가정하면 주어진 시간에 하나의 프로세스 만 실행될 수 있음을 의미합니다.
이제는 귀중한 CPU 시간에 대한 액세스를 제어하기 위해 운영 체제에서 사용하는 스케줄러도 프로세스라고 가정 할 수 있습니다.
따라서이 시스템에서는 사용자 프로세스 또는 스케줄링 시스템 프로세스가 특정 시점에서 실행되지만 둘 다 실행되지는 않습니다.
그래서 여기에 질문이 있습니다.
스케줄러가 CPU 제어를 다른 프로세스에 넘긴 경우, 스케줄링 작업을 수행하기 위해 다시 실행될 CPU 시간을 어떻게 되 찾을 수 있습니까? 현재 실행중인 특정 프로세스가 CPU를 포기 (양보)하지 않는 경우 스케줄러 자체가 어떻게 다시 실행되고 적절한 멀티 태스킹을 보장 할 수 있습니까?
지금까지 사용자 프로세스가 시스템 호출을 통해 I / O 작업을 요청하면 시스템 호출에서 스케줄러에 CPU 시간이 다시 할당되도록 할 수 있다고 생각했습니다. 그러나 이것이 이런 식으로 작동하는지 확실하지 않습니다.
반면에 문제의 사용자 프로세스가 본질적으로 CPU 바운드 인 경우,이 관점에서 볼 때 영구적으로 실행될 수 있으며 스케줄러도 다시 실행되지 않을 수 있습니다.
시간 분할 스케줄링을 가정하면 스케줄러가 실행 중이 아닌 다른 프로세스의 실행 시간을 어떻게 분할 할 수 있는지 알 수 없습니다.
이와 관련하여 귀하가 제공 할 수있는 통찰력이나 참고 자료에 감사드립니다.
OS는 N 밀리 초마다 인터럽트를 생성하는 하드웨어 타이머 ( 프로그래밍 가능한 간격 타이머 또는 PIT)를 설정합니다. 그 인터럽트는 커널에 전달되고 사용자 코드는 인터럽트됩니다.
다른 하드웨어 인터럽트처럼 작동합니다. 예를 들어 디스크가 IO를 완료하면 커널로 강제 전환합니다.
Google "중단". 인터럽트는 Linux / Windows와 같은 다중 스레딩, 선점 커널의 중심에 있습니다. 인터럽트가 없으면 OS는 아무것도하지 않습니다.
조사 / 학습하는 동안 첫 번째 단락에서 "타이머 인터럽트", "라운드 로빈"및 "타임 슬라이스"또는 "양자"를 언급하는 설명을 무시하십시오. 실제로 잘못되지는 않았더라도 위험 할 정도로 오해의 소지가 있습니다.
OS 측면에서 인터럽트는 두 가지 유형으로 제공됩니다.
하드웨어 인터럽트 – 주변 장치의 실제 하드웨어 신호에 의해 시작되는 인터럽트. 이는 (거의) 언제든지 발생할 수 있으며 실행중인 스레드에서 드라이버의 코드로 실행을 전환 할 수 있습니다.
소프트웨어 인터럽트 – 현재 실행중인 스레드에서 OS 호출에 의해 시작된 것.
인터럽트는 스케줄러에게 대기중인 스레드를 준비 / 실행 중이도록 요청하거나 대기 / 실행중인 스레드가 선점되도록 할 수 있습니다.
가장 중요한 인터럽트는 디스크, NIC 카드, 마우스, 키보드, USB 등에서 IO를 기다리고 있던 스레드를 준비하는 주변 드라이버의 하드웨어 인터럽트입니다 . 선점 커널을 사용하는 가장 중요한 이유와 모든 잠금 문제, 동기화, 신호 등, 이러한 시스템이 가지고있다 아주 좋은 IO 성능을 하드웨어 주변이 빠르게 그 하드웨어에서 데이터를 기다리고 있었다 실행 / 스레드가 준비 할 수 있기 때문에, 어떤 대기 시간없이 양보하지 않는 스레드의 결과, 또는주기를 기다리는 타이머 일정 변경.
주기적인 스케줄링 실행을 유발하는 하드웨어 타이머 인터럽트는 주변 장치의 응답이 예상보다 오래 걸리는 경우에 대비하여 많은 시스템 호출에 시간 초과가 있기 때문에 중요합니다.
멀티 코어 시스템에서 OS에는 다른 코어에서 하드웨어 인터럽트를 발생시킬 수있는 인터 프로세서 드라이버가있어 OS가 여러 코어로 스레드를 인터럽트 / 예약 / 디스패치 할 수 있습니다.
심각하게 오버로드 된 박스 또는 CPU 집약적 인 앱 (소수)을 실행하는 경우 OS는 주기적 타이머 인터럽트 및 결과 스케줄링을 사용하여 사용 가능한 코어 수보다 큰 준비 스레드 세트를 순환 할 수 있습니다. 사용 가능한 CPU 리소스의 공유를 각각 허용합니다. 대부분의 시스템에서 이것은 거의 발생하지 않으며 그다지 중요하지 않습니다.
"양자", "나머지 시간 조각을 포기하십시오", "라운드 로빈"등을 볼 때마다 저는 그냥 움찔합니다.
@usr의 대답을 보완하려면 Understanding the Linux Kernel 에서 인용 합니다 .
schedule () 함수
schedule ()은 스케줄러를 구현합니다. 그 목적은 실행 대기열 목록에서 프로세스를 찾은 다음 CPU를 할당하는 것입니다. 여러 커널 루틴에 의해 직접 또는 게으른 방식으로 호출됩니다. [...]
게으른 호출
스케줄러는 현재 [process]의 need_resched 필드를 1로 설정하여 지연 방식으로 호출 할 수도 있습니다.이 필드의 값은 항상 사용자 모드 프로세스의 실행을 다시 시작하기 전에 확인되기 때문에 ( "Returning 4 장)의 "인터럽트 및 예외에서", schedule ()은 가까운 미래에 확실히 호출 될 것입니다.
참조 URL : https://stackoverflow.com/questions/11473777/how-does-the-os-scheduler-regain-control-of-cpu
'Program Tip' 카테고리의 다른 글
대규모 프로젝트를위한 NodeJS 대 Play 프레임 워크 (0) | 2021.01.08 |
---|---|
ssh : 호스트 이름을 확인할 수 없습니다. github.com : 이름 또는 서비스를 알 수 없습니다. (0) | 2021.01.08 |
JAXB가 목록에 대한 setter를 생성하지 않는 이유 (0) | 2021.01.08 |
OpenCL과 OpenGL의 컴퓨 트 셰이더의 차이점은 무엇입니까? (0) | 2021.01.08 |
웹 서버에 라 라벨 프로젝트 업로드 (0) | 2021.01.08 |