Process
Process
프로세스란?
사용자가 프로그램을 실행하면 OS는 그 내용을 메모리상으로 읽어들여 처리를 실행한다. 이 메모리상에 할당된 프로그램을 프로세스라고 한다. 프로그램의 인스턴스. Process is a program in execution.
프로세스의 문맥
- CPU 수행 상태를 나타내는 하드웨어 문맥
Program Counter - 다음에 program 실행할 주소를 알려줌
각종 register
- 프로세스의 주소 공간 ( A가 할당되면 프로세스A의 주소공간이 할당된다.)
stack, data, code
code 중(함수) 하나쓰면 stack에 올라간다. A가 할당되어 register로 가서 일하고(ALU), 다시 register로 돌아와 memory로 빠진다.(현 상태 저장을 위해).
- 프로세스 관련 커널 자료구조
PCB(Process Control Block) - CPU, 메모리를 얼마나 줄지, 이상없는지 등 OS관리를 위함.
Kernel stack - 커널 스택은 누구의 부탁인지 프로세스별로 stack을 쌓는다. 프로세스에 올라오면 자동으로 메모리에 올라가며, 커널 주소공간 역시 stack, data, code 구조이다. 커널 함수는 여러 process가 공유하는 코드이다.
프로세스 상태
- Running : CPU가 할당되어있는 상태. CPU를 잡고 instruction을 수행중인 상태.
- Ready : CPU를 기다리는 상태(메모리 등 다른 조건을 모두 만족하고)
- Blocked(wait, sleep) : CPU를 주어도 당장 instruction을 수행할 수 없는 상태. Process 자신이 요청한 event(예:I/O)가 즉시 만족되지 않아 이를 기다리는 상태.
Suspended(stopped) : 외부적인 이유로 프로세스의 수행이 정지된 상태. 프로세스는 통째로 디스크에 swap out 된다. ex) 사용자가 프로그램을 일시 정지시킨 경우(break key), 시스템이 여러 이유로 프로세스를 잠시 중단시킴(메모리에 너무 많은 프로세스가 올라와 있을 때) Blocked의 경우 자신이 요청한 event가 만족되면 Ready이다. 즉, 일하면서 기다린다. Suspended는 외부에서 resume 해주어야 Active된다.
new는 프로세스가 생성중인 상태이고 Terminated는 수행(execution)이 끝난 상태이다.
Running상태에선 CPU에 Ready queue안에 있는 맨 처음 하나가 올라간다. 만약에 타이머가 걸리면 queue 맨뒤로 빠진다. Disk에서 정보를 받아올 때, Disk I/O queue(blocked)가 존재하며 Disk queue의 첫번째가 Ready queue 맨 뒤로 들어간다.
PCB(Process Control Block)
운영체제가 각 프로세스를 관리하기 위해 프로세스당 유지하는 정보.
구성요소
- OS가 관리상 사용하는 정보 : pointer(다른 PCB들을 연결시켜줄), Process state, Process ID
- CPU 수행 관련 하드웨어 값 : Program counter, registers(현재 뭐가 들어가있는지, 어디에 붙어있는지)
- 메모리 관련 : code, data, stack의 위치 정보
- 파일 관련 : Open file descriptors(어떤 파일 사용하는지)
Context Switch(문맥교환)
- CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정
- CPU가 다른 프로세스에게 넘어갈 때 운영체제는 다음을 수행
CPU를 내어주는 프로세스의 상태를 그 프로세스의 PCB에 저장
CPU를 새롭게 얻는 프로세스의 상태를 PCB에서 읽어옴
프로세스에서 kernel mode로 가는 것은 문맥교환이 아니고, 커널을 거쳐 다른 프로세스로 가는 것이 문맥교환이다. System call이나 Interrupt 발생시 반드시 문맥교환이 일어나는 것은 아니다. timer interrupt의 경우 무조건 문맥교환이다.(이건 메모리의 캐시가 다 비워지는거라 overhead이다. 그래서 상황이 맞으면 그때 그때 확인하는 interrupt or system call로 handling.)
Thread : CPU 수행단위. 프로세스보다 작은 단위. A thread(or lightweight process) is a basic unit of CPU utilization.
Thread의 구성 - program counter, register set, stack space
Thread가 동료 Thread와 공유하는 부분(=task) - code section, data section, OS resources
전통적인 개념의 heavyweight process는 하나의 thread를 가지고 있는 task로 볼 수 있다.
다중 스레드로 구성된 태스크 구조에서는 하나의 서버 스레드가 blocked(waiting) 상태인 동안에도 동일한 태스크 내의 다른 스레드가 실행(running)되어 빠른 처리를 할 수 있다. 동일한 일을 수행하는 다중 스레드가 협력하여 높은 처리율(throughput)과 성능 향상을 얻을 수 있다.(+메모리 자원절약)
ex) 웹툰을 예로 들면, 클릭을 해서 I/O 입출력을 통해 html코드를 받고, server에서 image를 가져와 뿌려준다. 근데 만약 thread를 쓰면 text가 먼저 뜨면서 image가 나온다고 볼 수 있다.
스레드를 사용하면 병렬성을 높일 수 있다.(CPU가 여러개일때만 가능.)
Benefits of Threads
- Responsiveness(응답성) : eg) multi-thread Web - If one thread is blocked(eg network), another thread continues(eg display)
- Resource Sharing : n threads can share binary code, data, resource of the process
- Economy : creating & CPU switching thread(rather than a process). Solaris의 경우 위 두 가지 overhead가 각각 30배, 5배. process보다 thread가 더 빠름.
- Utilization of MP Architectures : each thread may be running in parallel on a different processor