[혼공컴운] Ch10 프로세스와 스레드

Hyunjoon Choi·2023년 7월 30일
0

혼공컴운

목록 보기
10/15

📢 본 글은 혼공학습단 미션과 함께 정리해보는 글 입니다.

프로세스 개요

프로그램을 실행하는 순간 프로세스가 되며, 크게 포그라운드 프로세스와 백그라운드 프로세스로 나눌 수 있다.

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

사용자가 볼 수 있는 공간에서 실행되는 프로세스를 뜻한다. 메모장, 게임 등이 해당된다.

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

사용자가 볼 수 없는 공간에서 실행되는 프로세스를 뜻한다.

  • 사용자와 직접 상호작용이 가능한 프로세스
  • 사용자와 상호작용하지 않고 그저 정해진 일만 수행하는 프로세스 (데몬, 서비스 등)로 구분된다.

프로세스 제어 블록 (PCB - Process Control Block)

모든 프로세스는 실행을 위해 CPU가 필요하지만, CPU 자원은 한정되어 있다.

때문에 프로세스들은 돌아가며 한정된 시간만큼만 CPU를 이용하며, 타이머 인터럽트가 발생하면 차례를 양보한다.

이때 프로세스들이 빠르게 번갈아가며 수행되어야 하는데, 이 프로세스들을 관리할 때 사용되는 자료구조를 PCB라 한다.

  • 프로세스 관련 정보를 저장하는 자료구조
  • 상품에 달린 태그와 같은 정보
  • 프로세스 생성 시 커널 영역에 생성, 종료 시 폐기

담기는 정보들 (차이 있을 수 있음)

  • 프로세스 ID (PID)
    • 특정 프로세스를 식별하기 위해 부여되는 고유 번호
  • 레지스터 값
    • 프로세스는 자신의 실행 차례가 오면 이전까지 사용한 레지스터 중간 값을 복원 (지금까지 자기가 작업했던 CPU의 레지스터 내역을 알고 있어야 이후에 다시 자신 차례가 왔을 때 그 단계부터 실행할 수 있기 때문 → 만약 이걸 못한다면 다시 처음부터 해야 함)
  • 프로세스 상태
    • 입출력 장치를 사용하기 위해 기다리는 상태, CPU를 사용하기 위해 기다리는 상태 등 여러 상태가 있음
  • CPU 스케줄링 정보
    • 프로세스가 언제, 어떤 순서로 할당받아 사용될지를 나타냄
  • 메모리 정보
    • 프로세스가 어느 주소에 저장되어 있는지에 대한 정보
    • 페이지 테이블 정보
  • 사용한 파일과 입출력장치 정보
    • 할당된 입출력장치, 사용 중인 (열린) 파일 정보..

문맥 교환 (Context Switch)

한 프로세스에서 다른 프로세스로 실행 순서가 넘어갈 때 발생한다.

이때 이전 프로세스는 지금까지의 중간 정보를 백업해둔다. 이러한 중간 정보를 문맥 (context)이라 하며, 다음 차례가 왔을 때 실행을 재개하기 위한 정보가 된다.

실행 문맥을 백업해두면 언제든 해당 프로세스의 실행을 재개할 수 있다.

이후 뒤이어 실행할 프로세스의 문맥을 복구하며, 자연스럽게 실행 중인 프로세스가 바뀐다.

따라서 문맥 교환은 기존의 실행 중인 프로세스 문맥을 백업하고 새로운 프로세스의 실행을 위해 문맥을 복구하는 과정을 뜻한다.

사용자 영역은?

사용자 영역은 크게 스택 영역, 힙 영역, 데이터 영역, 코드 영역 등으로 나뉜다.

코드 영역

  • 실행할 수 있는 코드 = 기계어로 이루어진 명령어를 저장한다.
  • 데이터가 아닌, CPU가 실행할 명령어가 담기기에 쓰기가 금지된다. (read-only)

데이터 영역

  • 프로그램이 실행되는 동안 유지할 데이터를 저장한다. (전역 변수 등)

힙 영역

  • 프로그램을 만드는 사용자 (프로그래머)가 직접 할당할 수 있는 저장 공간을 뜻한다.

스택 영역

  • 데이터가 일시적으로 저장되는 공간이다.
  • 잠깐 쓰다가 사라질 값들이 저장되는 공간이다. (매개 변수, 지역 변수 등)

스택 영역과 힙 영역은 실행 과정에서 크기가 가변적으로 변할 수 있다. (동적 할당 영역)

그렇기 때문에 스택 영역과 힙 영역은 주소를 분리하기 위해 할당 방향을 반대로 할당해둔다.


프로세스 상태와 계층 구조

프로세스는 각각의 상태들을 가지고 있으며, 이 상태들은 해당 프로세스의 PCB에 기록된다.

프로세스 상태

운영체제마다 조금씩 차이가 있으나, 대부분의 운영체제에서는 다음 상태들을 가진다.

생성 상태

  • 이제 막 메모리에 적재되어 PCB를 할당받은 상태
  • 준비가 완료되었다면 준비 상태로 변함

준비 상태

  • 당장이라도 CPU를 할당받아 실행할 수 있지만, 자신의 차례가 아니기 때문에 기다리는 상태
  • 자신의 차례가 된다면 실행 상태로 dispatch

실행 상태

  • CPU를 할당받아 실행 중인 상태
  • 할당된 시간 모두 사용 시 (타이머 인터럽트 발생 시) 준비 상태로 됨
  • 실행 도중 입출력장치를 사용하면 입출력 작업이 끝날 때 까지 대기 상태로 됨

대기 상태

  • 프로세스가 실행 도중 입출력장치를 사용하는 경우
  • 입출력 작업은 CPU에 비해 느리기에, 이 경우 대기 상태로 접어듦
  • 입출력 작업이 끝나면 (입출력 완료 인터럽트를 받으면) 준비 상태로 됨

종료 상태

  • 프로세스가 종료된 상태
  • PCB, 프로세스의 메모리 영역 정리

프로세스 계층 구조

대부분의 운영체제에서는 프로세스를 계층적으로 관리한다. 그러나 엄밀히 말하면 윈도우에서는 프로세스를 계층적으로 관리하지 않는데, 개발자가 주로 사용하는 운영체제 (리눅스 등)에서는 프로세스를 계층적으로 관리하기에 알아두어야 한다.

  • 프로세스 실행 중 시스템 콜을 통해 다른 프로세스 생성 가능
  • 새 프로세스를 생성한 프로세스 : 부모 프로세스
  • 부모 프로세스에 의해 생성된 프로세스 : 자식 프로세스

부모 프로세스와 자식 프로세스는 별개의 프로세스이므로 각기 다른 PID를 가지는데, 일부 운영체제에서는 자식 프로세스 PCB에 부모 프로세스 PID (PPID)를 명시하기도 한다.

프로세스 생성 기법

많은 운영체제 (윈도우 제외)에서는 복제옷 갈아입기 과정을 통해 프로세스를 만들어낸다.

  • 부모 프로세스는 fork 시스템 콜을 통해 자신의 복사본을 자식 프로세스로 생성한다. (복제)
  • 자식 프로세스는 exec 시스템 콜을 통해 자신의 메모리 공간을 다른 프로그램으로 교체한다. (옷 갈아입기)
    • 자신의 메모리 공간을 새로운 프로그램으로 덮어쓰게 한다.
    • 코드/데이터 영역은 실행할 프로그램으로 바뀌고, 나머지 영역은 초기화된다.

자식 프로세스가 exec 명령어를 호출하지 않을 수도 있다. 이러면 같은 내용을 실행하는 프로세스가 두 개 실행되는 것이다.


스레드

여기에서의 스레드는 소프트웨어적인 스레드를 다룬다.

스레드는 프로세스를 구성하는 실행 흐름의 단위를 뜻하며, 하나의 프로세스는 여러 개의 스레드를 가질 수 있다.

구성 요소

스레드는 스레드 ID, 프로그램 카운터를 비롯한 레지스터 값과 스택 등을 가지고 있으며, 실행에 필요한 최소한의 정보를 가지고 있다.

프로세스를 이루는 스레드들은 프로세스의 자원을 공유하며 실행된다. 특정 스레드에서 어떤 파일을 열었다면, 모든 스레드들은 해당 파일에 접근할 수 있다.

추가로, 리눅스에서는 프로세스와 스레드를 별개로 구분하지 않는 편이다.

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

프로세스끼리는 자원을 공유하지 않으며, 스레드는 같은 프로세스의 자원을 공유한다.

프로세스를 fork하면 코드, 데이터, 힙 영역 등 모든 자원이 복제되어 저장되며, 저장된 메모리 주소를 제외하면 모든 것이 동일한 프로세스 두 개가 통째로 메모리에 적재된다.

스레드들은 각기 다른 스레드 ID, 프로그램 카운터 값을 포함한 레지스터 값과 스택을 가질 뿐, 프로세스가 가지는 자원을 공유한다. 때로는 이 점이 문제가 될 수 있는데, 한 스레드에서 문제가 발생한다면 이것에 의해 프로세스가 멈출 수 있다.

프로세스 간에도 자원을 공유할 수 있긴 하다. 프로세스 간 통신 (IPC - Inter-Process Communication)을 활용하면 된다. 파일을 통한 프로세스 간 통신, 공유 메모리를 통한 프로세스 간 통신 방법 등이 있다.


미션

  • 304p 1번 인증 : 프로세스 상태 채우기

  • 1번: 처음에 프로세스가 생성된 상태를 뜻한다. 때문에 생성 상태이다.
  • 2번: 디스패치를 보낼 수 있는 것을 봐서 준비 상태임을 알 수 있다. 자신의 차례가 될 때 실행 상태로 디스패치된다. 이에 따라 3번 또한 실행 상태임을 알 수 있다.
  • 3번: 2번에 의해 실행 상태임을 알 수 있다.
  • 4번: 입출력 요청 및 완료 신호를 보낼 수 있기 때문에 대기 상태임을 알 수 있다. 대기 상태는 프로세스가 실행 도중 입출력장치를 사용하는 경우에 해당되기 때문이다.
  • 5번: 프로세스가 종료된 상태이다. 따라서 종료 상태이다.

부족하거나 보완할 점이 있다면 댓글 부탁드립니다 😃

profile
개발을 좋아하는 워커홀릭

0개의 댓글