2675 단어
13 분
프로세스와 스레드

프로세스의 개요#

  • 운영체제로부터 자원을 할당받은 작업의 단위

프로세스 제어 블록(PCB)#

  • 프로세스란, 프로그램이 메모리에 올라와 실행 중인 상태 운영체제가 프로그램을 메모리에 가져올 때, 프로세스 제어 블록(PCB)라는 일종의 작업 지시서를 만듬

프로세스의 상태#

  • 현대 컴퓨터는 CPU가 여러 프로세스를 번갈아가며 실행하는 멀티 프로세싱 방식으로 동작 따라서 CPU를 얻어 실행 중인 프로세스가 다른 프로세스에게 넘겨주는 일이 자주 발생

이에 상태는 생성, 준비, 실행, 대기, 완료 중 하나를 가지게 된다

생성 상태#

  • 프로그램이 메모리에 올라오고, 운영체제로부터 PCB를 할당받은 상태 생성된 프로세스는 준비 상태로 전환되어 CPU를 기다림

준비 상태#

  • 프로세스가 자신의 순서를 기다리는 상태
  • 준비 큐에서 기다리며 CPU 스케줄러에 의해 관리

다수의 준비 큐가 운영되며, 스케줄러는 PCB에 기록된 우선순위를 기준으로 실행 상태로 옮길 프로세스를 선택

실행 상태#

  • CPU를 할당받아 실행되는 상태이며, 주어진 시간 동안만 작업할 수 있음
  • 이를 타임 슬라이스라고 함
  • CPU 스케줄러가 프로세스를 실행 상태로 옮기는 과정을 디스패치라고 함

실행 상태에 있는 프로세스가 입출력을 요청하면, 입출력 관리자에게 입출력을 요청하고 해당 프로세스를 대기 상태로 옮김

대기 상태#

  • 실행 상태의 프로세스가 입출력을 요청하면, 입출력이 완료될 때까지 기다리는 상태
  • 이 상태의 프로세스는 입출력장치별로 마련된 큐에서 대기
  • 입출력이 완료되면 인터럽트가 발생하고, PCB를 준비 상태로 이동

완료 상태#

  • 프로세스가 종료되는 상태, 코드와 데이터를 메모리에서 삭제하고 PCB를 폐기 만약 프로세스가 비정상적으로 종료된 경우, 복구를 위해 종료 직전의 메모리 상태를 저장장치로 옮기는 데 이를 코어 덤프라고 함
TIP

위 5가지의 활성 상태말고 추가로 ‘휴식 상태’와 ‘보류 상태’가 있다

  • 휴식 상태 : 프로세스가 작업을 일시적으로 쉬는 상태
  • 보류 상태 : 프로세스가 메모리에서 쫓겨나 스왑 영역에 보관되는 상태
    • 메모리 공간 부족, 프로그램 오류, 악성 프로그램으로 의심되는 경우 보류 상태가 됨

프로세스 제어 블록(PCB)#

  • 앞서 자주 언급한 PCB 블록은 도대체 무엇인가?
NOTE

프로세스를 실행하는 데 필요한 주요 정보를 보관하는 자료구조

PCB 구성#

명칭역할
포인터PCB를 연결하여 준비 상태나 대기 상태의 큐를 구현
프로세스 상태현재 어떤 상태에 있는 지를 나타냄
프로세스 구분자프로세스 구분을 위한 구분자를 저장
프로그램 카운터다음에 실행될 명령어의 위치를 가리키는 프로그램 카운터의 값
레지스터누산기, 스택 포인터, 색인 레지스터 등을 포함한 각종 중간 연산값을 저장
메모리 관리 정보메모리 내 프로세스 위치, 메모리 보호 경계 레지스터와 한계 레지스터 등을 저장
할당 자원 정보입출력 자원, 오픈 파일 등 정보를 저장
계정 정보계정 정보, CPU 할당 시간, CPU 사용 시간 등 저장
부모 프로세스 구분자, 자식 프로세스 구분자PPID, CPID를 통해 프로세스 부모-자식 관계를 저장

문맥 교환#

NOTE

CPU를 차지하던 프로세스가 나가고 새로운 프로세스를 받아들이는 작업

실행 상태에서 나가는 PCB는 이전까지의 작업 내용을 저장하고, 실행 상태로 들어오는 PCB의 정보로 셋팅해야 이전의 작업에 이어 작업을 할 수 있게 되는데, 이렇게 교환하는 작업을 문맥 교환이라고 한다.

  • 문맥 교환의 타임 슬라이스는 되도록 작되, 문맥 교환의 시간보다 짧게 설정하여 성능 저하가 되는 것을 유의해야 함

프로세스의 연산#

프로세스 구조#

  • 프로세스는 코드, 데이터, 스택, 힙 영역으로 구성

  • 코드와 데이터 영역은 프로세스 실행 직전 위치와 크기가 결정되어 이를 정적 할당 영역

  • 힙 영역과 스택 영역은 프로세스가 실행되는 동안 만들어지는 동적 할당 영역

코드 영역#

  • 프로그램의 본문이 기술된 곳으로 프로그래머가 작성한 프로그램이 탑재

데이터 영역#

  • 코드가 실행되면서 사용하는 변수나 파일 등의 데이터를 모아놓은 곳

스택 영역#

  • 함수 호출 후 되돌아올 위치를 저장하는 등 운영체제가 프로세스를 실행하기 위해 부수적으로 필요한 데이터를 모아두는 곳

힙 영역#

  • 동적으로 할당되는 변수 영역, malloc() 등으로 인해 프로그램 실행 도중 할당되는 데이터가 모임

fork(): 프로세스 복사#

프로그램을 매번 저장장치에서 가져오면 시간 오래 걸린다. 이를 해결하기 위해 기존 메모리에 복사하여 자식 프로세스를 생성하는 fork()를 통해 프로세스를 생성한다.

예로 Edge에서 새로운 탭을 실행하면 Edge 창이 하나 더 생기는 데 이는 기존 프로세스를 복사하여 생성한 것이다. 여기서 핵심은 기존 프로세스는 부모 프로세스가 되고, 새로운 프로세스는 자식 프로세스가 된다는 점이다.

fork()는 아래의 이점이 있다

  • 프로세스의 생성 속도가 빠름
    • 저장장치가 아닌 기존 메모리에서 복사하므로 자식 프로세스 생성 속도가 빠름
  • 추가 작업 없이 자원을 상속할 수 있음
    • 부모 프로세스가 사용한 모든 자원을 자식 프로세스에 상속할 수 있음
  • 시스템 관리를 효율적으로 할 수 있음
    • 부모와 자식이 PPID와 CPID로 연결되어 있어, 자식 프로세스 종료 시 부모 프로세스가 자식이 사용하는 자원을 정리할 수 있음

exec(): 프로세스 전환#

Edge뿐만 아니라 카카오톡, PPT 등 다양한 프로세스를 실행하는데, 이를 위해선 기존 프로세스를 새로운 프로세스로 전환하는 과정이 필요

NOTE

fork()를 통해 새로운 프로세스를 복사했다면, exec()를 통해 완전히 다른 프로세스로 전환

  • 이는 프로세스의 구조를 재활용하기 위해 새로운 프로세스를 만들려면 PCB를 만든 후 메모리 자리를 확보해야 함.
  • 또한 프로세스 종료 후 사용한 메모리 청소를 위해 부모-자식 관계가 있어야 함
  • 다만, exec()를 통해 기존 PCB, 메모리 영역, 부모-자식 관계를 그대로 사용할 수 있어 운영체제 효율성이 향상됨

고아 프로세스와 좀비 프로세스#

부모 프로세스는 자원 회수를 위해 자식 프로세스 종료까지 기다림

  • 그러나 부모가 먼저 종료되거나, 자식이 비정상적으로 종료되어 부모에게 종료를 알리지 못하는 경우가 있음

  • 고아 프로세스

    • 부모 프로세스가 자식 프로세스보다 먼저 종료되는 경우
  • 좀비 프로세스

    • 자식 프로세스가 종료되었지만 부모 프로세스가 뒤처리를 하지 않은 경우

이러한 회수되지 못한 자원이 쌓이면 결국 운영 효율성이 떨어지며, 운영체제는 주기적으로 반환되지 못한 자원을 회수해야 함

exit()와 return() 시스템 호출#

NOTE

main() 함수 마지막에 exit() 또는 return()을 사용하는 이유는 부모 프로세스에게 자식 프로세스가 끝났음을 알리기 위한 것임

이를 통해 자원을 빠르게 회수할 수 있고, 전달 인자에 따라 정상 또는 비정상 종료 여부를 알 수 있음

wait() 시스템 호출#

  • 다만 종료를 알려도 부모가 먼저 종료되버리면 고아 프로세스가 발생함
  • 따라서 wait 시스템을 호출하는 경우 자식 프로세스가 종료되는 것을 기다리다가, 자식이 종료되면 다음 명령을 실행함

스레드의 개요#

  • CPU 스케줄러가 CPU에 전달하는 일 하나가 스레드
  • 즉, 운영체제 입장에서 작업 단위는 프로세스, CPU 입장에서 하는 일을 스레드이다

멀티스레드#

멀티스레드는 작업을 하면서 값이 바뀌거나 새로 생기는 동적 할당 영역만 여러 개 생성 후, 정적 할당 영역을 공유하는 형태로 자원의 효율성을 향상 시키는 것

즉, 비슷한 일 2개 하는 프로세스 대신, 코드와 데이터를 공유하면서 여러 개의 일을 하나의 프로세스 내에서 진행하는 것

장점

  • 응답성 향상 : 한 스레드가 실행 상태가 아니더라도 다른 스레드가 작업을 계속해 사용자에게 빠른 응답
  • 자원 공유 : 한 프로세스 내 공유 자원을 모든 스레드가 사용해 작업을 원활하게 진행가능하며, 불필요한 자원 중복 방지

단점

  • 모든 스레드 자원을 공유하므로 한 스레드 문제가 발생 시 전체 프로세스에 영향이 발생
프로세스와 스레드
https://devlog.jpstudy.org/posts/2025/cs/processthread/
저자
SY
게시일
2025-03-14
라이선스
CC BY-NC-ND 4.0