21 April 2024

프로세스와 스레드

by 꽈배기

프로세스

프로세스는 실행중인 프로그램을 나타낸다

프로세스 제어 블록

프로세스는 CPU에 요청해 실행되는데 반해 CPU 자원은 한정되어 있다. 이를 위해 프로세스들은 한정된 시간 만큼만 CPU를 이용한다. 자신의 실행 차례에 정해진 시간만큼 CPU 자원을 이용하고 타이머 인터럽트가 발생하면 차례를 양보하게 된다.

image

이를 위해 사용하는 자료구조를 PCB (프로세스 제어 블록)이라 부른다. PCB는 프로세스 관련 정보를 저장하며 프로세스 생성 시 커널 영역에 생성, 종료 시 폐기된다.

PCB 정보

운영체제마다 상이하나 기본적인 내용은 비슷하다. 운영체제는 커널영역에 적재된 PCB의 정보를 보고 프로세스를 관리한다.

컨텍스트 스위칭

프로세스 실행 중 인터럽트에 의해 다른 프로세스로 실행 순서가 넘어가면 어떤 작업을 거쳐야 할까?

우선 기존에 실행되던 프로세스는 중간 정보를 백업해야한다.

즉 컨텍스트 스위칭이란

기존의 실행중인 프로세스 정보를 백업하고 새로운 프로세스 실행을 위해 문맥을 복구하는 과정을 일컫는다. 동시성을 보장하기 위한 환경에서 컨텍스트 스위칭을 통해 여러 프로세스가 끊임없이 번갈아가며 실행되도록 한다.

image

프로세스의 메모리 영역

운영체제는 커널 영역에 적재된 PCB 정보를 바탕으로 프로세스를 관리한다. 그렇다면 사용자 영역에서는 프로세스가 어떻게 관리될까? 사용자 영역에서 프로세스는 메모리 영역을 구분하여 관리한다.

메모리 영역

코드와 데이터 영역은 프로그램 실행 시 크기가 고정되기에 정적 할당 공간이라 지칭한다.


프로그램 실행 중 동적으로 크기가 변할 수 있기에 동적 할당 공간이라 지칭한다.

둘의 크기는 가변적이므로 서로 간 증가하는 주소의 방향이 다르다.

프로세스 상태

image

프로세스 계층 구조

윈도우 운영체제는 계층 구조를 가지고 있지 않으나, 대부분으 운영체제는 계층 구조로 프로세스를 관리한다.

프로세스 실행 도중 다른 프로세스 생성 가능
부모 프로세스
새 프로세스를 생성한 프로세스 자식 프로세스
부모에 의해 생성된 프로세스

부모 프로세스와 자식 프로세스는 별개의 프로세스이므로 서로 다른 PID를 가진다.

프로세스 생성 기법

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

복제와 옷 갈아입기 부모 프로세스는 fork 시스탬 호출을 통해 자신의 복사본을 자식 프로세스로 생성 자식 프로세스는 exec 시스템 호출을 통해 자신의 메모리 공간을 다른 프로그램으로 교체

fork 시스템 호출

exec 시스템 호출

image

스레드

프로세스를 구성하는 실행 흐름의 단위 하나의 프로세스는 하나 이상의 스레드를 가질 수 있다.

image

실행 흐름이 여러 개인 프로세스를 멀티 스레드 프로세스라 한다.

스레드의 구성 요소

스레드 ID, 프로그램 카운터 등의 레지스터, 스택 스레드마다 실행에 필요한 최소한의 정보를 보유

image

프로세스를 이루는 스레드는 서로간의 자원을 공유 할 수 있다. 최근 사용되는 방식으로는 CPU에게 작업을 전달할때 전달되는 단위를 스레드 단위로 하기도 한다.

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

멀티 프로세스 : 동일한 작업을 수행하는 단일 스레드 프로세스 여러 개 실행

copy on write

IPC

파일을 통한 프로세스 간 통신, 공유 메모리를 통한 프로세스 간 통신이 있다.

CPU 바운드 IO 바운드

CPU 바운드
프로세스가 CPU 자원을 많이 사용하는 작업을 하는 경우
IO 바운드
프로세스가 IO 작업 및 네트워크 관련 작업을 하는 경우

해당 경우에 따라 스레드 할당수가 변할 수 있다.

CPU 바운드 같은 경우 CPU로부터 자원을 받는 경우가 많으며 CPU Burst (작업이 몰리는 경우)가 자주 발생하기에 스레드의 숫자를 코어와 동일하게 또는 +1 만큼 할당하는것이 context switching 을 고려하여 병목현상을 줄일 수 있다.

반대로 IO의 경우 CPU 바운드에 비해 많은 수의 스레드를 할당하여 사용할 수 있으나, 여건에 맞게 사용하여야 한다.

스레드가 많으면 좋을까?

우선적으로 스레드가 사용될 환경을 봐야한다. 순차적으로 진행되는 프로그램의 경우 멀티스레드 환경이 큰 효과를 볼 수 없으며 코어의 성능을 넘는 스레드의 개수를 할당할 때 CPU 코어에 과도한 race condition이 발생하거나 context switching에 의해 병목이 발생할 수 있다. 또한 CPU bound인지 IO bound인지 고려하는것도 중요할 것이다. CPU burst가 자주 일어나는 CPU bound일 경우 스레드의 숫자를 과도하게 늘리는 것이 오히려 자원 사용성을 떨어뜨리는 결과를 불러올 수 있다.

tags: ComputerScience