Linux 커널은 선점형이기 때문에:
스케줄러는 어느 코어에서 실행됩니까?
커널 공간이 다른 코어에서 실행 중인 경우 다른 코어에서 어떻게 예약(컨텍스트 전환)됩니까?
사용자 공간이 다른 코어에서 실행 중인 경우 다른 코어에서 어떻게 예약(컨텍스트 전환)됩니까?
커널이 모든 코어에서 실행될 수 있다면 분산 알고리즘과 같나요(각 커널 스레드는 다른 커널 모듈과 독립적이며 커널 데이터 구조에 잠금이 있습니다). 아니면 모든 커널 스레드를 조정하는 하나의 주요 엔터티가 있습니까?
따라서 예약을 위해 스케줄러는 각 코어의 대기 목록을 변경하고(이것은 중앙 집중식 데이터 구조입니까?) 각 코어의 각 코어는 이 데이터를 보고 실행 중인 동일한 코어에서 다음 프로세스를 선택합니까?
스케줄러 인터럽트가 발생하면 어떤 스케줄러 프로세스가 실행되고 있습니까? 아니면 각 코어에 인터럽트가 있는 스케줄러 프로세스가 있고, 각 코어에 있는 각 스케줄러 프로세스가 실행 대기열에서 일정을 예약하거나 마이그레이션 스레드를 사용하여 프로세스를 다른 실행 대기열로 이동합니까?
답변1
스케줄러는 어느 코어에서 실행됩니까?
모든 코어에서
커널 공간이 다른 코어에서 실행 중인 경우 다른 코어에서 어떻게 예약(컨텍스트 전환)됩니까?
여기에 문제가 있습니다. 컨텍스트 전환은 코어에서 로컬로 발생하는 것입니다. 따라서 "다른 코어에서 실행"되는 상황은 없습니다.
"컨텍스트 전환"의 올바른 의미를 실제로 이해하고 있는지 확실하지 않습니다. "다른 코어에서 작업을 재정렬"한다는 뜻일 수도 있습니다.
또한 팁: 사물이 "실행 중"이라고 생각하지 마십시오. 이해하려는 메커니즘을 통해 사물이 훌륭하고 추상화될 때까지는 컴퓨터가 실제로 작동하는 방식이 아닙니다.
"지금 이 CPU 코어가 실행되고 있는 코드는 무엇입니까?"라고 생각해보세요. 기본적으로 이 모든 것이 실행되고 있다는 것을 알게 될 것입니다.적극적으로실행된 코드 또는 일부 하드웨어 인터럽트에 의해 수행됩니다.
사용자 공간이 다른 코어에서 실행 중인 경우 다른 코어에서 어떻게 예약(컨텍스트 전환)됩니까?
프로세스가 실행되고 있지 않으면 대기 목록에 있으며, 프로세서 코어에서 실행 중인 커널 코드가 유휴 시간이라고 판단하면(예: 가능한 한 많은 시스템 호출을 처리하여) 대기 목록을 쿼리합니다. 해당 코어 자체에서 코드를 실행합니다(논리적임). "아, 이 대기 과정이 제가 겪고 있는 일입니다." 이 결정이 이루어지는 방식에는 다음이 포함됩니다.장소(즉, 우리는 지난번에 그것을 실행했던 것과 동일한 코어입니까?) 그러나 정답은 아닙니다.
분산 알고리즘과 같나요(각 커널 스레드는 다른 커널 모듈과 독립적이며 커널 데이터 구조에 잠금이 있습니다). 아니면 모든 커널 스레드를 조정하는 하나의 주요 엔터티가 있습니까?
대부분 첫 번째입니다.
답변2
당신이 부르는 것스케줄러이는 실제로 특정 이벤트, 인터럽트 또는 사용자 공간 프로세스의 호출 후에 실행될 수 있는 커널 루틴 모음입니다.
스케줄러가 사용하는 가장 기본적인 데이터는 실행 큐입니다. CFS에서 각 프로세서에는 자체 작업 실행 큐가 있으며 동시에 여러 실행 큐에서 작업이 발생하지 않습니다.
결론은 그렇습니다. CFS는 모든 프로세서에서 실행될 수 있다고 말할 수 있습니다. 다섯 번째 질문은 아니요, 중앙 집중식 데이터 구조가 아닙니다.
렘. 나는 몇 가지 오해에 대한 Marcus Müller의 답변에 동의합니다.컨텍스트 스위치. 그렇다면 귀하의 질문은 스레딩에 관한 것이라고 가정합니다.이주자: 한 코어에서 다른 코어로의 스레드 마이그레이션은 다음에 의해 수행됩니다.[migration/x] 커널 스레드(코어당 하나)
잠금 관련: 예, 커널 스레드는 때때로 잠깁니다(스핀락 및 뮤텍스 사용). 하지만 물론입니다.적을수록 좋습니다.