본문 바로가기
os

[OS] 프로세스와 PCB 그리고 스레드

by 윤-찬미 2021. 3. 7.

📋 목차

  • 서론
  • 프로세스란 무엇인가
  • 프로세스 제어 블록(Process Control Block, PCB)
  • 스레드란 무엇인가
  • 정리

⛳ 서론

프로세스랑 스레드는 면접 단골 질문이라고 칭할만큼 이제는 필수적으로 알아야하는 개념입니다.

오늘은 이 프로세스랑 스레드에 대해 최대한 쉽게 설명 드리려고 합니다.

끝까지 읽어주세요!

사전에 알아야 할 내용은 다음과 같습니다.

  • cpu
  • 레지스터

👀 프로세스란 무엇인가

프로세스에 대해 알아보겠습니다.

사전적 정의

프로세스: 운영체제로부터 자원을 할당받은 작업의 단위.

말이 어려워 보이지만 사실 어려운 개념이 아닙니다.

그냥 실행하고 있는 프로그램을 일컫는데, 왜 이런 정의가 나왔는지 알아보겠습니다.

 

자 카카오톡으로 예를 들어보겠습니다.

 

카카오톡이라는 프로그램이 있습니다.

카카오톡을 클릭 해서 카카오톡을 실행시켰습니다.

이제 실행 중인 카카오톡을 프로세스 라고 부르겠습니다.

프로세스는 메모리에 올라갈 때 운영체제로부터 시스템 자원을 할당받습니다.

 

아래와 같이 말이죠!

그림과 같이 프로세스는 운영체제로 부터 각각 독립된 메모리 영역을 할당해 줍니다!

내부에는 code, data, stack, heap 영역으로 분리되어 있습니다.

 

핵심은 독립된 메모리 영역 입니다.

각각 독립된 메모리 영역을 할당 받았기 때문에 다른 프로세스로 접근 할 수 없습니다.

 

왜 독립된 영역을 할당 하는 걸까요?

독립되지 않고 여러프로그램이 하나의 프로세스에서 모든걸 처리한다고 가정해보겠습니다.

여러분이 과제를 하고 있는데, 카카오톡을 켜서 팀원들이랑 회의를 하면서 한글파일을 작성하고 있다고 가정해보겠습니다. 그런데 갑자기 카카오톡에 문제가 생겨 카카오톡이 중지 되어 버리고 말았네요!

그럼 한글과 카카오톡은 같은 프로세스를 쓰고 있기 때문에 같이 중지되어버리고 말 겁니다.

이러한 이유로 각각의 독립된 영역을 차지하고 있고, 각 프로세스는 다른 프로세스에 접근 할 수 없습니다.

크롬에서 프로세스를 어떻게 분리했을까?

크롬 같은 경우에는 내부적으로 각 탭별로 프로세스를 분리 했다고 합니다.

그 이유는 a라는 탭에서 작업을 하다가 문제가 생겨도 b, c, d 탭에는 문제가 생기지 않도록 하기 위함입니다.

 

페이지 별로 프로세스를 분리 시킬 수 있었는데 그렇게 하지 않은 이유도 a탭과 b탭이 같은 페이지를 켜놓고 작업을 할 수도 있는데 페이지 별로 프로세스를 분리 시키면 그 페이지에 문제가 생겼을때 a,b탭 모두 문제가 생길 수도 있기 때문입니다. 이처럼 프로세스를 이해하고 그들의 동작방식을 이해하는 것은 굉장히 중요합니다.

👀 프로세스 제어 블록(Process Control Block, PCB)

프로세스 제어 블록에 대해 알아보겠습니다.

 

프로세스 제어 블록이란,

PCB 는 특정 프로세스에 대한 중요한 정보를 저장 하고 있는 운영체제의 자료구조

개념정의상으로는 위와 같은데 대체 뭔소린가 하는 분들을 위해 조금 더 쉽게 알려드리겠습니다.

 

여러분이 카카오톡을 하면서 유튜브로는 음악을 듣고 중간중간 동시에 다른일들을 처리하기도 하시죠?

여기서의 포인트는 동시에 입니다. 과연 여러 프로세스들이 동시에 실행되고 있는 것일까요?

 

답은 "아니요" 입니다.

 

사실 동시에 실행하는게 아니라 내부적으로 왔다갔다 하는겁니다. 사용자가 느끼지 못할정도로 아주 빠르고 효율적으로 말이죠. 그래서 사용자들은 "동시에" 실행되고 있다고 느끼는 것 입니다.

 

이렇게 프로세스들이 교체되어 수행되고 나면, 다시 다른 프로세스를 불러와야 하는데, 전에 프로세스에 대한 작업내용을 기억하고 있어야 가능 할 것 입니다.

 

프로세스 단위로 정보를 저장해주는 block이 있는데, 이게 바로 PCB입니다.

 

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

  • 프로세스 식별자(Process ID, PID) : 프로세스 식별번호
  • 프로세스 상태 : new, ready, running, waiting, terminated 등의 상태를 저장
  • 프로그램 카운터 : 프로세스가 다음에 실행할 명령어의 주소
  • CPU 레지스터
  • CPU 스케쥴링 정보 : 프로세스의 우선순위, 스케줄 큐에 대한 포인터 등
  • 메모리 관리 정보 : 페이지 테이블 또는 세그먼트 테이블 등과 같은 정보를 포함
  • 입출력 상태 정보 : 프로세스에 할당된 입출력 장치들과 열린 파일 목록
  • 어카운팅 정보 : 사용된 CPU 시간, 시간제한, 계정번호 등

실제로 내부에서 어떻게 돌아가는지 조금 더 딥하게 알아보도록 하겠습니다.

 

Context Switching

저희가 지금까지 프로세스에 대해 살펴봤는데, 이번에는 Context Switching에 대해 알아보겠습니다. 이어진 개념들 입니다.

 

프로그램을 실행하면,

수행중인(실행중인) 프로세스에 대한 정보가 cpu의 레지스터 내부에 저장됩니다.

그러다가 다른 프로세스가 실행되면, 지금까지 실행중이던 프로세스의 작업 내용을 pcb에 저장하게 됩니다.

그리고 다시 전에 실행했었던 프로세스로 돌아오면 레지스터에 다시 프로세스에 대한 정보가 저장되고, 해당 프로세스 pcb에 저장되어 있던 것을 가져와 이어서 실행할 수 있는 것입니다.

 

즉 cpu가 이전의 프로세스 상태를 PCB에 저장하고, 또다른 프로세스 정보를 PCB에서 읽어 레지스터에 적재하는 과정을 Context Switching 이라고 부릅니다.

 

Overhead

오버헤드(overhead)는 어떤 처리를 하기 위해 들어가는 간접적인 처리 시간 · 메모리 등을 말합니다.

예를 들어 A라는 처리를 단순하게 실행한다면 10초 걸리는데, 안전성을 고려하고 부가적인 B라는 처리를 추가한 결과 처리시간이 15초 걸렸다면, 오버헤드는 5초가 됩니다. 또한 이 처리 B를 개선해 B'라는 처리를 한 결과, 처리시간이 12초가 되었다면, 이 경우 오버헤드가 3초 단축되었다고 말합니다.

 

그런데 의문이 들 수 있는 것은 여러 프로세스들을 메모리에 저장하고 왔다갔다 하면서 다시 메모리에 있는걸 CPU에 넣고.. 왜 이렇게 복잡한 짓을 하는 걸까요?

 

하나 실행이 완료되면 다음 프로세스를 실행 하면 오버헤드가 발생할 일이 더 없을 텐데 말이죠.

 

사실상 오버헤드를 감당하면서도 이렇게 실행하는 이유는 CPU가 노는걸 방지하기 위함이에요.

 

예를 들어 프로세스가 수행하다가 I/O이벤트가 디스크에 명령을 시켰는데, 걔가 끝날때까지 다른 프로세스로 안바꾸고 그냥 CPU가 가만히 있으면, 낭비되니, 오버헤드를 감당하더라도 위와 같이 작업을 하는 것 입니다.

 

👀 스레드

프로그램 > 프로세스 > 스레드 라고 말합니다.

 

스레드란?

스레드: 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위.

프로세스 내부에는 아래와 같이 자원을 공유하는 여러개의 스레드가 있습니다.

프로그램의 규모가 커지면서 한 프로그램 안에서 여러가지 작업을 하게 되는데, 이 내부 작업들은 각각의 스레드가 스레드간 메모리를 공유하며 작동 합니다.

 

아래와 같은 창을 본적이 있을 것입니다.

프로세스와는 다르게 자원을 공유하고 있기 때문에 한 스레드에 문제가 생기면 프로세스 전체가 종료됩니다.

 

🐱 정리

총 정리를 하면 다음과 같습니다.

  • 프로그램 : 코드덩어리 실행되기전 코드 그 자체
  • 프로세스: 실행하고 있는 프로그램, 각각의 독립된 메모리 영역을 할당 받는다.그 메모리는 **code, data, stack, heap** 영역으로 분리되어 있다.
  • PCB: 특정 프로세스에 대한 정보를 저장하고 있다.
  • 스레드: 프로세스의 실행 단위

참고자료

https://jhnyang.tistory.com/33

https://velog.io/@raejoonee/프로세스와-스레드의-차이#프로세스와-스레드의-작동-방식에-대한-더-자세한-설명

https://d2.naver.com/helloworld/2922312

 

프로세스와 스레드에 대해 궁금하셨던 분들에게 조금이나마 도움이 되길 바랍니다.

피드백, 정보 공유는 언제나 환영입니다.

'os' 카테고리의 다른 글

[OS] CPU 스케쥴러 쉽게 설명하기  (1) 2021.05.12
[OS] 스케쥴러  (0) 2021.03.15