CS/운영체제(OS)

[OS] 프로세스 (Process)

유정주 2022. 5. 21. 13:37
반응형

안녕하세요. 개발하는 정주입니다.

 

오늘은 "프로세스 (Process)"을 정리했습니다.

쌓아두기만 하고 포스팅을 안 하고 있었는데 이제야 하게 되었네요 ㅠㅠ..

내용이 슬그머니 추가될 수 있습니다.


프로세스 (Process)란?

프로세스란 실행 중인 프로그램입니다.  프로그램과 프로세스는 아예 다른 것입니다.

프로그램은 보조 기억 장치에 실행되기를 기다리는 명령어와 데이터의 묶음으로

프로그램이 CPU에서 다룰 수 있도록 메모리에 적재되면 이를 프로세스라고 부릅니다.

즉, 프로세스란 보조 기억 장치의 프로그램이 메모리에 적재된 상태를 의미합니다.

 


Process Context

프로세스의 개념을 이해할 때는 프로세스의 문맥(Context)이 중요합니다.

프로세스 Context란 특정 시점에서 프로세스가 어디까지 수행했는지를 규명하는데 필요한 요소입니다.

 

현대의 운영체제는 여러 프로세스가 함께 수행되는 시분할 시스템 환경입니다.

프로세스는 인터럽트에 의해 짧은 시간동안 중단과 속개를 반복하며 상태가 끊임없이 변경됩니다.

따라서 프로세스가 속개할 때 어디부터 실행 되어야 하는지, 어떤 데이터를 이어서 연산해야 하는지 등의 정보를 알아야 합니다.

이런 모든 프로세스 실행 정보를 프로세스 Context라고 합니다.

Program Counter가 어디를 가리키고 있는가, 프로세스 메모리에 어떤 내용을 담고 있는가, 변수의 값은 얼마인가, Register에 어떤 값을 넣어 놨는가 등도 프로세스 Context입니다.

 

프로세스 Context는 크게 3가지로 하드웨어 Context, 프로세스 주소 공간, 커널 상의 Context로 나눌 수 있습니다.

 

하드웨어 Context는 CPU 수행 상태를 나타냅니다.

PC(Program Counter)와 각종 register의 값들을 말합니다.

 

프로세스의 주소 공간은 code, data, stack은 프로세스의 독자적인 주소 공간을 말합니다.

 

커널 상의 Context는 PCB(Process Control Block)와 Kernel stack을 의미합니다.

PCB에 대해서는 아래 다룹니다.

 


프로세스 상태 - 1

 

프로세스는 상태(state)가 변경되며 수행된다고 설명하였습니다.

프로세스에는 어떤 상태가 있는지 알아봅시다.

  • New : 프로세스가 생성 중인 상태
  • Ready : 메모리 등 프로세스의 조건을 모두 만족하고 CPU가 할당되기를 기다리는 상태
  • Running : CPU가 할당되어 명령어를 수행 중인 상태
  • Blocked(wait, sleep) : CPU를 할당해도 명령어를 수행할 수 없는 상태
  • Terminated : 수행(execution)이 끝나 정리 중인 상태

Ready 상태의 프로세스가 Queue에 대기하다 CPU를 할당받을 차례가 되면 CPU를 할당받고 Running 상태가 됩니다.

Queue에 쌓인 순서대로 처리되는 것은 아니며 특정 기준에 의해 우선순위가 메겨집니다.

 

Running 중 디스크 I/O 작업을 하게 되면 Blocked 상태로 변하고 Disk I/O Queue에 쌓입니다.

I/O 작업은 비교적 오래 걸리는 작업이므로 CPU를 할당해도 명령어를 수행할 수 없습니다.

 

디스크 I/O 작업이 끝나면 CPU에게 Interrupt를 발생 시키고 CPU 제어권이 운영체제 커널로 넘어갑니다.

커널은 프로세스의 상태를 Blocked에서 Ready로 바꿔 CPU를 할당받을 자격을 줍니다.

 

모든 작업이 끝나면 Terminated 상태가 되어 정리됩니다.

 

운영체제의 커널은 자신의 데이터 영역에 Queue를 만들어놓고 프로세스의 상태를 바꿔가며 프로세스를 운영합니다.

 


PCB (Process Control Block)

PCB (Process Control Block / 프로세스 제어 블록)란 운영체제가 프로세스를 관리하기 위해 정보를 저장하는 자료구조로 운영체제에서 프로세스는 PCB로 표현됩니다. 

Context Switching이 발생할 때 기존에 실행하던 프로세스를 PCB에 저장 후 중단시키고 속개할 프로세스의 PCB를 불러옵니다.

 

PCB에 저장하는 정보는 아래와 같습니다.

  • 운영체제가 프로세스 관리에 사용하는 정보
    • Process State : 프로세스의 상태
    • Process ID : 프로세스 아이디 정보
  • CPU 수행 관련 하드웨어 정보
    • Program Counter : 프로세스가 다음에 실행할 명령어의 주소
    • Registers : 중단된 위치에서부터 시작할 수 있도록 하는 Register 값
    • CPU 스케줄링 정보 : 프로세스 우선순위, 스케줄링 Queue 포인터, 스케줄링 파라미터 등
  • 메모리 관련 정보
    • code, data, stack 위치 정보
    • 페이지 테이블, 세그먼트 테이블 등
  • 파일 관련 정보
    • Open file list : 입출력 장치 목록, 열려 있는 파일 목록 등

 


Context Switching

Context Switching(문맥 교환)이란 현재 CPU를 점유 중인 프로세스에서 다른 프로세스로 CPU 제어권을 넘겨주는 과정입니다. 

 

Context Switching에서 운영체제는 다음을 수행합니다.

  • CPU를 내어주는 프로세스의 상태를 그 프로세스의 PCB에 저장
  • CPU를 새롭게 얻는 프로세스의 상태를 PCB에서 읽음

CPU를 계속 사용하는 것이 아니라 짧은 간격으로 CPU를 뺏고 얻는 과정에서 이전 중단된 부분에서 다시 시작할 수 있도록 합니다.

 

주의할 점은 프로세스로 CPU 제어권이 넘어갈 때 무조건 Context Switching이 발생하는 것이 아니라, 프로세스에서 다른 프로세스로 CPU 제어권이 넘어갈 때 Context Switching이 발생한다는 것입니다.

사용자 프로세스가 인터럽트 혹은 system call로 인해 커널모드로 진입했다 user 모드로 복귀하여 동일한 프로세스가 CPU 제어권을 잡는 경우 Context Switching이 발생하지 않습니다. 이 상황에서도 CPU 수행 정보 등 Context 일부를 PCB에 저장하지만 다른 프로세스로 넘어가는 것보다는 부담이 작습니다.

 

다른 프로세스로 CPU 제어권이 넘어갈 때 부담이 큰 이유는 캐시 메모리 때문입니다.

캐시 메모리를 모두 삭제(cache memory flush)해야 하기 때문에 부담이 훨씬 커집니다.

 


프로세스 스케줄을 위한 Queue

운영체제는 하드웨어와 소프트웨어 자원을 줄세우기 위해 여러 Queue를 사용합니다.

프로세스들을 각 Queue를 오가며 수행됩니다.

  • Job Queue : 현재 시스템 내에 있는 모든 프로세스의 집합으로 Ready Queue, Device Queue를 모두 포함
  • Ready Queue : 현재 메모리 내에 있으면서 CPU를 잡아서 실행되기를 기다리는 프로세스의 집합
  • Device Queue : I/O Device의 처리를 기다리는 프로세스의 집합

 


스케줄러 (Scheduler)

CPU는 하나의 프로세스 작업이 끝나면 다음 프로세스 작업을 수행해야 합니다.

여기서 CPU 이용률을 최대화 할 수 있는 방향으로 어떤 프로세스를 다음에 처리할지 선택하는 알고리즘을 스케줄링(Scheduling)이라고 합니다.

CPU가 스케줄링을 하는 것이므로 CPU 스케줄링이라고도 하고, 프로세스를 스케줄링하므로 프로세스 스케줄링이라고도 합니다.

 

이 스케줄링을 하는 코드를 Scheduler라고 합니다.

스케줄러는 역할과 목적에 따라 나눌 수 있습니다.

 

Long-term 스케줄러 (장기 스케줄러, Job 스케줄러)

Long-term 스케줄러는 New 상태 프로세스 중 어떤 것들을 Ready Queue로 보낼지 결정합니다.

프로세스에 memory 및 각종 자원을 주는 문제를 담당하는 코드입니다.

 

메모리에 프로그램이 너무 많이 올라와도, 너무 적게 올라와도 성능에 악영향을 끼칩니다.

메모리에 프로그램이 너무 많이 올라온다면 CPU를 할당 받고 프로그램을 실행하려고 하니 메모리에 올라와 있지 않을 수 있습니다.

너무 적게 올라온다면 올라온 프로그램이 I/O를 할 때 CPU는 할 일 없이 놀게 됩니다.

 

따라서 운영체제는 디스크에 저장되어 있는 프로그램 중 어떤 것에 메모리를 할당하여 Ready Queue로 보낼지 제어합니다.

프로세스 상태를 New에서 Ready로 바꿉니다.

 

참고로 time sharing system(시분할 시스템)에서는 곧바로 메모리에 올라가 Ready 상태가 되므로 Long-term 스케줄러가 없습니다.

즉, 현대 운영체제에서는 사용하지 않는 스케줄러입니다.

 

Short-term 스케줄러 (단기 스케줄러, CPU 스케줄러)

보통 스케줄러라 함은 Short-term 스케줄러, CPU 스케줄러를 의미합니다. 

 

Short-term 스케줄러는 Ready Queue에 존재하는 프로세스 중 어떤 프로세스를 Running 시킬지 결정합니다.

프로세스에 CPU를 할당하는 문제이기 때문에 CPU 스케줄러라고도 합니다.

프로세스 상태를 Ready에서 Running으로 바꾸며(정확히는 Ready -> Running -> Block -> Read) 매우 빈번하게 호출되므로 millisecond 단위로 매우 빨라야 합니다.

 

CPU 스케줄링에 대해서는 이후 다른 포스팅에서 더 자세히 다룹니다.

 

Medium-term 스케줄러 (중기 스케줄러, Swapper)

현대 운영체제인 time sharing system에서 장기 스케줄러 사용이 낮아지면서 중기 스케줄러를 사용하게 됩니다.

 

여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫓아냅니다. (Swapping)

프로세스에게서 memory를 뺏는(deallocate) 문제입니다.

 

Block 상태의 프로세스는 Swap out 0순위 대상입니다.

모든 Block 상태의 프로세스를 Swapping해도 메모리가 부족하면 Timer 인터럽트로 Ready Queue로 이동하는 프로세스를 추가로 Swap out 시킵니다.

 

중기 스케줄러에서는 추가된 프로세스 상태가 있습니다.

메모리를 통째로 빼앗긴 프로세스의 상태를 표시하기 위함입니다.

 


프로세스 상태 - 2

프로세스 상태 - 1의 내용에 이어 중기 스케줄러에서 추가된 Suspend 상태를 알아보겠습니다.

 

Active 영역과 Inactive 영역으로 나뉘었습니다.

Inactive 영역에는 외부적인 이유로 인해 정지된 프로세스가 배치됩니다.

 

Suspend 상태는 Stopped 상태라고도 부르며 외부적인 이유로 프로세스의 수행이 정지된 상태입니다.

  • Suspend Blocked : Blocked 상태의 프로세스가 Swap out 당한 상태
  • Suspend Ready : Ready 상태의 프로세스가 Swap out 당한 상태

 

Suspend와 Blocked는 몇 가지 차이점이 존재합니다.

Blocked는 I/O 등의 event가 완료되기를 스스로 기다리는 상태로 자신이 요청한 event가 만족되면 Ready 상태로 변합니다.

Suspend는 외부적인 이유로 정지되었기 때문에 외부에서 resume을 해야 Active 상태가 됩니다.

 


잘못된 점이 있다면 댓글로 알려주시면 감사하겠습니다.

감사합니다.

 

출처

- 숭실대학교 홍지만 교수님, 운영체제

- 이화여자대학교 반효경 교수님, 운영체제

- A. Silberschatz et al., Operating System Concepts, 9th Edition, John Wiley & Sons, Inc. 2013. 
- A. Silberschatz et al., Operating System Principles, Wiley Asia Student Edition 

 

 

반응형