CS/운영체제

운영체제3 - 프로세스 상태도, 멀티 프로세스/스레드

개발 일기92 2024. 6. 9. 14:22

프로세스 상태도

모든 프로세스는 CPU에 의해 생성되고 소멸하는 과정을 거친다.

이 과정에서 프로세스는 아래 5가지 상태로 존재한다.

  • 생성(new) : 프로세스가 PCB를 가지고 있지만 OS로부터 승인(admit) 받기 전
  • 준비(ready) : OS로부터 승인 받은 후 준비 큐에서 CPU할당 기다림.
  • 실행(running) : 프로세스가 CPU를 할당 받아 실행.
  • 대기(waiting) : 프로세스가 입출력이나 이벤트 발생을 기다려야 해서 CPU사용을 멈추고 기다림.
  • 종료(terminated) : 프로세스 종료

상태 변화

  • 생성 -> 준비 : 생성 상태의 프로세스가 OS의 승인을 받아 준비 큐(ready queue)에 추가됨
  • 준비 -> 실행 : 준비 큐에 있는 프로세스 중 우선순위가 높은 프로세스가 디스패치(dispatch)되어 실행됨
  • 실행 -> 준비 : CPU독점을 방지하기 위해 타임아웃됨
  • 실행 -> 대기 : 입출력 또는 이벤트로 인해 대기
  • 대기 -> 준비 : 입출력 또는 이벤트가 완료되어 준비
  • 실행 -> 종료 : 정상 종료

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

  • 동시성(concurrency) : 싱글 코어에서 여러 작업을 번갈아 처리하는 방식(콘텍스트 스위칭, context switcing)
  • 병렬성(parallelism) : 멀티 코어에서 여러 작업을 동시에 처리하는 방식

멀티 프로세스?

프로그램 하나를 여러 프로세스로 구성하는 것을 의미.

1프로세스가 죽어도 다른 프로세스에 영향을 주지 않음.(안정화)

but 시간과 메모리 공간을 많이 사용하고 콘텍스트 스위칭 작업이 이루어져야 하므로 오버헤드가 발생.

또한 프로세스는 각각 독립적인 메모리를 할당 받기 때문에 프로세스간 공유할 자원이 있다면 IPC(Inter Process Communication)를 통해 서로의 자원을 공유 해야한다.

오버헤드 : 프로세스를 교체하면서 발생하는 시간과 메모리

 

멀티 스레드?

스레드를 여러 개 생성해 스레드들이 각자 다른 작업을 처리하는것.

멀티 스레드는 스레드 간에 힙, 데이터, 코드 영역공유한다. 

따라서 콘텍스트 스위칭할 때 오버헤드가 적게 발생하고 IPC를 사용하지 않아도 되어 멀티 프로세스의 단점을 보완할 수 있다.

※독립적인 메모리 공간이 필요한 프로세스 여러개 보단 스래드를 멀티로 구성하는 것이 자원을 효율적으로 사용이 가능하다.

but 스택 영역을 제외한 힙,데이터,코드 영역을 다른 스레드와 함께 사용하므로 공유 자원에 대한 동기화가 필수다.

또한 1스레드 문제 시 다른 스레드에도 영향이 갈 수 있다.

 

콘텍스트 스위칭?

CPU는 하나의 프로세스만 처리할 수 있으므로 멀티 프로세스를 처리하려면 CPU 스케줄러에 의해 인터럽트가 발생하면서 콘텍스트 스위칭이 이뤄진다.

즉, 멀티 프로세스 환경에서 CPU가 처리중인 프로세스의 정보를 바꾸는 것.

interrupt(방해하다, 중단시키다)  : 입출력 관련 이벤트가 발생하거나 예외 상황이 발생할 때 이에 대응할 수 있게 CPU에 처리 요청을 하는것

 

예를 들어 처리 중인 프로세스 P1이 운영체제에 의해 인터럽트가 발생했다. 그러면 P1은 유휴 상태(idle)로 변하고 스케줄러는 레지스터에 있는 처리 중인 작업정보를 P1의 PCB에 저장한다. 그리고 P2의 PCB를 가져와 레지스터에 로드하고 CPU는 P2를 처리하기 시작한다.

위 경우에서 P1정보를 PCB에 저장, P2의 PCB정보를 로드하는 동안 오버헤드가 발생한 것이다.

이처럼 멀티 스레드에도 콘텍스트 스위칭이 이뤄진다. 하지만 멀티 프로세스의 콘텍스트 스위칭보다 시간과 메모리 를 적게 사용한다. 앞서 설명 했듯 멀티 스레드는 스택을 제외한 힙, 데이터, 코드 영역을 공유하므로 레지스터에 저장하고 로드하는 데이터가 상대적으로 적기 때문이다.

 

Quiz) CPU에서 처리 중이던 프로세스가 중간에 변경되어도 이어서 실행 가능한 이유는?

( 콘텍스트 스위칭에도 프로세스가 잘 작동되는 이유는?) 

=> PCB에 프로그램 카운터(PC)와 스택포인터 값이 저장되어 있기 때문.

프로그램 카운터 : 프로세스가 이어서 처리해야 하는 명령어의 주소 값.

스택 포인터 : 스택 영역에서 데이터가 채워진 가장 높은 주소 값.

이어서 실행할 명령어의 주소 값과 데이터가 스택에 어디까지 채워져 있는지 알고 있으므로 콘텍스트 스위칭이 원활히 이뤄질 수 있다.