참고 : Daniel P. Bovet, Marco Cesati 의 Linux 커널 이해 , 3 판
- 출판사 : O'Reilly
- 출판 일 : 2005 년 11 월
- ISBN : 0-596-00565-2
- 페이지 : 942
Daniel P. Bovet과 Marco Cesati는 다음과 같이 소개했습니다.
기술적으로 말하자면 Linux는 파일 시스템 유틸리티, 윈도우 시스템 및 그래픽 데스크탑, 시스템 관리자 명령, 텍스트 편집기, 컴파일러 등과 같은 모든 응용 프로그램을 포함하지 않기 때문에 전체 Unix 운영 체제는 아니지만 진정한 Unix 커널입니다. 의 위에. 이 책에서 읽고 Linux 커널에서 보는 내용은 다른 Unix 변형도 이해하는 데 도움이 될 수 있습니다.
다음 단락에서는 "리눅스 커널 이해하기"에 제시된 사실에 대한 나의 이해를 바탕으로 당신의 관점을 다루려고 노력할 것입니다.
프로세스는 무엇을 의미합니까? :
프로세스는 인간과 같으며, 생성되고, 다소 중요한 수명을 가지며, 선택적으로 하나 이상의 자식 프로세스를 생성하고 결국 죽습니다. 프로세스에는 코드 ( "텍스트"), 데이터 (VM), 스택, 파일 I / O 및 신호 테이블의 5 가지 기본 부분이 있습니다.
커널에서 프로세스의 목적은 시스템 자원 (CPU 시간, 메모리 등)이 할당되는 엔티티로 작동하는 것입니다. 프로세스가 생성되면 부모 프로세스와 거의 동일합니다. 부모 주소 공간의 (논리적) 사본을 수신하고 프로세스 작성 시스템 호출 다음에 나오는 다음 명령에서 시작하여 부모와 동일한 코드를 실행합니다. 부모와 자식은 프로그램 코드 (텍스트)가 포함 된 페이지를 공유 할 수 있지만 별도의 데이터 복사본 (스택 및 힙)을 가지므로 자식이 메모리 위치로 변경 한 내용은 부모에게 보이지 않으며 그 반대도 마찬가지입니다. .
프로세스는 어떻게 작동합니까?
실행 프로그램에는 컴퓨터에 수행 할 작업을 알려주는 이진 코드 이상의 것이 필요합니다. 프로그램을 실행하려면 메모리와 다양한 운영 체제 리소스가 필요합니다. "프로세스"는 작동에 필요한 모든 리소스와 함께 메모리에로드 된 프로그램을 말합니다. 스레드는 프로세스 내에서 실행 단위입니다. 프로세스는 하나의 스레드에서 많은 스레드까지 어디든 가질 수 있습니다. 프로세스가 시작되면 메모리와 리소스가 할당됩니다. 프로세스의 각 스레드는 해당 메모리와 리소스를 공유합니다. 단일 스레드 프로세스에서 프로세스에는 하나의 스레드가 포함됩니다. 프로세스와 스레드는 동일하며 한 가지만 발생합니다. 다중 스레드 프로세스에서 프로세스는 둘 이상의 스레드를 포함하며 프로세스는 동시에 여러 가지 작업을 수행합니다.
다중 처리 시스템의 역학에는 다음과 같은 경량 및 중량 공정이 포함됩니다.
헤비급 프로세스에서는 여러 프로세스가 동시에 실행됩니다. 각각의 헤비급 프로세스에는 자체 메모리 주소 공간이 있습니다. 프로세스마다 다른 메모리 주소가 있으므로 프로세스 간 통신이 느립니다. 프로세스 간 컨텍스트 전환이 더 비쌉니다. 프로세스는 다른 프로세스와 메모리를 공유하지 않습니다. 이러한 프로세스 간의 통신에는 소켓 또는 파이프와 같은 추가 통신 메커니즘이 필요합니다.
가벼운 프로세스에서 스레드라고도합니다. 스레드는 워크로드를 공유하고 나누는 데 사용됩니다. 스레드는 자신이 속한 프로세스의 메모리를 사용합니다. 동일한 프로세스의 스레드가 자신이 속한 프로세스와 메모리를 공유하므로 스레드 간 통신이 프로세스 간 통신보다 빠를 수 있습니다. 결과적으로 스레드 간의 통신은 매우 간단하고 효율적입니다. 동일한 프로세스의 스레드 간 컨텍스트 전환은 비용이 적게 듭니다. 스레드는 동일한 프로세스의 다른 스레드와 메모리를 공유
사용자 레벨 스레드와 커널 레벨 스레드의 두 가지 스레드 유형이 있습니다. 사용자 수준 스레드는 커널을 피하고 자체적으로 작업을 관리합니다. 사용자 수준 스레드는 단일 스레드가 시간 조각을 독점하여 작업 내 다른 스레드를 고갈시킬 수 있다는 문제가 있습니다. 사용자 수준 스레드는 일반적으로 사용자 공간에서 커널 위에서 지원되며 커널 지원없이 관리됩니다. 커널은 사용자 수준 스레드에 대해 전혀 모르고 마치 단일 스레드 프로세스 인 것처럼 관리합니다. 따라서 사용자 수준 스레드는 매우 빠르며 커널 스레드보다 100 배 빠르게 작동합니다.
커널 수준 스레드는 종종 여러 작업을 사용하여 커널에서 구현됩니다. 이 경우 커널은 각 프로세스의 타임 슬라이스 내에 각 스레드를 예약합니다. 여기에서 클럭 틱이 스위칭 시간을 결정하기 때문에 작업이 작업 내의 다른 스레드에서 시간 조각을 호그 할 가능성이 적습니다. 커널 수준 스레드는 운영 체제에서 직접 지원하고 관리합니다. 사용자 수준 스레드와 커널 수준 스레드 간의 관계는 완전히 독립적 인 것은 아니며 실제로이 두 수준간에 상호 작용이 있습니다. 일반적으로 사용자 수준 스레드는 다 대일, 일대일, 다 대다 및 2 단계 모델의 4 가지 모델 중 하나를 사용하여 구현할 수 있습니다. 이 모든 모델은 사용자 수준 스레드를 커널 수준 스레드에 매핑하고 두 수준간에 서로 다른 수준의 상호 작용을 유발합니다.
스레드와 프로세스
- 프로그램은 프로그래밍 코드의 텍스트 파일로 시작합니다.
- 프로그램은 바이너리 형태로 컴파일되거나 해석됩니다.
- 프로그램이 메모리에로드되고
- 프로그램은 하나 이상의 실행중인 프로세스가됩니다.
- 프로세스는 일반적으로 서로 독립적입니다.
- 스레드는 프로세스의 하위 집합으로 존재합니다.
- 스레드는 프로세스보다 더 쉽게 서로 통신 할 수 있습니다.
- 그러나 스레드는 동일한 프로세스에서 다른 스레드로 인한 문제에 더 취약합니다.
참고 문헌 :
Linux 커널, 3 판 이해
추가 1 2 3 4 5
...............................................
이제이 모든 용어를 단순화 해 보겠습니다 ( 이 단락은 저의 관점에서 왔습니다 ). 커널은 소프트웨어와 하드웨어 사이의 인터페이스입니다. 다시 말해, 커널은 두뇌처럼 행동합니다. 그것은 유전 물질 (즉, 코드와 그 파생 소프트웨어)과 신체 시스템 (즉, 하드웨어 또는 근육) 사이의 관계를 조작합니다.
이 뇌 (즉, 커널)는 그에 따라 작동하는 프로세스에 신호를 보냅니다. 이러한 과정 중 일부는 근육 (예 : 실)과 유사하며 각 근육에는 고유 한 기능과 작업이 있지만 모두 함께 작동하여 작업을 완료합니다. 이 실들 (즉, 근육들) 사이의 의사 소통은 매우 효율적이고 간단하므로 매끄럽고 빠르고 효과적으로 업무를 수행합니다. 일부 실 (예 : 근육)은 사용자의 통제하에 있습니다 (예 : 손과 다리의 근육). 다른 사람들은 우리가 통제하지 않는 우리의 뱃속, 눈, 심장의 근육과 같은 뇌 통제하에 있습니다.
사용자 공간 스레드는 커널을 피하고 작업 자체를 관리합니다. 종종 이것을 "협업 멀티 태스킹"이라고하며 실제로 상지 및하지와 같으며, 우리 자신의 통제하에 있으며 작업 (예 : 운동 또는 ...)을 달성하기 위해 모두 함께 작동하며 직접 주문이 필요하지 않습니다. 뇌. 반면 커널 공간 스레드는 커널과 해당 스케줄러에 의해 완전히 제어됩니다.
...............................................
귀하의 질문에 대한 답변으로 :
프로세스는 항상 하나 이상의 경량 프로세스를 기반으로 구현됩니까? 그림 3.4는 그렇습니다. 그림 3.5 (a)는 왜 CPU 위에서 직접 프로세스를 보여줍니까?
예, 스레드라고하는 가벼운 프로세스와 무거운 프로세스가 있습니다.
헤비급 프로세스 (신호 스레드 프로세스라고 부를 수 있음)는 프로세서 자체에서 실행을 주문하기 위해 더 많은 작업을 수행해야하므로 그림 3.5 (a)는 CPU 위에 직접 프로세스를 표시합니다.
경량 프로세스는 항상 커널 스레드를 기반으로 구현됩니까? 그림 3.4는 그렇습니다. 왜 그림 3.5 (b)가 공정 위에 직접 경량 공정을 보여줍니까?
경량 프로세스는 위에서 언급 한대로 사용자 레벨 프로세스와 커널 레벨 프로세스의 두 가지 범주로 나뉩니다. 사용자 수준 프로세스는 자체 라이브러리를 사용하여 작업을 처리합니다. 커널 자체는 커널 수준 프로세스를 예약합니다. 사용자 수준 스레드는 다 대일, 일대일, 다 대다 및 2 단계의 4 가지 모델 중 하나를 사용하여 구현할 수 있습니다. 이러한 모델은 모두 사용자 수준 스레드를 커널 수준 스레드에 매핑합니다.
커널 스레드가 유일한 엔티티를 예약 할 수 있습니까?
커널 수준 스레드는 커널 자체에 의해 생성됩니다. 커널 수준 스레드에는 제한된 주소 공간이 없다는 점에서 사용자 수준 스레드와 다릅니다. 그것들은 오직 커널 공간에서만 살며 절대 사용자 영역으로 전환하지 않습니다. 그러나 일반적인 프로세스와 마찬가지로 완전히 예약 가능하고 선점 가능한 엔티티입니다 (참고 : 중요한 커널 작업에 대해 거의 모든 인터럽트를 비활성화 할 수 있습니다). 커널 자체 스레드의 목적은 주로 시스템에서 유지 관리 업무를 수행하는 것입니다. 커널 만이 커널 스레드를 시작하거나 중지 할 수 있습니다. 다른 한편으로, 사용자 수준 프로세스는 자체 라이브러리를 기반으로 자체 일정을 계획 할 수 있으며 동시에 2 단계 및 다 대다 모델 (위에서 언급 한)을 기반으로 커널에서 예약 할 수 있습니다.
기본 커널 스레드를 예약하여 경량 프로세스를 간접적으로 만 예약합니까?
커널 스레드는 커널 스케줄러 자체에 의해 제어됩니다. 사용자 수준에서 스레드를 지원한다는 것은 응용 프로그램과 연결된 사용자 수준 라이브러리가 있으며 CPU가 아닌이 라이브러리는 런타임에 스레드를 지원하는 모든 관리 기능을 제공한다는 것을 의미합니다. 스레드 추상화를 구현하는 데 필요한 데이터 구조를 지원하고 이러한 스레드에 대한 자원 관리 결정을 내리는 데 필요한 모든 스케줄링 동기화 및 기타 메커니즘을 제공합니다. 이제 일부 사용자 수준 스레드 프로세스를 기본 커널 수준 스레드에 매핑 할 수 있으며 여기에는 일대일, 일대 다 및 다 대다 매핑이 포함됩니다.
기본 경량 프로세스를 예약하여 프로세스를 간접적으로 만 예약합니까?
무거운 프로세스인지 가벼운 프로세스인지에 따라 다릅니다. 커널 자체에 의해 예약 된 프로세스는 무겁습니다. 가벼운 프로세스는 커널 수준과 사용자 수준에서 관리 할 수 있습니다.