OS - 프로세스 & 스레드

최정훈·2024년 10월 27일

프로세스

실행중인 프로그램

  • 포그라운드 프로세스 - 사용자가 볼 수 있는 공간에서 실행되는 프로세스
  • 백그라운드 프로세스 - 사용자가 볼 수 없는 공간에서 실행되는 프로세스

모든 프로세스들은 실행을 위해서 CPU를 필요로 한다. 하지만, CPU의 자원은 한정되어있기 때문에, 자신의 차례에 정해진 시간만큼 CPU를 사용하고, 타이머 인터럽트(Time Out)이 발생하면 차례를 양보한다.

프로세스의 메모리 영역

  • 코드 영역 - 실행할 수 있는 코드, 기계어로 이루어진 명령어 저장
  • 데이터 영역 - 프로그램이 실행되는 동안 유지할 데이터 저장, 전역변수와 같은 것
  • 힙 영역 - 프로그래머가 직접 할당할 수 있는 저장공간. 가비지 컬렉션과 연관. 낮은주소에서 높은 주소로 할당
  • 스택 영역 - 데이터가 일시적으로 저장되는 공간, 매개변수, 지역변수. 높은 주소에서 낮은 주소로 할당

프로세스 상태

  • 생성 상태 - 이제 막 메모리에 적재되어 PCB를 할당받은 상태. 준비가 완료되었다면 준비상태로 전환
  • 준비 상태 - 당장이라도 CPU를 할당받아 실행할 수 있지만 자신의 차례가 아니라서 기다리는 상태. 자신의 차례가 된다면 실행상태로 전환됨
  • 실행 상태 - CPU를 할당받아서 실행 중인 상태. 할당된 시간을 모두 사용시 준비상태로 전환. 실행도중 입출력 장치를 사용하면, 입출력 작업이 끝날 때까지 대기상태로 전환
  • 대기 상태 - 프로세스가 실행도중 입출력 장치를 사용하는 상태. 이 작업은 CPU를 사용하는 작업에 비해서 느리기 때문에 대기상태로 접어듬. 입출력 작업이 끝나면 준비상태로 전환
  • 종료 상태 - 프로세스가 종료된 상태. PCB 폐기

프로세스 계층 구조

프로세스 실행 도중 시스템 호출을 통해 다른 프로세스 생성이 가능하다.

  • 부모 프로세스 - 새 프로세스를 생성한 프로세스
  • 자식 프로세스 - 부모 프로세스에 의해 생성된 프로세스

부모 프로세스와 자식 프로세스는 별개의 프로세스이다. 그렇기 때문에 자식 프로세스가 부모 프로세스에서 복제되었더라도, 각각 다른 PID를 가진다.

프로세스 생성 기법

부모 프로세스는 fork()라는 시스템 호출을 통해 자신의 복사본을 자식 프로세스로 생성한다.

자식 프로세스는 exec()라는 시스템 호출을 통해 자신의 메모리 공간을 다른 프로그램으로 교체한다. → 메모리 공간을 새로운 프로그램으로 덮어씀(옷 갈아입는 것과 유사)

스레드

프로세스를 구성하는 실행 흐름의 단위

하나의 프로세스는 하나 이상의 스레드를 가질 수 있다. ex) 웹 브라우저 프로세스는 화면 출력 스레드, 입력 스레드, 검색 스레드 등을 가질 수 있다.

스레드의 구성요소

  • 스레드 ID
  • 프로그램 카운터를 비롯한 레지스터 값
  • 스택영역(스레드마다 개별적으로 스택영역을 가진다)

스레드들은 프로세스의 자원을 공유한다.

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

동일한 작업을 수행하는 단일 스레드 프로세스 여러 개 실행 vs 하나의 프로세스를 여러 스레드로 실행

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

즉, 프로세스를 fork()하면 코드/힙/데이터 영역 등 모든 자원이 복제됨 → 자원의 낭비

그렇다고 해서 한쪽이 무조건 좋은 것만은 아님. 멀티 프로세스 환경에서는 하나의 프로세스에 문제가 생겨도 나머지에 문제가 없다면 상관 없지만, 멀티 스레드 환경에서는 프로세스에 문제가 생기면 이를 따르는 스레드들에 모두 문제가 생긴다.

PCB

프로세스들을 관리하기 위한 자료구조

번갈아 수행되는 프로세스들을 관리하기 위한 자료구조. 프로세스 관련 정보를 저장하는 자료구조.

  • PCB안에 들어있는 값들
    • PID - 특정 프로세스를 식별하기 위해 부여하는 고유한 번호

    • 레지스터 값 - 프로세스는 자신의 실행 차례가 오면, 이전까지 사용한 레지스터 중간 값을 모두 복원해서 실행

    • 프로세스 상태 - 입출력 장치를 사용하기 위해 기다리는 상태

    • CPU 스케줄링 정보 - 어떠한 순서로 CPU를 할당받아서 사용할지에 대한 정보

    • 메모리 정보 - 프로세스가 어느 주소에 저장되어 있는지에 대한 정보, 페이지 테이블 정보

    • 사용한 파일과 입출력장치 정보 - 할당된 입출력 장치, 사용중인 파일정보


문맥교환(Context Switching)

기존의 실행 중인 프로세스의 문맥을 백업하고, 새로운 프로세스 실행을 위해 문맥을 복구하는 과정

한 프로세스에서 다른 프로세스로 실행순서가 넘어가면, 기존에 실행되던 프로세스는 지금까지의 중간정보를 PCB에 저장한다. 이러한 중간정보가 바로 context이고, 이는 다음 실행될 차례가 왔을 때 실행을 재개하기 위한 정보이다.

profile
게임개발자(희망)의 공부일지

0개의 댓글