Process
Process is a program in execution (실행중인 프로그램)
- 프로세스의 문맥(context)
- 하드웨어 문맥: CPU 수행 상태를 나타냄. Program Counter, 각종 register
- 프로세스의 주소 공간: code, data, stack 으로 구성
- 프로세스 관련 커널 자료 구조: PCB, Kernel Stack
프로세스의 문맥을 알고 있어야 다른 프로세스로 제어권이 넘어가고 다시 돌아올 때 실행해야 할 instruction의 위치나 프로세스의 상태를 알 수 있다.
Process Status
프로세스는 상태(state)가 변경되며 수행된다.
- Running: CPU를 잡고 instruction을 수행 중인 상태 (CPU를 잡는다 == PC(Program Counter)와 register를 잡는다)
- Ready: CPU를 기다리는 상태 (메모리 등 다른 조건을 모두 만족하고)
- Blocked (wait, sleep): CPU를 주어도 당장 instruction을 수행할수 없는 상태
- Process 자신이 요청한 event(ex. I/O)가 즉시 만족되지 않아 이를 (스스로) 기다리는 상태
- 자신이 요청한 event가 만족되면 Ready 상태가 됨
- ex. 디스크에서 file을 읽어와야 하는 경우
- Suspended (stopped): 외부적인 이유로 프로세스의 수행이 정지된 상태, 프로세스는 통째로 디스크에 swap out 된다
- 외부에서 resume 해주어야 Active 된다
- ex. 사용자가 프로그램을 일시 정지시킨 경우, 시스템이 여러 이유로 프로세스를 잠시 중단시키는 경우(메모리에 너무 많은 프로세스가 올라와 있을 떄)
- New: 프로세스가 생성중인 상태. 생성이 끝나면 Ready로 넘어감
- Terminated: 수행(exeuction)이 끝난 상태
Process Control Block (PCB)
Process Control Blocl (PCB)
PCB: 운영체제가 각 프로세스를 관리하기 위해 프로세스 별로 유지하는 정보. Kernel 주소공간의 data 영역에 프로세스마다 하나씩 생성된다.
- OS가 관리상 사용하는 정보
- Process State, Process ID
- scheduling information, priority
- CPU 수행 관련 하드웨어 값
- Program counter, registers
- 메모리 관련
- code, data, stack의 위치정보
- 파일 관련
- Open file descriptors
문맥 교환 (Context Switch)
Context Switch: CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정
CPU가 다른 프로세스에게 넘어갈 때 OS는 다음을 수행한다.
- CPU를 내어주는 프로세스의 상태를 그 프로세스의 PCB에 저장
- CPU를 새롭게 얻는 프로세스의 상태를 PCB에서 읽어옴
System Call이나 Interuupt가 발생해서 CPU제어권이 OS로 넘어가는 것(kernel mode)은 문맥 교환이 아니다. 이 경우에도 context의 일부를 PCB에 저장해야 하지만 문맥 교환을 하는 경우 그 부담이 훨씬 크다. (e.g. cache memory flush)
Process Scheduling
프로세스를 스케쥴링 하기 위한 큐: 프로세스들은 각 큐를 오가며 수행된다.
- Job queue: 현재 시스템 내에 있는 모든 프로세스의 집합
- Ready queue: 현재 메모리 내에 있으면서 CPU를 잡아서 실행되기를 기다리는 프로세스의 집합
- Device queue: I/O device의 처리를 기다리는 프로세스의 집합
스케쥴러 (Scheduler)
- Long-term Scheduler (장기 스케줄러)
- 시작 프로세스 중에 어떤 것들을 reqdy queue로 보낼지 결정 (new -> ready)
- 프로세스에 memory(및 각종 자원)을 주는 문제
- degree of Multiprogramming을 제어 (메모리에 프로세스를 얼마나 올릴지)
- time sharing system(현대의 컴퓨터)에는 보통 장기 스케줄러가 없음 (무조건 ready)
- Short-term Scheduler (단기 스케줄러, CPU Scheduler)
- 어떤 프로세스를 다음에 running 시킬 지 결정
- 프로세스에 CPU를 주는 문제
- 충분히 빨라야 함 (millisecond 단위)
- Medium-term Scheduler (중기 스케줄러, Swapper)
- 여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫓아냄
- 프로세스에게서 memory를 뺏는 문제
- degree of Multiprogramming을 제어
Thread
A thread (or lightweight process) is a basic unit of CPU utilization
Thread의 구성
- program counter (PC)
- register set
- stack space
Tread가 동료 tread와 공유하는 부분(=task)
- code section
- data section
- OS resources
- 전통적인 개념의 heavyweight process는 하나의 thread를 가지고 있는 task로 볼 수 있다.
- 다중 스레드로 구성된 태스크 구조에서는 하나의 서버 스레드가 blocked (waiting) 상태인 동안에도 동일한 태스크 내의 다른 스레드가 실행(running)되어 빠른 처리가 가능하다.
- 동일한 일을 수행하는 다중 스레드가 협력하여 높은 처리율(throughput)과 성능 향상을 얻을 수 있다.
- 스레드를 사용하면 병렬성을 높일 수 있다.
하나의 프로세스를 구성하는 thread들은 주소 공간을 공유하기 때문에 동일한 코드를 수행하지만, PC를 별도로 두기 때문에 특정한 시각에는 코드의 다른 위치를 수행할 수 있다.
Benefits of Threads
Responsiveness (응답성, 반응성)
- If one thread is blocked, another thread continues eg) multi-threaded Web
Resource Sharing
- n threads can share binary code, data, resource of t he process
Economy (경제성)
- creating & CPU switching thread (rather than a process)
- 프로세스를 추가하는 작업은 스레드를 추가하는 것보다 overhead가 크다
Utilization of MP Architectures
- easy thread may be running in parallel on a different processor
Implementation of Threads
- Kernel Threads: supported by kernel ex. Windows 95/98/NT, Solaris
- User threads: supported by library ex. POSIX Pthreads
- Real-time threads
Process Management
Process Creation
프로세스 생성
- 부모 프로세스(Parent Process)가 자식 프로세스(Children Process) 생성
- 프로세스의 트리(계층 구조) 형성
- 프로세스는 자원을 필요로 함 -> 운영체제로부터 받고 부모와 공유한다.
- 자원의 공유: 부모와 자식이 모든 자원을 공유 or 일부를 공유 or 전혀 공유하지 않는 모델이 있다.
- 수행 (Execution): 부모와 자식이 공존하며 수행되는 모델 or 자식이 종료(terminate)될 때까지 부모가 기다리는(wait) 모델
주소 공간(Address Space)
- 자식은 부모의 공간을 복사함(binary and OS data)
- 자식은 그 공간에 새로운 프로그램을 올린다.
- 유닉스의 예
fork()
시스템 콜이 새로운 프로세스를 생성: 부모를 그대로 복사(Os data except PID + binary)하고 주소공간 할당- fork 이후에 이어지는
exec()
시스템 콜을 통해 새로운 프로그램을 메모리에 올린다.
Process Termination
프로세스 종료
자발적 종료: 프로세스가 마지막 명령을 수행한 후 운영체제에게 이를 알려준다. (exit
)
- 자식이 부모에게 output data를 보냄
- 프로세스의 각종 자원들이 OS에 반납됨
비자발적 종료: 부모 프로세스가 자식들의 수행을 종료시킴 (abort
)
- 자식이 할당 자원의 한계치를 넘어섬
- 자식에게 할당된 태스크가 더 이상 필요하지 않음
- 부모가 종료(exit)하는 경우: 운영체제는 부모 프로세스가 종료하는 경우 자식이 더 이상 수행되도록 두지 않는다. 자식 프로세스 먼저 단계적으로 종료.
System Call related to Process
fork() 시스템 콜: create a child (copy)
A process is created by the fork()
system call.
- create a new address space that is a duplicate of the caller
int main()
{
int pid;
pid = fork();
if (pid == 0)
printf("Hello, I am Child\n");
else if (pid > 0)
printf("Hello, I am Parent\n");
}
copy-on-wirte(cow): fork()시 자식이 부모의 주소 공간을 바로 copy하는 대신 일단 공유하고 있다가 부모와 다른 내용으로 주소 공간의 내용이 변경될 때 해당 부분을 copy하는 방법
자식 코드에도 fork() 명령어가 포함되는데 fork()가 무한히 생성되지 않는 이유: 부모의 PC(program counter) 문맥(하드웨어 문맥)도 복사하기 때문
exec() 시스템 콜: overlay new image
A process can execute a different program by the exec()
system call
- replaces the memory image of the caller with a new program
int main()
{
int pid;
pid = fork();
if (pid == 0) {
printf("Hello, I am Child\n");
execlp("/bin/date", "/bin/date", {char *) 0); // 새로운 코드 overriding
}
else if (pid > 0)
printf("Hello, I am Parent\n");
}
wait() 시스템 콜: sleep until child is done
프로세스 A가 wait()
시스템 콜을 호출하면
- 커널은 child가 종료될 때까지 프로세스 A를 sleep 시킨다 (block 상태)
- Child process가 종료되면 커널은 프로세스 A를 깨운다 (ready 상태)
int main()
{
int pid;
childPID = fork();
if (childPID == 0) {
printf("Hello, I am Child\n");
// <code for child process>
}
else{
printf("Hello, I am Parent\n");
wait();
}
}
exit() 시스템 콜: frees all the resources, notify parent
자발적 종료
- 마지막 statement 수행 후
exit()
시스템 콜을 통해 프로세스 종료 - 프로그램에 명시적으로 넣어주지 않아도 main 함수가 리턴되는 위치에 컴파일러가 넣어줌
비자발적 종료
- 부모 프로세스가 자식 프로세스를 강제 종료시킴
- 자식 프로세스가 한계치를 넘어서는 자원 요청, 자식에게 할당된 태스크가 더 이상 필요하지 않음
- 키보드로 kill, break 등을 입력한 경우
- 부모가 종료하는 경우
- 부모 프로세스가 종료하기 전에 자식들이 먼저 종료됨
Interprocess Comunication (IPC, 프로세스 간 협력 매커니즘)
독립적 프로세스 (Independent Process)
- 프로세스는 각자의 주소 공간을 가지고 수행되므로 원칙적으로 하나의 프로세스는 다른 프로세스의 수행에 영향을 미치지 못함
협력 프로세스 (Cooperating Process)
- 프로세스 협력 메커니즘을 통해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있음
프로세스 간 협력 매커니즘 (IPC: Interprocess Communication)
Message Passing: 커널을 통해 메시지를 전달하는 방법
- Message system: 프로세스 사이에 공유 변수(shared variable)를 일체 사용하지 않고 통신하는 시스템
- Direct Communication
- 통신하려는 프로세스의 이름을 명시적으로 표시
- Process P: Send (Q, message) -> Process Q: Receive (P, message)
- Indirect Communication: mailbox (혹은 port)를 통해 메시지를 간접 전달
Shared Memory: 주소 공간을 공유하는 방법
- 서로 다른 프로세스 간에도 일부 주소 공간을 공유하게 하는 shared memory 메커니즘이 있다.
- thread는 사실상 하나의 프로세스이므로 프로세스 간 협력으로 보기는 어렵지만, 동일한 process를 구성하는 thread들 간에는 주소 공간을 공유하므로 협력이 가능하다.
'CS > 운영체제' 카테고리의 다른 글
06. Deadlocks (1) | 2023.11.21 |
---|---|
05. Process Synchronization (0) | 2023.11.13 |
[Week4] CPU Scheduling (0) | 2023.11.02 |
Week 2: 시스템 구조 및 프로그램 실행 (1) | 2023.10.18 |
Week 1: 운영체제(Operation System, OS) 개요 (0) | 2023.10.17 |