Machineboy空

프로세스와 스레드 ① 프로세스 개요 - 프로세스 제어블록(PCB), 문맥 교환, 정적할당/ 동적할당 본문

Computer/CS

프로세스와 스레드 ① 프로세스 개요 - 프로세스 제어블록(PCB), 문맥 교환, 정적할당/ 동적할당

안녕도라 2024. 1. 12. 11:25

프로세스란?

프로그램은 실행되기 전까지 데이터 덩어리로서 보조기억장치에 저장되어 있다가

실행해서 메모리에 적재되는 순간 프로세스(process)가 된다.

이 과정을 프로세스를 생성한다고 말하기도 한다.

macOS에서는 ps 명령어


프로세스(process)의 종류

포그라운드 프로세스 (foreground process) 백그라운드 프로세스(background process)

사용자가 볼 수 있는 공간에서 실행되는 프로세스 사용자가 볼 수 없는 공간에서 실행되는 프로세스
메모장, 게임 등

사용자와 직접 상호작용이 가능한 백그라운드 프로세스 사용자와 상호작용하지 않고 그저 정해진 일만 수행하는 프로세스
데몬(daemon), 서비스(service)

CPU가 프로세스를 어떻게 관리하는지

프로세스 제어 블록

 

모든 프로세스는 실행을 위해 CPU가 필요하다.

하지만 CPU 자원은 한정되어 있다.

*타이머 인터럽트: 야 시간 끝났어

 

*타이머 인터럽트(timeout interrupt): 클럭 신호를 발생시키는 장치에 의해 주기적으로 발생하는 하드웨어 인터럽트의 한 종류

 

CPU는 빠르게 번갈아 수행되는 프로세스들을 관리해야한다.

 

  • 이를 위해 사용하는 자료 구조가 프로세스 제어 블록 (Process Control Block)
    • 프로세스 관련 정보를 저장하는 자료 구조 * 자료구조: 자료를 저장하는 하나의 형태 
    • 마치 상품에 달린 태그와 같은 정보
    • 프로세스 생성 시 커널 영역에 생성, 종료 시 폐기

운영체제마다 차이가 있다!

 

운영체제는 커널 영역에 적재된 PCB를 보고 프로세스를 일목요연하게 관리한다.


프로세스 제어 블록(PCB)에 담기는 정보

  • 프로세스 ID(PID)
    • 특정 프로세스를 식별하기 위해 부여하는 고유한 번호 ex. 학교의 학번, 회사의 사번
  • 레지스터값
    • 프로세스는 자신의 실행 차례가 오면 이전까지 사용한 레지스터 중간값을 모두 복원 -> 실행 재개
      • 프로그램 카운터, 스택 포인터 등의 여러가지 레지스터가 이용될 것
      • * 프로그램 카운터 : 다음에 실행할 메모리의 주소 저장
      • 지금까지 실행한 레지스터의 값들을 알고 있어야 다시 자신의 차례가 왔을 때, 거기서부터 실행이 가능 
  • 프로세스 상태 
    • 입출력 장치를 위해 기다리는 상태, CPU를 사용하기 위해 기다리는 상태, CPU 이용 중인 상태 등
  • CPU 스케줄링 정보
    • 프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보
  • 메모리 정보
    • 프로세스가 어느 주소에 저장되어 있는지에 대한 정보
    • 페이지 테이블 정보 * '메모리 주소를 알 수 있는 정보가 담기는구나' 
  • 사용한 파일과 입출력장치 정보
    • 할당된 입출력장치, 사용 중인(열린) 파일 정보

PID


문맥 교환 (context switch)

한 프로세스(A)에서 다른 프로세스(B)로 실행 순서가 넘어가면?


  • 기존에 실행되던 프로세스 A는 지금까지의 중간 정보를 백업한다.
    • 프로그램 카운터 등 각종 레지스터값, 메모리 정보, 열었던 파일, 사용한 입출력장치 등
    • 이러한 중간 정보 == 문맥(context)
    • 즉, 다음 차례가 왔을 때 실행을 재개하기 위한 정보
    • "실행 문맥을 백업해두면 언제든 해당 프로세스의 실행을 재개할 수 있다"
  • 뒤이어 실행할 프로세스 B의 문맥을 복구
    • 자연스럽게 실행 중인 프로세스가 바뀐다.


지금까지는 CPU가 데이터(커널영역)를 어떻게 관리하는지의 이야기.

그렇다면 사용자 영역의 메모리는 어떻게 관리?

 

사용자 영역의 메모리

 

주소가 겹치지 않기 위해 힙은 아래에서부터 쌓이고 스택은 위에서 부터 쌓임

크기가 고정된 영역
:정적 할당 영역

코드영역
(= 텍스트 영역)
실행할 수 있는 코드, 기계어로 이루어진 명령어 저장

데이터가 아닌 CPU가 실행할 명령어가 담기기에 쓰기가 금지된 영역 (read-only)
데이터 영역 잠간 썼다 없앨 데이터가 아닌 프로그램이 실행되는 동안 내내 유지할 데이터 저장

ex. 전역 변수 (전체 영역에 걸쳐 쓸 변수)
크기가 가변적 영역
:동적 할당 영역

힙 영역 프로그램을 만드는 사용자, 즉 프로그래머가 직접 할당할 수 있는 저장공간

*메모리를 할당했다면 해제를 해줘야하는데
이것을 자동으로 해주는 언어에서 사용되는 것이 가비지 컬렉션(garbage collection)

*안하면 메모리 누수(memory leak)가 발생할 수 있음
스택 영역 데이터가 일시적으로 저장되는 공간
(데이터 영역에 담기는값과는 달리) 잠깐 쓰다가 말 값들이 저장되는 공간

ex. 매개 변수, 지역 변수