Post

[OS] Chapter 3 프로세스와 스레드

summary of OS chapter 3

  • 프로세스가 생성된 후 작업을 마칠 때까지 어떤 상태를 거치고, 각 상태의 특징, 프로세스 제어 블록에 대해 살펴본다.
  • 스레드와 프로세스를 비교해본다.

1. 프로세스의 개요

1.1 프로세스의 개념

  • 프로그램은 저장장치에 저장되어 있는 정적인 상태이고, 프로세스는 실행을 위해 메모리에 올라온 동적인 상태이다.
  • 레시피가 프로그램, 요리가 프로세스로 비유할 수 있다.

1.2 요리사 모형에의 비유

  • 레스토랑에서 요리를 주문하여 나오기까지의 과정을 살펴보자.

1.2.1 주문서의 역할

  • 주문서에 담긴 내용 - 주문 순서, 일련번호, 테이블 번호, 몇 명, 요리, 특별 주문 사항

1.2.2 일괄 작업 방식의 요리

  • 가장 간단한 요리 제공 방식은 일괄 작업 시스템이다. ← 한번에 하나의 작업만 처리하는 것, 테이블이 하나인 식당
  • 주문 목록은 큐로 처리된다.

1.2.3 시분할 방식의 요리

  • CPU가 시간을 쪼개어 여러 프로세스에 적당히 배분함으로써 동시에 실행하는 것처럼 느껴지게 한다.
  • 주문서가 주문 목록에 올라온다는 것은 요리의 시작을 의미한다. 주문 목록이 삭제되면 해당 요리 작업이 종료되었음을 의미한다.

1.2.4 시분할 방식에서의 예상치 못한 상황 처리

  • 지연되는 요리가 있으면 대기 목록에서 기다렸다가 다시 제작 목록으로 옮긴다.
  • 언제 다시 시작될 지 모르는 주문서는 보류 목록으로 옮기고, 손님이 원하면 주문 목록으로 보낸다.

1.3 프로그램에서 프로세스로의 전환

  • 프로세스는 컴퓨터 시스템의 작업 단위로 테스크라고도 부른다.
  • 프로그램이 프로세스로 전환될 때 일어나는 일
    • 프로그램을 메모리의 적당한 위치로 가져온다. + 주문서에 해당 작업 지시서를 만든다 → 프로세스 제어 블록(주문서)을 의미한다.
  • 프로세스 제어블록에 있는 대표적인 3가지
    • 프로세스 구분자 - 프로세스를 구분하는 구분자
    • 메모리 관련 정보 - 실행하려는 프로세스의 메모리 상의 위치, 경계 레지스터, 한계 레지스터
    • 각종 중간값 - 어디까지 실행되었는지 표시하는 용도, 프로그램 카운터, 레지스터들
  • 프로세스가 종료되면 프로세스가 메모리에서 삭제되고 프로세스 제어 블록도 폐기된다.
  • 프로세스 = 프로그램 + 프로세스 제어블록
  • 컴퓨터 내에는 사용자가 실행한 프로세스만 있는 것이 아니다. → 사용자 프로세스와 운영체제의 커널 프로세스가 섞여서 실행된다.

1.4 프로세스의 상태

  • 운영체제에서도 여러가지 이유로 프로세스 상태가 변화된다.
  • 일괄 작업 시스템의 프로세스 상태는 생성, 실행, 완료이다.
  • 시분할 시스템에서의 프로세스 상태는 일괄 작업 시스템보다 복잡하다. ← 중간에 다른 프로세스에 CPU를 넘겨주는 일이 빈번하기 때문이다.

1.4.1 프로세스의 네 가지 상태

  • 생성 상태 - 프로세스가 메모리에 올라와 실행 준비를 완료한 상태이다. 프로세스 제어 블록이 생성된다.
  • 준비 상태 - 생성된 프로세스가 CPU를 얻을 때까지 기다리는 상태이다. 레스토랑의 예에서는 주문 목록이 준비 상태에 해당한다.
  • 실행 상태 - 준비 상태에 있는 프로세스 중 하나가 CPU를 얻어 실제 작업을 수행한다. 프로세스는 자신의 작업이 끝날 때까지 준비상태와 실행 상태를 왔다 갔다 한다.
  • 완료 상태 - 실행 상태의 프로세스가 주어진 시간 동안 작업을 마치면 완료 상태로 진입한다. ← 프로세스 제어 블록이 사라진 상태를 의미한다.
  • CPU 스케줄러 - 다음 실행할 프로세스를 선정하는 일을 하는 것, 준비상태 맨 앞에 있는 프로세스 제어 블록을 CPU에 전달하여 작업이 이루어지게 한다.
    • dispatch - 프로세서 하나를 준비 상태 → 실행 상태
  • 프로세스는 실행 상태에서 일정 시간 동안 작업을 하는데, 프로세스에 배당된 작업 시간을 타임 슬라이스, 타임 퀀텀이라고 부른다.
    • 하나의 타임 슬라이스 안에 작업을 끝내지 못 했다면 다시 준비 상태로 간다. 이를 타임 아웃이라고 한다.
  • CPU는 새로운 프로세스가 들어오면 알람을 맞춰둔다. 시간이 다되면 인터럽트를 사용해 CPU에게 알려준다.

1.4.2 프로세스의 다섯 가지 상태

  • 입출력을 요구한 프로세스가 입출력이 완료될 때까지 기다리는 상태를 대기 상태라고 한다. 이는 작업의 효율성을 높이기 위해 입출력을 요청한 프로세스를 실행 상테에 두지 않고 대기 상태로 옮기는 것이다. → CPU는 준비 상태의 프로세스를 실행 상태로 만든다.
  • 대기 상태의 프로세스는 요청한 입출력이 완료되면 입출력 관리자로부터 인터럽트를 받는다. 대기 상태에서 입출력이 끝난 프로세스는 실행 상태로 가지 않고 준비 상태로 돌아가 자기 차례를 기다린다.
  • 프로그램의 다섯가지 상태
    • 생성 상태 - 프로그램이 메모리에 올라가고 OS로 부터 프로세스 제어 블록을 할당받은 상태로, 준비 상태에서 자기 순서를 기다리며, 프로세스 제어 블록도 같이 준비사태로 옮겨진다.
    • 준비 상태 - 실행 대기 중인 모든 프로세스가 자기 순서를 기다리는 상태이다. 준비 큐에서 기다리며 CPU 스케줄러가 관리한다.
      • dispatch(PID) - 프로세스 제어 블록을 선택하는 작업을 처리하는 명령
    • 실행 상태 - 프로세스가 CPU를 할당받아 실행되는 상태이다. 실행 상태에 들어가는 프로세스는 CPU의 개수만큼 이다.
      • 타임 슬라이스가 지나면 timeout(PID)가 실행된다. → 프로세스 제어 블록을 실행 상태에서 준비 상태로 옮긴다.
      • 끝나면 exit(PID)가 실행되어 프로세스가 종료된다.
      • 실행 상태에 있는 프로세스가 입출력을 요청하면 CPU는 입출력 관리자에게 입출력을 요청하고 block(PID)를 실행한다.
    • 대기 상태 - 실행 상태에 있는 프로세스가 입출력을 요청하면 입출력이 완료될 때까지 기다리는 상태로 wait status라고도 한다. 대기 상태의 프로세스는 큐에서 기다린다.
      • wakeup(PID) - 대기 상태에 잇는 여러 프로세스 중 입출력 인터럽트로 깨어날 프로세스를 찾는 것 → 해당 프로세스의 프로세스 제어 블록이 준비 상태로 이동하게 된다.
    • 완료 상태 - 프로세스가 종료되는 상태이다. 메모리에서 삭제하고 프로세스 제어 블록을 폐기한다.
      • exit() - 정상적인 종료
      • 코어 덤프 - 정상적이지 않은 종료를 하면 디버깅하기 위해 강제 종료 직전의 메모리 상태를 저장장치로 옮기느 것

1.4.3 휴식 상태와 보류 상태

  • 대부분의 프로세스는 생성, 준비, 실행, 대기, 완료 상태로 운영되며 이 다섯 가지 상태를 활성 상태라고 한다. ↔ 이와 반대로 대기 상태가 있다.
  • 휴식 상태 - 프로세스가 작업을 일시적으로 쉬고 있는 상태이다. 사용하던 데이터가 메모리에 그대로 있고 프로세스 제어 블록도 유지되므로 프로세스는 멈춘 지점에서부터 재시작할 수 있다.
  • 보류 상태 - 프로세스가 메모리에서 잠시 쫓겨난 상태로 휴식 상태와 차이가 있다. 일시 정지 상태라고 볼 수 있고 보류 상태와 비교하여 일반적인 프로세스 상태를 활성 상태라고 한다.
    • 보류 상태로 들어가는 경우
      • 메모리가 꽉 찼을 때
      • 프로그램에 오류가 있어서 실행을 미루어야 할 때
      • 악의적인 공격 프로세스라고 판단될 때
      • 매우긴 주기로 반복되는 프로세스라 메모리 밖으로 쫓아내도 큰 문제가 없을 때
      • 입출력을 기다리는 프로세스의 입출력이 계속 지연될 때
    • 보류 상태에 들어간 프로세스는 메모리 밖으로 쫓겨나 스왑 영역에 보관된다.
    • 보류 상태는 대기 상테에서 옮겨진 보류 대기 상태와 준비 상태에서 옮겨진 보류 준비 상태로 구분되며, 각 상태에서 재시작하면 원래의 활성 상태로 들어간다.

2. 프로세스 제어 블록과 문맥 교환

2.1 프로세스 제어 블록

  • 프로세스 제어 블록 - 프로세스를 실행하는 데 필요한 중요한 정보를 보관하는 자료구조로 TCB라고도 한다.

2.1.1 프로세스 제어 블록의 구성

  • 포인터 - 첫번째 블록에는 포인터가 저장된다.
  • 프로세스 상태 - 두번째 블록에 저장되는 것으로, 생성, 준비, 실행, 대기, 보류 준비, 보류 대기 등이 있다.
  • 프로세스 구분자 - 운영체제 내에 있는 여러 프로세스를 구별하기 위한 구분자를 저장한다.
  • 프로그램 카운터 - 다음에 실행될 명령어의 위치를 가리키는 프로그램 카운터의 값을 저장한다.
  • 프로세스 우선순위 - 사용자의 프로세스보다 중요도가 큰 커널 프로세스는 우선순위기 높고, 사용자 프로세스끼리도 우선순위가 다르다. 대기 상태의 큐도 우선순위 별로 따로 운영된다.
  • 각종 레지스터 정보 - 자신이 사용하던 레지스터의 중간 값을 보관한다.
  • 메모리 관리 정보 - 프로세스가 메모리의 어디에 있는지 나타내는 메모리 위치 정보, 메모리 보호를 위해 사용하는 경계 레지스터 값과 한계 레지스터 값 등이 저장된다.
  • 할당된 자원 정보 - 프로세스를 실행하기 위해 사용되는 입출력 자원이나 오픈 파일 등에 대한 정보를 말한다.
  • 계정 정보 - 계정 번호, CPU 할당 시간, CPU 사용 시간 등이다.
  • 부모 프로세스 구분자와 자식 프로세스 구분자 - 부모 프로세스를 가리키는 PPID와 자식 프로세스를 가리키는 CPID 정보도 저장된다.

2.1.2 포인터의 역할

  • 대기 상태에는 같은 입출력을 요구한 프로세스끼리 모아놓는다.
  • 준비큐도 여러 개가 있다.

2.2 문맥 교환

2.2.1 문맥 교환의 의미

  • 문맥 교환 - CPU를 차지하던 프로세스가 나가고 새로운 프로세스를 받아들이는 작업을 말한다.
  • 문맥 교환시 두 프로세스 제어 블록의 내용이 변경된다. 실행 상태에서 나가는 프로세스 제어 블록에는 지금까지의 작업 내용을 저장하고, 반대로 실행 상태로 들어오는 프로세스 제어 블록의 내용으로 CPU가 다시 세팅된다.

2.2.2 문맥 교환의 절차

  • 문맥 교환이 일어나는 경우는 매우 다양하다.
    • 주어진 시간을 다 사용할때, 인터럽트가 걸렸을 때 등이 있다.

3. 프로세스의 연산

  • 이제 프로세스가 어떻게 생성되고 복사되는지 알아볼 것이다.
  • 먼저 시스템 프롤그래밍을 이해해야 한다.

3.1. 프로세스의 구조

  • 프로세스는 코드, 데이터, 스택으로 구성된다.
    • 코드 영역 - 프로그램의 본문이 기술된 곳으로 텍스트 영역이라고도 한다. 읽기 전용으로 처리된다.
    • 데이터 영역 - 변수나 파일 등 각종 데이터를 모아놓는 곳이다.
    • 스택 영역 - 운영체제가 프로세스를 실행하기 위해 부수적으로 필요한 데이터를 모아놓는 곳이다. 운영체제가 사용자의 프로세스를 작동하기 위해 유지하는 영역이므로 사용자에게는 보이지 않는다.

3.2 프로세스의 생성과 복사

  • 프로세스는 프로그램을 실행할 때 생성된다. → 운영체제는 프로그램을 메모리로 가져와 코드영역에 넣고 프로세스 제어 블록을 생성한다. → 메모리에 데이터 영역과 스택 영역을 확보한 후 프로세스를 실행한다.
  • 프로세스를 새로 생성하는 것뿐만 아니라 새로운 프로세스를 복사하는 방법도 있다.

3.2.1 fork()시스템 호출의 개념

  • fork() 시스템 호출은 실행 중인 프로세스로부터 새로운 프로세스를 복사하는 함수이다. → 똑같은 프로세스가 하나 더 만들어 진다.
  • 속도가 새로 생성하는 것보다 빠르다.

3.2.2 fork() 시스템 호출의 동작 과정

  • fork()시스템 호출을 하면 프로세스 제어 블록을 포함한 부모 프로세스 영역의 대부분이 자식 프로세스에 복사되어 똑같은 프로세스가 만들어진다. 프로세스 제어 블록의 내용 중 일부는 변경되는데 다음과 같다
    • 프로세스 구분자 - 주민등록 번호와 같은 것으로 바뀐다.
    • 메모리 관련 정보 - 메모리의 위치가 다르므로 바뀐다.

3.2.3 fork() 시스템 호출의 장점

  • 프로세스의 생성 속도가 빠르다.
    • 자식 프로세스의 생성 속도가 빠르다.
  • 추가 작업 없이 자원을 상속할 수 있다.
    • 부모 프로세스가 사용하던 모든 자원을 추가 작업 없이 자식 프로세스에 상속할 수 있다.
  • 시스템 관리를 효율적으로 할 수 있다.
    • 자식 프로세스를 종료하면 자식이 사용하던 자원을 부모 프로세스가 정리할 수 있다.

3.2.4 fork() 시스템 호출의 예

  • fork()문 이전에 파일을 열거나 변수를 선언하면 이것이 모두 자식 프로세스에 상속된다는 것이다. 그러나 서로 동립적이다.

3.3 프로세스의 전환

  • fork()시스템 호출로 요리를 복사한 후, 복사된 요리를 새로운 요리로 바꾸는 함수인 exec() 시스템 호출을 사용하면 된다.

3.3.1 exec() 시스템 호출의 개념

  • exec() 시스템 호출은 기존의 프로세스를 새로운 프로세스로 전환하는 함수이다.
  • 프로세스는 그대로 둔 채 내용만 바꾸는 시스템 호출이다. 현재의 프로세스가 완전히 다른 프로세스로 전환된다.
  • 목적 - 프로세스의 구조체를 재활용하기 위한 것이다.
    • 새로운 프로세스를 만드려면 프로세스 제어 블록을 만들고 메모리의 자리를 확보하는 과정이 필요하다. 또한 청소하기 위해 부모 자식 관계를 만들어야 한다.
    • 이미 만들어진 프로세스 제어 블록, 메모리 영역, 부모-자식 관계를 그대로 사용할 수 있어 편리하다.

3.3.2 exec() 시스템 호출의 동작 과정

  • 코드 영역에 있는 기존의 내용을 지우고 새로운 코드로 바꿔버린다. 또한 데이터 영역이 새로운 변수로 채워지고, 스택 영역이 리셋된다.
  • 프로세스 제어 블록 중 프로세스 구분자, 부모 프로세스 구분자, 자식 프로세서 구분자, 메모리 관련 사항 등이 변하지 않지만 프로그램 카운터 레지스터 값을 비롯한 각종 레지스터와 용한 파일 정보가 모두 리셋된다.

3.3.3 exec() 시스템 호출의 예

  • 건너 뜀

3.4 프로세스의 계층 구조

  • 유닉스의 예를 통해 프로세스의 계층 구조를 알아보자.

3.4.1 유닉스 프로세스 계층 구조

  • 유닉스에 커널이 처음 메모리에 올라와 부팅이 되면 커널 관련 프로세스를 여러 개 만드는데, 그중 init 프로세스는 전체 프로세스의 출발점이 된다. 나머지 프로세스를 init 프로세스의 자식으로 만든다.

3.4.2 프로세스 계층 구조의 장점

  • 여러 작업의 동시 처리
    • fork()exec()를 통해 login 프로세스를 여러개 만들거나 login 프로세스를 shell 프로세스로 만드는 등의 작업을 한다.
  • 용이한 자원 회수
    • 프로세스를 계층 구조로 만들면 프로세스 간의 책임 관계가 분명해져서 시스템을 관리하기가 수월하다. 모든 프로세스를 부모-자식 관계로 만들면 자식 프로세스가 작업을 마쳤을 때 사용하던 자원을 부모 프로세스가 회수하면 된다.

3.4.3 미아 프로세스

  • 부모 프로세스는 자원을 회수하기 위해 자식 프로세스가 끝날 때까지 기다려야 한다. 그러나 부모 프로세스가 먼저 종료되거나 자식 프로세스가 비정상적으로 종료되어 부모 프로세스에 연락이 안 되는 경우도 있다. → 미아 프로세스
  • 미아 프로세스 - 많아지면 자원 낭비가 된다. → OS는 반환되지 못한 자원을 회수하는 자원회수를 주기적으로 해야 한다.

4. 스레드

  • 이 절에서는 스레드의 개념과 사용 예를 다양한 각도로 접근하여 살펴본다.

4.1 스레드의 개념

4.1.1 스레드의 정의

  • 프로세스의 작업 과정
    • OS는 코드와 데이터를 메모리에 가져오고, 프로세스 제어 블록을 생성하고, 작업에 필요한 메모리 영역을 확보한 후, 준비된 프로세스를 준비 큐에 삽입한다.
    • 프로세스가 생성되면 CPU 스케줄러는 프로세스가 해야 할 일을 CPU에 전달하고 실제 작업을 CPU가 수행한다. 이때 CPU 스케줄러가 CPU에 전달하는 일 하나가 스레드이다.
  • ⇒ CPU가 처리하는 작업의 단위는 프로세스로부터 전달받은 스레드이다. 운영체제 입장에서의 작업 단위는 프로세스이고 CPU 입장에서의 작업 단위는 스레드인 것이다.
  • ⇒ 프로세스의 입장에서의 정의 - 프로세스의 코드에 정의된 절차에 따라 CPU에 작업 요청을 하는 실행 단위이다.
  • 작업을 상대적인 크기순으로 나열하면 job > task > operation이고, 처리 > 프로세스 > 스레드가 된다.

4.1.2 프로세스와 스레드의 차이

  • 프로세스끼리는 약하게 연결되어 있는 반면 스레드끼리는 강하게 연결되어 있다.
    • 프로세스 - 서로 영향을 크게 미치지 않는다.
    • 스레드 - 순서를 바꾸면 안된다. → 강하게 연결되어 있다.
  • 멀티 태스크와 멀티 스레드의 차이
    • 멀티 태스크 - 독립적인 프로세스는 데이터를 주고 받을 때 프로세스간 통신(IPC)를 이용한다.
    • 멀티 스레드 - 스레드들이 동시에 작업을 하는 것이다. 스레드끼리는 강하게 연결되어 하나가 종료되면 다른 하나도 종료된다. 변수나 파일을 공유하고 전역 변수나 함수 호출 등의 방법등으로 스레드 간 통신을 한다.

4.1.3 스레드 관련 용어

  • 멀티 스레드 - 프로세스 내 작업을 여러 개의 스레드로 분할함으로써 작업의 부담을 줄이는 프로세스 운영 기법이다.
  • 멀티 태스킹 - 운영체제가 CPU에게 작업을 줄 때 시간을 잘게 나누어 배분하는 기법이다. → 시분할 시스템이라고 한다.
  • 멀티 프로세싱 - CPU를 여러개 사용하여 여러 개의 프로세스를 동시에 처리하는 작업 환경을 말한다. 병렬 처리에서의 슈퍼스칼라 기법과 같다.
  • CPU 멀티 스레드 - 한 번에 하나씩 처리해야 하는 스레드를 파이프라인 기법을 이용하여 동시에 여러 스레드를 처리하도록 만든 병렬 처리 기법이다.

4.2 멀티스레드의 구조와 예

4.2.1 멀티 스레드의 구조

  • fork() 시스템 호출은 낭비적인 요소가 많다 - 코드 영역과 데이터 영역의 일부가 메모리에 중복되어 존재한다.
  • 스레드는 이러한 멀티태스킹의 낭비 요소를 제거하기 위해 사용한다. ← 비슷한 일을 하는 2개의 프로세스를 만드는 대신 코드, 데이터 등을 공유하면서 여러 개의 일을 하나의 프로세스 내에서 하는 것이다.
  • 프로세스는 정적인 영역과 동적인 영역으로 나뉜다.
    • 정적인 영역 - 프로세스가 실행되는 동안 바뀌지 않는 영역
    • 동적인 영역 - 스레드가 작업을 하면서 값이 바뀌거나 새로 만들어지거나 사라지는 영역, 레지스터, 스택, 힙
  • 멀티 태스킹의 경우 필요 없는 정적 영역이 여러 개가 된다. 이를 해결하기 위해 멀티 스레드를 사용한다.

4.3 멀티스레드의 장단점

4.3.1 멀티 스레드의 장점

  • 자원의 낭비를 막고, 작업의 효율을 높일 수 있다.
  • 하나의 프로세스를 여러 개의 스레드로 구성하면 복잡한 작업을 쉽게 처리할 수 있다.
  • 요약
    • 응답성 향상 - 한 스레드가 입출력으로 인해 작업이 진행되지 않더라도 다른 스레드가 작업을 계속하여 사용자의 작업 요구에 빨리 응답할 수 있다.
    • 자원 공유 - 한 프로세스 내에서 독립적인 스레드를 생성하면 프로세스가 가진 자원을 모든 스레드가 공유하게 되어 작업을 원활하게 진행할 수 있다.
    • 효율성 향상 - 여러 개의 프로세스를 생성하는 것과 달리 멀티 스레드는 불필요한 자원의 중복을 막음으로써 시스템의 효율이 향상된다.
    • 다중 CPU 지원 - 2개 이상의 CPU를 가진 컴퓨터에서 멀티 스레드를 사용하면 다중 CPU가 멀티 스레드를 동시에 처리하여 CPU 사용량이 증가하고 프로세스의 처리 시간이 단축된다.

4.3.2 멀티 스레드의 단점

  • 멀티 스레드의 경우 모든 스레드가 자원을 공유하기 때문에 한 스레드에 만제가 생기면 전체 프로세스에 영향을 미친다. ↔ 반면 프로세스를 여러개 만드는 방식의 경우 상관이 없다.

4.4 멀티스레드 모델

  • 프로세스는 커널 프로세스와 사용자 프로세스로 나뉘며 스레드에도 커널 스레드와 사용자 스레드가 있다
    • 커널 스레드 - 커널이 직접 생성하고 관리하는 스레드이다.
    • 사용자 스레드 - 라이브러리에 의해 구현된 일반적인 스레드이다.

4.4.1 사용자 레벨 스레드

  • 운영체제가 멀티 스레드를 지원하지 않을 떄 사용하는 방법으로 초기의 스레드 시스템에서 이용되었다. 라이브러리를 사용하여 구현하며, 라이브러리는 커널이 지원하는 스캐줄링이나 동기화 같은 기능을 대신 구현해준다.
  • 커널 입장에서는 일반 프로세스이지만 커널이 하는 일을 라이브러리가 대신 처리하여 여러 개의 스레드를 작동한다. 따라서 사용자 프로세스 내에 여러 개의 스레드가 존재하지만 커널의 스레드 하나와 연결되기 때문에 1 to N 모델이라고 부른다.
  • 문맥 교환과 같은 부가적인 작업이 줄어들어 속도가 빠르다.
  • 단점
    • 단점은 여러 개의 스레드가 하나의 커널 스레드와 연결되기 때문에 커널 스레드가 입출력 작업을 위해 대기 상태에 들어가면 모든 사용자가 스레드가 같이 대기하게 된다는 것이다.
    • 또 다른 단점은 한 프로세스의 타임 슬라이스를 여러 스레드가 공유하기 때문에 여러 개의 CPU를 동시에 사용할 수 없다는 것이다.
    • 보안에 취약하다. 보호 장치를 라이브러리에서 구현해야하기 때문이다.

4.4.2 커널 레벨 스레드

  • 커널이 멀티 스레드를 지원하는 방식으로, 하나의 사용자 스레드가 하나의 커널 스레도와 연결되기 때문에 1 to 1 모델이라고 부른다.
  • 장단점은 사용자 레벨 스레드의 장단점과 반대이다.
  • 멀티 CPU를 사용할 수 있고, 대기 상태에 있어도 다른 스레드는 작업을 계속할 수 있다. 커널 기능으로 보안에 강하다.
  • 하지만 문맥 교환을 할 때 오버헤드 때문에 느리게 작동한다.

4.4.3 멀티 레벨 스레드

  • 사용자 레벨 스레드와 커널 레벨 스레드를 혼합한 방식이므로 M to N 모델이라고 부른다.
  • 사용자 레벨 스레드와 커널 레벨 스레드의 장단점을 모두 가지고 있다.
  • 하나가 대기 들어가면 다른 하나가 대신하면 된다.
  • 하지만 커널 레벨 스레드를 같이 사용하기 때문에 문맥 교환시 오버헤드가 있어 사용자 레벨 스레드만큼 빠르지 않다.
  • 빠르게 움직여야 하는 스레드는 사용자 레벨 스레드로 작동하고, 안정적으로 움직여야 하는 스레드는 컨러 레벨 스레드로 작동한다.
This post is licensed under CC BY 4.0 by the author.