CS/운영체제

[운영체제] 프로세스와 스레드(PCB, 컨텍스트 스위칭, 멀티 프로세스, 멀티 스레드)

연듀 2022. 9. 29. 10:07

프로세스와 스레드

 

1.프로세스란? 

 

실행 중인 프로그램

  • 보조기억장치에 저장된 프로그램을 메모리에 적재하고 실행하는 순간 프로세스가 됨
  • 포그라운드 프로세스: 사용자가 보는 앞에서 실행하는 프로세스
  • 백그라운드 프로세스: 사용자가 보지 못하는 뒤편에서 실행되는 프로세스 
    • 사용자와 상호작용하지 않는 백그라운드 프로세스: 데몬(유닉스), 서비스(윈도우)

 

 

프로그램은 하드디스크 등의 보조기억장치에 저장된 실행 코드이고,

프로세스는 프로그램을 실행시켜 프로그램이 메모리 상에서 실행하는 작업 단위이다. 

 

 

 

프로세스 제어 블록(PCB)

 

  • 프로세스와 관련된 정보를 저장하는 자료구조로, 특정 프로세스를 식별하고 처리하는데 필요한 정보를 판단한다. 
  • 프로세스 생성 시에 만들어지고 실행이 끝나면 폐기된다. 
  • 커널 영역에 생성된다.
  • PCB에 담기는 정보:
    • 프로세스 ID(PID)
    • 레지스터 값
    • 프로세스 상태
    • CPU 스케줄링 정보
    • 메모리 관리 정보
    • 사용한 파일과 입출력장치 목록

 

 

컨텍스트 스위칭 (Context Switching)

 

*문맥(Context): 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보. PCB에 기록됨

 

기존에 실행하던 프로세스의 컨텍스트를 PCB에 백업하고, 새로운 프로세스를 실행하기 위해 컨텍스트를 PCB로부터 복구하여 새로운 프로세스를 실행하는 것

 

1. 프로세스의 CPU 이용 시간이 다 되거나 인터럽트가 발생한다.

2. 운영체제가 프로세스의 상태를 PCB에 백업한다.

3. 그 다음에 실행할 프로세스의 상태를 복구한다.

 

컨텍스트 스위칭이 자주 일어나면 프로세스는 그만큼 빨리 번갈아가며 수행돼 프로세스가 동시에 실행되는 것처럼 보인다.

컨텍스트 스위칭 때 CPU는 아무일도 하지 못하므로 컨텍스트 스위칭이 잦아지면 오버헤드가 발생한다.

 

 

 

프로세스의 메모리 영역

 

메모리는 커널 영역, 사용자 영역으로 나눌 수 있고, 커널 영역에는 PCB가 생성된다고 했다.

사용자 영역에는 하나의 프로세스가 크게 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어 저장된다.

 

  • 코드 영역
    • 기계어로 이루어진 명령어 저장, 읽기 전용 공간
    • 정적 할당 영역
  • 데이터 영역
    • 프로그램이 실행되는 동안 유지할 데이터 저장(ex.전역 변수, static 변수)
    • 정적 할당 영역
  • 힙 영역
    • 프로그래머가 직접 할당할 수 있는 저장 공간
    • 힙 영역에 메모리 공간을 할당한 후 반환하지 않으면 메모리 누수 문제가 발생
    • 동적 할당 영역
  • 스택 영역
    • 데이터를 일시적으로 저장하는 공간(ex. 매개 변수, 지역 변수)
    • 동적 할당 영역

 

 

정적 할당 영역: 크기가 고정된 영역으로, 코드 영역과 데이터 영역이 포함된다. 

동적 할당 영역: 프로세스 실행 과정에서 크기가 변할 수 있는 영역으로, 힙 영역과 스택 영역이 포함된다. 

 

힙 영역은 낮은 주소에서 높은 주소로, 스택 영역은 높은 주소에서 낮은 주소로 할당되어 데이터가 쌓일 때 할당되는 주소가 겹칠 수 없게 한다. 

 

 

프로세스 상태

 

운영체제는 프로세스 각각의 상태를 PCB에 기록하고 계층적으로 관리한다.

 

  • 생성 상태: 막 메모리에 적재돼 PCB를 할당받은 상태
  • 준비 상태: CPU 할당을 기다리는 상태
  • 실행 상태: CPU 할당받아 실행 중인 상태. 프로세스가 할당된 시간을 다 사용하면(타이머 인터럽트 발생시) 다시 준비 상태가 되고, 입출력장치 작업이 끝날때 까지 기다려야하면 대기 상태가 된다. 
  • 대기 상태: 입출력장치 작업을 기다리는 상태. 입출력 작업이 완료되면 다시 준비 상태가 된다. 
  • 종료 상태: 프로세스가 종료된 상태

 

dispatch: 준비 -> 실행

timeout: 실행 -> 준비

block: 실행 -> 대기

wakeup: 대기(보류) -> 준비

 

 

프로세스 계층 구조

 

부모 프로세스: 새 프로세스를 생성한 프로세스

자식 프로세스: 부모 프로세스에 의해 생성된 프로세스

 

운영체제는 프로세스(부모 프로세스)가 프로세스(자식 프로세스)를 낳는 계층적인 구조로써 프로세스들을 관리한다.

컴퓨터가 부팅될 때 실행되는 최초의 프로세스가 자식 프로세스를 생성하고, 또 다시 그 자식이 자식을 낳는 형식으로 여러 프로세스가 동시에 실행되는 것이다.

부모 프로세스와 자식 프로세스는 다른 프로세스이기 때문에 다른 PID를 가진다.

 

 

 

프로세스 생성 기법

 

부모 프로세스는 fork로 자신의 복사본을 자식 프로세스로 생성하고,

만들어진 복사본인 자식 프로세스는 exec을 통해 자신의 메모리 공간을 다른 프로그램으로 교체한다.

 

fork: 자기 자신 프로세스의 복사본을 자식 프로세스로 생성하는 시스템 호출

exec: 자신의 메모리 공간을 새로운 프로그램으로 덮어쓰는 시스템 호출

 

ex) 

1.사용자가 bash 셸에서 ls 명령어를 침

2.셸 프로세스는 fork를 통해 자신과 동일한 프로세스 생성

3.생성된 자식 프로세스는 exec을 통해 ls 명령어를 실행하기 위한 프로세스로 전환되어 실행

 

 


 

2. 스레드

 

스레드

 

프로세스를 구성하는 실행 단위. 하나의 프로세스는 여러 개의 스레드를 가질 수 있다.

즉, 하나의 프로세스에서 스레드를 이용하면 여러 일을 동시에 실행할 수 있다. 

실행에 필요한 최소한의 정보(프로그램 카운터를 포함한 레지스터, 스택)만을 유지한채 프로세스 자원을 공유하며 실행

 

컨텍스트 스위칭 때 자신의 PCB에 있는 stack 및 간단한 정보들만 저장하면 되기 때문에 프로세스의 컨텍스트 스위칭보다 빠르다.

스레드 간 자원을 공유하기 때문에 효율성이 증가한다.

 

 

 

 

멀티 프로세스와 멀티 스레드

 

 

 

멀티프로세스: 여러 프로세스를 동시에 실행하는 것

 

 

멀티스레드: 여러 스레드로 프로세스를 동시에 실행하는 것

 

프로세스끼리는 기본적으로 자원을 공유하지 않지만, 프로세스 내의 스레드끼리는 같은 프로세스 내의 자원을 공유한다.

 

같은 프로세스 내의 스레드는 스레드 ID, 프로그램 카운터 값을 포함한 레지스터 값, 스택을 고유하게 가지고

나머지 프로세스 자원(코드, 데이터, 힙 영역) 은 공유한다.

 

멀티 프로세스 환경에서는 모든 자원이 복제되어 메모리에 적재돼 메모리에 동일한 내용들이 중복해서 존재할 수 있는데,

이에 반해 스레드는 프로세스 자원을 공유하기 때문에 메모리를 효율적으로 사용할 수 있다.

또한 서로 다른 프로세스는 독립적으로 실행되는 반면 스레드는 프로세스의 자원을 공유하기 때문에 스레드는 협력과 통신에 유리하다. 

 

그러나 멀티 프로세스 환경에서는 하나의 프로세스에 문제가 생겨도 다른 프로세스에 지장이 적지만,

멀티스레드 환경에서는 하나의 스레드에 문제가 생기면 프로세스 전체에 문제가 생길 수 있다. 

 

 

 

 

 

 

책 혼자서 공부하는 컴퓨터 구조 + 운영체제

https://zangzangs.tistory.com/107