쉽게 배우는 운영체제를 읽고 스스로 이해하기 위해 정리한 내용입니다.
운영체제에서 프로세스는 하나의 작업 단위로 태스크 task
라고도 부른다.
프로그램은 저장장치에 저장되어 있는 정적인 상태이고, 프로세스는 실행을 위해 메모리에 올라온 동적인 상태이다.
프로세스 제어 블록 PCB Process Control Block
에는 프로세스를 처리하는데 필요한 다양한 정보가 들어 있으며 TCB Task Control Block
라고도 한다. PCB가 없으면 프로그램이 프로세스로 전환되지 못한다. PCB는 프로세스 생성 시 만들어져서 프로세스가 실행을 완료하면 폐기된다.
PCB는 운영체제가 해당 프로세스를 위해 관리하는 데이터 구조이기 때문에 운영체제 영역에 만들어진다.
PCB의 구성 요소는 다음과 같다.
[PCB 구성 요소]
1. 포인터
2. 프로세스 상태
3. 프로세스 구분자 PID
4. 프로그램 카운터
5. 프로그램 우선순위
6. 레지스터 정보
7. 메모리 관리 정보
8. 할당된 자원 정보
9. 계정 정보
10. PPID, CPID
운영체제에서 여러 가지 이유로 프로세스 상태가 변화한다.
일괄 작업 시스템의 경우 프로세스가 생성된 후 CPU를 얻어 실행되고 작업을 마치면 종료된다.
따라서 일괄 작업 시스템의 프로세스 상태는 생성, 실행, 완료이다.
시분할 시스템에서는 CPU를 다른 프로세스에 넘겨주는 일이 빈번하기 때문에 일괄 작업 시스템보다 프로세스 상태가 복잡하다.
생성 상태 create status
: 프로세스가 메모리에 올라와 실행 준비를 완료한 상태, PCB가 생성준비 상태 ready status
: 생성된 프로세스가 CPU를 얻을 때까지 기다리는 상태디스패치 dispatch
: 준비 -> 실행 상태로 바꾸는 CPU 스케줄러의 작업타임 아웃 time out
: 프로세스에 배당된 작업 시간인 타임 슬라이스(타임 퀀텀) 내에 작업을 끝내지 못해 다시 준비 상태로 돌아가는 것 -> 클록으로부터의 인터럽트실행 상태 running status
: 준비 상태에 있는 프로세스 중 하나가 CPU를 얻어 실제 작업을 수행하는 상태, 주어진 시간 내에 작업을 끝내지 못하면 준비 상태로 돌아감완료 상태 terminate status
: 실행 상태의 프로세스가 주어진 시간 내에 작업을 마치면 완료 상태로 진입, PCB가 사라진 상태오늘날 운영체제 효율성을 고려해 프로세스의 상태를 대기 상태를 포함한 5가지로 표현할 수 있다.
생성 상태 create status
: OS로부터 PCB를 할당 받은 상태준비 상태 ready status
: PCB는 준비 큐에서 기다리며 CPU 스케줄러에 의해 관리실행 상태 running status
: 프로세스가 CPU를 할당받아 실행되는 상태, 타임 슬라이스 동안 작업대기 상태 blocking status
: 실행 상태에 있는 프로세스가 입출력을 요청하면 입출력이 완료될 때까지 기다리는 상태, 입출력장치별로 마련된 큐에서 대기완료 상태 terminate status
: 프로세스가 종료되는 상태, 코드와 데이터를 메모리에서 삭제하고 PCB를 폐기코어 덤프 core dump
: 비정상적으로 종료되는 강제 종료를 만나면 디버깅하기 위해 강제 종료 직전의 메모리 상태를 저장장치로 옮기는 것생성, 준비, 실행, 대기, 완료 상태를 활성 상태 active status
라고 한다. 이외에도 특별한 상태가 있다.
휴식 상태 pause status
: 프로세스가 작업을 일시적으로 쉬고 있는 상태보류 상태 suspend status
: 프로세스가 메모리에서 잠시 쫓겨난 상태보류 상태에 들어간 프로세스는 메모리 밖으로 쫓겨나 스왑 영역 swap area
에 보관된다.
context switching
은 CPU를 차지하던 프로세스가 나가고 새로운 프로세스를 받아들이는 작업을 말한다. 이때 두 PCB의 내용이 변경된다.
일반적으로 한 프로세스가 자신에게 주어진 시간을 다 사용하면 발생하고, 인터럽트가 걸렸을 때도 발생한다.
프로세스는 정적 할당 영역인 코드 영역, 데이터 영역과 동적 할당 영역인 힙 영역, 스택 영역으로 구성된다.
코드 영역 code area
: 프로그램 본문이 기술된 곳, 읽기 전용으로 처리됨데이터 영역 data area
: 변수나 파일 등의 각종 데이터를 모은 곳, 상수는 읽기 전용이지만 대부분의 변수는 읽기와 쓰기가 가능스택 영역 stack area
: 운영체제가 프로세스를 실행하기 위해 부수적으로 필요한 데이터를 모아놓은 곳, 사용자에게 보이지 않음힙 영역 heap area
: 동적으로 할당되는 변수 영역사용자가 프로그램을 실행하면 운영체제는 프로그램을 메모리로 가져와 코드 영역에 넣고 PCB를 생성한다. 그리고 메모리에 데이터 영역과 스택 영역을 확보한 후 프로세스를 실행한다.
fork() 시스템 호출
을 통해 실행 중인 프로세스로부터 새로운 프로세스를 복사하는 방법도 있다.
기존의 프로세스는 부모 프로세스가 되고 새로운 프로세스는 자식 프로세스가 되며 부모-자식 관계로 연결된다.
[fork() 시스템 호출 동작 과정]
[fork() 시스템 호출의 장점]
exec() 시스템 호출
을 통해 기존의 프로세스를 새로운 프로세스로 전환할 수 있다. 프로세스는 그대로 둔 채 내용만 바꾼다.
exec() 시스템 호출의 사용 목적은 프로세스의 구조체를 재활용하기 위함이다. 새로운 프로세스를 만들기 위해서는 PCB를 만들고 메모리 자리를 확보해하며, garbage collection을 위해 상위 프로세스와 부모-자식 관계를 만들어야 한다. 이때 exec() 시스템 호출을 사용하면 그대로 사용할 수 있어 편리하다.
[exec() 시스템 호출 동작 과정]
프로세스 계층 구조는 동시에 여러 작업을 처리하고 종료된 프로세스의 자원을 회수하는데 유용하다.
여러 작업의 동시 처리
: fork() 시스템 호출로 프로세스를 여러 개 만들어서 동시에 처리할 수 있도록 한다.용이한 자원 회수
: 프로세스 간의 책임 관계가 분명해져 시스템을 관리하기 수월하다.부모 프로세스가 먼저 종료되거나 자식 프로세스가 비정상적으로 종료되어 부모 프로세스에 연락이 안되는 경우가 발생해, 자식 프로세스가 종료되지 않거나, 사용하던 자원이 그대로 남게 되는 경우가 있다.
이 때, 비정상적으로 남아있는 프로세스를 orphan process, zombie process라고 한다.
orphan process는 부모 프로세스가 자식보다 먼저 죽은 경우 발생한다.
zombie process는 자식 프로세스가 종료했음에도 부모가 뒤처리를 하지 않았을 때 발생한다.
운영체제의 작업 단위는 프로세스라면, CPU의 작업 단위는 스레드이다.
프로세스 입장에서 정의하자면, 스레드는 프로세스의 코드에 정의된 절차에 따라 CPU에 작업 요청을 하는 실행 단위이다.
멀티스레드
: 프로세스 내 작업을 여러 개의 스레드로 분할하여 작업의 부담을 줄이는 프로세스 운영 기법멀티태스킹
: 운영체제가 CPU에 작업을 줄 때 시간을 잘게 나누어 배분하는 기법시분할 시스템 time-sharing system
: 여러 스레드에 시간을 잘게 나누어주는 시스템멀티프로세싱
: CPU를 여러 개 사용하여 여러 개의 스레드를 동시에 처리하는 작업 환경CPU 멀티스레드
: 한 번에 하나씩 처리해야 하는 스레드를 파이프라인 기법을 이용하여 동시에 여러 스레드를 처리하도록 만든 병렬 처리 기법fork() 시스템 호출로 프로세스를 복사하면 코드 영역과 데이터 영역의 일부가 메모리에 중복되어 존재하고, 부모-자식 관계이지만 독립적인 프로세스이므로 낭비적인 요소가 많다.
따라서 이러한 멀티태스킹의 낭비 요소를 제거하기 위해 스레드를 사용한다.
멀티스레드는 하나의 프로세스 내에 여러 개의 스레드를 생성하고, 이 스레드가 코드, 파일 등의 정적인 자원은 서로 공유함으로써 자원의 낭비를 막고 효율성을 향상한다.
[멀티스레드 장점]
응답성 향상
: 한 스레드가 입출력으로 인해 작업이 진행되지 않더라도 다른 스레드가 작업을 계속해 사용자의 작업 요구에 빠르게 응답할 수 있다.자원 공유
: 한 프로세스 내에서 독립적인 스레드를 생성하면 모든 스레드가 프로세스의 자원을 공유한다.효율성 향상
: 불필요한 자원의 중복을 막아 시스템의 효율이 향상된다.다중 CPU 지원
: 2개 이상의 CPU를 가진 컴퓨터에서 멀티스레드를 사용하면 다중 CPU가 멀티스레드를 동시에 처리해 CPU 사용량이 증가하고, 프로세스 처리시간이 단축된다.[멀티스레드 단점]
자원 공유
: 한 스레드에 문제가 생기면 전체 프로세스에 영향을 미친다.커널 스레드와 사용자 스레드로 나뉜다.
커널 스레드 kernel thread
: 커널이 직접 생성하고 관리하는 스레드
1 to 1 모델
이라고 부른다.사용자 스레드 user thread
: 라이브러리에 의해 구현된 일반적인 스레드
1 to N 모델
이라고 부른다.멀티레벨 스레드 multi-level thread
: 사용자 스레드와 커널 스레드를 혼합한 방식
M to N 모델
이라고 부른다.프로세스는 운영체제의 작업 단위, 스레드는 CPU의 작업 단위이다.
프로세스는 생성, 준비, 실행, 대기, 완료 상태를 가질 수 있다.
멀티스레드를 통해 프로세스의 정적인 영역을 모든 스레드가 공유하게끔 하여 자원 관리의 효율성을 향상시킬 수 있다.
갓도연짱 역시 깐부님 대단해여