프로세스와 스레드

Minjoo Kim·2024년 9월 22일

프로세스(process)

  • 실행 중인 프로그램

  • 보조기억 장치에 저장된 프로그램을 메모리에 적재하고 실행하면 프로그램은 프로세스가 된다. 그리고 이 과정을 프로세스를 생성한다라고 표현한다.

  • 포그라운드 프로세스(foreground process) : 사용자가 보는 앞에서 실행되는 프로세스

  • 백그라운드 프로세스(background process) : 사용자가 보지 못하는 뒤편에서 실행되는 프로세스
    - 데몬(demon, 유닉스), 서비스(service, 윈도우) : 사용자와 상호작용하지 않는 백그라운드 프로세스

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

TCB(Task Control Block)라고도 한다. 프로세스는 실행을 위해 CPU를 필요로한다. 하지만 CPU 자원은 한정되어 있다. 프로세스들은 차례로 돌아가며 한정된 시간만큼(타이머 인터럽트, 타임아웃 인터럽트) CPU를 이용하고 다음 차례가 올 때까지 기다린다. 프로세스 실행 순서를 관리하기 위해 프로세스 제어 블록을 이용한다.
프로세스 제어 블록에는 해당 프로세스를 처리하기 위해 꼭 필요한 다양한 정보들이 저장된다. 프로세스 제어 블록이 없으면 프로그램이 프로세스로 전환되지 못한다. 프로세스 생성 시 만들어지고 실행이 끝나면 폐기된다. 새로운 프로세스 생성 == 운영체제가 PCB를 생성했다

구성설명
포인터프로세스 제어 블록을 연결하여 준비 상태나 대기 상태의 큐를 구현할 때 사용한다
프로세스 상태프로세스가 어떤 상태에 있는지
프로세스 ID(PID)프로세스를 식별하기 위해 부여하는 고유한 번호
레지스터 값이전에 실행할 때 사용한 레지스터의 값을 보관해야 다음에 실행할 수 있기 때문에 자신이 사용하던 레지스터의 중간값을 보관한다
메모리 관리 정보프로세스가 메모리의 어디에 있는지, 페이지 테이블 정보
할당된 자원 정보프로세스를 실행하기 위해 사용하는 입출력 자원이나 오픈 파일 등에 대한 정보
부모 프로세스 구분자와 자식 프로세스 구분자

프로세스의 상태(process status)

대부분의 프로세스는 생성, 준비, 실행, 대기, 종료 상태로 운영되며 이 다섯 가지 상태를 활성 상태(active status)라고 한다.

상태설명작업
생성 상태프로그램이 메모리에 적재되어 PCB를 할당 받은 상태메모리 할당, 프로세스 제어 블록 생성
준비 상태프로세스가 자기 차례를 기다리고 있는 상태. 실행될 프로세스를 CPU 스케줄러가 선택한다. CPU 스케줄러가 dispatch(PID)를 실행하면 준비 상태에서 실행 상태로 바뀐다.dispatch(PID): 준비 ➡️ 실행
실행 상태CPU를 할당받아 실행 중인 상태. 프로세스 사이의 문맥 교환이 일어난다.timeout(PID): 실행 ➡️ 준비
exit(PID): 실행 ➡️ 완료
block(PID): 실행 ➡️ 대기
대기 상태실행 상태 프로세스가 입출력을 요청하면 입출력 완료 인터럽트를 받을 때까지 기다리는 상태. 입출력이 완료되면 준비 상태로 이동한다.wakeup(PID): 대기 ➡️ 준비
종료 상태프로세스가 종료된 상태. 운영체제는 PCB와 프로세스가 사용한 메모리를 정리한다.메모리 삭제, 프로세스 제어 블록 삭제

휴식 상태와 보류 상태

휴식 상태(pause status)

프로세스가 작업을 일시적으로 쉬고 있는 상태. 사용하던 데이터가 메모리에 그대로 있고 프로세스 제어 블록도 유지되므로 멈춘 지점에서부터 재시작(resume)할 수 있다.

보류 상태(suspende status)

일시 정지 상태 프로세스가 메모리에서 잠시 쫓겨난 상태.

  • 메모리가 꽉 차서 일부 프로세스를 메모리 밖으로 내보낼 때
  • 프로그램에 오류가 있어서 실행을 미루어야 할 때
  • 바이러스와 같이 악의적인 공격을 하는 프로세스라고 판단될 때
  • 매우 긴 주기로 반복되는 프로세스라 메모리 밖으로 쫓아내도 큰 문제가 없을 때
  • 입출력을 기다리는 프로세스의 입출력이 계속 지연될 때

보류 상태에 들어간 프로세스는 메모리 밖으로 쫓겨나 스왑 영역(swap area)에 보관된다.

문맥 교환

CPU를 차지하던 프로세스가 나가고 새로운 프로세스를 받아들이는 작업. 기존 프로세스의 문맥을 PCB에 백업하고 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구하여 새로운 프로세스를 실행한다. 여러 프로세스가 끊임없이 빠르게 번갈아 가며 실행되는 원리. 문맥 교환이 자주 일어나면 프로세스는 그만큼 빨리 번갈아 가며 수행되기 때문에 프로세스들이 동시에 실행되는 것처럼 보인다.

프로세스 메모리 영역 == 프로세스 주소 공간

영역설명
코드 영역텍스트 영역(text segment)
실행할 수 있는 코드가 저장된다.
CPU가 실행할 명령어가 담겨 있기 때문에 쓰기가 금지(읽기 전용 공간)
데이터 영역프로그램이 실행되는 동안 유지할 데이터 저장
전역 변수
힙 영역프로그래머가 직접 할당할 수 있는 공간
이 공간을 반환하지 않으면 메모리 누수가 발생할 수 있다.
스택 영역데이터를 일시적으로 저장하는 공간
매개 변수, 지역 변수
  • 정적 할당 영역 : 코드, 데이터 영역은 크기가 고정되어 있다.
  • 동적 할당 영역 : 프로세스 실행 과정에서 크기가 변할 수 있다.
  • 힙 영역은 메모리의 낮은 주소에서 높은 주소로 할당되고, 스택 영역은 높은 주소에서 낮은 주소로 할당된다 ➡️ 데이터가 쌓여도 새롭게 할당되는 주소가 겹칠 일이 없다.

프로세스 계층 구조

최초의 프로세스가 자식 프로세스를 생성하고, 생성된 자식 프로세스들이 새로운 프로세스를 낳는 형식으로 여러 프로세스가 동시에 실행된다. fork와 exec가 반복되며 프로세스 계층 구조가 이루어진다.

fork()

자신의 복사본을 자식 프로세스로 생성한다.

exec()

자신의 메모리 공간을 다른 프로그램으로 교체한다. 프로세스 구조체를 재활용할 수 있다. 새로운 프로세스를 만들려면 프로세스 제어 블록을 만들고 메모리 자리를 확보하는 과정이 필요하다. exec() 시스템 호출을 사용하면 이미 만들어진 프로세스 제어 블록, 메모리 영역, 부모-자식 관계를 그대로 사용할 수 있어 편리하다.

스레드(thread)

프로세스를 구성하는 실행의 흐름 단위. 하나의 프로세스는 여러 개의 스레드를 가질 수 있다. 스레드를 이용하면 하나의 프로세스에서 여러 부분을 동시에 실행할 수 있다.

프로세스와 스레드

프로세스의 스레드들은 실행에 필요한 최소한의 정보만을 유지한 채 프로세스 자원을 공유하며 실행된다. 스레드는 프로세스의 자원을 공유한다.

  • 프로세스 : 실행되는 프로그램
  • 스레드 : 프로세스를 구성하는 실행의 흐름 단위

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

  • 멀티프로세스 : 여러 프로세스를 동시에 실행
  • 멀티스레드 : 여러 스레드로 프로세스를 동시에 실행

  • 프로세스끼리는 기본적으로 자원을 공유하지 않지만 스레드끼리는 같은 프로세스 내의 자원을 공유한다.
  • 프로세스의 자원을 공유하기 때문에 멀디스레드 환경에서 하나의스레드에 문제가 생기면 프로세스 전체에 문제가 생길 수 있다.

프로세스 간 통신(IPC: Inter-Process Communication)

프로세스끼리는 기본적으로 자원을 공유하지 않지만 자원을 공유하고 데이터를 주고받을 수 있다.

  • 파일을 통한 프로세스 간 통신 : 한 파일에 새로운 값을 쓰는 프로세스, 그 값을 읽는 프로세스가 있다면 파일 속 데이터를 주고받는다.
  • 공유 메모리 : 공유하는 메모리 영역을 두어 데이터를 주고받을 수 있다.
    소켓, 파이프 등을 통해 통신할 수 있다. 프로세스들끼리 데이터를 교환하는 것은 모든 자원을 처음부터 공유하고 있는 스레드에 비하면 다소 까다로운 것일 뿐 불가능한 것은 아니다.

🔗 References

  • 강민철, 『혼자 공부하는 컴퓨터 구조+운영체제』, 한빛미디어(2022)
  • 조성호, 『쉽게 배우는 운영체제』, 한빛아카데미(2023)
  • Abraham Silberschatz,Peter Baer Galvin,Greg Gagne 저 / 박민규 역, 『운영체제』, 퍼스트북(2020)
profile
Hello, this is Minjoo Kim.

0개의 댓글