Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

tanficial 개발 일기

프로세스 본문

운영체제

프로세스

tanficial 2021. 8. 1. 23:27

이번 포스팅에서는 프로세스에 대해 자세히 알아보도록 하겠습니다. 프로세스가 무엇인지, 프로세스의 상태가 무엇이고 어떻게 변화하는지, 운영체제가 프로세스를 어떻게 관리하는지 등에 대한 것을 살펴보겠습니다.


1. 프로세스란?

프로세스란 가장 쉽게 말해서 실행 중인 프로그램을 말합니다. 그럼 실행 중인 프로그램이란 게 무엇일까요? 프로그램이 실행 중이란 말은, 프로그램이 커널에 등록되고 커널에 의해 관리되고 있다는 이야기입니다.

이 프로세스는 각종 자원들을 요청할 수 있고, 할당받을 수 있습니다. 프로세스는 이처럼 실행 중에 각종 자원을 요구, 할당, 반납하기 때문에 능동적인 개체(active entity)라고 불립니다.

프로세스와 프로그램의 차이는 다음과 같습니다.

  • 프로그램
    • 실행할 프로그램 + 데이터
    • 컴퓨터 시스템에게 실행 요청하기 전의 상태
    • 디스크에 보관되어 있는 상태
  • 프로세스
    • 실행을 위해 시스템(커널)에 등록된 프로그램
    • 시스템 성능 향상을 위해 커널에 의해 관리됨
    • 시스템에 등록돼서 메모리를 할당받았을 때 프로세스라고 한다.

잠깐 자원이 무엇인지 짚고 넘어가겠습니다. 자원이란 커널의 관리 하에 프로세스에게 할당/반납되는 수동적 개체(passive entity)를 말합니다. 자원에는 H/W Resource, S/W Resource 가 있습니다. H/W Resource는 프로세서, 메모리, 디스크, 모니터, 키보드 등 흔히 알고 계시는 컴퓨터 하드웨어를 말합니다. S/W Resource는 Message, Signal, Files, 프로그램 등을 말합니다.(메시지와 시그널은 소프트웨어끼리 주고 맡는 것을 말합니다.)

  • H/W Resource
    • 프로세서, 메모리, 디스크, 모니터, 키보드...
  • S/W Resource
    • 메시지, 시그널, 프로그램...

2. 프로세스의 종류

프로세스에도 종류가 있습니다. 종류는 역할과 병행 수행 방법에 따라서 분류할 수 있습니다.

  • 역할에 따른 분류
    • 시스템(커널) 프로세스 : 모든 시스템 메모리와 프로세서의 명령에 액세스 할 수 있는 프로세스입니다. 프로세스 실행 순서를 제어하거나 프로세스가 다른 사용자 및 커널(운영체제) 영역을 침범하지 못하게 감시하고, 프로세스를 생성하는 기능을 합니다.
    • 사용자 프로세스 : 사용자 코드를 수행하는 프로세스입니다.
  • 병행 수행 방법에 따른 분류
    • 독립 프로세스 : 다른 프로세스에 영향을 주지 않거나 다른 프로세스의 영향을 받지 않으면서 수행하는 병행 프로세스입니다.
    • 협력 프로세스 : 다른 프로세스에 영향을 주거나 다른 프로세스에서 영향을 받는 병행 프로세스입니다.

3. PCB(Process Control Block)

PCB란 운영체제가 프로세스의 관리 및 제어에 필요한 정보를 저장한 것을 말합니다. 프로세스가 생성되면 운영체제는 이 프로세스를 관리하기 위해 PCB를 생성하고, 커널이 직접 본인의 메모리 영역에 저장하여 가지고 있습니다. 커널이 PCB를 가지고 프로세스를 관리해야 하기 때문에 해당 프로세스의 메모리 영역이 아닌 자신의 메모리 영역에 저장하는 것입니다.

앞서 말씀드린 프로그램이 커널에 등록된다는 말은 이 PCB가 만들어져 커널 영역에 저장되고 이를 통해 프로세스로써 관리되는 것을 말합니다.

PCB가 관리하는 프로세스의 정보는 대게 다음과 같습니다.

  1. OS가 관리상 사용하는 부분
    • process state : 프로세스의 상태
    • process ID : 프로세스의 고유 식별 번호
    • scheduling information, priority : 프로세스 우선순위 등과 같은 스케줄링 관련 정보들을 저장합니다.
  2. CPU 수행 관련 하드웨어 값
    • Program counter, Register 값
    • 이 부분을 Context(문맥)라고 합니다. 프로세스 수행 도중의 CPU 상태를 저장하고 필요할 때 사용하게 됩니다.
  3. 메모리 관련
    • 메모리의 code, data영역 정보와, stack의 위치를 가리키는 포인터를 저장합니다.
  4. 입출력 상태 정보
    • 할당받은 입출력 장치, 파일 등에 대한 정보
    • open file descriptors : 프로세스에서 열고 있는 파일의 목록을 관리하는 테이블의 인덱스
  5. 계정 정보 : 자원 사용 시간 등을 관리

PCB 정보는 운영체제별로 서로 다릅니다. PCB 참조 및 갱신 속도는 운영체제의 성능을 결정짓는 중요한 요소 중 하나이기 때문에 PCB를 잘 구성해야 하고 운영체제의 목적이나, 용도에 따라 달라지게 됩니다.


4. 프로세스의 상태

프로세스는 자원 할당 상태를 기준으로 몇 가지 상태로 구분합니다. 하나씩 차례대로 보도록 하겠습니다.

Created 상태

created 상태란 프로그램(작업)이 생성되어 커널에 등록된 상태입니다. 이제 막 PCB가 할당되고 커널에 저장되어 프로세스가 된 상태를 말합니다.

created상태에서는 ready와 suspended ready 두 가지 상태로 전이될 수 있습니다. 커널은 프로세스를 생성한 후 사용 가능한 메모리 공간을 체크합니다. 메모리 공간을 프로세스에게 할당할 수 있다면 메모리를 할당하여 ready상태로 전이시키고, 메모리가 부족하다면, 메모리를 할당받지 못한 상태인 suspended ready 상태로 전이시킵니다.

  • created → ready : 메모리 할당
  • created → suspended ready : 메모리 할당받지 못함

Ready 상태

프로세서(CPU)만을 제외한 다른 모든 자원을 할당받은 상태로써, 프로세서(CPU) 할당을 기다리고 있는 상태입니다. 이 상태의 프로세스는 프로세서만 할당받으면 즉시 코드를 수행할 수 있는 상태입니다. 프로세서를 할당받아 실행상태로 전이되며, 이 상태를 running 상태라고 부릅니다.

  • ready → running : 이 상태 전이를 dispatch(schedule)라고 부릅니다. 프로세서를 할당받아 작업을 수행하게 됩니다.
  • ready → suspended running : 모종의 이유로 메모리를 빼앗기게 된다면 suspended ready 상태가 됩니다. 메모리를 빼앗기는 상태 전이를 swap-out이라고 부릅니다.

Running 상태

프로세서와 필요한 자원을 모두 할당받은 상태로, 실제로 수행 중인 상태입니다. 실행 도중 전이할 수 있는 상태로는 ready 상태와 asleep(blocked) 상태가 있습니다.

일정 시간이 지나거나 스케줄링에 의해 우선순위에서 밀려나는 등의 상황에서 다시 ready 상태로 전이되어 프로세스 할당을 기다립니다. 이 상태 전이를 preemption이라고 합니다.

운영체제에게 I/O 등의 자원 할당을 요청하게 되면, asleep 상태로 전이되어 프로세서를 빼앗기고 요청한 자원을 할당받을 때까지 기다리게 됩니다. 이 상태 전이를 sleep(block)이라고 합니다.

  • running → ready : preemption, 다시 ready 상태로 돌아가 프로세서의 할당을 기다림
  • running → blocked : sleep(block), 자원을 요청해 프로세서를 빼앗기고 요청한 자원의 할당을 기다리는 상태
  • running → suspended ready : swap-out, 수행 도중 메모리를 빼앗겨, suspended ready 상태로 전이될 수도 있습니다.

Asleep(Blocked) 상태

프로세서와 메모리 외의 다른 자원의 할당을 기다리고 있는 상태입니다. 메모리는 할당받은 상태이고, 자원 할당을 위해 프로세서는 반납한 상태입니다. 자원 할당은 system call에 의해 이루어집니다. Asleep 상태에서 자원을 할당받으면 곧바로 running 상태로 돌아가는 것이 아니라, 프로세서 할당을 위한 ready 상태로 전이되고, ready 상태에서 프로세서의 할당을 기다리게 됩니다.

  • asleep → ready : 이 상태 전이를 wake up이라고 부릅니다. 요청한 자원을 할당받아 프로세서를 기다리는 ready 상태로 전이
  • asleep → suspended blocked : swap-out, 요청한 자원을 기다리는 도중 메모리를 빼앗긴다면 suspended-block 상태로 전이합니다.

Suspended 상태

suspended 상태에는 suspended ready와 suspended blocked 상태가 있습니다. 두 상태 모두 메모리를 할당받지 못하거나 빼앗긴 상태입니다. swap-out 상태 전이가 발생하면 운영체제는 메모리를 다시 할당받았을 때 메모리를 뺏기기 전까지 하던 작업을 이어서 수행해야 하는데 이를 위해 Memory image를 swap device에 저장합니다.

  • swap device : 프로그램 정보 저장을 위한 특별한 파일 시스템
  • suspended ready → ready : swap-in
  • suspended blocked → blocked : swap-in

Terminated(Zombie) 상태

프로세스 수행이 끝난 상태입니다. 할당받은 모든 자원을 반납하고 커널 내에 일부 PCB정보만 남아있는 상태입니다. 커널 내에 PCB가 남아있으니 아직 완전히 종료된 상태는 아니고, 종료 중인 상태라고 보는 게 맞다고 합니다.

이후 커널이 남아 있는 PCB정보를 수집하고 이를 이용해 다른 비슷한 작업이 들어왔을 때 효율적으로 실행하기 위해 사용합니다.

정보 수집이 끝나면 커널은 실제로 프로세스를 삭제하고 종료합니다.


5. 프로세스 관리를 위한 자료구조

프로세스들은 자원을 할당받을 때 각 자원에 따른 큐에 등록되어 우선순위나 순서에 따라 자원을 할당받습니다.

  • Job queue : 현재 시스템 내에 있는 모든 프로세스의 집합
  • Ready queue : 프로세스들이 프로세서를 할당받기 위해 줄 서있는 공간
  • Device queue : 하드웨어 사용을 위해 대기하는 큐
  • I/O queue : I/O 작업을 위해 대기하는 큐

6. 운영체제의 인터럽트 처리 과정

이전의 포스팅을 보셨다면 인터럽트가 무엇인지는 아실 겁니다. 간단하게 다시 설명하면 예상치 못한 상황을 맞닥뜨리거나, 외부에서 이벤트가 발생했을 때 보내는 신호를 인터럽트라고 합니다.

인터럽트가 발생하면 프로세서(CPU)가 운영체제로 넘어가고 기존의 프로세스를 중단시키고 운영체제가 인터럽트에 맞는 서비스를 수행한 후 다음 차례의 프로세스에게 넘겨주게 됩니다.


7. 문맥(context)과 문맥 교환(context-switching)

문맥(context)이란?

프로세스와 관련된 정보들의 집합을 문맥이라고 합니다. 언제 시작했는가, 어디까지 했는가, 지금 어떤 상태인가 등의 프로세스 상태 정보를 나타냅니다.

  • CPU register context : 프로세스와 관련된 CPU 내부 정보, program counter(지금 어디를 수행하는가), register값(현재 CPU에 어떤 값이 있고, 어떤 값을 넣고 있는가)
  • 프로세스의 주소 공간 : 프로세스와 관련된 메모리 정보, code & data, stack, 메모리에 무엇을 가지고 있었는가
  • 프로세스 관련 커널 정보
    • PCB : 운영체제가 프로세스 별로 가지고 있는 자료구조, 프로세스가 cpu를 얼마나 썼는지, 메모리를 어떻게 썼는지 등의 정보를 종합적으로 가지고 있습니다.
    • Kernel stack : 운영체제는 커널 영역에 프로세스별로 별도의 스택 영역을 두고 관리합니다.

Context saving

현재 프로세스의 Register Context를 저장하는 작업입니다. 프로세스 수행 중 CPU를 빼앗기면 사용 중이던 CPU의 정보를 저장해야 합니다. 수행 중이던 프로세스의 Register Context를 PCB에 저장합니다.

Context restoring

저장해 놓았던 Register Context를 프로세스를 복구하는 작업입니다. PCB에 저장해 놓았던 Register Context를 다시 CPU에 가져나 놓고 이어서 작업을 수행합니다.

Context Switching

CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정입니다. 이 과정에서 방금 말씀드린 Context saving과 Context restoring이 이루어집니다.

  • 실행 중이던 프로세스 정보 context saving → 이전에 중단됐던 프로세스 정보 context restoring

시스템 콜이나 인터럽트 발생 시 반드시 문맥 교환이 일어나는 것은 아닙니다. 프로세스가 도중에 중단되었어도 해당 프로세스가 다시 바로 수행된다면 문맥 교환은 이루어지지 않습니다. 프로세스가 수행되다가 프로세서가 운영체제로 넘어가는 것은 문맥 교환이 아니며, 운영체제의 서비스 수행 이후 다시 A가 프로세서를 받아 작업을 수행하면 문맥 교환은 이루어지지 않습니다.

문맥 교환은 타이머 인터럽트에 의해 강제로 다른 프로세스로 프로세서를 넘겨주거나, I/O 요청 같은 시간이 오래 걸리는 시스템 콜을 호출했을 때 이루어집니다. 이런 인터럽트가 오면 프로세서는 운영체제에게 넘어가고 해당 프로세스를 중단시키고 다른 프로세스에게 프로세서를 넘깁니다. 이때 문맥 교환이 발생해 다른 프로세스가 수행되고, 해당 인터럽트를 발생시킨 프로세스는 요청한 작업이 완료되면 ready 큐로 들어가 다시 프로세서 할당을 대기합니다.

Context Switching Overhead(부하)

Context Switching에 발생하는 비용은 운영체제에 따라 다릅니다. 또한 이는 운영체제의 성능에 큰 영향을 줍니다. 따라서 불필요한 Context Switching을 줄이는 것이 중요합니다.

앞서 말씀드린 문맥 교환이 아닌 경우에도 context saving이 수행되어 부하가 발생하긴 하지만, 문맥 교환이 이루어지는 경우의 부담이 훨씬 크므로 Context Switching을 적절히 줄이는 것이 중요합니다.

부하의 예) cache memory flush


정리

  1. 프로세스란 커널에 등록되어 커널에 의해 관리되고 있는 프로그램, PCB가 만들어져 등록된 것
  2. PCB란 운영체제가 프로세스의 관리 및 제어에 필요한 정보를 저장한 것
  3. 프로세스의 상태
    • created
    • ready
    • running
    • asleep(blocked)
    • suspended ready
    • suspended blocked
    • terminated
  4. 인터럽트 처리 과정
    1. 인터럽트 발생
    2. 프로세스 중단
    3. context saving
    4. 인터럽트 서비스 수행
    5. context restoring
  5. 문맥과 문맥 교환
    1. 문맥 : 프로세스와 관련된 정보들의 집합을 문맥이라고 합니다. 언제 시작했는가, 어디까지 했는가, 지금 어떤 상태인가 등의 프로세스 상태 정보
    2. 문맥 교환 : CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정
      • 실행 중이던 프로세스 정보 context saving → 이전에 중단됐던 프로세스 정보 context restoring

마치며

프로세스에 대해 알아보았습니다. 프로세스 하나만 해도 굉장히 양이 많네요. 운영체제 다시 공부하는 게 도움이 많이 되는 거 같습니다. 옛날엔 모르고 넘어갔던 것도 다시 보고 이해할 수 있게 되고, 특히 이번 파트는 면접에서 받았던 질문도 다시 공부하게 되는 시간이었습니다. 또한 알게 된 거를 제 말로 설명하듯이 글을 쓰니 다시 복습하게 되고 제 생각도 정리되는 거 같습니다. 저번보다 글도 잘 써지는 거 같고 좋은 시간이었습니다.

다음 포스팅은 스레드에 대해 다루겠습니다. 제가 알기로 스레드 개념은 백엔드에서도 많이 쓰이고 동기, 비동기와도 밀접한 관련이 있는 걸로 알고 있습니다. 때문에 다른 파트와 마찬가지로 중요한 파트라고 생각합니다. 다음 포스팅 기대해 주시고 질문이랑 잘못된 점 말씀해 주시면 감사하겠습니다.


Reference

'운영체제' 카테고리의 다른 글

Thread(스레드)  (1) 2021.08.01
인터럽트  (2) 2021.07.26
운영체제의 구조와 기능  (1) 2021.07.24
컴퓨터 시스템 구조  (5) 2021.07.18
운영체제란 무엇일까  (7) 2021.07.16
Comments