OS 10 - 프로세스와 스레드

10-1 프로세스 개요

프로세스

  • 포그라운드 프로세스 : 사용자가 보는 앞에서 실행되는 프로세스
  • 백그라운드 포르세스 : 사용자가 보지 못하는 뒷편에서 실행되는 프로세스
    • 데몬(유닉스 체계의 운영체제), 서비스(윈도우 운영체제)

프로세스 제어 블록(PCB)

  • 프로세스와 관련된 정보를 저장하는 자료 구조
  • PCB는 커널 영역에 생성
  • 새로운 프로세스가 생성되었다 == 운영체제가 PCB를 생성했다
  • 프로세스가 종료되었따 == 운영체제가 해당 PCB를 폐기했다
  • 프로세스에 담기는 정보
    • 프로세스 ID(PID)
    • 레지스터 값
    • 프로세스 상태
    • CPU 스케줄링 정보
    • 메모리 관리 정보
    • 사용한 파일과 입출력장치 목록

문맥 교환

하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보를 문맥이라고 한다. 프로세스 문맥은 PCB에 표현되어 있다.

기존 프로세스 문맥을 PCB에 백업하고, 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구하여 새로운 프로세스를 실행하는 것을 문맥 교환이라고 한다.

프로세스의 메모리 영역

프로세스가 생성되면 커널 영역에 PCB가 생성된다. 그렇다면 사용자 영역에서는 해당 프로세스가 어떻게 배치될까?

  • 코드 영역
    • 코드 영역 == 텍스트 영역
    • 실행할 수 있는 코드(기계어로 이루어진 명령어)가 저장되는 공간
    • 읽기 전용 공간
    • 정적 할당 영역
  • 데이터 영역
    • 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간
    • ex) 전역 변수
    • 정적 할당 영역
  • 힙 영역
    • 프로그래머가 직접 할당할 수 있는 저장 공간
    • 힙 영역에 메모리 공간을 할당했다면 언젠가는 해당 공간을 반환해야 함
    • 메모리 공간을 반환한다 == 해당 메모리 공간은 사용하지 않겠다
    • 메모리 공간을 반환하지 않으면 메모리 낭비를 초래하는 메모리 누수 문제가 발생
    • 동적 할당 영역
  • 스택 영역
    • 데이터를 일시적으로 저장하는 공간
    • ex) 매개 변수, 지역 변수
    • PUSH, POP

정적 할당 영역 vs 동적 할당 영역

  • 정적 할당 영역 : 크기가 고정된 영역
  • 동적 할당 영역 : 프로그램 실행 과정에서 크기가 변할 수 있는 영역

10-2 프로세스 상태와 계층 구조

프로세스 상태

  • 생성 상태 : PCB를 할당받았지만, CPU의 할당을 기다리는 상태
  • 준비 상태 : CPU를 할당받았지만, 아직 차례가 아닌 상태
  • 실행 상태 : CPU를 할당받아 실행 중인 상태
  • 대기 상태 : 입출력 작업을 요청한 프로세스가 입출력장치의 작업을 기다리는 상태
  • 종료 상태 : PCB와 프로세스가 사용한 메모리는 정리됨

프로세스 계층 구조

프로세스는 실행 도중 시스템 호출을 통해 다른 프로세스를 생성할 수 있다. 새 프로세스를 생성한 프로세스를 부모 프로세스라고 하고, 부모 프로세스에 의해 생성된 프로세스를 자식 프로세스라고 한다.

부모 프로세스와 자식 프로세스는 엄연히 다른 프로세스이기 때문에 서로 다른 PIP를 갖고, 자식 프로세스의 PCB에 부모 프로세스의 PID인 PPID(Paent PID)가 기록된다. 생성된 자식 프로세스들이 또 프로세스를 낳을 수 있다.

프로세스 생성 기법

부모 프로세스는 자식 프로세스를 어떻게 만들어내고, 자식 프로세스는 어떻게 자신만의 코드를 실행할까?

  1. 부모 프로세스는 fork 시스템 호출을 통해 자신의 복사본을 자식 프로세스로 생성한다.
  2. 만들어진 복사본(자식 프로세스)는 exec 시스템 호출을 통해 자신의 메모리 공간을 다른 프로그램으로 교체한다.

여기에서 exec이란 부모 프로세스를 통해 복사한 자원(메모리 내의 내용, 열린 파일 목록 등) 위에 새로운 프로그램으로 덮어쓰는 시스템 호출이다.

10-3 스레드

멀티프로세스와 멀티스레드

  • 멀티프로세스 : 여러 프로세스를 동시에 실행하는 것
  • 멀티스레드 : 여러 스레드로 프로세스를 동시에 실행하는 것 프로세스끼리는 자원을 공유하지 않지만, 스레드끼리는 프로세스 내의 자원을 공유한다. 여러 프로세스를 병행 실행하는 것보다 여러 스레드를 병행 실행하는 것이 메모리를 더 효율적으로 사용할 수 있다. 하지만, 머리스레드 환경에서 하나의 스레드에 문제가 생기면 프로세스 전체에 문제가 생길 수 있다는 단점이 있다.

++ 프로세스 간 통신 프로세스끼리는 기본적으로 자원을 공유하지 않지만, 자원을 공유하고 데이터를 주고받을 수 있다. 이를 프로세스 간 통신(IPC) 이라고 부른다. 또한 공유 메모리를 통해 데이터를 주고받을 수 있다.