답변:
Linux 커널과 관련하여 사람들이 선점에 대해 이야기 할 때, 종종 커널 코드를 실행하는 동안 작업을 전환하여 자체적으로 인터럽트 할 수있는 커널의 기능을 말합니다. 이를 허용하는 것은 상당히 복잡합니다. 아마도 커널을 선점하기까지 오랜 시간이 걸렸을 것입니다.
처음에는 대부분의 커널 코드가 큰 커널 잠금으로 보호되어 있기 때문에 중단 될 수 없었습니다. 이 잠금은 점점 더 많은 커널 코드에서 점진적으로 제거되어 커널에 대한 여러 개의 동시 호출을 병렬로 허용합니다 (SMP 시스템이 점점 일반화됨에 따라 더욱 중요 해짐). 그러나 여전히 커널 자체를 선점 할 수는 없습니다. 그 결과 더 많은 개발 이 필요 했고 PREEMPT_RT
결국 메인 라인 커널에 합쳐진 패치 세트를 완성했습니다 (어쨌든 BKL을 선점 할 수있었습니다). 오늘날 커널은 처리량과 지연 시간 특성에 따라 선점 가능하도록 구성 할 수 있습니다. 자세한 내용은 관련 커널 구성 을 참조하십시오.
커널 구성의 설명에서 알 수 있듯이 선점은 동시성이 아니라 처리량과 대기 시간에 영향을줍니다. 단일 CPU 시스템에서 선점은 이벤트가 더 짧은 반응 시간으로 처리 될 수 있기 때문에 여전히 유용합니다. 그러나 커널이 작업을 전환하는 데 시간을 소비하기 때문에 처리량이 줄어 듭니다. 선점을 사용하면 단일 또는 여러 CPU 시스템에서 지정된 CPU가 다른 작업으로보다 빠르게 전환 할 수 있습니다. 다중 CPU 시스템의 제한 요소는 선점이 아니며 잠금이거나 크거나 그렇지 않은 경우입니다. 타임 코드가 잠금을 사용하면 다른 CPU가 동일한 작업을 수행 할 수 없습니다.
선점 커널은 Big Kernel Lock 이 없음을 의미합니다 .
리눅스는 첫 순간부터 선점 형 멀티 태스킹 (즉, 사용자 코드가 선점 가능)을 가졌다 (리누스가 funet ftp 서버에 업로드 한 최초의 리눅스 0.0.1은 이미 선점 형 멀티 태스킹이었다). 예를 들어 여러 압축 또는 컴파일 프로세스를 실행 한 경우 첫 번째 순간부터 병렬로 실행되었습니다.
반대로 당시에 널리 사용되는 Win31. Win31에서 작업이 "커널"에서 CPU를 가져 오면 기본적으로 OS (또는 다른 작업)에 제어권을 부여 할시기를 결정해야합니다. 프로세스에이 기능에 대한 특별한 지원이없는 경우 (추가 프로그래밍 작업이 필요함) 프로세스를 실행하는 동안 다른 모든 작업이 일시 중단되었습니다. Win31에 통합 된 대부분의 기본 앱도 그렇게 작동했습니다.
선점 형 멀티 태스킹이란 작업이 원하는대로 CPU를 할당 할 수있는 방법이 없음을 의미합니다. 대신 시간 슬롯 이 만료되면 커널은 CPU를 CPU에서 가져옵니다. 따라서 선제 적 운영 체제에서 잘못 작성되었거나 제대로 작동하지 않는 프로세스는 OS를 정지 시키거나 다른 프로세스가 실행되지 않도록 할 수 없습니다. 리눅스는 항상 사용자 공간 프로세스를 선점했습니다.
Big Kernel Lock은 경우에 따라 커널 공간 내에 여전히 잠금이있어 다른 프로세스가 보호 된 코드를 실행하지 못하게 할 수 있음을 의미합니다. 예를 들어, 여러 파일 시스템을 동시에 마운트 할 수 없었 습니다. 여러 마운트 명령을 제공 한 경우 Big Kernel Lock을 할당하는 데 필요한 마운트 작업으로 인해 계속 실행되었습니다.
커널을 선점 적으로 만들려면이 큰 커널 잠금을 제거해야했습니다. 즉, 마운트와 다른 작업을 동시에 실행할 수 있어야합니다. 큰 일이었습니다.
역사적으로 이것은 SMP (멀티 CPU 지원)의 지원이 증가함에 따라 정말 시급했습니다. 처음에는 실제로 여러 개의 CPU 메인 보드가있었습니다. 나중에 여러 개의 CPU ( "코어")가 단일 칩에 통합되었으므로 오늘날 실제로는 여러 개의 CPU 메인 보드는 거의 사용되지 않습니다 (일반적으로 값 비싼 서버 시스템에 있음). 또한 실제로 단일 코어 시스템 (단일 코어가있는 단일 CPU 만있는 경우)은 거의 없습니다.
따라서 귀하의 질문에 대한 대답은 항상 선점했기 때문에 "비 선점의 이유는 무엇입니까"가 아닙니다. 실제 질문은 선점 커널 실행이 실제로 필요한 이유 입니다. 이에 대한 대답은 많은 CPU, 많은 코어 시스템의 비율이 증가한다는 것입니다.
이것은 기술적 인 답변이 아니라 OP가 제기 한 특정 질문 에 대한 역사적 답변입니다 . "오래된 Linux 커널의 비선 점적 이유는 무엇입니까?"
(나는 그의 대답과 의견에서 @peterh가 설명했듯이 OP는 "비 선점"에 의해 하나의 사용자 프로세스 만 (API에서) 커널 내부에 (API에서) 하나의 사용자 프로세스 만있을 수 있다는 사실을 언급한다고 가정합니다. 시간 및 / 또는 큰 커널 잠금.)
Linus Torvalds는 운영 체제의 작동 방식을 배우는 데 관심이 있었고, 배우는 방식은 운영 체제를 작성하는 것이 었습니다. 그의 모델, 기본 및 초기 개발 환경은 교육 목적을위한 기존 OS (예 : 프로덕션 OS가 아님) 인 Minix였으며, 당시에는 오픈 소스에서와 같이 비어 있지 않았습니다. 어느 한 쪽).
그래서 그는 선점없이 커널을 작성했습니다 (다른 답변에서 언급 된 Big Kernel Lock). 새로운 OS를 교육 목적으로 빠르게 시작하고 실행하려면 원하는 방식으로 수행하십시오. 그 방식은 훨씬 간단합니다. 사용자 프로그램과 장치의 동시 멀티 프로그래밍을 지원하는 커널은 충분히 어렵습니다. 커널 자체를 동시에 만드는 것은 매우 어렵습니다.
만약 그가 대중적 / 유용한 / 중요한 리눅스가 어떻게 될지 알았다면 아마도 같은 방식으로했을 것이다. (IMO 만, 그가 실제로 어떻게 생각하는지 모르겠습니다.) 달리기 전에 걸어야하기 때문입니다.
a) 오늘날 리눅스를 만드는 데있어서 다른 많은 작업이 있었으며 (또는 그 당시의 상황까지도) b) 그것을 바꾸는 것이 큰 어려움을 겪었 기 때문에 오랫동안 그렇게 유지했습니다. (다른 답변에서 설명한 바와 같이).