최초의 Linux 개발자가 비선점형 커널을 구현하기로 선택한 이유는 무엇입니까? 동기화 저장인가요?
내가 아는 한, Linux는 PC에 프로세서가 하나만 있던 1990년대 초반에 개발되었습니다. 이러한 PC에서 비선점형 코어의 장점은 무엇입니까? 그런데 멀티코어 프로세서가 이점을 감소시키는 이유는 무엇입니까?
답변1
Linux 커널의 맥락에서 사람들이 선점에 대해 이야기할 때 일반적으로 커널이 스스로를 중단하는 능력, 즉 본질적으로 커널 코드가 실행되는 동안 작업을 전환하는 능력을 말합니다. 이를 허용하는 것은 매우 복잡하며, 이는 아마도 코어가 선점되는 데 오랜 시간이 걸리는 주된 이유일 것입니다.
처음에는 대부분의 커널 코드가 대규모 커널 잠금으로 보호되기 때문에 중단될 수 없습니다. 잠금은 점점 더 많은 커널 코드에서 점차적으로 제거되어 여러 커널을 동시에 병렬로 호출할 수 있게 되었습니다(SMP 시스템이 보편화됨에 따라 이는 더욱 중요해졌습니다). 그러나 이것이 여전히 코어 자체를 선점 가능하게 만드는 것은 아닙니다.저것아직 더 많은 개발이 필요하며 궁극적으로PREEMPT_RT
패치 세트는 결국 메인라인 커널에 병합되었습니다(그리고 어쨌든 BKL을 선점할 수 있었습니다). 이제 원하는 처리량 및 대기 시간 특성에 따라 코어를 선점형으로 구성할 수 있습니다.관련 커널 구성더 알아보기.
커널 구성의 설명에서 볼 수 있듯이 선점은 동시성이 아닌 처리량과 대기 시간에 영향을 미칩니다. 단일 CPU 시스템에서 선점은 더 짧은 반응 시간으로 이벤트를 처리할 수 있기 때문에 여전히 유용합니다. 그러나 이로 인해 처리량이 감소합니다(커널이 작업을 전환하는 데 시간을 소비하기 때문). 선점을 사용하면 단일 CPU 또는 다중 CPU 시스템의 특정 CPU가 다른 작업으로 더 빠르게 전환할 수 있습니다. 다중 CPU 시스템의 제한 요소는 선점이 아니라 잠금(크든 작든)입니다. 모든 타임 코드가 잠금을 획득하면 다른 CPU가 동일한 작업 수행을 시작할 수 없음을 의미합니다.
답변2
선점형 코어는 단순히 코어가 없음을 의미합니다.큰 커널 잠금.
Linux에는 처음부터 선점형 멀티태스킹(즉, 사용자 코드가 선점 가능)이 있었습니다(내가 아는 한 Linus가 funet ftp 서버에 업로드한 첫 번째 Linux 0.0.1은 이미 선점형 멀티태스킹이었습니다). 예를 들어 여러 압축이나 컴파일 프로세스를 수행하는 경우 처음부터 병렬로 실행됩니다.
당시 널리 사용되던 Win31과 반대되는 개념입니다. Win31에서 작업이 "커널"에서 CPU를 가져오는 경우 기본적으로 언제 운영 체제(또는 다른 작업)에 제어권을 넘겨줄지 결정하는 것은 기본적으로 해당 작업의 책임입니다. 프로세스에 이 기능에 대한 특별한 지원이 없으면(추가 프로그래밍 노력이 필요함) 실행되는 동안 다른 모든 작업이 일시 중지됩니다. 이는 Win31에 통합된 대부분의 기본 응용 프로그램에도 해당됩니다.
선점형 멀티태스킹은 작업에 필요에 따라 CPU가 할당되지 않음을 의미합니다. 반대로 만약 그들의시간대만료 후 커널은 CPU를 가져옵니다. 따라서 선점형 운영 체제에서는 제대로 작성되지 않거나 제대로 실행되지 않는 프로세스가 운영 체제를 정지시키거나 다른 프로세스의 실행을 방해할 수 없습니다. Linux는 항상 사용자 공간 프로세스를 선점합니다.
큰 커널 잠금은 어떤 경우에는 다음을 의미합니다.커널 공간 내부, 다른 프로세스가 보호된 코드를 실행하지 못하게 하는 일부 잠금이 여전히 있을 수 있습니다. 예를 들어, 다음을 수행할 수 없습니다.산동시에 여러 파일 시스템 - 여러 개의 마운트 명령을 제공하는 경우 마운트하려면 대규모 커널 잠금 할당이 필요하므로 계속해서 연속적으로 실행됩니다.
커널 선점을 활성화하려면 마운트 및 기타 작업이 동시에 실행될 수 있더라도 이러한 대규모 커널 잠금을 제거해야 합니다. 힘든 일이에요.
역사적으로 SMP(다중 CPU 지원) 지원이 지속적으로 증가함에 따라 이는 매우 시급해졌습니다. 최초로 진정한 멀티 CPU 마더보드가 등장했습니다. 나중에 여러 CPU("코어")가 단일 칩에 통합되었으며 오늘날 진정한 다중 CPU 마더보드는 드뭅니다(보통 고가의 서버 시스템에서 발견됨). 그리고 진정한 단일 코어 시스템(단 하나의 CPU, 단 하나의 코어)은 드뭅니다.
따라서 귀하의 질문에 대한 대답은 항상 선점이기 때문에 "비선점의 이유는 무엇입니까"가 아닙니다. 진짜 질문은,선점형 커널 실행이 정말로 필요한 이유. 대답은 멀티 CPU와 멀티 코어 시스템의 비율이 계속 증가하고 있다는 것입니다.
답변3
이것은 기술적 답변이 아니라 역사적 답변입니다.특정 문제OP가 질문했습니다. "이전 Linux 커널에서 선점되지 않는 이유는 무엇입니까?"
(@peterh가 그의 답변과 의견에서 설명했듯이 OP는 "비선점형"으로 다음 사실 중 하나 또는 둘 다를 참조한다고 가정합니다. 단 하나의 사용자 프로세스만 커널(API에서) 내부에서 실행될 수 있고 /또는 대규모 커널 잠금.
Linus Torvalds는 운영 체제가 어떻게 작동하는지 배우는 데 관심이 있었고, 그가 배운 방법은 운영 체제를 작성하는 것이었습니다. 그의 모델, 기반 및 초기 개발 환경은 교육 목적으로 사용되는 기존 운영 체제인 Minix였습니다(즉, 프로덕션 OS가 아님). 이는 무료가 아니었습니다(당시 오픈 소스가 그랬던 것처럼 - 누구에게나 맥주처럼 무료는 아니었습니다).
그래서 그는 선점(다른 답변에서 언급된 큰 커널 잠금) 없이 커널을 작성했습니다. 교육 목적으로 새 OS를 빠르게 시작하고 실행하려면 다음과 같이 하십시오. 이렇게 하면 훨씬 간단해집니다. 사용자 프로그램과 장치의 동시 다중 프로그래밍을 지원하는 커널은 충분히 어렵습니다.극도로커널 자체를 동시성으로 만드는 것은 어렵습니다.
그가 Linux가 얼마나 인기 있고 유용하고 중요해질지 알았다면...그도 똑같이 했을 것입니다. (내 생각에는 도대체 무슨 생각을 하고 있었는지 모르겠다.) 뛰려면 먼저 걸어야 하기 때문이다.
이러한 상태는 오랫동안 지속되었는데, 그 이유는 a) Linux를 오늘날의 모습(또는 당시의 모습)으로 만들기 위해 수행해야 할 작업이 훨씬 더 많았고 b) Linux를 변경하는 것이 어려운 작업이었기 때문입니다(예: 다른 답변은 )에 설명되어 있습니다.