Linux는 단일 코어 시스템에서 CPU 제어를 어떻게 유지합니까?

Linux는 단일 코어 시스템에서 CPU 제어를 어떻게 유지합니까?

존재하다Linux에서 프로세스를 "종료"하는 방법은 무엇입니까?Linux는 메모리를 풀에 반환하여 프로세스를 종료한다고 설명됩니다.

단일 코어 머신에서 실제로 이 작업을 어떻게 수행합니까? 프로세스를 종료하려면 CPU 시간이 필요하며, 프로세스가 양보하지 않고 매우 오랫동안 실행되는 계산을 수행하는 경우 Linux는 프로세스를 종료할 수 있을 만큼 오랫동안 프로세서를 어떻게 제어할 수 있습니까?

답변1

커널은 정상 작동 중에 프로세스가 시스템 호출을 호출할 때마다, 인터럽트가 발생할 때마다 매우 자주 제어권을 갖습니다. 하드웨어가 CPU의 주의를 필요로 하거나 CPU가 커널의 주의를 필요로 할 때 인터럽트가 발생하며, 하드웨어의 특정 부분이 주기적으로 주의(타이머)를 요청하도록 프로그래밍될 수 있습니다. 따라서 커널은 시스템이 너무 심하게 잠겨 더 이상 인터럽트가 생성되지 않는 한 주기적으로 호출되도록 보장할 수 있습니다.

그러므로,

프로세스가 결과를 산출하지 않고 매우 오랫동안 실행되는 계산을 수행하는 경우

질문이 아닙니다. Linux는선제적 멀티태스킹운영 체제,실행 중인 프로그램의 협력 없이 멀티태스킹을 수행할 수 있습니다.

프로세스 종료와 관련하여 어쨌든 커널이 관련됩니다. 프로세스가 다른 프로세스를 종료하려면 이를 위해 커널을 호출해야 하므로 커널이 제어권을 갖습니다. 커널이 프로세스를 종료하기로 결정한 경우(예를 들어또한 OOM 킬러로 인해 제어되거나 프로세스가 수행이 허용되지 않는 작업(예: 매핑되지 않은 메모리에 액세스)을 수행하려고 시도하기 때문에 제어됩니다.

커널은 다음과 같이 구성될 수 있습니다.아니요제어 시스템 CPU 자체의 하위 집합(더 이상 사용되지 않음)isolcpus커널 매개변수) 또는 일부 CPU 자체에서 작업을 예약하지 않으려면(사용중앙 처리 유닛로드 밸런싱이 필요 없으며 완벽하게 통합되어 있습니다.c그룹 v1그리고c그룹 v2); 하지만 시스템에 있는 적어도 하나의 CPU는 항상 커널에 의해 완전히 관리되어야 합니다. 그럼 충분해구성되었습니다특정 CPU 사용량에 따라 생성되는 타이머 인터럽트 수를 줄입니다.

또한 단일 CPU(단일 코어 등) 시스템과 다중 CPU 시스템 간에는 큰 차이가 없습니다. 커널 제어에 관한 한 동일한 문제가 두 시스템 모두에 적용됩니다. 각 CPU는 주기적으로 커널을 호출해야 합니다(만약 그것은). 커널 제어 하의 멀티태스킹에 사용됩니다.

답변2

Linux 및 대부분의 최신 운영 체제에서는선제적 멀티태스킹이는 커널이 각 프로세스의 실행 시간을 완전히 제어할 수 있으며, 프로세스가 너무 오래 실행되는 경우 프로세스를 선점한다는 의미입니다.협업 멀티태스킹프로세스는 언제든지 제어를 통과합니다.

기본적으로 선점형 멀티태스킹에서 커널은 타이머에서 주기적으로 실행되며 커널이 제어 상태에 있을 때마다(타이머 인터럽트가 발생하거나 시스템 호출이 호출될 때) 커널은 현재 프로세스의 컨텍스트를 저장한 다음 다음 프로세스로 전환' 필요한 경우 컨텍스트를 제공하세요. 이것은 ... 불리운다컨텍스트 스위치프로세스의 전체 상태(모든 스레드 정보, 레지스터 값 등 포함)가 저장되고 복원되므로 프로세스가 계속 실행되고 있지 않다는 사실조차 알지 못한 채 선점된 정확한 지점부터 계속 실행될 수 있습니다. 따라서 많은 프로세스가나타나다실제로는 언제든지 1개의 프로세스만 실행되더라도 단일 CPU 코어에서 동시에 실행됩니다. 커널은 또한 모든 프로세스와 리소스 처리를 담당하는 특별한 프로세스일 뿐입니다. 다른 프로세스를 모니터링하기 위해 별도의 코어에서 실행되지 않습니다.

당신은 또한 볼 수 있습니다"Linux 커널은 선점형입니다"란 무엇을 의미합니까?

답변3

좀 이상한 상황에서(임베디드 장치일 수도 있습니다.라즈베리 파이기준)Linux 커널을 가질 수 있습니다(바라보다kernel.org&kernelnewbies.org세부)매우 제한된 그룹 관리프로세스.

/sbin/init자신만의 프로그램을 작성할 수도 있습니다.

그러면 이 프로세스 세트를 완벽하게 제어할 수 있습니다.

(바라보다초기화(1)) 그런 식으로포크(2)-자식 프로세스가 적고 다른 프로세스를 사용합니다.시스템 호출(2).

이것운영체제 교과서이를 통해 더 많은 통찰력을 얻을 수 있으며 소스에서 Linux 커널을 컴파일하여 많은 것을 배울 수 있습니다. 실행할 첫 번째 명령은 make menuconfig(로컬 디스크에 전체 Linux 커널 트리가 있는 후)일 수 있습니다. 또한 읽어보세요고급 Linux 프로그래밍그리고신호(7),시간(7),VDS(7).

그러나 2020년 현재 대부분의 Linux 프로세서에는 코어가 2개 이상 있습니다. 많은 Linux 시스템에서 사용됨체계, 그 소스 코드는 다음과 같습니다오픈 소스(그리고 그것을 연구하고 개선할 수 있습니다). 다른 Linux 시스템을 사용할 수 있습니다.달리다(또한 오픈 소스). 기존 프로그램에서 관심과 영감을 얻어 init자신만의 프로그램을 작성할 수 있습니다.

한 번 살펴보고 싶을 수도 있습니다처음부터 리눅스, 그리고 소스 코드를 연구하세요crt0루틴, 그리고GNU 라이브러리(이것은무료 소프트웨어, 좋다걸프 협력 협의회그리고GNU 바이너리틸그리고GNU 배쉬예! )또는musl-libc 라이브러리.

관련된 개념은계속하다(물체화를 위한 멋진 이름호출 스택)그리고전화/참조구성표 기본 요소. 그러니 읽어보세요R5RS,ACM 신호 이니셔티브회의록(예:PLDI), Quinek의 책Lisp의 작은 조각, 그리고 피에트라의 책인공생물어쩌면 있을 수도 있지이 초안보고서(작성자:이륜 전차). 깨닫다라이스의 정리.

당신이 사용하는 경우걸프 협력 협의회foo.c, 코드를 컴파일한 다음 gcc -Wall -Wextra -fverbose-asm -S foo.c내부를 살펴보는 것을 잊지 마세요.foo.s

이것OSDEV 웹사이트운영 체제 커널 작성(및 해당 소스 코드 연구)에 대한 실제 정보도 제공됩니다. 당신은 관심이있을 수 있습니다특이점소프트웨어와포스뎀그리고ACM 시그푸스회의.

다음을 사용하고 싶을 수도 있습니다 /proc/(참조공정(5)) 그러면 Linux 커널이 처리 중임을 확인할 수 있습니다.방해하다자주 발생합니다(보통 초당 수백 개의 인터럽트). 각 인터럽트(예:고온 PET)은 (Linux 커널의 경우) 다른 프로세스를 예약할 수 있는 기회입니다.

하드웨어가 초당 수백 개의 인터럽트를 제공하지 않는 경우 하드웨어 공급자나 설계자와 이에 대해 논의해야 합니다.

프로세스가 결과를 생성하지 않고 매우 장기간 실행되는 계산을 수행하고 있습니다.

Linux에서는 커널이나 하드웨어에 문제가 없는 한 이런 일이 절대 발생하지 않습니다.

존재하다사용자 공간프로세스는 초당 최소 수십 번 중단됩니다(2020년 대부분의 하드웨어에서). 읽다커널 선점그리고컨텍스트 스위치.

컨텍스트 스위치가 현재 연속을 변경하고 있음을 관찰하십시오. 추상적인 수준에서 인터럽트는 일부 call/cc인터럽트 에 가깝습니다.계획.

답변4

간단히 말해서 커널은 시스템의 절대적인 독재자입니다 * . 그것은 통제한다언제프로세스는 선점형 멀티태스킹 커널이 되어 자원을 획득하고 제어권을 가집니다.무엇획득한 자원. (요청한 자원을 처리하고, 자원이 있으면 커널이 이를 제공한다. 자원이 없으면 자원을 제공하지 않는다.)

절대 독재자로서 핵심은 필요하다고 판단되면 그들을 죽일 수 있습니다.

* 항상 예외와 극단적인 경우가 있습니다.

관련 정보