프로그램의 실행 (메모리 load)
stack | 함수 이용시, 쌓아둠 |
data | 변수 |
code | 기계어 |
Kernel의 주소공간 : OS도 코드이므로 함수로 구성.
커널 주소 공간의 내용
- PCB(Process Control Block) : 각 프로그램마다 운영체제가 관리하고 있는 자료구조.
- 프로세스마다 사용하는 커널 스택이 다름.
사용자 프로그램이 사용하는 함수
프로세스(Process)
A program in execution.
프로세스의 문맥(context)
- CPU 수행 상태를 나타내는 하드웨어 문맥 : program counter, 각종 register
- 프로세스의 주소 공간(메모리와 관련) : code,data,stack
- 프로세스 관련 커널 자료 구조 : PCB(프로세스의 종합적 정보를 가지고 있음), Kernel stack
프로세스의 상태(Process State)
Running
CPU를 잡고 instruction을 수행중인 상태
Ready
CPU를 기다리는 상태 (메모리 등 다른 조건은 모두 만족)
Blocked(wait, sleep)
CPU를 주어도 당장 instruction을 수행할 수 없는 상태 또는
process 자신이 요청한 event가 즉시 만족되지 않아 이를 기다리는 상태
Suspended(stopped)
외부적인 이유로 프로세스의 수행이 정지된 상태
프로세스는 통째로 디스크에 swap out됨.
ex) 사용자가 프로그램을 일시 정지시킨 경우 (break key)
시스템이 여러 이유로 프로세스를 잠시 중단시킴.(메모리에 너무 많은 프로세스가 올라와 있을 때)
New
프로세스가 생성중인 상태
Terminated
수행이 끝난 상태
공유데이터
프로세스들이 같이 쓰는 데이터로 한 번에 한 개의 프로세스만 실행(일관성을 위해)
Process Control Block (PCB)
문맥 교환(Context Switch)
CPU를 뺏길 때 어디까지 했었는지를 기록해야함.
CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정.
CPU가 다른 프로세스에게 넘어갈 때 운영체제는 다음을 수행
- CPU를 내어주는 프로세스의 상태를 그 프로세스의 PCB에 저장
- CPU를 새롭게 얻는 프로세스의 상태를 PCB에서 읽어옴
(1)의 경우 문맥 교환이 아님. (2)의 경우는 문맥 교환이 맞음.
문맥 교환인 경우
1. 사용자 프로세스 A에서 사용자 프로세스 B로 넘어가는 경우
2. 사용자 프로세스 A는 계속 쓰고 싶은데, timer interrupt가 들어온 경우 (CPU를 다른 애한테 넘겨줘야함)
프로세스를 스케줄링하기 위한 큐
Job queue
현재 시스템 내에 있는 모든 프로세스의 집합
Ready queue
현재 메모리 내에 있으면서 CPU를 잡아서 실행되기를 기다리는 프로세스의 집합
Device queue
I/O device의 처리를 기다리는 프로세스의 집합
스케줄러
쓰레드(Thread)
CPU 수행 단위.
- 다중 스레드로 구성된 태스크 구조에서는 하나의 서버 스레드가 blocked(waiting) 상태인 동안에도 동일한 태스크 내의 다른 스레드가 실행(running)되어 빠른 처리를 할 수 있음.
- 동일한 일을 수행하는 데 다중 스레드가 협력하여 높은 처리율(throughput)과 성능 향상을 얻을 수 있음.
- 스레드를 사용하면 병렬성을 높일 수 있음.(CPU가 여러 개 있을 경우만)
Thread의 구성
- program counter
- register set
- stack space
Thread가 동료 thread와 공유하는 부분(=task)
- code section
- data section
- OS resources
Thread의 장점
Thread 구현 방식
Kernel Threads
Thread가 여러 개라는 사실을 운영체제 kernel이 알고 있음.
하나의 thread에서 다른 thread로 넘어가는 것을 kernel이 CPU스케줄링을 하듯이 넘겨줌.
User Threads
Process 안에 thread가 여러 개라는 것을 운영체제는 모름.
User program이 스스로 여러 프로그램을 관리. (library지원을 받음) 구현 상의 제약이 있음.
프로세스 관리(Process Management)
프로세스 생성(Process Creation)
- 부모 프로세스(Parent process)가 자식 프로세스(Children process) (복제) 생성
- 프로세스의 트리(계층 구조)형성
- 프로세스는 자원을 필요로 함
운영체제로부터 받고, 부모와 공유
- 자원의 공유
부모와 자식이 자원을 공유하는 모델
일부를 공유하는 모델
전혀 공유하지 않는 모델(일반적)
- 수행 (Execution)
부모와 자식은 공존하며 수행하는 모델
자식이 종료(terminate)될 때까지 부모가 기다리는(wait) 모델
- 주소 공간(Address space)
자식은 부모의 공간을 복사 (binary and OS data)
자식은 그 공간에 새로운 프로그램을 올림
- 유닉스의 예
fork() 시스템 콜이 새로운 프로세스를 생성
부모를 그대로 복사 (OS data except PID + binary), 주소 공간 할당
fork 다음에 이어지는 exec() 시스템 콜을 통해 새로운 프로그램을 메모리에 올림
프로세스의 종료(Process Termination)
- 프로세스가 마지막 명령을 수행한 후 운영체제에게 이를 알려줌 (exit)
자식이 부모에게 output data를 보냄(via wait)
프로세스의 각종 자원들이 운영체제에게 반납.
- 부모 프로세스가 자식의 수행을 종료시킴(abort)
자식이 할당 자원의 한계치를 넘어서거나 자식에게 할당된 태스크가 더 이상 필요하지 않음
- 부모가 종료(exit)하는 경우
운영체제는 부모 프로세스가 종료하는 경우 자식이 더 이상 수행되도록 두지 않음
- 단계적으로 종료
fork() 시스템 콜 - create
둘 중 뭐가 부모고 뭐가 자식인지 구분하는 법 : return 값으로 pid값 비교. 자식은 0 부모는 양수.
exec() 시스템 콜 - 메모리에 올리기