3 장. 프로세스
프로세스관리 3장 프로세스 (Process) 4장 쓰레드 (Thread) 5장 프로세스동기화 (Synchronization) 6장 CPU 스케쥴링 2
목표 프로세스개념 프로세스는실행중인프로그램으로모든계산의기반이됨 프로세스의여러특성 스케쥴링, 생성및종료등 프로세스간통신 공유메모리 (shared memory), 메시지전달 (message passing) 클라이언트-서버시스템에서의통신 3
3.1 프로세스개념 CPU activity를부르는명칭 Batch 시스템 작업 (Job) Time-shared 시스템 User program, Task, Process Job, Task, Process 용어는거의같은의미로사용됨 프로세스 - 실행상태에있는능동적개체, 연관된자원사용 프로그램코드보다더많은부분을포함 메모리 : code + data + stack + heap CPU : program counter(pc) + registers 프로세스관리용자료구조 : 프로세스제어블록 (PCB) 프로그램 디스크에파일로저장된수동적개체 프로그램파일 = 코드 (text section) + 초기화데이터 + 헤더정보등 4
프로세스와프로그램 program in disk header code 초기화 data executable file - a.out - prog.exe process in CPU PC regs process in memory stack : 임시데이터저장 - 함수매개변수 - return 주소 - 지역변수 heap : 실행시간동안에동적할당되는메모리 data section : 전역변수 초기화전역변수 (data) 비초기화전역변수 (bss) text section 프로그램코드 5
프로세스와프로그램 여러개의프로세스가같은프로그램사용가능 text section 은같음 같은메모리공유, 개별적인실행시퀀스 data/stack/heap section 은다름 프로세스마다개별적인메모리할당 CPU process1 PC regs process2 PC regs memory code data stack data stack shared by two processes process1 process2 6
프로세스상태 프로세스상태 프로세스의현재활동을나타내며, 실행하는동안상태변화가발생함 프로세스상태의종류 생성 (new) 프로세스가생성중임 실행 (running) 명령어가실행되고있음 대기 (waiting) 어떤사건 ( 입출력완료, 신호수신등 ) 발생을기다림 준비 (ready) 프로세스가실행할준비가됨 CPU의할당을기다림 종료 (terminated) 프로세스의실행이종료됨 종료후처리를기다림 프로세스상태이름과종류는운영체제마다차이가있다. 7
프로세스상태도 preemption (timeout) time interval message event occurs request grant (blocked) resource request 한 CPU 에서는어떤순간에한프로세스만실행될수있다. 많은수의프로세스가 ready 또는 waiting 상태일수가있다. 프로세스가다른프로세스에의해서종료되면 프로세스는 ready 또는 waiting 상태에서 terminated 상태로이동될수있다. 8
프로세스제어블록 (PCB) 프로세스제어블록 (Process Control Block) 프로세스에대한정보를포함하는 OS 커널의자료구조 태스크제어블록 (task control block) 이라고도함 프로세스 context 프로그램의실행상태정보 실행시간동안변경가능 CPU context, Memory context 등 CPU context PC registers Memory context 9
PCB 정보 PCB 정보 Process state Program Counter(PC) CPU registers Memory-management 정보 (7 장 ) CPU scheduling 정보 (6 장 ) I/O status 정보 the list of allocated I/O devices the list of I/O requests the list of open files Accounting information process number(id), account number CPU time, time limit,... CPU context 10
( 예 ) 리눅스에서의 Process 표현 struct task_struct... 모든 active process 는 task_struct 자료의 doubly link list 로관리됨 11
프로세스간에 CPU switch scheduler CPU contexts task switching scheduler task switching 12
3.2 프로세스스케쥴링 스케쥴링의필요성 multiprogramming CPU 이용률극대화 time sharing 사용자와의상호작용 빈번한 CPU 스위칭 프로세스스케쥴링 Queue Job queue: 모든프로세스들의집합 Ready queue: ready 상태의프로세스들의집합 ( 메모리에위치 ) Device queues: 특정 I/O 장치사용을대기하는프로세스들의집합 일반적으로 linked list로저장 프로세스들은실행동안여러 queue들사이에서이동함 프로세스가종료되면 queue에서제거되며할당된자원과 PCB도반납 (deallocate) 함 13
Ready Queue 와여러 I/O Device Queues ready queue device queues 14
프로세스스케쥴링에대한 Queueing initial dispatch terminate child termination create a new process 15
프로세스의 Queue 들간의이동 queue migration Waiting Queue 16
스케줄러 스케줄러 queue 간에이동할프로세스를선택하는역할을담당 장기 (Long-term) 스케줄러 (job scheduler) disk pool에서 ready queue로이동시킬프로세스를선택 batch systems에서사용 단기 (Short-term) 스케줄러 (CPU scheduler) 스케줄러 다음에실행시킬프로세스를선택하여 CPU를할당함 중기 (Medium-term) 스케줄러 time-sharing system에서추가된중간레벨의스케줄링 메모리에서 disk로이동시킬프로세스를선택 (swapping이라고함 ) 17
3 가지스케줄러 disk medium-term scheduler (swapping) disk pool job scheduler memory CPU scheduler CPU invoked infrequently (sec, min) may be slow invoked frequently (ms) must be fast 18
Long-Term 스케줄러 I/O bound process 와 CPU bound process I/O-bound process 계산보다는 I/O 수행에더많은시간을소비함 많은수의짧은 CPU bursts( 연속적으로 CPU 를사용하는시간 ) CPU-bound process 계산에더많은시간을소비함 적은수의매우긴 CPU bursts. 장기스케줄러의역할 multiprogramming 의정도 (degree) 를제어함 I/O bound process와 CPU bound process들의적절한조합을선택하는것이중요함 시분할 ( 대화형 ) 시스템에서는장기스케줄러가없거나최소화 물리적제한 ( 예 : 터미널수 ) 이나인간의스스로조절하는능력으로대치됨 19
Medium-Term 스케줄러 medium-term 스케줄러의중요아이디어 CPU 에대한경쟁 (contention) 을줄임 multiprogramming 정도감소 새로적재될프로세스를위한메모리공간확보 20
Context Switch 프로세스의 CPU Context PC, CPU registers, memory management 정보등 Process switching 전에 PCB 등의장소에저장해야함 Context switch (= Process switching) CPU 가다른프로세스로전환될때에운영체제는 old process 의현재 CPU 상태 (context) 를저장하고 new process 의저장된상태 (context) 를 CPU 에적재한다. 프로세스전환과정 현재 process 의 PCB 에있는 state 를 running 에서다른상태로갱신하고 PCB 를 ready queue 에서갱신상태에적절한 queue 로이동함 새로선택된 process 의 PCB 에있는 state 를 running 으로갱신 현재 process 의 CPU context 를자신의 PCB 에저장 새 process 의 PCB 에서 CPU context 를 CPU 로복원함 21
Context Switch Overhead Context-switch time 은 overhead 임 switching 동안시스템은유용한작업을하지않음 운영체제가더복잡할수록 context switching 동안더많은작업이필요 ( 예 ) memory management 사용은추가적인 context data를사용하고이에대한코드가추가적으로필요함 Context-switch time은하드웨어지원에크게영향받음 Sun UltraSPARC 는여러개의레지스터집합을제공 context switch 동안현재레지스터집합에대한포인터만변경 많은 processor 들이모든레지스터를적재 (load) 하고저장 (store) 하는 special instruction 을제공 Process Switching 은간접적인 overhead 도가짐 캐쉬무효화 (cache invalidation) 등. 22
모바일시스템에서의 Multitasking 초기의 ios는사용자 application의 multitasking을제공하지않음 ios 4부터제한된형태의 multitasking 지원 단일 foreground 프로세스 화면사용 다수의 background 프로세스 메모리에있지만, 화면에보이지않음 단일작업을수행하는제한된길이의작업 ( 예 : 다운로드 ) 사건공지 (notification) ( 예 : 메일메시지수신 ) 실행시간이긴작업 ( 예 : 오디오재생 ) Android 는 background 응용에제한이없음 application 은 background 에서 service 를사용해야함 service : background 프로세스대신에수행하는분리된응용컴포넌트 service 는사용자인터페이스를갖고있지않고, 적은메모리를사용하여모바일환경에서의 multitasking 에효율적임 23
3.3 프로세스연산 프로세스생성 (creation) 프로세스는 create-process 시스템호출을사용하여 new 프로세스를생성 부모프로세스 자식프로세스 생성된프로세스들의계속적인프로세스생성의결과로프로세스트리 (process tree) 를형성함 ( 다음쪽참조 ) 프로세스들은프로세스식별자 (process identifier, pid) 로구분 부모프로세스와자식프로세스간의여러가지자원공유방법 자식프로세스가 OS에서자원을직접얻음 부모와자식프로세스간에자원을공유하지않음 자식프로세스가부모프로세스자원의부분집합을사용 자식프로세스는부모프로세스의모든자원또는일부자원공유 부모프로세스는자식프로세스들에게자신의자원을분할제공 24
전형적 Linux 시스템의프로세스트리 init pid = 1 login pid = 8415 kthreadd pid = 2 sshd pid = 3028 bash pid = 8416 khelper pid = 6 pdflush pid = 200 sshd pid = 3610 ps pid = 9298 emacs pid = 9204 tcsch pid = 4005 25
프로세스생성 실행 (Execution) 부모와자식이병행 (concurrent) 수행, 또는 부모가모든또는일부자식이끝나기를기다림 (wait) 주소공간 (Address space) 자식은부모의복사본 (duplicate), 또는 자식은새로적재되는프로그램을가짐 Examples UNIX: fork 와 exec system call 사용 fork() : new process 생성. 부모프로세스의주소공간의복제본으로구성됨 exec() : 프로세스메모리공간을새프로그램으로대치하여새로운프로그램을실행 Win32 API: CreateProcess() : 프로그램을적재하여자식프로세스를생성하여실행. 인수가복잡함 (10개이상) 26
UNIX 에서의프로세스생성 (pid > 0) parent (pid = 0) 인수형태에따라서여러종류의 exec 계열함수가제공됨 27
프로세스를생성하는 C 프로그램 (UNIX) #include <stdio.h> int main(void) { int pid; pid = fork(); /* fork another process */ if (pid < 0) { fprintf(stderr, "Fork failed"); exit(-1); } else if (pid == 0) { /* child process */ execlp("/bin/ls", "ls", NULL); /* execute a new program */ } else { /* parent process */ wait(null); /* wait for the child to complete */ printf("child complete"); exit(0); } } 28
UNIX 에서의 fork/exec/wait 동작 parent pid = fork() (pid: child pid) duplicate child pid = fork() (pid: 0) load & execute (replace) wait() exec() exit() 29
Windows 에서의프로세스생성 30
프로세스종료 ( 정상적 ) 프로세스의정상종료 프로세스가마지막문장의실행이끝나면 exit() 시스템호출을하여운영체제에게자신을삭제를요청함 자식프로세스는부모에게상태값 ( 대개정수 ) 을반환할수있다. 부모는 wait() 시스템호출을하여이값을기다림 운영체제는프로세스가사용한자원을반납 (deallocate) 함 좀비 (Zombie) 프로세스 종료되었지만부모가 wait() 를아직호출하지않아서남아있는프로세스 (terminated/zombie 상태 ). 짧은시간동안이상태에머무름 31
프로세스의종료 ( 비정상적 ) 프로세스의비정상종료 다음경우에부모가 abort() 시스템호출을하여자식을종료할수있음 child 가자신에게할당된자원을초과하여사용할때 child 에게할당된태스크 ( 작업 ) 가더이상필요없을때 부모가종료하는데, 운영체제가자식이계속하여실행하는것을허용하지않을때 연쇄적종료 (cascading termination) 부모프로세스종료후에자식의계속적인실행을허용하는경우 모든프로세스는종료후처리를위하여부모프로세스가있어야함 자식프로세스는고아 (orphan) 프로세스가되며, init 프로세스를자식프로세스의새로운부모프로세스로지정함 32
3.4 프로세스간통신 (Interprocess Comminication) 병행 (concurrent) 프로세스의종류 독립 (Independent) 프로세스 : 다른프로세스의실행에영향을주거나받지않음 협력 (Cooperating) 프로세스 : 다른프로세스의실행에영향을주거나받음 프로세스협력을허용하는이유 정보공유 ( 예 ) 공유파일 계산가속화 (Computation Speedup) 작업을서브작업으로나누어, 병렬실행 모듈성 (Modularity) 기능모듈화 편의성 (Convenience) 개별사용자가한번에여러작업을수행함 ( 예 ) 편집, 프린트, 컴파일을함께수행 ( 병렬 ) 33
( 예 ) 다중프로세스구조 Chrome Browser 단일프로세스방식의웹브라우저 한웹사이트 (JS, html5 포함 ) 가문제가있으면전체브라우저에영향 Chrome Browser 의다중프로세스구조 3 프로세스사용 브라우저 (browser) 렌더러 (renderer) - 웹사이트마다별도의렌더러실행 플러그인 (plug-in) 특징과장점 renderers는 sandbox에서실행되며, 멀티코어에서병렬렌더링지원 웹사이트가다른웹사이트와고립되어동작 문제발생시다른웹사이트의렌더러에영향을주지않음 sandbox : 디스크와네트워크 I/O 접근이제한됨 보안취약점 (exploits) 의영향최소화 34
프로세스간통신 (IPC) 모델 Message Passing Shared Memory - 적은양의데이터전달에유용 - 충돌 (conflict) 이없음 - 구현이용이 - 코어수가증가할때더나은성능 - 최대속도 - 편의성 : 공유메모리영역지정할때에만시스템호출. 보통메모리처럼접근 - 코어수증가시캐시일관성문제로성능저하 많은운영체제가두 IPC 모델을모두구현함 35
공유메모리시스템 Shared Memory Systems 공유영역에있는버퍼사용 시스템호출을사용하여공유메모리영역지정 UNIX: shmget(), shmat() 뒤에서설명 공유메모리가지정되면보통의메모리와같이접근됨 생산자 - 소비자문제 (Producer-Consumer) 협력프로세서들의간단하고전형적인예 producer 프로세스는정보를생산하고, consumer 프로세스는정보를소비함 생산자-소비자문제의공유메모리구현방법 두유형의버퍼 무한 (unbounded) 버퍼 : 버퍼크기의제한이없음 유한 (bounded) 버퍼 : 고정된버퍼크기 버퍼가 full 이면 producer 는기다려야함 producer process write read buffer shared memory consumer process 36
Producer-Consumer 프로그램 공유메모리 shared buffer producer consumer 37
메시지전달시스템 메시지전달 (Message passing) 같은주소공간을공유하지않고, 통신을하고동작을동기화하는기능을제공함 ( 네트워크로연결된분산환경에특히유용 ) 메시지전달 IPC 함수이용 메시지전달 IPC 함수 최소두가지 send(message) receive(message) 메시지크기와 IPC 구현 구현 프로그래밍 fixed size: 간단함더복잡함 variable size: 더복잡함더간단함 한번에전송 / 수신할수있는메시지길이는제한됨. 길이가길면제한된길이로분할하여여러번전송하거나, 여러번수신하여합해야함 fixed size IPC : 프로그래머가이작업을수행 variable size IPC : IPC 함수에서이작업을수행 38
IPC 의통신연결 (Communication Link) communication link 통신프로세스 P와 Q가서로통신을하려면그들간에통신연결이설정되어야함 communication link의구현 물리적구현 : 공유메모리, 하드웨어버스, 네트워크 논리적구현 : 운영체제의관심사항 communication link 와 send/receive 의논리적구현방법 direct / indirect communication 명명 (naming) 방법 상대편을참조하는 ( 가리키는 ) 방법 synchronous / asynchronous communication send 와 receive 의동작동기화여부 자동 (automatic) / 명시적 (explicit) buffering 39
Naming - Direct Communication Direct Communication 서로의이름을명시 ( 대칭주소지정 ) send (P, message) process P 에게 message 전송 receive(q, message) process Q 로부터 message 수신 비대칭 (asymmetric) 주소지정 send(p, message) receive(id, message) 임의의 process 로부터 message 수신 id = sending process 의이름 communication link 의특성 링크가자동적으로설정 링크는두프로세스들사이에서만연관됨 두프로세스들사이에정확히 1 개의링크만존재 문제점 프로세스의이름을변경하면, 모든다른프로세스정의에대한검사가필요함 해결책 : 간접통신 Q Q id = Q P P 40
Naming - Indirect Communication Indirect communication mailbox ( 또는 port) 를경유하여 message 를송신하거나수신함 각메일박스는고유의 ID 를가짐 프로세스들은메일박스를공유할때에, 메일박스를통하여통신 메일박스를사용한 send/receive send(a, message): mailbox A 로 message 송신 receive(a, message): mailbox A 에서 message 수신 communication link 의특성 프로세스들이공유 (common) 메일박스를가질때에만통신링크가설정됨 링크는두개이상의프로세스와연관가능 두프로세스들간에다수의링크를공유가능 메일박스생성및소유 운영체제는메일박스생성 / 송수신 / 삭제기능 메일박스는생성한프로세스의소유임 운영체제도자체의메일박스소유가능 Q R Q mailbox A A B P P 41
동기화 (Synchronization) 동기식 (synchronous) 통신 Blocking 송수신 동작이상대편동작에영향을받음 Blocking send 송신프로세스는수신프로세스나메일박스가메시지를받을때까지 block 되어있음 Blocking receive 수신프로세스는수신메시지가있을때까지 block 되어있음 비동기식 (asynchronous) 통신 - Non-blocking 송수신 동작이상대편동작에영향을받지않음 Non-blocking send 송신프로세스는메시지를보내고바로 return. 작업을계속수행함 ( 수신여부와관계없이 ) Non-blocking receive 수신프로세스는유효한메시지를받거나널 (null) 을받고바로 return. 작업을계속수행함 동기식통신이프로그래머가사용하기가더쉽다. 42
버퍼링 (Buffering) 메시지큐 프로세스간에교환되는메시지는링크에연관된 message queue( 버퍼 ) 에저장되어전송됨 buffer queue 의구현방법 1. 유한용량 (Bounded capacity) 유한한길이의버퍼 ( 길이 n) queue가 full이면 sender는기다려야함 (blocking). 2. 무한용량 (Unbounded capacity) 무한한길이의버퍼 ( 이상적 ) Sender는결코기다리지않음 (nonblocking) 3. 무용량 (Zero capacity) 링크에버퍼가없음. Sender 는 receiver 가준비되어직접수신할때까지기다려야함. 랑데부 (rendezvous). 43
3.5 IPC 시스템사례 - UNIX 의공유메모리함수 Shared Memory IPC 공유메모리세그먼트생성, id 반환 segment id = shmget(ipc_private, size, S_IRUSR S_IWUSR); id 가지정하는공유메모리를프로세스에연결 (attach) shared_memory = (char *) shmat(id, NULL, 0); 공유메모리세그먼트에읽고, 쓰기 ( 배열 read/write 와동일 ) sprintf(shared_memory, "Writing to shared memory"); 공유메모리를프로세스에서제거 (detach) shmdt(shared_memory); POSIX shared memory IPC shm_open() : 공유메모리객체생성 ftrunccate() : 객체의크기설정 mmap() : 공유메모리객체를프로세스메모리공간맵핑 shm_unlink() : 공유메모리객체제거 44
Mach 의 message passing 메일박스기반메시지전송 메일박스를 port 라고부름 메시지전송시스템호출 msg_send() 메일박스 ) 전송 msg_receive() 메일박스수신 msg_rpc() remote procedure call port_allocate() 메일박스생성 45
Windows 의 IPC - Local Procedure Calls message passing port( 메일박스와같음 ) 를경유 Advanced Local Procedure Call(ALPC) 이용 - 작은메시지 : port 의메시지큐이용 - 대용량메시지 : 공유 section object 이용 - 매우큰메시지 : 서버가클라이언트주소공간직접접근 API 사용 46
3.6 클라이언트 - 서버시스템에서의통신 소켓 (Sockets) 원격프로시저호출 (Remote Procedure Calls) 파이프 (pipes) 47
Sockets A socket 응용프로그램간에통신이연결되는종단점 (endpoint) IP 주소와포트번호에의해서식별됨 IP 주소는시스템을가리킴, 포트번호는해당시스템의프로세스와연결됨 IP address port 48
Remote Procedure Calls Remote procedure call (RPC) 네트워크에연결되어있는시스템의프로세스들간에 procedure calls 을추상화한것으로 IPC 기반으로구현됨 Stubs 서버의프로시저에대한원격호출을대행해주는프로시저 (proxy) client process client stub client OS network server process (RPC) server stub server OS XDR (external data representation) The client-side stub 원격서버의포트를찾고, 매개변수를중립적표현방식으로정돈 (marshal) The server-side stub 메시지수신, 정돈된메시지해제, 서버에서요청한프로시저호출하여수행하여결과전송 49
Pipes 파이프 (pipe) 두개의프로세스가서로통신이가능하도록전달자역할수행 고려사항 통신방향 : 단방향 (unidirectional) 또는양방향 (bidirectional) 양방향통신의경우 : 반이중 (half-duplex) 또는전이중 (full-duplex) 통신하는두프로세스간에특별한관계 ( 예 : 부모 - 자식 ) 필요여부 네트워크통신가능여부 일반파이프 (ordinary pipe) 생성한프로세스만접근가능 부모프로세스가파이프를생성하고, 자식프로세스를생성하여파이프를사용하여자식프로세스와통신 지명파이프 (named pipe) 파이프특성을가지며, 보통의파일처럼존재 지명파이프를사용하는프로세스들은부모 - 자식관계가필요하지않음. 50
일반 Pipes (Windows 의 anonymous pipe) 생산자-소비자형태로두프로세스간의통신을허용 Producer는한쪽끝 (write-end) 으로쓰기를함 Consumer는다른쪽끝 (read-end) 에서읽기를함 일반 pipe는단방향통신만가능 통신하는두프로세스는부모-자식관계가필요함 부모가생성한 pipe가자식에게복제되어공유됨 fd[1] fd[0] close fd[1] close fd[0] X X write-end read-end fd[0] : read fd[1] : write UNIX : pipe() 시스템호출 Windows : CreatePipe() 51
지명 (Named) Pipes 일반 pipe보다강력한기능제공 지명 pipe는양방향통신가능 부모-자식관계가필요없음 여러프로세스들이지명 pipe를사용하여통신가능 UNIX에서는 FIFO 특수파일로나타남 half-duplex 양방향전송을함 동시에양방향으로전송하려면두개의 FIFO 파일이필요 mkfifo() 를사용하여 FIFO 파일생성 Windows는 full-duplex 양방향전송가능 CreateNamedPipe() 사용하여생성 52