제 2 부프로세스관리 (Process Management) 프로세스» 실행중인프로그램 (program in execution) CPU time, memory, files, I/O devices 등자원요구» 시스템의작업단위 (the unit of work)» 종류 1. 사용자프로세스 (user process) - user code 실행 2. 시스템프로세스 (system process) - system code 실행 프로세스관리» 사용자프로세스와시스템프로세스의생성과삭제» 프로세스스케줄링» 프로세스들의동기화기법지원» 프로세스들의통신지원» 프로세스들의교착상태 (deadlock) 처리 4.1
제 4 장프로세스 (Processes) 예전 1 program 실행 -> 오늘날 multiple program 의동시실행 프로세스개념 (Process Concept) ~ 프로세스 (The Process)» 프로그램코드 + 현재활동 (Current activity) PC(Program Counter) 레지스터값 스택 (stack) : 서브루틴, 매개변수, 복귀주소, 임시변수등 데이터부분 (data section) : 전역변수 프로세스상태 (Process State)» 생성 (new)» 수행 (running) : CPU 가실행» 대기 (waiting) : I/O 완료나 signal 기다림» 준비 (ready) : Processor 를받을준비가됨» 종료 (terminated) 4.2
프로세스상태 (Process State) 4.3
프로세스개념 (Process Concept) 프로세스제어블럭 (Process Control Block)» 각프로세스는 PCB로표현됨» PCB 프로세스상태 : new, ready, running, waiting, halted 프로그램카운터 : next instruction 의주소 CPU레지스터들 : accumulator, index register, stack pointers, 범용 registers, condition-code CPU스케줄정보 : priority, pointers to scheduling queues 메모리관리정보 : base and limit registers, page tables, segment tables 계정정보 : time used, time limits, account numbers, job#, process# 입출력상태정보 : I/O devices list allocated to the process, list of open files 스레드 (Threads)» a process = a single thread of execution (one task)» 많은현대 OS들이 multiple threads of control (multitasks at a time) 지원 4.4
Process Control Block (PCB) 4.5
프로세스스케줄링 (Process Scheduling) ~ 스케줄링큐 (Scheduling Queues)» 작업큐 (job queue) : memory 할당기다리는큐 (disk 에서 )» 준비큐 (ready queue) : CPU 에할당기다리는큐» 장치큐 (device queue() : 입출력기다리는큐» 큐잉도표 (queueing diagram) : 그림 4.5 스케줄러 (Schedulers)» 장기스케줄러 (long-term scheduler, job scheduler) pool -> memory(degree of multiprogramming) Unix 같은시분할시스템에는없음» 단기스케줄러 (short-term scheduler, CPU scheduler) CPU 할당 : must be very fast» 중기스케줄러 (medium-term scheduler) swapping» degree of multiprogramming 을줄임» memory -> backing store 4.6
준비큐와다양한입출력장치큐 4.7
프로세스스케줄링을표현하는큐잉도표 4.8
큐잉도표에중기스케줄링 (Medium Term Scheduling) 추가 4.9
프로세스스케줄링 (Process Scheduling) 문맥교환 (Context Switch)» CPU가한process에서다른 process로 switch될때 save the state of the old process : CPU와메모리상태 (PCB정보) load the saved state for new process : CPU와메모리상태 (PCB정보)» pure overhead : performance bottleneck -> threads로해결» context-switch time : 1-1000microsecond» address space 보존방법 : memory 관리기법에좌우 4.10
한프로세스에서다른프로세스로의 CPU Switch 4.11
프로세스에대한오퍼레이션 (Operations on Processes) ~ 프로세스생성 (Process Creation)» 프로세스생성시스템호출 : fork, exec.. 부모프로세스 자신프로세스 : 사용자원을부모프로세스의자원 (memory, files) 공유» 새프로세스생성후부모는 계속실행 모든자식이끝날때까지기다림 : wait system call로 4.12
전형적인 UNIX System 의프로세스트리 4.13
프로세스에대한오퍼레이션 (Operations on Processes) ~» 새프로세스의 2모델 ( 자식의주소공간관점에서본 ) 1) 자식은부모의것을복제 : fork 2) 자식은자신의새프로그램을가짐 : fork+exec군» execl : 문자형인수포인터들» execv : 인수배열의포인터 char *av[3]; av[0] = ls ; av[1] = -l ; av[2] = (char *)0; execv( /bin/ls, av);» Unix의예 : fork + exec 프로그램참조 1) fork : 자식 process 생성, 모든 process는 PID(Process identifier) 를가짐 2) fork + exec : 호출하는프로세스의기억장소에새프로그램 load 4.14
Fork() 로새프로세스를생성하는 Cprogram #include <stdio.h> void main(int argc, char *argv[]) { int pid; /* fork another process */ pid = fork(); if(pid < 0) { /* error occurred */ fprintf(stderr, Fork Failed ); exit(-1); else if (pid== 0) { /* child process) */ execl( /bin/ls, ls, -l, NULL); else { /* parent process */ wait(null); printf( Child Complete ); exit(0); 4.15
A tree of processes on a typical Solaris 4.16
프로세스에대한오퍼레이션 (Operations on Processes) 프로세스종료 (Process Termination)» exit 시스템종료 계산결과는부모에게 Return 메모리 ( 물리적 / 가상적 ), 오픈한화일, I/O 버퍼를 OS 에게돌려줌» abort 시스템호출 부모만호출 ( 그렇지않으면서로죽이는일생김 )» 실행종료이유 자식이할당된자원을초과사용할때 자식의 task 가더이상필요없을때 부모가종료될때 DEC VMS 또는 Unix 계단식 (cascading) 종료» 부모종료 -> OS 가모든자식종료» ( 예 ) Unix exit system call 로프로세스종료 wait system call : return 값 = 종료하는자식의 pid wait(&status) /* int status */» status : 자식이 exit 으로종료될때의상태정보 정상종료경우 : 하위 8bits 는 0, 상위 8bits 는 exit status( 자식프로세스가 exit 명령으로전달한값 ), signal 로종료된경우 : 하위 8bits 는 signal 번호, 상위 8bits 는 0» ( 상위 8 비트추출 ) status >> 8; status &= 0xFF; 4.17
프로세스협조 (Cooperating Processes) ~ 프로세스협조하는이유» 정보공유 (information sharing)» 계산속도증가 (computation speedup) : parallel computing으로» 모듈화 (modularity)» 편이성 (convenience) : parallel computing으로 프로세스협조예 : 생산자-소비자 (producer-consumer) 문제» compiler : assembly code 생산» assembler : assembly code 소비, object code 생산» loader : object code 소비 생산자와소비자가동시에수행되려면 => buffer가필요 ( 동시수행을위해 ) => 생산자와소비자의동기화필요 ( 생산되지않은자료소비하지않게 ) 생산자-소비자문제종류» 1. 무한버퍼 (unbounded-buffer) 생산자-소비자문제 생산자는항상생산, 소비자는소비할자료를기다릴수도» 2. 유한버퍼 (bounded-buffer) 생산자-소비자문제 버퍼가꽉차있으면생산자가대기, 버퍼가비어있으면소비자가대기 4.18
프로세스협조 (Cooperating Processes) 유한버퍼생산자-소비자문제 (bounded-buffer producer-consumer problem) -> 스레드 (LWP) 로하면효과적» Version 1: 공유메모리를이용한해결책» Version 2: 메시지전달을이용한해결책 (4.5절)» Version 3: 세마포어를이용한해결책 (7.5절)» Version 4: 세마포어와스레드를이용한해결책 (7.6절)» Version 5: Java synchronization을이용한해결책 (7.8절) 4.19
Shared Memory count=3 in=0 out=0 count=0 in=0 out=0 count=2 in=2 out=0 2 0 count=0 in=0 out=0 count=1 in=0 out=2 1 count=1 in=1 out=0 count=2 in=0 out=1 4.20
Shared Memory count=3 in=0 out=0 count=0 in=0 out=0 count=2 in=2 out=0 count=0 in=0 out=0 count=1 in=0 out=2 count=2 in=0 out=1 count=1 in=1 out=0 4.21
공유메모리를이용하는생산자 - 소비자문제 Import java.util.*; public class BoundedBuffer { public BoundedBuffer() { // buffer is initially empty count = 0; in = 0; out = 0; buffer = new Object[BUFFER_SIZE]; // producer calls this method public void enter(object item) { //Figure 4.10 The enter method // consumer calls this method public Object remove() { //Figure 4.11 The remove() method public static final int NAP_TIME = 5; private static final int BUFFER_SIZE = 5; private volatile int count; private int in; // points to the next free position private int out; //points to the next full posiiton private Object[] buffer; 4.22
공유메모리시스템의생산자 enter() 메소드 public void enter(object item) { while (count == BUFFER_SIZE) ; // do nothing // add an item to the buffer ++count; buffer[in] = item; in = (in + 1) % BUFFER_SIZE; if (count == BUFFER_SIZE) System.out.printIt( Producer Entered + item + Buffer Full ); else count); System.out.printIt( Producer Entered + item + Buffer size = + 4.23
공유메모리시스템의소비자 remove() 메소드 public Oject remove() { Object item; while (count == 0) ; // do nothing // remove an item to the buffer --count; item = buffer[out]; out = (out + 1) % BUFFER_SIZE; if (count == 0) System.out.printIt( Consumer Consumed + item + BufferEmpty ); else count); System.out.printIt( Consumer Consumer + item + Buffer size = + 4.24
공유메모리시스템의 Consumer.java import java.util.*; public class Consumer extends Thread { public Consumer(BoundedBuffer b) { buffer = b; public void run() { Date message; while (true) { int sleeptime = (int) (BoundedBuffer.NAP_TIME * Math.random() ); System.out.println("Consumer sleeping for " + sleeptime + " seconds"); try { sleep(sleeptime*1000); catch(interruptedexception e) { // consume an item from the buffer System.out.println("Consumer wants to consume."); message = (Date)buffer.remove(); private BoundedBuffer buffer; 4.25
공유메모리시스템의 Producer.java import java.util.*; public class Producer extends Thread { public Producer(BoundedBuffer b) { buffer = b; public void run() { Date message; while (true) { int sleeptime = (int) (BoundedBuffer.NAP_TIME * Math.random() ); System.out.println("Producer sleeping for " + sleeptime + " seconds"); try { sleep(sleeptime*1000); catch(interruptedexception e) { // produce an item & enter it into the buffer message = new Date(); System.out.println("Producer produced " + message); buffer.enter(message); private BoundedBuffer buffer; 4.26
공유메모리시스템의 Server.java public class Server { public static void main(string args[]) { BoundedBuffer server = new BoundedBuffer(); // now create the producer and consumer threads Producer producerthread = new Producer(server); Consumer consumerthread = new Consumer(server); producerthread.start(); consumerthread.start(); 4.27
프로세스간통신 (Interprocess Communication) ~ 통신방식 <- 한시스템에서둘다사용해도됨» 공유메모리방식 (shared-memory) 응용프로그램작성자가응용레벨에서통신기능제공 ( 예 ) 유한버퍼생산자 - 소비자문제 version 1» 메시지전달방식 (message-passing) IPC(interprocess-communication) 기능이용 : OS 가통신기능제공 ( 예 ) 유한버퍼생산자 - 소비자문제 version 2 IPC 기본구조 (Basic Structure)» IPC 기능의 2 연산 send (message) receive(message)» 프로세스 P 와 Q 가통신함 -> 통신선이전재 링크» 공유메모리» bus» network send/receive 연산 메시지시스템을구현하는기법들» 직접 (direct) 또는간접통신» 대칭 (symmetric) 또는비대칭 (symmetric) 통신» 자동 (automatic) 또는명시적 (explicit) 버퍼링» 복사 (copy) 에의한전송또는참고 (reference) 에의한전송» 고정길이 (fixed-sized) 또는가변길이 (variable-sized) 메시지 4.28
프로세스간통신 (Interprocess Communication) ~ 명칭부착 (Naming) 1) 직접통신 (Direct Communication) 대칭적통신 : 두프로세스 (sender/receiver) 가상대의이름을호출» Send(P, message) : 프로세스 P 에게메시지보냄» Receive(Q, message) : 프로세스 Q 로부터메시지받음 비대칭적통신 : sender 만 receiver 호출» Send(P, message) : 프로세스 P 에게메시지보냄» Receive(id, message) : 임의의프로세스로부터메시지받음 id = 통신이일어난순간메시지를보낸프로세스의이름으로설정됨 직접통신의단점» 프로세스이름바뀌면전부고쳐야 (limited modularity) 2) 간접통신 (Indirect Communication) mailbox(ports) 통해통신» send(a, message) : mailbox A 에메시지보냄» receive(a, message) : mailbox 로부터메시지받음 mailbox 의구현» 프로세스가 mailbox 소유» OS 가 mailbox 소유 4.29
프로세스간통신 (Interprocess Communication) ~ 동기화 (Synchronization)» Blocking send: 수신프로세스가메시지를받을때까지멈춤» Nonblocking send: 메시지보내고다른연산계속» Blocking receive: 메시지가있을때까지멈춤» Nonblocking receive: 올바른메시지이거나널메시지이거나상관하지않고받음 버퍼링 (Buffering)» 링크의메시지보유용량 Zero capacity : rendez-vous(no buffering) 동기적통신 Bounded capacity : 유한길이큐이용 자동버퍼링 Unbounded capacity : 무한길이큐이용 자동버퍼링 4.30
프로세스간통신 (Interprocess Communication) ~ 자동버퍼링경우» 보통비동기적통신 (asynchronous communication) 이일어남 보낸메시지도착여부모름 꼭알아야할경우 : 명시적통신 P : send(q, message); receive(q, message); Q : receive(p, message); send(p, acknowledgment ); 특별한경우» 비동기적통신 : 메시지보낸프로세스는절대로지연되지않음 보낸메시지미처받기전에새메시지보내면이전메시지유실될수있음 메시지유실방지위해복잡한명시적동기화필요» 동기적통신 : 메시지보낸프로세스는받았다는회신받을때까지기다림 Thoth OS : reply(p, message) 가메시지보낸프로세스와받는프로세스의수행재개 Sun RPC(Remote Procedure Call) 동기적통신 (synchronous communication)» sender : subroutine call -> reply 올때까지블록됨» receiver : 계산결과를 reply (http://marvel.incheon.ac.kr 의 Information 참조 ) 4.31
프로세스간통신 (Interprocess Communication) ~ 예외조건 (Exception Conditions)» centralized 또는 distributed system에서고장발생시오류의회복 ( 예외조건 ) 필요» 프로세스종료 (Process Terminates) P는종료된Q를기다림 -> P는블록됨» P 종료» Q 종료사실을 P에알림 P가종료된Q에메시지보냄 -> Q의 reply 기다려야할경우블록됨» 메시지유실 (Lost Messages) OS 가탐지및처리책임 sender 가탐지및처리책임 OS 가탐지, sender 가처리 훼손된메시지 (Scrambled Messages) 통신채널의잡음 (noise) 때문 -> 보통 OS 가재전송 오류검사코드 (check sums, parity, CRC) 으로조사 4.32
Mailbox 를이용하는생산자 - 소비자문제 Import java.util.*; public class MessageQueue { public MessageQueue() { queue = new Vector(); // This implements a nonblocking send public void send(object item) { queue.addelement(item); // This implements a nonblocking receive public Object receive() { Object item; if (queue.size() == 0) return null; else { item = queue.firstelement(); queue.removeelementat(0); return item; private Vector queue; 4.33
메시지시스템의생산자프로세스와소비자프로세스 생산자프로세스 MessageQueue mailbox; while (true) { Date message = new Date(); mailbox.send(message); 소비자프로세스 MessageQueue mailbox; while (true) { Date message =(Date) mailbox.receive(); if (message!=null) // consume the message 4.34
메시지시스템의 Producer.java import java.util.*; class Producer extends Thread { public Producer(MessageQueue m) { mbox = m; public void run() { Date message; while (true) { int sleeptime = (int) (Server.NAP_TIME * Math.random() ); System.out.println("Producer sleeping for " + sleeptime + " seconds"); try { sleep(sleeptime*1000); catch(interruptedexception e) { message = new Date(); System.out.println("Producer produced " + message); // produce an item & enter it into the buffer mbox.send(message); private MessageQueue mbox; 4.35
메시지시스템의 Consumer.java import java.util.*; class Consumer extends Thread { public Consumer(MessageQueue m) { mbox = m; public void run() { Date message; while (true) { int sleeptime = (int) (Server.NAP_TIME * Math.random() ); System.out.println("Consumer sleeping for " + sleeptime + " seconds"); try { sleep(sleeptime*1000); catch(interruptedexception e) { // consume an item from the buffer System.out.println("Consumer wants to consume."); message = (Date)mbox.receive(); if (message!= null) System.out.println("Consumer consumed " + message); private MessageQueue mbox; 4.36
메시지시스템의 Server.java import java.util.*; public class Server { public Server() { // first create the message buffer MessageQueue mailbox = new MessageQueue(); // now create the producer and consumer threads Producer producerthread = new Producer(mailBox); Consumer consumerthread = new Consumer(mailBox); producerthread.start(); consumerthread.start(); public static void main(string args[]) { Server server = new Server(); public static final int NAP_TIME = 5; 4.37
프로세스간통신 (Interprocess Communication) ~ 실례 : Mach» 분산시스템을위한 OS» 시스템호출, task 간정보전달을메시지로» port(= mailbox)» task 생성 => (kernel mailbox, notify mailbox) 생성» system calls msg_send msg_receive msg_rpc (remote procedure call) port_allocate : 새 mailbox 생성, buffer size = 8, FIFO order port_status : 주어진 mailbox의메시지수반환» 메시지형태 고정길이 header» 메시지길이» 두 mailbox 이름 ( 그중하나는sender의 mailbox; reply 위한 return address 포함 ) 가변길이 data portion: 정형화된 (typed) 데이터항목들의리스트 4.38
프로세스간통신 (Interprocess Communication) ~» send 연산 수신 mailbox 가 full 이아니면메시지복사 수신 mailbox가 full이면 4 가지중선택 1 mailbox에빈공간이생길때까지대기 2 최대 n 밀리초대기 3 기다리지않고즉시복귀 4 메시지를임시로 cache : 메시지하나만 OS가보관 ( 메시지가실제로목표 mailbox에들어갔을때 reply ; only one pending message) line printer driver 등서버태스크경우» receive 연산 어떤 mailbox 또는 mailbox set 로부터메시지를읽을지를명시 지정된 mailbox 로부터또는 mailbox set 중한 mailbox 로부터메시지수신 읽을메시지없으면최대 n 밀리초대기하거나대기하지않음» 메시지시스템의단점 double copy(sender -> mailbox, mailbox -> receiver) Mach는 virtural memory 기법으로두번복사않음 ( 송신스레드와수신스레드를같은주소공간으로 mapping 시킴 ) 4.39
프로세스간통신 (Interprocess Communication) ~ 실례 : Windows XP» XP subsystem server와메시지전달방식으로통신 : 지역프로시주어호출기능 (LPC; Local Procedure Call facility) LPC: RPC(Remote Procedure Call) 기법과유사» 연결포트 (connection port) 와통신포트 (communication port) 사용» 통신작업 클라이언트가연결포트객체에대한 handle 을 open 클라이언트가연결요청 서버는두개의사적인 (private) 통신포트를생성하고클라이언트에게두포트중하나의 handle을돌려줌 클라이언트와서버는해당통신포트의 handle을이용하여메시지를보내거나, 응답호출 (callback) 을하거나, 응답 (reply) 을기다림 4.40
프로세스간통신 (Interprocess Communication)» 세가지메시지전달기법 포트의메시지큐 (~256 bytes) 를중간저장소로이용, 즉시응답하기어려울때알려주는 callback 기법사용가능 전송할메시지가크면공유메모리인섹션객체 (section object) 를이용, 섹션객체의포인터와크기정보전송하여데이터복사피함, 즉시응답하기어려울때알려주는 callback 기법사용가능 quick LPC : 클라이언트가연결요청후 quick LPC 지시, 서버는클라이언트전용서버스레드 (dedicated server thread) 생성» 서버스레드가연결요청, 메시지담을 64KB 섹션객체, 한쌍의사건객체 (event pare object) 셋업» 메시지전송시작되며한쌍의사건객체가동기화수행» 장점 : 메시지복사 overhead 제거, 포트객체사용 overhead 제거, 호출한클라이언트파악위한 overhead 제거» 단점 : 다른두방법보다많은자원사용» 메시지전달 overhead 감소위해여러메시지들을한메시지로 batch 하기도함 4.41
Socket Communication 4.42
Remote Procedure Calls Remote procedure call (RPC) abstracts procedure calls between processes on networked systems. Stubs client-side proxy for the actual procedure on the server. The client-side stub locates the server and marshalls the parameters. The server-side stub receives this message, unpacks the marshalled parameters, and peforms the procedure on the server. 4.43
Execution of RPC 4.44
Remote Method Invocation Remote Method Invocation (RMI) is a Java mechanism similar to RPCs. RMI allows a Java program on one machine to invoke a method on a remote object. 4.45
Marshalling Parameters 4.46