OS – 프로세스와 스레드

프로세스

프로세스: 실행을 위해 메모리에 올라온 프로그램, 운영체제의 작업 단위

프로세스 제어 블록

운영체제: 프로세스를 위해 관리하는 자료구조 (PCB를 원소로 가지는 자료구조)
PCB: 프로세스 제어 블록

프로그램이 프로세스가 된다는 것은 운영체제로부터 프로세스 제어 블록을 얻는다는 뜻
프로세스가 종료된다는 것은 해당 프로세스 제어 블록이 폐기된다는 뜻
프로세스: 프로그램 + 프로세스 제어 블록


프로세스의 상태

생성 상태: 프로세스가 메모리에 올라와 실행 준비를 완료한 상태
준비 상태: 생성된 프로세스가 CPU를 얻을 때까지 기다리는 상태
실행 상태: 준비 상태에 있는 프로세스 중 하나가 CPU를 얻어 실제 작업을 수행하는 상태
완료 상태: 프로세스가 종료되는 상태 (메모리에서 삭제, 프로세스 제어 블록 폐기)

대기 상태: 실행 상태에 있는 프로세스가 입출력을 요청하면 입출력이 완료될 때까지 기다리는 상태

강제 종료를 만나면 메모리 상태를 저장 장치로 옮기는데 이것을 Core Dumped라고 한다.

1. 준비 -> 실행 // dispatch
2. 실행 -> 준비 // timeout
3. 실행 -> 대기 // block
4. 대기 -> 준비 // wakeup

활성 상태: 생성 -> 준비 -> 실행 -> (입출력발생) -> 대기 -> 준비 -> 실행 -> 완료

휴식 상태: 프로세스가 작업을 일시적으로 쉬고 있는 상태
보류 상태: 프로세스가 메모리에서 잠시 쫓겨난 상태
Ex) 메모리가 꽉 차서 일부 프로세스를 메모리 밖으로 내보낼 때, 프로그램에 오류가 있어서 실행을 미루어야 할 때, 입출력을 기다리는 프로세스의 입출력이 계속 지연될 때 등등

보류 상태를 포함한 프로세스의 상태

보류 상태는 중단 상태라고도 한다.

프로세스의 보류(중단)
시스템의 유효시간 문제를 프로세스 중단 상태를 이용해서 해결
중단한 프로세스는 중단한 지점부터 다시 시작할 수 있다.


프로세스 제어 블록 (PCB)
프로세스를 실행하는 데 필요한 중요한 정보를 보관하는 자료구조

프로세스가 준비상태나 대기 상태일 경우에 큐로 운영이 되는데, 프로세스 제어 블록을 연결 시 큐로 구현하기 위해 포인터를 사용한다.

프로세스 구분자 (PID)

운영체제 내에 여러 프로세스가 있기 때문에 프로세스를 구분하기 위한 구분자가 필요하다.

프로그램 카운터

프로세스가 준비상태에서 실행상태 갈 경우 프로그램 카운터를 통해 다음 실행될 명령어의 위치를 알 수 있다. 또는 실행상태에서 준비상태로 갈 경우 프로그램 카운터에 저장하여 다음 실행될 명령어 위치를 저장한다.

프로세스 우선순위

CPU 스케줄러가 준비 상태에 있는 프로세스 중 실행 상태로 옮겨야 할 프로세스를 선택할 때 프로세스의 우선순위를 기준으로 삼기 때문에 저장한다.

각종 레지스터 정보

프로세스가 실행 중에 사용했던 레지스터 정보( 누산기(Accumulator), 색인 레지스터, 스택 포인터 등)들이 저장된다. 이전 실행할 때 사용했던 레지스터 값들을 저장해야 다음에 실행할 수 있기 때문에 보관한다.

메모리 관리 정보

프로세스가 메모리의 어디에 있는지 알아야 하기 때문에 메모리 위치 정보가 필요하고 메모리 보호를 위해 사용되는 경계 레지스터, 한계 레지스터 값 등이 저장된다. 이외 세그먼테이션 테이블, 페이지 테이블 등의 정보도 포함된다.

할당된 자원 정보

프로세스를 실행하기 위해 사용되는 입출력 자원, 오픈 파일 등에 대한 정보가 들어간다. 어떤 프로세스가 파일을 오픈하여 작업한다고 했을 경우 파일에 대한 정보가 필요하기 때문에 저장해야 한다.

계정 정보

계정 번호, CPU 할당 시간, CPU 사용 시간 등이 저장된다.

PPID CCID

부모 프로세스 구분자(Parent PID)와 자식 프로세스 구분자(Child PID) 정보도 저장된다.

문맥 교환: CPU를 차지하는 프로세스가 나가고 새로운 프로세스를 받아들이는 작업


프로세스의 구조

코드 영역: 프로그램 본문이 기술된 곳, 읽기 전용으로 처리됨
데이터 영역: 변수나 파일 등의 각종 데이터를 모은 곳, 상수는 읽기 전용이지만 대부분의 변수는 읽기와 쓰기가 가능
스택 영역: 운영체제가 프로세스를 실행하기 위해 부수적으로 필요한 데이터를 모아놓은 곳, 사용자에게 보이지 않음

Ex) 워드 프로세서 프로그램 -> 프로그램, 편집중인 문서, 운영체제가 사용하는 각종 부가 데이터


프로세스의 생성과 복사

Fork(): 실행중인 프로세스로부터 새로운 프로세스를 복사하는 함수
(실행하던 프로세스는 부모 프로세스, 새로 생긴 프로세스는 자식 프로세스가 된다)

<프로세스 제어 블록 내용 중 다음이 변경됨>
프로세스 구분자, 메모리 관리 정보, 부모 프로세스 구분자, 자식 프로세스 구분자

<fork 시스템 호출의 장점>
프로세스의 생성 속도가 빠름, 추가 작업 없이 자원을 상속할 수 있음, 시스템 관리를 효율적으로 할 수 있음

Exec(): 기존의 프로세스를 새로운 프로세스로 전환하는 함수
Exec() 시스템 호출을 하면 코드 영역에 있는 기존의 내용을 지우고 새로운 코드로 바꿔버림

PCB의 PID, PPID, CPID, 메모리 관련 사항 등은 변하지 않지만 프로그램 카운터 레지스터 값을 비롯한 각종 레지스터와 사용한 파일 정보가 모두 리셋된다.


프로세스 계층 구조

유닉스에서 커널이 처음 메모리에 올라와 부팅이 되면 커널 관련 프로세스를 여러 개 만드는데, 그 중 init프로세스는 전체 프로세스의 출발점이 된다. 운영체제는 프로세스를효율적으로 관리하기 위해 init프로세스를 만든 다음 나머지 프로세스를 init 프로세스의 자식으로 만든다. 운영체제에 있는 모든 프로세스는 init 프로세스의 자식이 되어 아래 그림과 같이 트리 구조를 이룬다.

프로세스 계층 구조의 장점

  1. 여러 작업을 동시에 처리할 수 있다.
     fork() 시스템 호출로 프로세스를 여러 개 만들어서 동시에 처리할 수 있도록 한다.
  2. 용이한 자원 회수
    프로세스 간의 책임 관계가 분명해져 시스템을 관리하기 수월하다.

고아 프로세스
프로세스가 종료된 후에도 비정상적으로 남아있는 프로세스 중 부모 프로세스가 자식보다 먼저 죽은 경우
-> C언어의 Return문은 자식 프로세스가 작업이 끝났음을 부모 프로세스에게 알리는 과정으로 고아 프로세스를 대비한다.


스레드

스레드: 프로세스에서 할당된 일, CPU 스케줄러가 CPU에게 전달하는 일, CPU의 작업 단위

프로세스가 ‘작업’이라면 스레드는 실제 ‘일’이다.
예를 들어, 프로세스가 ‘스테이크 만들기’라면 스레드는 ‘고기 굽기’, ‘채소 굽기’, ‘소스 뿌리기’이다.

프로세스의 실행으로 알아보는 스레드의 개념

프로세스를 실행하기 위해 운영체제는 코드와 데이터를 메모리에 가져오고, 프로세스 제어 블록을 생성하고, 작업에 필요한 메모리 영역을 확보한 후, 준비된 프로세스를 준비 큐에 삽입한다. 이러한 작업을 모든 프로세스에 대해 각각 시행하므로 운영체제의 작업 단위는 프로세스라고 할 수 있다.

준비 프로세스가 준비 큐에 삽입이 되면 CPU 스케줄러는 프로세스에 관한 일을 CPU에 전달하고 실제 작업은 CPU가 수행한다. 이 때 CPU 스케줄러가 CPU에 전달하는 일 하나가 스레드이다. 그러므로 CPU의 작업 단위는 프로세스로부터 전달받은 스레드이다.

멀티 태스킹: 여러 개의 프로세스로 구성하는 방식
멀티 스레드: 하나의 프로세스에 여러 개의 스레드로 구성하는 방식

fork() 시스템 호출로 프로세스를 복사하면 코드 영역과 데이터 영역의 일부가 메모리에 중복되어 존재하고, 부모-자식 관계이지만 독립적인 프로세스이므로 낭비적인 요소가 많다. 따라서 이러한 멀티태스킹의 낭비 요소를 제거하기 위해 스레드를 사용한다.

멀티스레드는 하나의 프로세스 내에 여러 개의 스레드를 생성하고, 이 스레드가 코드, 파일 등의 정적인 자원은 서로 공유함으로써 자원의 낭비를 막고 효율성을 향상한다.

멀티 스레드의 장점: 응답성 향상, 자원 공유, 효율성 향상, 다중 CPU 지원
멀티 스레드의 단점: 자원 공유 (한 스레드에 문제가 생기면 전체 프로세스에 영향을 미침)

멀티 스레드의 실행 방식

  1. 동시성 (Concurrency)
     멀티 작업을 위해 하나의 코어에서 멀티 스레드가 번갈아가며 실행할 수 있는 방식
  2. 병렬성 (Parallelism)
    멀티 작업을 위해 멀티 코어에서 개별 스레드를 동시에 실행할 수 있는 방식


Leave a Reply

Your email address will not be published. Required fields are marked *