CS 상식 - 운영체제

[CS 상식 - 운영체제] 프로세스와 스레드 (스터디 2)

beginner-in-coding 2025. 2. 10. 14:54

01. 프로세스 개요

  • 프로세스(process): 실행 중인 프로그램
  • 프로세스를 생성한다는 것: 보조 장치에 저장되어 있는 데이터 덩어리(프로그램)을 메모리에 적재하고 실행하는 것
  • 프로세스 직접 확인하는 방법
    • 윈도우: 작업 관리자의 [프로세스] 탭
    • 유닉스: ps 명령어
    • 포그라운드 프로세스(foreground process): 사용자가 보는 앞에서 실행되는 프로세스를 의미
    • 백그라운드 프로세스(background process): 사용자가 보지 못하는 뒤에서 실행되는 프로세스를 의미
    • 데몬(demon): 유닉스 운영체제에서의 백그라운드 프로세스
    • 서비스(service): 윈도우 운영체제에서의 백그라운드 프로세스
  • 프로세스 제어 블록
    • CPU 자원은 한정되어 있으므로 모든 프로세스가 동시에 CPU를 할당받을 수 없음
    • 타이머 인터럽트(Timer Interrupt): 클럭 신호를 발생시키는 장치에 의해 주기적으로 발생하는 하드웨어 인터럽트(타임 인터럽트)
    • OS는 빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리하고, 프로세스에 CPU를 비롯한 자원을 분배
    • 프로세스 제어 블록(PRB: Process Controll Block): 프로세스와 관련된 정보를 저장하는 자료구조
      • 해당 프로세스를 식별하기 위해 꼭 필요한 정보들이 저장됨
      • 커널 영역에 생성됨
      • 프로그램 생성 시에 만들어지고 실행이 끝나면 폐기됨
      • 새로운 프로세스가 생성되었음 == 운영체제가 PCB를 생성하였음
      • 프로세스가 종료되었음 == 운영체제가 해당 PCB를 폐기하였음
      • PCB에 담기는 정보들
        • 프로세스 ID(PID; Process ID): 특정 프로세스를 식별하기 위해 부여하는 고유한 번호
        • 레지스터 값: 이전에 진행했던 작업을 이어하기 위해 이전까지 사용했던 레지스터의 중간 값들을 모두 복원함
        • 프로세스 상태: 프로세스의 현재 어떤 상태인지를 저장
        • CPU 스케줄링 정보: 프로세스가 언제, 어떤 순서로 CPU에 할당받을지에 대한 정보 기록
        • 메모리 관리 정보: 프로세스마다 저장된 메모리 위치가 다름
        • 사용한 파일과 입출력 장치 목록: 실행 과정중에서 특정 입출력 장치나 파일을 사용하면 해당 내용이 명시
  • 문맥 교환
    • 문맥(contest): 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보
    • CPU를 사용가능한 시간이 다되어가거나 예기치 못한 상황이 발생하여 인터럽트가 발생하면 OS는 해당 프로세스의 PCB에 문맥을 백업
    • 문맥 교환(context switching): 기존 프로세스의 문맥을 PCB에 백업하고, 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구하여 새로운 프로세스를 실행하는 것
    • 문맥 교환이 자주 일어나면 오버헤드가 발생할 수 있음
  • 프로세스의 메모리 영역
    • 하나의 프로세스는 사용자 영역에 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어 저장됨
      1. 코드 영역(code segement)
        • 텍스트 영역(text segement)
        • 실행할 수 있는 코드
        • 즉 기계어로 이루어진 명령어가 저장
        • 읽기 전용(read-only)
      2. 데이터 영역(data segement)
        • 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간
        • 전역 변수(global variable): 프로그램이 실행되는 동안, 프로그램 전체에서 접근할 수 있는 변수
        • 정적 할당 영역: 크기가 고정된 영역
          • 코드 영역, 데이터 영역
        • 동적 할당 영역: 프로세스 실행 과정 중에서 크기가 변할 수 있는 영역
          • 힙 영역, 스택 영역
      3. 힙 영역(heap segemet)
        • 프로그래머가 직접 할당할 수 있는 저장 공간
        • 힙 영역에 메모리 공간을 할당했다면 반환해줘야함
          • 메모리 누수(memory leak): 메모리 공간을 반환하지 않는다면 할당된 공간이 메모리 내에 남아 메모리 낭비를 초래
      4. 스택 영역(stack segement)
        • 데이터를 일시적으로 저장하는 공간
        • 매개변수, 지역 변수
        • 일반적으로 힙 영역은 메모리의 낮은 주소에서 높은 주소로 할당되고
        • 스택 영역은 높은 주소에서 낮은 주소로 할당됨

02. 프로세스 상태와 계층 구조

  • 프로세스의 상태를 PCB에 기록하여 계층적으로 관리함
  • 프로세스 상태
    1. 생성 상태(new): 이제 막 메모리에 적재되어 PCB를 할당 받은 상태
    2. 준비 상태(ready): 당장이라도 CPU 할당받아 실행할 수 있지만, 아직 자신의 차례가 아니여서 기다리고 있는 상태
      • 디스패치(dispatch): 준비 상태인 프로세스가 실행 상태로 전환되는 것
    3. 실행 상태(running): CPU를 할당 받아 실행중인 상태를 의미
      • 타이머 인터럽트(할당된 시간을 다 사용하면)가 발생되면 다시 준비 상태로 변환
      • 실행 도중 입출력 장치의 작업이 끝날 때까지 기다려야 한다면 대기 상태로 변환
    4. 대기 상태(blocked): 입출력 작업을 요청한 프로세스가 입출력장치가 끝낼때까지 기다리는 상태
      • 입출력 작업은 CPU에 비해 처리 속도가 느리므로
    5. 종료 상태(terminated): 프로세스가 종료된 상태
      • 프로세스가 종료되면 사용한 메모리를 정리함
    6. 프로세스 상태 다이어그램(process state diagram)

프로세스 상태 다이어그램

  • 프로세스 계층 구조
    • 프로세스는 실행도중 시스템 호출을 통해 다른 프로세스를 생성할 수 있음
      • 부모 프로세스(parent process): 새 프로세스를 생성한 프로세스
      • 자식 프로세스(child process): 부모 프로세스에 의해 생성된 프로세스
    • 부모 프로세스와 자식 프로세스는 각각 다른 PID를 가짐
      • 일부 운영체제에서는 자식 프로세스의 PCB에 부모 프로세스의 PID인 PPID(Parent PID)가 기록되기도 함
    • 프로세스가 프로세를 낳는 계층적인 구조로 프로세스들을 관리
    • 프로세스 계층 구조

프로세스 계층 구조

* 최초의 프로세스 *

  • 유닉스: init
  • 리눅스: systemd
  • macOS: launchd
  • 프로세스 생성 기법
    • 부모를 통해 생성된 자식 프로세스들은 복제와 옷 갈아입기를 통해 실행
      • 부모 프로세스는 fork를 통해 자신의 복사본을 자식 프로세스로 생성해냄
      • 만들어진 복사본(자식 프로세스)는 exec를 통해 자신의 메모리 공간을 다른 프로그램으로 교체
    • 시스템 호출: fork, exec
      • fork: 부모 프로세스의 자원들(메모리 내의 내용, 열린 파일 목록 등)이 자식 프로세스에 상속
      • exec: 자신의 메모리 공간을 새로운 프로그램으로 덮어쓰는 시스템 호출, 새로운 내용으로 전환하는 것
    • 프로세스 계층 구조를 이루는 과정은 fork와 exec가 반복되는 과정임을 알 수 있음
    • 부모 프로세스가 자식 프로세스를 fork한 후에 부모/자식 프로세스 중 exec를 하지 않을 경우: 같은 코드를 병행하여 실행하는 프로세스가 됨

03. 스레드

  • 스레드(thread): 실행의 단위, 프로세스를 구성하는 실행의 흐름 단위
  • 하나의 프로세스는 여러개의 스레드를 가질 수 있음
  • 스레드를 이용해 하나의 프로세스에서 여러 부분을 동시에 실행할 수 있음
  • 프로세스와 스레드
    • 단일 스레드 프로세스: 실행의 흐름 간위가 하나
    • 멀티 스레드 프로세스: 하나의 프로세스가 여러 일을 동시에 처리하는 것
    • 스레드의 중요한 점: 실행에 필요한 최소한의 정보만을 유지한 채 프로세스 자원을 공유하며 실행됨
    • 리눅스에서의 프로세스와 스레드
      • 프로세스와 스레드 대신 테스크(task)라는 이름으로 통일해서 사용
  • 멀티 프로세스와 멀티 스레드
    • 멀티 프로세스(multi process): 여러 프로세스를 동시에 실행하는 것
    • 멀티 스레드(multi thread): 여러 스레도로 프로세스를 동시에 실행하는 것
    • 동일한 작업을 수행하는 단일 스레드 프로세스 여러개 실행 vs 하나의 프로세스를 여러 스레드로 실행하는 것 차이
      • 여러 프로세스로 병행 실행: 자원이 복제되어 메모리에 적재
      • 여러 스레드로 병행 실행: 스레드끼리 같은 프로세스 내의 자원을 공유함
        • 쓰기 시 복사(copy on write): fork한 후 같은 프로세스를 통째로 메모리에 중복 저장하지 않으면서 동시에 프로세스끼지 자원을 공유하지 않는 방법도 존재
    • 프로세스간 통신(IPC; Inter-Process Communicaton)
      • 기본적으로 프로세스는 자원을 공유하지 않지만, 가능함
      • 공유 메모리(shared memory): 서로 공유하는 메모리 영역을 두어 데이터를 주고받을 수 있음