제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) 처리 3.1
제3 장프로세스 (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) 3.2
Process in Memory 3.3
Linux 가상메모리구조 3.4
Linux 메모리관리자료구조 task_struct 구조체내의 struct mm_struct *mm» include/linux/sched.h 1169행» 메모리디스크립터 3.5
프로세스상태 (Process State) 3.6
프로세스개념 (Process Concept) p) 프로세스제어블럭 (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) 지원 3.7
Process Control Block (PCB) 3.8
Linux task_ struct 구조체 구조체를통한정보관리» 프로세스가생성되면 task_struct 구조체를통해프로세스의모든정보를저장하고관리 모든태스크들에게하나씩할당 include/linux/sched.h : line 1115 태스크 ID, 상태정보, 가족관계, 명령, 데이터, 시그널, 우선순위, CPU 사용량및파일디스크립터등생성된태스크의모든정보를가짐 alloc_task_struct struct 매크로를통해커널영역의메모리에서 8KB를할당받아프로세스디스크립터와커널스택의자료를저장» current : 현재실행되고있는태스크를가리키는변수 include/arch/x86/include/asm/cu l d / / rrent.h : line 37 커널스택과프로세스디스크립터 3.9
Linux task_ struct 구조체 태스크관계와관련된변수들 struct task_struct *p_opptr, *p_pptr, *p_cptr, *p_ysptr, *p_osptr;» p_opptr과 p_pptr : 부모태스크 p_oppr : Original Parent» p_cptr : 자식, p_ysptr : 아우, p_osptr : 형 struct task_struct *next_task, *prev_task;» 커널에존재하는모든태스크들은원형이중연결리스트로연결 SET_LINKS : 리스트에추가하는매크로 REMOVE_LINK : 리스트서삭제하는매크로 task_struct 구조체 3.10
프로세스스케줄링 (Process Scheduling) 스케줄링큐 (Scheduling Queues)» 작업큐 (job queue) : memory 할당기다리는큐 (disk 에서 )» 준비큐 (ready queue) : CPU에할당기다리는큐» 장치큐 (device queue() : 입출력기다리는큐» 큐잉도표 (queueing diagram) : 그림 3.7 스케줄러 (Schedulers)» 장기스케줄러 (long-term scheduler, job scheduler) pool -> memory(degree of multiprogramming) Unix 같은시분할시스템에는없음» 단기스케줄러 (short-term term scheduler, CPU scheduler) CPU 할당 : must be very fast» 중기스케줄러 (medium-term scheduler) swapping» degree of multiprogramming을줄임» memory -> backing store 3.11
준비큐와다양한입출력장치큐 3.12
프로세스스케줄링을표현하는큐잉도표 3.13
큐잉도표에중기스케줄링 (Medium Term Scheduling) 추가 3.14
프로세스스케줄링 (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 관리기법에좌우 3.15
한프로세스에서다른프로세스로의 CPU Switch 3.16
프로세스에대한오퍼레이션 (Operations on Processes) 프로세스생성 (Process Creation)» 프로세스생성시스템호출 : fork, exec, CreateProcess, etc. 부모프로세스 자신프로세스 : 사용자원을부모프로세스의자원 (memory, files) 공유» 새프로세스생성후부모는 계속실행 모든자식이끝날때까지기다림 : wait system call 로 3.17
전형적인 UNIX System 의프로세스트리 3.18
A tree of processes on a typical Solaris 3.19
프로세스에대한오퍼레이션 (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 3.20
fork 시스템호출 printf( One\n ); pid = fork(); PC A printf(two\n ); fork BEFORE AFTER printf( One\n ); pid=fork(); printf( Two\n ); PC printf( One\n ); pid = fork(); printf( Two\n ); PC A B 3.21
fork 와 exec호출의조합 pid = fork(); PC A BEFORE FORK AFTER FORK wait((int*)0); PC execl( /bin/ls ); PC A B /* first line of ls */ PC AFTER FORK AFTER EXEC wait((int*)0); PC A 3.22 B (now runs ls)
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); /* fork another process */ execv char *av[3]; av[0]= ls ; av[1]= -l ; av[2]=(char a[] (ca *)0; execv( /bin/ls, av); execlp, execvp 쉘환경변수 PATH 를따름 execlp( ls, ls, -l, (char *)0); execvp( ls, av); 3.23
fork() example #include <stdio.h> int value = 5; main () { int pid; pid = fork (); /* Duplicate. Child and parent continue from here */ if (pid!= 0) /* pid is non-zero, so I must be the parent */ { wait(null); printf ("Parent: value = %d\n", value); else /* pid is zero, so I must be the child */ { value += 15; printf ("Child: value = %d\n", value); printf ("PID %d terminates.\n",,getpid ());/); /* Both processes execute this */ 3.24
fork() + exec() example 후면처리 (background processing)» 실행 $ gcc background.c o background $./background ls -l» 코드 $ cat background.c #include <stdio.h> main (argc, argv) int argc; char* argv []; { if (fork () == 0) /* Child */ { execvp (argv[1], &argv[1]); /* Execute other program */ fprintf (stderr, "Could not execute %s\n", argv[1]); 3.25
프로세스에대한오퍼레이션 (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; 3.26
프로세스협조 (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) buffer) 생산자- 소비자문제 버퍼가꽉차있으면생산자가대기, 버퍼가비어있으면소비자가대기 3.27
프로세스협조 (Cooperating Processes) 유한버퍼생산자-소비자문제 (bounded-buffer producer-consumer problem) -> 스레드 (LWP) 로하면효과적» Version 1: 공유메모리를이용한해결책 (3.4.1절)» Version 2: 메시지전달을이용한해결책 (3.4.2절)» Version 3: 세마포어를이용한해결책 (6.6.1 절 )» Version 4: 세마포어와스레드를이용한해결책 (6장프로젝트 p266)» Version 5: Java synchronization을이용한해결책 3.28
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 3.29
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 3.30
공유메모리를이용하는생산자 -소비자문제 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) { // The enter method // consumer calls this method public Object remove() { // The remove() method public static final int NAP_TIME = 5; private static final int BUFFER_SIZE = 3; private volatile int count; private int in; // points to the next free position private int out; //points to the next full position private Object[] buffer; 3.31
공유메모리시스템의생산자 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) else System.out.printIt( Producer Entered + item + Buffer Full ); System.out.printIt( Producer Entered + item + Buffer size = + count); 3.32
공유메모리시스템의소비자 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) else System.out.printIt( Consumer Consumed + item + BufferEmpty ); System.out.printIt( Consumer Consumer + item + Buffer size = + count); 3.33
공유메모리시스템의 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( println("consumer sleeping for " + sleeptime + " seconds"); try { sleep(sleeptime*1000); catch(interruptedexception e) { // consume an item from the buffer System.out.println( println("consumer wants to consume. "); message = (Date)buffer.remove(); private BoundedBuffer buffer; 3.34
공유메모리시스템의 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( println("producer produced " + message); buffer.enter(message); private BoundedBuffer buffer; 3.35
공유메모리시스템의 Server.java public class Server { public static void main(string args[]) { BoundedBuffer d server = new BoundedBuffer(); d // now create the producer and consumer threads Producer producerthread = new Producer(server); Consumer consumerthread = new Consumer(server); producerthread.start(); consumerthread.start(); 3.36
프로세스간통신 (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) 메시지 3.37
프로세스간통신 (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 소유 3.38
프로세스간통신 (Interprocess Communication) 동기화 (Synchronization)» Blocking send: 수신프로세스가메시지를받을때까지멈춤» Nonblocking send: 메시지보내고다른연산계속» Blocking receive: 메시지가있을때까지멈춤» Nonblocking receive: 올바른메시지이거나널메시지이거나상관하지않고받음 버퍼링 (Buffering)» 링크의메시지보유용량 Zero capacity : rendez-vous(no buffering) 동기적통신 Bounded capacity : 유한길이큐이용 자동버퍼링 Unbounded d capacity : 무한길이큐이용 자동버퍼링 3.39
프로세스간통신 (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 참조 ) 3.40
프로세스간통신 (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) 으로조사 3.41
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; 3.42
메시지시스템의생산자프로세스와소비자프로세스 생산자프로세스 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 3.43
메시지시스템의 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; 3.44
메시지시스템의 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; 3.45
메시지시스템의 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; 3.46
IPC 실례 : POSIX Shared Memory 프로세스는일차적으로 shmget (SHared Memory GET) 을이용하여공유메모리세스먼트생성 segment id = shmget(ipc PRIVATE, size, S_IRUSR S_IWUSR); 프로세스는공유메모리에접근하기위해 shmat (SHared Memory ATtach) 를이용하여자신의주소공간 (address space) 에부착 shared memory = (char *) shmat(segment_id, NULL, 0); 프로세스는반환된포인터가가리키는공유메모리에 read & write sprintf(shared memory, "Writing to shared memory"); 작업이끝나면프로세스는 shmdt (SHared Memory DeTach) 를이용하여자신의주소공간에서공유메모리를분리 shmdt(shared memory); 마지막으로프로세스는 shmctl(shared Memory ConTroL operation) 에 IPC_RMID 플래그를지정하여공유메모리세그먼트를시스템에서제거 shmctl(segment_id, IPC_RMID, NULL); 3.47
IPC 실례 : 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) 데이터항목들의리스트 3.48
프로세스간통신 (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 시킴 ) 3.49
IPC 실례 : 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) 을기다림 세가지메시지전달기법» 포트의메시지큐 (~256 bytes) 를중간저장소로이용, 즉시응답하기어려울때알려주는 callback 기법사용가능» 전송할메시지가크면공유메모리인섹션객체 (section object) 를이용, 섹션객체의포인터와크기정보전송하여데이터복사피함, 즉시응답하기어려울때알려주는 callback 기법사용가능» quick LPC : 클라이언트가연결요청후 quick LPC 지시, 서버는클라이언트전용서버스레드 (dedicated server thread) 생성 연결요청, 메시지담을 64KB 섹션객체, 동기화를수행하는한쌍의사건객체 (event pare object) 처리 장점 : 메시지복사, 포트객체사용, 호출한클라이언트파악위한 overhead 제거 단점 : 다른두방법보다많은자원사용 메시지전달 overhead 감소위해여러메시지들을한메시지로 batch 하기도함 3.50
IPC 실례 : Windows XP 3.51
소켓통신 (Socket Communication) 3.52
Time-of-Day: Server.java import java.net.*; import java.io.*; public class DateServer { public static void main(string[] args) { try { ServerSocket sock = new ServerSocket(6013); // now listen for connections while (true) { catch (IOException ioe) { Socket client = sock.accept(); // we have a connection PrintWriter pout = new PrintWriter(client.getOutputStream(), true); // write the Date to the socket pout.println(new java.util.date().tostring()); // close the socket and resume listening for more connections client.close(); System.err.println(ioe); 3.53 1.53
Time-of-Day: Client.java import java.net.*; import java.io.*; public class DateClient t { public static void main(string[] args) { try { // this could be changed to an IP name or address other than the localhost Socket sock = new Socket("127.0.0.1",6013); InputStream in = sock.getinputstream(); BufferedReader bin = new BufferedReader(new InputStreamReader(in)); String line; while( (line = bin.readline())!= null) sock.close(); catch (IOException ioe) { System.out.println(line); System.err.println(ioe); 3.54 1.54
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-sideside stub receives this message, unpacks the marshalled parameters, and peforms the procedure on the server. 3.55
Execution of RPC 3.56
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. 3.57
Marshalling Parameters 3.58
( 참고 ) 파이프 프로세스간상호통신메카니즘 단방향통신을제공 일반적으로, 유틸리티표준출력을다른유틸리티의표준입력과연결하기위해셸내에서사용 파이프종류» 명명되지않은파이프 (unnamed pipe)» 명명된파이프 (named pipe) 시스템프로그래밍 3.59 인천대학교컴퓨터공학과 59 성미영
( 참고 ) 파이프» 명명되지않은파이프 : pipe( ) 4K(BSD) 혹은 40K( 시스템 V) 정도의크기 단방향통신링크 (unidirectional communication link) read(), write(), close() 를사용하여파이프의읽기, 쓰기, 종료가수행 양방향통신을위해서는 2 개의파이프를사용 동작 System call: int pipe pp ( int fd [ ] )» 명명되지않은파이프생성후, 2개의파일기술자반환 fd [0] - 파이프의 읽기 끝과연관된기술자저장 fd [1] - 파이프의 쓰기 끝과연관된기술자저장» 커널이새로운파이프에충분한공간을할당할수없으면 -1 반환하고, 그렇지않으면 0 반환» 소스프로그램 : P514 시스템프로그래밍 3.60 인천대학교컴퓨터공학과 60 성미영
( 참고 ) 파이프» 파이프를생성한프로세스와그의자손프로세스만이그파이프를사용 파이프를호출 프로세스 A 파이프를이용할수없음 프로세스 B 프로세스 C 프로세스 D 프로세스 E 파이프를공용 시스템프로그래밍 3.61 인천대학교컴퓨터공학과 61 성미영
( 참고 ) 파이프» 명명된파이프 or FIFO(First In First Out) 대략 40K 의큰버퍼용량을가짐 명명되지않은파이프보다는덜제한적 네트워크를통과해동작하지않음 이점» 파일시스템에존재하는 UNIX 파일이름을가짐» 관련없는프로세스들에의해서사용될수있음 ( 소유자, 크기, 접근허가등이지정 )» 명시적으로삭제될때까지존재 소스프로그램 : P585» 명명된파이프생성 유닉스유틸리티 mknod를사용 시스템호출 mknod( ) 를사용 (1) mknod 사용하여파이프생성 $ mknod mypipe p. 파이프생성 mypipe : FIFO의이름 p : mknod 가 FIFO 를생성하도록지정 $ chmod ug+rw mypipe. 허가권갱신 시스템프로그래밍 3.62 인천대학교컴퓨터공학과 62 성미영
( 참고 ) 파이프 (2) mknod() 사용하여파이프생성» 프로그램상에서 FIFO 생성시사용» 생성한 FIFO는 UNIX의 rm 명령이나 unlink() 시스템호출로제거» 처리가정상종료 : 0 반환» 비정상종료시 : -1 반환 int mknod(const char *path, mode_t mode, dev_t dev); path 로지정된경로명으로새로운파일을생성 새로운파일의화일형및허가는 mode 에지정 mode 가블록형특수장치또는문자형특수파일을표시하면 dev에는그시스템구성에의존 시스템프로그래밍 3.63 인천대학교컴퓨터공학과 63 성미영