스터디/CS 스터디

[운영체제] 프로세스 & 스레드

제이온 (Jayon) 2021. 11. 13.

cs-study에서 스터디를 진행하고 있습니다.

프로세스 & 스레드

프로세스

  • 프로그램이란 보조 기억 장치(하드디스크, SSD)에 존재하며 본인이 실행되기를 기다리는 명령어(코드) 및 데이터들의 묶음이다. 프로그램 자체는 동작을 하지 않는 정적이고 수동적인 개체이므로 프로그램을 실행하기 위해 운영체제로부터 프로그램이 동작하는데 필요한 CPU, 메모리, 입출력 장치, 파일 등의 자원을 할당 받아 동작을 시작해야 한다.
  • 동작을 시작하게 된 프로그램을 프로세스라 하며, 프로세스는 실핼 중인 프로그램 을 의미한다.
  • 프로그램이 프로세스가 되는 과정에서는 크게 2가지 일이 일어난다.
    • 운영체제는 프로세스가 필요로 하는 재료를 메모리의 code, data, heap, stack 영역에 올려준다.
    • 프로세스의 정보를 담은 PCB (Process Control Block) 블록이 메모리에 올라간다.

프로세스 메모리 공간

Untitled

  • Text: CPU에서 수행되는 명령어를 저장하는 곳이다. Code 영역이라고도 하며, 코드 자체를 구성하는 메모리 영역으로 Hex 파일이나 Bin 파일을 저장하는 메모리다.
  • Data: 정적 변수. 배열, 구조체 등이 저장되는 곳이다. 초기화된 데이터는 Data 영역에 저장되고, 초기화 되지 않은 데이터는 BSS(Block Stated Symbol) 영역에 저장되며, 프로그램 종료시 시스템에 반환된다.
  • Heap: 동적 데이터가 저장되는 곳이다.
  • Stack: 지역 변수와 인자, 함수의 리턴 주소가 저장되는 곳이다. 함수 호출 시 생성되고, 함수가 끝나면 반환된다. Stack 사이즈는 각 프로세스마다 할당되지만, 프로세스가 메모리에 로드될 때 Stack 사이즈가 고정되어 있기 때문에 런타임 시에 Stack 사이즈를 바꿀 수는 없다.

PCB 블록

Untitled

운영 체제가 프로세스에 대한 중요한 정보를 저장해 놓는 곳으로, Task Control Block 또는 Job Control Block이라고도 한다. 각 프로세스가 생성될 때마다 고유의 PCB가 생성되며 프로세스가 완료되면 PCB는 제거된다. PCB 블록은 메모리 중에서도 커널 스택과 같이 보호받을 수 있는 메모리에 저장된다.

  • PID: 프로세스를 구분할 수 있는 고유의 번호
  • 프로세스 상태: 준비 / 대기 / 실행 등 프로세스의 상태를 나타내는 정보
  • PC(Program Counter): CPU가 다음으로 실행할 명령어를 가리키는 값
  • 레지스터: Accumulator, Index Register, 범용 레지스터, PC 등에 대한 정보
  • CPU 스케줄링 정보: 우선 순위, 최종 실행 시각, CPU 점유 시간 등에 대한 정보
  • 포인터: 부모 프로세스에 대한 포인터, 자식 프로세스에 대한 포인터, 프로세스가 위치한 메모리 주소에 대한 포인터, 할당된 자원에 대한 포인터 정보 등
  • 프로세스 계정 정보: 페이지 테이블, 스케줄링 큐 포인터, 소유자, 부모 등

특징

  • 프로세스는 각각 독립된 메모리 영역(Code, Data, Stack, Heap의 구조)을 할당받는다.
  • 각 프로세스는 별도의 주소 공간에서 실행되며, 일반적으로 한 프로세스는 다른 프로세스의 변수나 자료 구조에 접근할 수 없다.
  • 한 프로세스가 다른 프로세스의 자원에 접근하려면, 프로세스 간의 통신(IPC, inter-process communication)을 사용해야 한다.

스레드

Untitled

  • 프로세스 내에서 실행되는 여러 흐름의 단위
  • 스레드는 프로세스 내에서 레지스터와 Stack만 따로 할당 받고 Code, Data, Heap 영역은 스레드끼리 공유한다.

프로세스와 스레드의 차이

  • 프로세스는 운영체제로부터 자원을 할당 받는 작업의 단위이지만, 스레드는 할당 받은 자원을 이용하는 실행의 단위다.
  • 프로세스는 자신만의 고유 공간과 자원을 할당 받아 사용하는데 반해, 스레드는 다른 스레드와 공간 자원을 공유하면서 사용한다.
  • 하나의 프로세스 내에 1개 이상의 스레드를 가질 수 있다.

멀티 프로세스, 멀티 스레드, 멀티 프로세싱, 멀티 코어

멀티 프로세스

Untitled

  • 하나의 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 병렬적으로 작업을 수행하는 것이다.
  • 부모 프로세스가 fork() 하여 자식 프로세스를 생성하면, 자식 프로세스는 독립적인 메모리 영역을 가지면서 하나의 프로그램을 처리할 수 있는데 이를 멀티 프로세스라고 볼 수 있다.
  • 장점
    • 각 프로세스가 독립된 영역(Code, Data, Heap, Stack)을 가지고 있기 때문에 여러 자식 프로세스 중 하나에 문제가 발생하여도 해당 프로세스에만 영향을 미친다.
    • 메모리 침범 문제를 OS 차원에서 해결하므로 안전하다.
  • 단점
    • 작업량이 많아지면 Context Switching시 오버헤드가 발생한다.
    • 프로세스 간의 복잡한 통신(IPC)가 필요하다.

멀티 스레드

Untitled

  • 하나의 응용 프로그램에서 여러 스레드를 구성해 각 스레드가 하나의 작업을 처리하는 것이다.
  • 장점
    • 메모리 공간, 시스템 자원의 효율성이 증가한다.
    • Context Switching시 교환해야 할 대상이 적으므로 비용이 적다.
    • Data, Heap 영역을 이용해 데이터를 주고 받으므로 스레드 간 통신이 간단하다.
  • 단점
    • 서로 다른 스레드가 Stack을 제외한 메모리 공간을 공유하기 때문에 동기화 문제가 발생할 수 있다.
    • 스레드 간의 자원 공유는 전역 변수(데이터 세그먼트)를 이용하므로 다른 스레드가 동시에 사용할 때 충돌이 발생할 수 있다.
    • 하나의 스레드에 문제가 생기면 전체 스레드가 영향을 받는다.
    • 주의 깊은 설계가 필요하며 디버깅이 까다롭다.
    • 멀티 스레드의 단점은 Critical Section 기법을 통해 대비할 수 있다.

멀티 프로세싱

  • 두 개 이상의 CPU가 협력적으로 하나 이상의 작업을 동시에 처리하는 것이다.
  • 레지스터와 캐시를 독립적으로 가진 여러 개의 CPU가 1개의 메모리에 연결된 구조다.

멀티 코어

  • CPU 칩 내부에 레지스터와 캐시를 갖고 있는 코어만 따로 회로를 구성한 구조다.
  • 해당 코어가 2개 이상이면서 동시에 한 개 이상의 작업을 처리하는 것이다.

결론

  • 프로세스는 프로그램이 실행된 것이다.
  • 스레드는 한 프로세스 내에서 나뉘어진 하나 이상의 실행 단위다.
  • 한 애플리케이션에 대한 작업을 동시에 처리하기 위한 방식으로 멀티 프로세스와 멀티 스레드가 있다.
  • 동시에 실행되는 것처럼 보이기 위해, 실행 단위는 시분할로 CPU를 점유하여 Context Switching를 한다.
  • 멀티 프로세스는 독립적인 메모리를 가지고 있지만, 멀티 스레드는 자원을 공유한다.

댓글

추천 글