프로세스와 쓰레드

 

프로세스와 쓰레드의 정의

프로세스

정적이였던 프로그램이 자원을 할당 받고 동작을 하는 것을 프로세스라 함

  • 프로그램: 동작을 하지 않는 정적, 수동적 개체
  • 프로세스: 동작을 하는 능동적 개체
  • 자원: CPU, 메모리, 입출력장치, 파일 등
  • 동작: 프로세스가 동작을 한다 -> CPU가 프로세스의 명령을 실행

운영체제(프로세스 관리자)가 처리하는 작업

  • 프로세스를 생성 및 종료
  • 프로세스를 실행시키기 위한 스케줄링 작업
  • 프로세스의 상태 관리

프로세스의 구성

아래 두 절차를 마치면 하나의 프로세스가 만들어진다

  1. 메모리 구조: 프로그램 실행에 직접적으로 필요한 코드와 데이터
    • 코드영역: 프로그램 자체를 저장하는 코드영역
    • 데이터 영역: 프로그램 실행 시 필요한 데이터 영역 (상수나 변수의 값, 서브프로그램 호출상태 등)
    1. 정적 데이터 영역: 상수나 변수
    2. 스택 영역: 지역변수
    3. 힙 영역: 동적변수 중에서 사용자가 수동으로 저장하는 것들을 저장
  2. 프로세스 제어 블록(Process Control Block: PCB): 운영체제가 프로세스를 관리하기 위해 필요한 정보
    • 각 프로세스마다 존재
    • 여러 프로세스가 번갈아 실행되는 경우 PCB에 저장된 정보 활용

프로세스 상태 관리

  • 생성: 처음 작업이 시스템에 주어진 상태 (메모리 구조 및 프로세스 제어 블록이 형성된 상태)
  • 준비: 실행 준비가 되어 CPU 할당을 기다리는 상태 (준비큐에 프로세스가 들어가있는 상태)
  • 실행: 프로세스가 처리되는 상태
  • 대기: 프로세스 I/O 작업이 끝날 때까지 또는 특정 자원을 할당받을 때까지 보류되는 상태 (대기 시간동안 다른 프로세스에게 양보함)
  • 종료: 프로세스가 더 이상 실행되지 않도록 끝난 상태

### 프로세스 상태 변화

  • 생성 => 준비: 생성에서는 준비만 변화가 가능
  • 준비 => 실행(디스패치) :해당하는 프로세스가 할당 받으면 실행 / 할당시간 만료시 준비 상태로 돌아감 / 우선순위에 밀려 준비큐로 돌아가야 할 상태
  • 실행 => 대기: 이벤트 대기
  • 대기 => 준비: 재개 조건 만족후 준비큐에 들어감
  • 실행 => 종료: 실행할 내용이 없다면 종료 / 부모가 종료 신호를 보낼 때 / 실행할 수 없는 상황일 때

부모 프로세스와 자식 프로세스

프로세스 생성 방법

  • 사용자가 프로그램을 직접 실행
  • 한 프로세스가 다른 프로세스를 생성
    • 프로세스 생성 시스템 호출 이용
    • 부모 프로세스: 시스템 호출을 하는 프로세스
    • 자식 프로세스: 시스템 호출을 통해 생성된 프로세스
  • UNIX, Linux: fork() 를 통해 프로세스를 복제할 경우 부모 프로세스를 그대로 복제하되 PID만 다르게 된다.
  • pid = fork(); 할 경우 각각 부모 프로세스의 pid 변수에는 자식의 PID를 리턴하고 자식의 pid에는 0이 리턴된다.

프로세스 종료 방법

  • 프로세스가 모든 처리를 완료 (정상적 종료)
  • 부모 프로세스에 의해 자식 프로세스가 강제 종료
    • 프로세스 종료 시스템 호출 이용
    • 자식 프로세스 생성시 얻은 자식 PID 이용
  • 부모 프로세스가 종료되는 경우 운영체제가 자식 프로세스 종료

쓰레드

프로세스

  • 하나의 프로그램을 실행하기 위한 기본적인 단위, 자원 소유의 단위(하나의 메모리 구조), 디스패칭의 단위(하나의 제어흐름)
  • 프로세스는 PC가 한개여서 프로세스 내부에서 다중처리가 불가능

쓰레드

  • 프로세스 내에서 다중처리를 위해 제안된 개념
  • 하나의 프로그램을 실행하기 위한 기본적인 단위
  • 디스패칭의 단위 cf) 자원 소유의 단위 -> 프로세스
  • 쓰레드별로 디스패칭 해야 되기 때문에 PC가 PCB 내부에서 쓰레드로 이동
  • 프로세스 내부에 쓰레드는 한 개 이상 소유 가능
  • 쓰레드는 실행에 필요한 최소한의 정보만 가짐
    • PC를 포함한 레지스터 값
    • 상태정보
    • 스택 영역
  • 나머지 정보는 프로세스에 두고 다른 쓰레드와 공유