프로세스 정의
실행 중인 프로그램으로 디스크에 있던 코드가 메모리에 올라오면 프로세스가 됨.
프로세스 구조
1. 스택(stack)
지역변수, 호출 함수의 반환 주소, 매개 변수 등과 같이 프로그램을 실행하는데 필요한 데이터를 일시적으로 저장하는 영역.
힙과 인접한 방향으로 자라다가 힙과 만나게 되면 메모리가 소진되었다는 의미.
커널의 스택에는 사용자 프로세스가 요청한 운영체제 함수가 올라감.
운영체제의 자원(함수 등)은 공유 데이터이기 때문에 커널의 스택에 각 프로세스별 호출한 운영체제의 함수가 쌓임.
2. 힙(heap)
프로그래머가 동적으로 메모리를 할당 받을 때 사용되는 영역.
프로그램이 실행되는 중에 필요가 생겨 메모리를 할당받기 때문에 메모리 반환도 사용자가 직접 반환해야 함.
3. 데이터(data)
전역 변수, 정적 변수를 저장하거나 할당 받는 영역으로 실행 전에 초기화됨.
커널의 data 영역에는 각 프로세스별 PCB가 저장됨.
4. 코드(code)
프로그램의 실제 코드.
읽기 전용이므로 다른 영역의 데이터가 침범하면 프로그램이 오류로 인해 종료됨.
이 영역은 공유가 가능하므로 자주 사용하는 코드는 항상 메모리에 상주해있음.
PC(프로그램카운터)는 이 영역을 가리키며 다음으로 실행할 명령어를 CPU에게 알려줌.
프로세스 종류
1. 시스템(커널) 프로세스 : 모든 시스템 메모리와 프로세서 명령에 접근할 수 있는 프로세스
2. 사용자 프로세스 : 사용자 코드를 수행하는 프로세스
프로세스 상태
실행(Running) : CPU가 해당 프로세스를 실행하고 있는 상태.
준비(Ready) : 모든 자원은 준비되어있고, CPU를 기다리고 있는 상태. 준비가 다 된 프로세스는 준비 큐에 저장.
대기(Wait, Sleep, Blocked) : CPU를 받아도 당장 일을 못 하는 상태로 대기 원인(ex - 입출력)만 제거하면 준비 상태가 됨. 자기가 요청한 event가 만족되면 Ready 상태가 됨.
지연(Suspended, Stop) : 메모리가 가득 차는 것을 방지하기 위해 Swapper가 프로세스를 메모리에서 디스크로 내려보낸(Swap out) 상태. 또는 사용자가 프로그램을 일시정지시킨 상태. 외부에서 다시 시작해주어야 함.
생성(New) : 프로세스가 생성된 상태.
종료(Terminated) : 프로세스가 종료된 상태. PCB도 프로세스와 함께 제거됨.
프로세스 전이 동작
준비→실행(Dispatch) : 우선 순위가 높은 프로세스를 선정하여 실행함.
실행→준비(Time runout) : 시간이 다 되어 클럭이 인터럽트를 발생시켜 제어권을 뺏음(Preemption, 독점방지)
실행→대기(Sleep, Block) : 프로세서가 입출력, 자원 등을 기다리기 위해 대기 상태로 빠짐.
대기→준비(Wake up) : 프로세스가 자원을 얻어 준비 단계가 됨.
Swap-out(Suspend) : Swapper에 의해 프로세스가 준비 상태에서 메모리를 반납하고 디스크로 내려감.
Swap-in(Resume) : 다시 메모리를 할당받고 준비 상태가 됨.
※ 클럭이란 하나의 프로세스가 CPU를 독점하지 못하도록 클럭이란 시간을 만들어 해당 시간 동안만 CPU를 점유하게 합니다. 시간을 다 소비해도 프로세스가 끝나지 않으면 실행→준비((Time runout) 상태가 됩니다.
※ 프로세서 스케줄러가 PCB에 있는 우선순위를 통해 준비 큐의 프로세스 순위를 변경합니다.
프로세스 생성
프로그램이 프로세스를 생성하기위해 시스템 콜을 이용하여 운영체제에게 요청.
프로세스는 자원을 운영체제에게 요청하거나 부모 프로세스의 주소를 복사(fork)하여 자원을 공유함.
프로세스 종료
프로세스가 마지막 명령어를 수행한 뒤 운영체제에게 알림.
부모 프로세스가 종료되면 자식 프로세스도 함께 종료.
프로세스 간 협력
프로세스는 독립적이어서 서로에게 영향을 미치지 않지만 예외적으로 협력이 필요할 때가 있는데 그 경우 협력 메커니즘(IPC)을 사용함.
1. Massage passing : 커널을 통해 프로세스 간에 메시지를 주고받음.
2. Shared memory : 프로세스들이 서로의 주소공간을 공유함
프로세스 제어 블록(PCB)
운영체제가 프로세스를 관리하기 위해 만든 자료구조로 프로세스 별 정보가 저장되어 있음.
사용자가 쉽게 접근할 수 없도록 커널 영역의 data에 존재.
프로세스가 생성될 때 함께 생성되어 함께 종료됨.
프로세스 제어 블록에 저장된 정보
1. 운영체제가 사용하는 정보
프로세스 상태, 프로세스 ID, 우선 순위, 스케줄링 정보
2. CPU 관련 하드웨어 값
프로그램 카운터를 포함한 레지스터 값
3. 메모리 관련 값
현재 code, data, stack의 위치
프로세스 제어 블록을 사용하는 이유
PCB를 통해 어디까지 실행되고 있는지, 메모리를 얼마큼 할당해야 하는지 등 현재 프로세스의 상태를 알 수 있는 문맥을 파악할 수 있음.
다양한 큐에 대기하고 있는 프로세스
Ready Queue 또는 Device Queue에 다양한 프로세스들이 대기를 하고 있는데, 이 큐에는 PCB가 담겨 있습니다. PCB에는 pointer가 존재하는데 이 pointer를 이용하여 다음 PCB를 가리키고 있는 형태입니다.
프로세스 문맥
PCB에 저장된 프로세스의 현재 상태를 알 수 있는 정보.
현재 프로세스가 어떤 명령어를 수행중이고, 다음에 실행할 명령어 위치 등의 정보.
※ 프로세스 문맥은 흔히 "문장을 볼 땐 문맥을 파악해야 한다."라는 말처럼 프로세스의 상태 흐름을 파악하는 것을 말합니다.
※ 시분할 운영체제에선 여러 프로세스가 번갈아 실행되므로 현재 프로세스의 상태를 저장하고, 불러올 수 있어야 합니다. 그래서 프로세스 문맥이 중요합니다.
문맥 교환(Context Switch)
현재 프로세스에서 다른 프로세스를 실행할 때 현재 프로세스의 문맥을 저장하고 실행할 프로세스의 문맥을 불러오는 과정.
저장하고, 불러오는 과정이 있기 때문에 오버헤드가 발생
CPU는 PCB에 저장되어 있는 문맥을 통해 프로세스를 어디서부터 실행해야 하는지 파악.
※ 시스템 콜로 인해 발생한 인터럽트나 그외 인터럽트가 발생하였다고 무조건 문맥 교환이 발생하는 것은 아닙니다. 사용자 프로세스 A가 시스템 콜로 인해 인터럽트가 발생하여 운영체제에게 CPU를 주었다가 다시 사용자 프로세스 A가 받으면 문맥 교환이 발생한 것은 아닙니다. 만약, 사용자 프로세스 B가 받는다면 문맥 교환이 발생한 것입니다. 즉, 인터럽트 발생 후 다른 프로세스가 받아야 문맥 교환이 발생한 것입니다.
물론, "A 프로세스 → 커널모드 → A 프로세스" 과정도 A 프로세스에 대한 실행 정보를 PCB에 기록하긴 하지만, 문맥교환이 이보다 훨씬 비용이 많이 발생합니다. 왜냐하면 "A 프로세스 → 커널모드 → B 프로세스" 경우, A 프로세스가 사용하던 모든 캐시 메모리를 비워주어야하기 때문입니다.
스레드(Thread) 정의
프로세서의 실행 단위로, 모든 프로세스는 한 개 이상의 스레드를 가짐.
프로세스의 stack, data, code에서 stack 부분만 스레드마다 존재하고 data, code 부분은 공유.
커널에 저장되어 있는 PCB의 프로그램 카운터를 포함한 레지스터 값만 각 스레드 별로 가짐.
하나의 프로세스에 코드의 여러 부분을 실행할 수 있도록 stack 부분과 레지스터 값을 스레드마다 다르게 가짐.
스레드 구성
1. stack
2. program counter
3. register
스레드끼리 공유하는 부분
1. data
2. code
3. OS 자원
스레드를 사용하는 이유
1. 하나의 프로세스를 여러 스레드로 분산하여 병렬적으로 처리하므로 처리 속도를 향상할 수 있음.
2. 스레드끼리 자원 공유를 하고 있기 때문에 프로세스를 여러개 만드는 것보다 효율이 좋음
3. 문맥 교환이 적게 발생하여 오버헤드를 최소화 할 수 있음.
※ 멀티 프로세싱은 하나의 프로그램을 여러 프로세스로 작업하는 것을 말합니다. 프로세스는 독립적이므로 프로세스 사이에 자원 공유가 되지 않고, 문맥 교환이 많이 발생하여 스레드에 보다 비효율적입니다.
스레드의 단점
1. 하나의 스레드에 문제가 생기면 같은 프로세스 내에 있는 모든 스레드가 피해를 입음.
2. 같은 데이터를 공유하기 때문에 데이터 동기화에 신경을 써야함.
스레드 상태
프로세스 상태와 유사.
한 번에 한 스레드만 실행 가능.
스레드 제어 블록(Thread Control Block, TCB)
프로세스의 PCB처럼 스레드의 정보를 저장.
PCB에도 TCB의 정보가 저장됨.
'Computer Science > Operating System' 카테고리의 다른 글
멀티 스레드에 대한 이해 with 자바 (0) | 2022.11.11 |
---|---|
운영체제 - 프로세스 스케줄링 (0) | 2021.09.21 |
운영체제 - 병행프로세스, 상호배제 (0) | 2021.09.18 |
운영체제 (0) | 2021.09.14 |