[OS] 프로세스와 스레드, PCB, Context Switching

jh Seo·2025년 7월 23일
0

운영체제

목록 보기
2/4

프로세스(Process)

운영체제로부터 자원을 할당받은 작업의 단위

프로그램(Program)

윈도우의 .exe 파일이나 Mac의 .dmg 파일등 사용자가 실행할 수 있는 파일을 말한다.

프로그램과 프로세스 차이

실행 파일(프로그램)을 실행하는 순간, 파일은 컴퓨터 메모리에 올라가게 된다.
이를 동적 상태라고하며, 이 상태의 프로그램을 프로세스 라고 한다.

따라서 프로그램은 실행할 수 있는 파일을 말하고,
프로세스는 실행한 상태의 프로그램을 말한다.

스레드(Thread)

프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위
경량 프로세스(light weight process)라고도 함

프로세스와 스레드 차이 및 스레드의 기원

과거에는 프로그램 실행시, 실행 시작부터 끝까지 프로세스 하나만으로 구성되어있었다.
시간이 지날수록 프로그램이 복잡해지고, 프로세스 하나만으로 구동하기엔 한계가 있었다.

따라서 프로세스 여러 개로 이루어진 프로그램이 나타났다.
하지만 프로세스가 많아지면 멀티 프로세스의 메모리 구성상
cpu에서 할당받는 자원이 중복되어 메모리를 많이 차지한다.

따라서 프로세스보다 더 작은 실행 단위 개념이 필요해졌고, 이것이 스레드다.

스레드는 프로세스와 다르게 스레드 간의 메모리를 공유하며 작동한다.
스레드끼리 프로세스 자원을 공유하며 프로세스의 실행 흐름의 일부가 된다.

프로세스와 스레드의 메모리 공유

공통적인 메모리 구성

프로세스와 메모리 모두 아래의 메모리로 구성되어 있다.

코드 영역(Code/Text)

프로그래머가 작성한 프로그램 함수들의 코드가 cpu가 해석 가능한 기계어로 저장되어 있다.

데이터 영역(Data)

코드가 실행되면서 사용되는 전역 변수나 static, 상수 데이터들이 모여있다.

  • data
    전역 변수 또는 static 변수등 프로그램이 사용하는 데이터들 저장되는 영역
  • bss
    초기값 없는 전역 변수, static변수 저장되는 영역
  • rodata
    const같은 상수 키워드 선언된 변수나 문자열 상수가 저장되는 영역

스택 영역(Stack)

지역변수나 호출한 함수가 종료되면 되돌아 올 주소등, 임시적인 자료를 저장하는 독립적인 공간이다.
Stack은 함수의 호출시 할당되며, 함수의 호출이 완료되면 소멸한다.
stack 영역을 초과하게 되면 stack overflow가 발생한다.

힙 영역(Heap)

생성자, 인스턴스와 같은 동적으로 할당되는 데이터들을 위한 공간이다.
사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.

위 그림에서 Stack과 Heap영역이 위아래로 화살표가 쳐 있는 것을 볼 수 있는데,
이는 stack과 heap은 동적 영역이기때문에 이를 표현한 것이다.

프로세스 메모리 공유

각 프로세스는 메모리의 별도 주소공간에서 실행되기 때문에,
한 프로세스는 다른 프로세스의 메모리에 접근할 수 없다.

프로세스가 다른 프로세스의 메모리를 공유하기 위해선 다음과 같은 특별한 방법들이 필요하다.

IPC (Inter-Process Communication)

IPC는 서로 다른 프로세스가 데이터를 주고받을 수 있도록 하는 기술이다.
주요 목적은 독립적으로 실행되는 프로세스 간에 정보를 교환하거나 효율적인 자원 공유이다.

대표적인 방식

  • 파이프(Pipe)
    부모-자식 프로세스 간 단방향 데이터 전송에 사용.

  • 메시지 큐(Message Queue)
    시스템 내 큐를 통해 메시지를 송수신.

  • 공유 메모리(Shared Memory)
    하나의 물리적 메모리를 여러 프로세스가 접근하여 정보 교환.

  • 소켓(Socket)
    네트워크를 통해 프로세스 간 통신 지원.

  • 세마포어(Semaphore)
    동기화나 자원 접근 제어에 활용.

특징

  • 프로세스의 독립성을 유지하면서도 안전하게 데이터 전송 가능

  • 운영체제(OS)가 안전성과 권한 관리를 담당

  • 성능과 구현 방법은 방식에 따라 상이

LPC (Local Procedure Call)

LPC는 주로 윈도우 운영체제에서 사용하는 IPC의 일종으로,
동일한 시스템 내의 로컬 프로세스 간에 효율적으로 데이터를 교환하기 위한 메커니즘이다.

동작 방식

하나의 프로세스가 다른 프로세스의 특정 기능(함수/프로시저)을 직접 호출할 수 있다.
커널이 메시지 패싱, 동기화, 권한 확인 등 저수준 처리를 관리하여 안전하고 신속한 통신을 보장한다.

주요 활용 예시

  • 윈도우의 서비스 관리, 시스템 내부 컴포넌트 간 통신

  • 클라이언트-서버 구조의 어플리케이션 내부 통신

특징

  • 로컬 시스템 내에서만 작동(네트워크 불필요)

  • 직관적이고 빠른 데이터 교환이 가능

  • 운영체제가 철저히 통신을 관리하여 안전성 보장

그러나 프로세스 자원 공유는 단순히 CPU 레지스터 교체뿐만 아니라
RAM과 CPU사이의 캐시 메모리까지 초기화되기 때문에 자원 부담이 크다는 단점이 있다.
그래서 다중 작업이 필요한 경우 스레드를 이용하는 것이 훨씬 효율적이라,
현대 컴퓨터 운영체제에서는 다중 스레딩을 기본으로 하고 있다.

스레드의 자원 공유

스레드는 기본적으로 프로세스의 4가지 메모리 영역 중 Stack영역만 할당받아 복사해 사용한다.
따라서 나머지 세 영역은 같은 프로세스 내의 스레드들과 공유한다.

독립적인 Stack 영역을 가진다는 것은 독립적인 함수호출이 가능하다라는 뜻이다.
따라서 스레드는 stack영역을 가짐으로 독립적인 실행 흐름을 갖게 된다.

프로세스 컨텍스트 스위칭

컨텍스트 스위칭(context switching)은 cpu가 한 프로세스에서 다른 프로세스로 전환할 때 발생하는 일련의 과정을 말한다.
CPU는 한 번에 하나의 프로세스만 실행할 수 있으므로, 여러 프로세스를 번갈아가며 실행해
CPU활용률을 높이기 위해 컨텍스트 스위칭이 필요하다.

PCB(Process Control Block)

PCB는 운영체제에서 프로세스를 관리하기 위해 해당 프로세스의 상태 정보를 담고 있는 자료구조를 말한다.
프로세스를 컨텍스트 스위칭할 때, 이전 프로세스의 PCB에 현재 상태를 저장해놓고,
새로 실행할 프로세스의 PCB를 참조해 직전 상태에서 실행할 수 있도록 한다.

따라서 운영체제는 PCB에 담긴 프로세스 고유 정보를 통해 프로세스를 관리하며
프로세스의 실행상태를 파악하고, 우선순위를 조정하며, 스케쥴링을 수행하고, 다른 프로세스와의 동기화를 제어한다.

일반적으로 PCB내에는 다음과 같은 정보들이 포함되어 있다.

  • 포인터(Pointer)
    프로세스의 현재 위치를 저장하는 포인터 정보
  • 프로세스 상태(Process State)
    프로세스의 각 상태 - 생성(New), 준비(Ready) ,실행(Running) ,대기(Waiting) ,종료(Terminated)
  • 프로세스 아이디(Process ID)
    프로세스 식별자를 지정하는 고유한 ID
  • 프로그램 카운터(Program counter)
    프로세스를 위해 실행될 다음 명령어의 주소를 포함하는 카운터를 저장
  • 레지스터(Register)
    누산기, 베이스, 레지스터 및 범용 레지스터를 포함하는 CPU레지스터에 있는 정보
  • 메모리 제한(Memory Limits)
    운영 체제에서 사용하는 메모리 관리 시스템에 대한 정보
  • 열린 파일 목록(List of open file)
    프로세스를 위해 열린 파일 목록

Process의 Context Switching 동작 과정

  1. CPU는 Process P1을 실행한다.(Executing)
  2. 일정 시간이 지나 Interrupt 또는 system call이 발생한다. (CPU idle상태)
  3. 현재 실행 중인 Process P1의 상태를 PCB 1에 저장한다. (Save state into PCB 1)
  4. 다음으로 실행할 Process P2를 선택한다. (CPU 스케쥴링)
  5. Process P2의 상태를 PCB 2에서 불러온다. (Reload state from PCB 2)
  6. CPU는 Process P2를 실행한다. (Executing)
  7. 일정 시간이 지나 Interrupt 또는 System call이 발생한다. (CPU는 idle 상태)
  8. 현재 실행 중인 Process P2의 상태를 PCB 2에 저장한다. (Save state into PCB 2)
  9. 다시 Process P1을 실행할 차례까 된다. (CPU 스케쥴링)
  10. Process P1의 상태를 PCB 1에서 불러온다. (Reload state from PCB 1)
  11. CPU는 Process P1을 중간 시점부터 실행한다. (Executing)
    idle(대기)와 executing(실행)은 CPU의 동작 상태를 나타낸 것이다.

TCB

스레드를 관리하는 자료구조도 존재한다.
보통 PCB내부에 TCB를 포함해 스레드를 관리한다.


스레드가 확장될 때 마다, 스레드 블록도 확장된다

Context Switching Overhead

프로세스 컨텍스트 스위칭 오버헤드

컨텍스트 스위칭 과정은 사용자로 하여금 빠른 반응성과 동시성을 제공하지만 ,
실행되는 프로세스 변경 과정에서 프로세스의 상태, 레지스터 값등이 저장되고 불러오는 등의 작업이 수행하기 때문에 시스템에 많은 부담을 주게 된다.

컨텍스트 스위칭 과정 그림을 보면 P1이 Execute에서 idle이 될 때 P2가 바로 Execute되지않고, idle 상태에 조금 머무르다가 Execute 가 되는 걸 볼수 있다.
이 간극이 컨텍스트 스위칭 오버헤드이다.

컨텍스트 스위칭 오버헤드는 대표적으로 다음과 같은 행위에서 발생된다.

  • PCB 저장 및 복원 비용
  • CPU 캐시 메모리 무효화에 따른 비용
  • 프로세스 스케쥴링 비용

컨텍스트 스위칭 과정에서 PCB를 저장하고 복원하는데 비용이 발생하며,
프로세스 자체가 교체되는 것이니 CPU 캐시 메모리에 저장된 데이터가 무효화가 된다.
메모리 접근 시간도 늘어나고 , CPU 스케쥴링 알고리즘에 따라 프로세스를 선택하는 비용도 든다.

스레드 컨텍스트 스위칭 오버헤드

스레드끼리도 컨텍스트 스위칭 오버헤드가 발생한다.
멀티 스레드를 사용할 때, 스레드가 많을 수록 프로그램 성능이 향상될거라 예상하지만,
스레드끼리의 컨텍스트 스위칭 오버헤드도 존재해서 그렇지 않다.

우선 스레드 컨텍스트 스위칭이 일어나면 커널모드로 전환된 후,
현재 실행중인 CPU의 레지스터 값, 프로그램 카운터, 스택 포인터가 TCB에 저장된 후,
다음 스레드의 TCB를 불러오면서 컨텍스트 스위칭이 발생한다.

프로세스 컨텍스트 스위칭 오버헤드가 더 큰 이유

스레드 컨텍스트 스위칭은 PCB 내부의 TCB 정보만 바꾸는 것에 가깝다.
→ OS 입장에서는 단일 프로세스 내에서 "실행 흐름"만 바꿔치기

프로세스 간 스위칭은 메모리 매핑, 리소스 관리 등 훨씬 더 복잡한 동작을 수반

스레드 컨텍스트 스위칭 중에도 CPU가 오랜 시간 놀지 않고, 관리 코드 실행 후 빠르게 다른 스레드로 일한다는 점

레퍼런스

https://eunajung01.tistory.com/55#pcb%EC%99%80-tcb
https://inpa.tistory.com/entry/👩‍💻-프로세스-⚔️-쓰레드-차이

profile
코딩 창고!

0개의 댓글