Vahalia의 Unix Internal에는 프로세스, 커널 스레드, 경량 프로세스 및 사용자 스레드 간의 관계를 보여주는 다이어그램이 있습니다. 이 책은 SVR4.2에 가장 중점을 두고 있지만 4.4BSD, Solaris 2.x, Mach 및 Digital UNIX에 대해서도 자세히 설명합니다. 나는 Linux에 대해 묻는 것이 아니라는 점에 유의하십시오.
각 프로세스마다 프로세스 아래에 항상 하나 이상의 경량 프로세스가 있습니까? 그림 3.4는 그렇다고 대답하는 것 같습니다.
그림 3.5(a)에서 중간에 경량 프로세스 없이 CPU에서 직접 프로세스를 보여주는 이유는 무엇입니까?
각각의 경량 프로세스에 대해 경량 프로세스의 기반이 되는 커널 스레드는 항상 하나만 있습니까? 그림 3.4는 그렇다고 대답하는 것 같습니다.
그림 3.5(b)에서 중간에 커널 스레드 없이 프로세스 바로 위에 경량 프로세스가 표시되는 이유는 무엇입니까?
커널 스레드가 예약할 수 있는 유일한 엔터티입니까?
경량 프로세스는 기본 커널 스레드를 예약하여 간접적으로만 예약됩니까?
기본 경량 프로세스를 예약하여 프로세스를 간접적으로만 예약합니까?
고쳐 쓰다:
Linux에 대해서도 비슷한 질문을 했습니다.Linux의 경량 프로세스가 커널 스레드에 연결되어 있습니까? "운영 체제 개념"이라는 책에서는 개념을 소개하기 위해 암시적으로 Unix를 사용하고 있고 Unix와 Linux는 다를 수 있기 때문에 Unix 커널에 대해 읽었습니다.
현재 답변에 감사드립니다. 하지만 다른 답변을 받을 수 있도록 스레드를 다시 열고 싶습니다.
답변1
바라보다:Linux 커널에 대해 알아보기, 3판, 작성자: Daniel P. Bovet, Marco Cesati
- 출판사: 오라일리
- 출시일: 2005년 11월
- ISBN: 0-596-00565-2
- 페이지 수: 942
Daniel P. Bovet과 Marco Cesati는 소개에서 다음과 같이 말합니다.
기술적으로 Linux는 진정한 Unix 커널이지만 파일 시스템 유틸리티, 창 시스템 및 그래픽 데스크톱, 시스템 관리자 명령, 텍스트 편집 변환기, 컴파일러 등과 같은 모든 응용 프로그램을 포함하지 않기 때문에 완전한 Unix 운영 체제는 아닙니다. 따라서 이 책에서 읽고 Linux 커널에서 보는 내용은 다른 Unix 변형을 이해하는 데에도 도움이 될 수 있습니다.
다음 단락에서는 Unix의 커널과 거의 유사한 Linux 커널 이해에서 제시된 사실에 대한 나의 이해를 바탕으로 귀하의 요점을 설명하려고 노력할 것입니다.
과정은 무슨 뜻인가요?:
프로세스는 인간과 유사하며 생성되고 다소 중요한 수명을 가지며 하나 이상의 하위 프로세스를 선택적으로 생성하고 결국 종료됩니다. 프로세스는 코드("텍스트"), 데이터(VM), 스택, 파일 I/O 및 신호 테이블의 다섯 가지 기본 부분으로 구성됩니다.
커널에서 프로세스의 목적은 시스템 리소스(CPU 시간, 메모리 등)를 할당하는 엔터티 역할을 하는 것입니다. 프로세스가 생성되면 상위 프로세스와 거의 동일합니다. 이는 상위 주소 공간의 (논리적) 복사본을 수신하고 프로세스 생성 시스템 호출 후 다음 명령어부터 시작하여 상위와 동일한 코드를 실행합니다. 부모와 자식은 프로그램 코드(텍스트)가 포함된 페이지를 공유할 수 있지만 별도의 데이터 복사본(스택 및 힙)을 가지므로 자식이 메모리 위치를 변경한 내용은 부모에게 표시되지 않습니다(그 반대의 경우도 마찬가지).
프로세스는 어떻게 진행되나요?
프로그램을 실행하려면 컴퓨터에 수행할 작업을 알려주는 바이너리 코드 이상의 것이 필요합니다. 이 프로그램을 실행하려면 메모리와 다양한 운영 체제 리소스가 필요합니다. "프로세스"는 우리가 프로그램이라고 부르는 것이며 실행에 필요한 모든 리소스와 함께 메모리에 로드됩니다. 스레드는 프로세스 내의 실행 단위입니다. 프로세스에는 하나의 스레드부터 여러 스레드까지 있을 수 있습니다. 프로세스가 시작되면 메모리와 리소스가 할당됩니다. 프로세스의 각 스레드는 이 메모리와 리소스를 공유합니다. 단일 스레드 프로세스에서는 프로세스에 하나의 스레드가 포함됩니다. 프로세스와 스레드는 동일하며 한 가지 일만 발생합니다. 다중 스레드 프로세스에서는 프로세스에 여러 스레드가 포함되어 있으며 동시에 많은 작업을 수행합니다.
다중 처리 시스템의 메커니즘에는 경량 프로세스와 중량 프로세스가 포함됩니다.
중량급 프로세스에서는 여러 프로세스가 병렬로 실행됩니다. 각 병렬 헤비급 프로세스에는 자체 메모리 주소 공간이 있습니다. 프로세스는 메모리 주소가 다르기 때문에 프로세스 간 통신이 느립니다. 프로세스 간 컨텍스트 전환은 비용이 더 많이 듭니다. 프로세스는 다른 프로세스와 메모리를 공유하지 않습니다. 이러한 프로세스 간의 통신에는 소켓이나 파이프와 같은 추가 통신 메커니즘이 포함됩니다.
경량 프로세스에서는 스레드라고도 합니다. 스레드는 작업 부하를 공유하고 나누는 데 사용됩니다. 스레드는 자신이 속한 프로세스의 메모리를 사용합니다. 스레드 간 통신은 동일한 프로세스의 스레드가 자신이 속한 프로세스와 메모리를 공유하기 때문에 프로세스 간 통신보다 빠릅니다. 따라서 스레드 간의 통신은 매우 간단하고 효율적입니다. 동일한 프로세스의 스레드 간 컨텍스트 전환은 비용이 저렴합니다. 스레드는 동일한 프로세스의 다른 스레드와 메모리를 공유합니다.
스레드에는 사용자 수준 스레드와 커널 수준 스레드의 두 가지 유형이 있습니다. 사용자 수준 스레드는 커널을 피하고 자체 작업을 관리합니다. 단일 스레드가 시간 조각을 독점하여 작업의 다른 스레드를 고갈시킬 수 있는 사용자 수준 스레드에는 문제가 있습니다. 사용자 수준 스레드는 일반적으로 사용자 공간의 커널 위에서 지원되며 커널 지원 없이 관리됩니다. 커널은 사용자 수준 스레드에 대해 아무것도 모르고 단일 스레드 프로세스처럼 관리합니다. 따라서 사용자 수준 스레드는 매우 빠르며 커널 스레드보다 최대 100배 빠르게 실행됩니다.
커널 수준 스레드는 일반적으로 여러 작업을 사용하여 커널에서 구현됩니다. 이 경우 커널은 각 프로세스의 시간 조각 내에서 각 스레드를 예약합니다. 여기서는 시계 틱이 전환 시간을 결정하므로 작업이 작업 내의 다른 스레드에서 시간 조각을 가져갈 가능성이 없습니다. 커널 수준 스레드는 운영 체제에서 직접 지원하고 관리합니다. 사용자 수준 스레드와 커널 수준 스레드 간의 관계는 완전히 독립적이지 않습니다. 실제로 두 수준 간에는 상호 작용이 있습니다. 일반적으로 사용자 수준 스레드는 다대일, 일대일, 다대다 및 2레벨 모델의 네 가지 모델 중 하나를 사용하여 구현할 수 있습니다. 이러한 모델은 모두 사용자 수준 스레드를 커널 수준 스레드에 매핑하고 두 수준 간의 상호 작용 수준이 다양합니다.
스레드와 프로세스
- 프로그램은 프로그래밍 코드의 텍스트 파일로 시작됩니다.
- 프로그램은 바이너리 형식으로 컴파일되거나 해석됩니다.
- 프로그램이 메모리에 로드되고,
- 프로그램은 하나 이상의 실행 프로세스가 됩니다.
- 프로세스는 일반적으로 서로 독립적입니다.
- 스레드는 프로세스의 하위 집합으로 존재합니다.
- 스레드 간의 통신은 프로세스보다 쉽고,
- 그러나 스레드는 동일한 프로세스의 다른 스레드로 인해 발생하는 문제에 더 취약합니다.
인용하다:
................................................. ...............
이제 이 모든 용어를 단순화해 보겠습니다(이 단락은 내 관점에서 나온 것입니다.). 커널은 소프트웨어와 하드웨어 간의 인터페이스입니다. 즉, 핵심은 뇌와 같습니다. 이는 유전 물질(예: 코드 및 파생 소프트웨어)과 신체 시스템(예: 하드웨어 또는 근육) 간의 관계를 조작합니다.
이 두뇌(즉, 커널)는 프로세스에 신호를 보내고 프로세스는 그에 따라 작동합니다. 이러한 프로세스 중 일부는 근육(예: 실)과 유사하며 각 근육은 고유한 기능과 임무를 갖고 있지만 모두 함께 작동하여 작업량을 완료합니다. 이러한 실(즉, 근육) 사이의 의사소통은 매우 효율적이고 간단하므로 원활하고 빠르고 효과적으로 작업을 수행합니다. 일부 스레드(예: 근육)는 사용자(예: 손과 다리의 근육)의 제어를 받습니다. 다른 것들은 뇌에 의해 제어됩니다(예: 우리가 제어할 수 없는 위, 눈, 심장의 근육).
사용자 공간 스레드는 커널을 피하고 작업 자체를 관리합니다. 종종 이것은 "협업 멀티태스킹"이라고 불리며 실제로는 상지와 하지와 같습니다. 이는 우리 자신의 통제하에 있으며 함께 작동하여 작업을 완료합니다(예: 연습 또는...). 뇌에 직접적인 명령이 필요하지 않습니다. 반면에 커널 공간 스레드는 커널과 해당 스케줄러에 의해 완전히 제어됩니다.
................................................. ...............
귀하의 질문에 대한 답변:
프로세스는 항상 하나 이상의 경량 프로세스를 기반으로 구현됩니까? 그림 3.4는 그렇다고 대답하는 것 같습니다. 그림 3.5(a)가 CPU에 직접 위치한 프로세스를 보여주는 이유는 무엇입니까?
예, 스레드라고 하는 가벼운 프로세스와 무거운 프로세스가 있습니다.
중량급 프로세스(신호 스레드 프로세스라고 부를 수 있음)는 실행 명령을 내리기 위해 프로세서 자체에서 더 많은 작업을 필요로 합니다. 이것이 바로 그림 3.5(a)가 CPU에 직접 위치하는 프로세스를 보여주는 이유입니다.
경량 프로세스는 항상 커널 스레드를 기반으로 구현됩니까? 그림 3.4는 그렇다고 대답하는 것 같습니다. 그림 3.5(b)가 프로세스 바로 위에 경량 프로세스를 표시하는 이유는 무엇입니까?
아니요, 경량 프로세스는 위에서 언급한 것처럼 사용자 수준 프로세스와 커널 수준 프로세스라는 두 가지 범주로 나뉩니다. 사용자 수준 프로세스는 자체 라이브러리를 사용하여 작업을 처리합니다. 커널 자체는 커널 수준 프로세스를 예약합니다. 사용자 수준 스레드는 다대일, 일대일, 다대다 및 2레벨의 네 가지 모델 중 하나를 사용하여 구현할 수 있습니다. 이러한 모든 모델은 사용자 수준 스레드를 커널 수준 스레드에 매핑합니다.
커널 스레드가 예약할 수 있는 유일한 엔터티입니까?
아니요, 커널 수준 스레드는 커널 자체에서 생성됩니다. 커널 수준 스레드에는 제한된 주소 공간이 없다는 점에서 사용자 수준 스레드와 다릅니다. 커널 공간에만 존재하며 사용자 공간 영역으로 전환되지 않습니다. 그러나 이는 일반 프로세스와 마찬가지로 완전히 예약 가능하고 선점 가능한 엔터티입니다(참고: 거의 모든 중요한 커널 작업에 대해 인터럽트를 비활성화할 수 있습니다). 커널 자체 스레드의 목적은 주로 시스템에서 유지 관리 작업을 수행하는 것입니다. 커널만이 커널 스레드를 시작하거나 중지할 수 있습니다. 반면, 사용자 수준 프로세스는 자체 라이브러리를 기반으로 자체적으로 예약할 수 있는 반면, 2수준 및 다대다 모델(위에서 언급한)을 기반으로 커널에 의해 예약될 수 있으므로 특정 사용자를 바인딩할 수 있습니다. -레벨 스레드를 단일 커널 레벨 스레드로.
경량 프로세스는 기본 커널 스레드를 예약하여 간접적으로만 예약됩니까?
커널 스레드는 커널 스케줄러 자체에 의해 제어됩니다. 사용자 수준에서 스레드를 지원한다는 것은 애플리케이션과 연결된 사용자 수준 라이브러리가 있고 해당 라이브러리(CPU가 아닌)가 스레드에 대한 런타임 지원의 모든 관리를 제공한다는 의미입니다. 이는 스레드 추상화를 구현하는 데 필요한 데이터 구조를 지원하고 이러한 스레드에 대한 리소스 관리 결정을 내리는 데 필요한 모든 예약 동기화 및 기타 메커니즘을 제공합니다. 이제 일대일, 일대다 및 다대다 매핑을 포함하여 일부 사용자 수준 스레드 프로세스를 기본 커널 수준 스레드에 매핑할 수 있습니다.
기본 경량 프로세스를 예약하여 프로세스를 간접적으로만 예약합니까?
중량급 프로세스인지 경량 프로세스인지에 따라 다릅니다. 무거운 프로세스는 커널 자체에 의해 예약된 프로세스입니다. 가벼운 프로세스는 커널 수준과 사용자 수준에서 관리할 수 있습니다.