Linux/UNIX Programming APUE (Interprocess Communication)

Slides:



Advertisements
Similar presentations
Term Project Hints Topics Keep-alive CGI Multi-thread Multi-process Event-based.
Advertisements

Signal Handling ( 금 ) 한 민 규
C++ Tutorial 1 서강대학교 데이터베이스 연구실.
Project #2-2. Pintos User Program
Chapter 7 ARP and RARP.
Linux/UNIX Programming
Linux/UNIX Programming APUE (The Environment of a UNIX Process)
Understanding of Socket and File I/O
Internet Computing KUT Youn-Hee Han
Linux/UNIX Programming APUE (Process Control)
제 6장 프로세스 간 동기화 및 통신 6.1 개요 6.2 병행 처리의 문제점
기본 컴퓨터 프로그래밍 Lecture #6.
Task 통신 및 동기화 : Message Queue, Semaphore Shared Memory
Internet Control Message Protocol (ICMP)
Internet Computing KUT Youn-Hee Han
공유 메모리[1] 공유 메모리 공유 메모리 생성: shmget(2) 같은 메모리 공간을 두 개 이상의 프로세스가 공유하는 것
Internet Computing KUT Youn-Hee Han
Department of Computer Engineering
제 6 장 프로세스 동기화 (Process Synchronization)
Chapter 2 OSI 모델과 TCP/IP 프로토콜.
Linux System Programming
6장 비연결형 지향 프로토콜 Database Lab 강 우 석.
Department of Computer Engineering
[INA240] Data Structures and Practice
시스템 V IPC 기초[1] 시스템 V IPC 공통 요소 키 생성
10 시스템V의 프로세스간 통신.
Linux System Programming
10 시스템V의 프로세스간 통신.
양방향 파이프의 활용 양방향 통신 파이프는 기본적으로 단방향이므로 양방향 통신을 위해서는 파이프를 2개 생성한다.
fork로 생성한 자식 프로세스에서 exec 함수군을 호출
Internet Computing KUT Youn-Hee Han
파일 및 디렉토리(1) 여러 함수들 chdir(“category”) || die “cannot cd to temp”;
Computer Architecture
Linux/UNIX Programming APUE (Files & Directories)
Lecture #3 프로세스(Process).
운영체제 (Operating Systems)
메시지 큐[5] – test1.c 메시지 제어: msgctl(2) #include <sys/msg.h>
Department of Computer Engineering
Linux/UNIX Programming APUE (The Environment of a Linux/Unix Process)
Chapter 4 The Von Neumann Model.
adopted from KNK C Programming : A Modern Approach
스케줄링 (Scheduling) 시스템 내부시간(time in the system): 스케줄링 문제
Signal & Inter-Process Communication
제4장 유닉스 쉘 숙명여대 창병모 2011 가을.
Memory & Data Management.
Linux/UNIX Programming
리눅스 커널의 이해 중에서 18장. 프로세스 통신 김상국 네트워크 실험실.
제 6 장 프로세스 동기화 (Process Synchronization)
Analog to Digital Converter
Introduction to Programming Language
네트워크 프로그래밍의 이해 School of Electronics and Information.
Transmission Control Protocol (TCP)
User Datagram Protocol (UDP)
Operating System 10주차 - IPC(InterProcess Communication) -
Linux/UNIX Programming APUE (Thread Programming)
스케줄링 (Scheduling) 시스템 내부시간(time in the system): 스케줄링 문제
Linux/UNIX Programming
Operating System Multiple Access Chatting Program using Multithread
Department of Computer Engineering
Signature, Strong Typing
Signature, Strong Typing
이산수학(Discrete Mathematics)
Signature, Strong Typing
스케줄링 (Scheduling) 시스템 내부시간(time in the system): 스케줄링 문제
창 병 모 숙명여대 전산학과 자바 언어를 위한 CFA 창 병 모 숙명여대 전산학과
제4장 유닉스 쉘 숙명여대 창병모
For regex_compile function in grep.c
3장 파일 다루기 한빛미디어(주).
Chapter 4. Energy and Potential
Chapter 7: Deadlocks.
Presentation transcript:

Linux/UNIX Programming APUE (Interprocess Communication) 문양세 강원대학교 IT대학 컴퓨터과학전공

Contents Pipes FIFOs System V IPC Message Queues Shared Memory APUE (Interprocess Communication Pipes FIFOs System V IPC Message Queues Shared Memory Semaphores

IPC using Pipes IPC using regular files IPC using pipes APUE (Interprocess Communication IPC using regular files unrelated processes can share fixed size lack of synchronization IPC using pipes for transmitting data between related processes can transmit an unlimited amount of data automatic synchronization on open()

Pipes in a Linux/Unix Shell (1/2) APUE (Interprocess Communication In a Linux/Unix shell, the pipe symbol is: | (the vertical bar) In a shell, UNIX pipes look like: $ ls -alR | more where the standard output of the program at the left (i.e., the producer) becomes the standard input of the program at the right (i.e., the consumer).

Pipes in a Linux/Unix Shell (2/2) APUE (Interprocess Communication We can have longer pipes: $ wc *.h | sort | grep std

Example (1/2) APUE (Interprocess Communication $ who | sort

Example (2/2) APUE (Interprocess Communication

IPC using Pipes Data transmitting Types of pipes APUE (Interprocess Communication Data transmitting data is written into pipes using the write() system call data is read from a pipe using the read() system call automatic blocking when full or empty Types of pipes (unnamed) pipes named pipes (FIFOs)

Pipes (1/4) Pipes are the oldest form of IPC. Limitations of Pipes: APUE (Interprocess Communication Pipes are the oldest form of IPC. Limitations of Pipes: Half duplex (data flows in one direction) Can only be used between processes that have a common ancestor (Usually used between the parent and child processes) Processes cannot pass pipes and must inherit them from their parent If a process creates a pipe, all its children will inherit it

Pipes (2/4) Two file descriptors are returned through the fd argument APUE (Interprocess Communication #include <unistd.h> int pipe(int fd[2]) Returns: 0 if OK, -1 on error Two file descriptors are returned through the fd argument fd[0]: can be used to read from the pipe, and fd[1]: can be used to write to the pipe Anything that is written on fd[1] may be read by fd[0]. This is of no use in a single process. However, between processes, it gives a method of communication The pipe() system call gives parent-child processes a way to communicate with each other.

Pipes (3/4) parent child parent child pipe kernel pipe kernel APUE (Interprocess Communication parent  child: parent closes fd[0] child closes fd[1] parent  child: parent closes fd[1] child closes fd[0] parent fd[0] child parent fd[1] child fd[1] fd[0] pipe kernel pipe kernel

Pipes (4/4) Read from a pipe with write end closed: (fd[1]이 close된 경우) APUE (Interprocess Communication Read from a pipe with write end closed: (fd[1]이 close된 경우) returns 0 to indicate EOF Write to a pipe with read end closed: (fd[0]가 close된 경우) SIGPIPE generated, write() returns error (errno == EPIPE)

예제: pipe.c (1/2) APUE (Interprocess Communication

예제: pipe.c (2/2) APUE (Interprocess Communication 실행 결과

Contents Pipes FIFOs System V IPC Message Queues Shared Memory APUE (Interprocess Communication Pipes FIFOs System V IPC Message Queues Shared Memory Semaphores

FIFOs (1/2) APUE (Interprocess Communication Pipes can be used only between related processes. (e.g., parent and child processes) FIFOs are "named pipes" that can be used between unrelated processes. A type of file stat.st_mode == FIFO Test with S_ISFIFO() macro

FIFOs (2/2) Creating FIFOs is similar to creating a file. APUE (Interprocess Communication #include <sys/types.h> #include <sys/stat.h> int mkfifo(const char *pathname, mode_t mode); Returns: 0 if OK, -1 on error Creating FIFOs is similar to creating a file. pathname: filename mode: permissons, same as for open() function Using a FIFO is similar to using a file. we can open, close, read, write, unlink, etc., to the FIFO.

Uses of FIFOs APUE (Interprocess Communication Used by shell commands to pass data from one shell pipeline to another, without creating intermediate files. Used in client-server application to pass data between clients and server.

Using FIFOs to Duplicate Output Streams APUE (Interprocess Communication tee(1) copies its standard input to both its standard output and to the file named on its command line. $ mkfifo fifo1 $ prog3 < fifo1 & $ prog1 < infile | tee fifo1 | prog2 fifo1 prog3 infile prog1 tee prog2

An Example using a FIFO APUE (Interprocess Communication

Client-Server Communication Using a FIFO APUE (Interprocess Communication Server creates a “well-known” FIFO to communicate with clients. client well-known FIFO read request server write request . Problem: Server can't reply clients using a single “well-known” FIFO

Contents Pipes FIFOs System V IPC Message Queues Shared Memory APUE (Interprocess Communication Pipes FIFOs System V IPC Message Queues Shared Memory Semaphores

System V IPC Message Queues Shared Memory Semaphores APUE (Interprocess Communication Message Queues Send and receive amount of data called “messages”. The sender classifies each message with a type. Shared Memory Shared memory allows two or more processes to share a given region of memory. Readers and writers may use semaphore for synchronization. Semaphores Process synchronization and resource management For example, a semaphore might be used to control access to a device like printer.

Identifiers & Keys APUE (Interprocess Communication Identifier: each IPC structure has a nonnegative integer Key: when creating an IPC structure, a key must be specified (key_t) id = xxxget(key, …) How to access the same IPC?  key in a common header Define a key in a common header Client and server agree to use that key Server creates a new IPC structure using that key Problem when the key is already in use (msgget, semget, shmget returns error) Solution: delete existing key, create a new one again!

IPC System Calls msg/sem/shm get msg/sem/shm ctl msg/sem/shm op APUE (Interprocess Communication msg/sem/shm get Create new or open existing IPC structure. Returns an IPC identifier msg/sem/shm ctl Determine status, set options and/or permissions Remove an IPC identifier msg/sem/shm op Operate on an IPC identifier For example(Message queue) add new msg to a queue (msgsnd) receive msg from a queue (msgrcv)

Permission Structure - skip APUE (Interprocess Communication ipc_perm is associated with each IPC structure. Defines the permissions and owner. struct ipc_perm { uid_t uid; /* owner's effective user id */ gid_t gid; /* owner's effective group id */ uid_t cuid; /* creator's effective user id */ gid_t cgid; /* creator's effective group id */ mode_t mode; /* access modes */ ulong seq; /* slot usage sequence number */ key_t key; /* key */ };

Message Queues (1/2) Linked list of messages msgget msgsnd msgrcv APUE (Interprocess Communication Linked list of messages Stored in kernel Identified by message queue identifier (in kernel) msgget Create a new queue or open existing queue. msgsnd Add a new message to a queue msgrcv Receive a message from a queue Fetching order: based on type

Message Queues (2/2) - skip APUE (Interprocess Communication Each queue has a structure struct msqid_ds { struct ipc_perm msg_perm; struct msg *msg_first; /* ptr to first msg on queue */ struct msg *msg_last; /* ptr to last msg on queue */ ulong msg_cbytes; /* current # bytes on queue */ ulong msg_qnum; /* # msgs on queue */ ulong msg_qbytes; /* max # bytes on queue */ pid_t msg_lspid; /* pid of last msgsnd() */ pid_t msg_lrpid; /* pid of last msgrcv() */ time_t msg_stime; /* last-msgsnd() time */ time_t msg_rtime; /* last-msgrcv() time */ time_t msg_ctime; /* last-change time */ }; We can get the structure using msgctl() function. Actually, however, we don’t need to know the structure in detail.

msgget() Create new or open existing queue flag : ipc_perm.mode APUE (Interprocess Communication #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> int msgget(key_t key, int flag); Returns: msg queue ID if OK, -1 on error Create new or open existing queue flag : ipc_perm.mode Example msg_qid = msgget(DEFINED_KEY, IPC_CREAT | 0666);

msgctl() - skip Performs various operations on a queue APUE (Interprocess Communication #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> int msgctl(int msqid, int cmd, struct msqid_ds *buf); Returns: 0 if OK, -1 on error Performs various operations on a queue cmd = IPC_STAT: fetch the msqid_ds structure for this queue, storing it in buf cmd = IPC_SET: set the following four fields from buf: msg_perm.uid, msg_perm.gid, msg_perm.mode, and msg_qbytes cmd = IPC_RMID: remove the message queue.

msgsnd() msgsnd() places a message at the end of the queue. APUE (Interprocess Communication #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> int msgsnd(int msqid, const void *ptr, size_t nbytes, int flag); Returns: 0 if OK, -1 on error msgsnd() places a message at the end of the queue. ptr: pointer that points to a message nbytes: length of message data if flag = IPC_NOWAIT: IPC_NOWAIT is similar to the nonblocking I/O flag for file I/O. Structure of messages struct mymesg { long mtype; /* positive message type */ char mtext[512]; /* message data, of length nbytes */ };

msgrcv() msgrcv() retrieves a message from a queue. APUE (Interprocess Communication #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> int msgrcv(int msqid, void *ptr, size_t nbytes, long type, int flag); Returns: data size in message if OK, -1 on error msgrcv() retrieves a message from a queue. type == 0: the first message on the queue is returned type > 0: the first message on the queue whose message type equals type is returned type < 0: the first message on the queue whose message type is the lowest value less than or equal to the absolute value of type is returned flag may be given by IPC_NOWAIT

예제: sender.c (1/2) APUE (Interprocess Communication

예제: sender.c (2/2) APUE (Interprocess Communication

예제: receiver.c (1/2) APUE (Interprocess Communication

예제: receiver.c (2/2) APUE (Interprocess Communication

예제: sender.c receiver.c (3/4) APUE (Interprocess Communication 실행 결과

예제: ipcs –q (1/2) APUE (Interprocess Communication Message Queue 확인

예제: ipcs –q (2/2) APUE (Interprocess Communication Message Queue 확인

Shared Memory Allows multiple processes to share a region of memory APUE (Interprocess Communication Allows multiple processes to share a region of memory Fastest form of IPC: no need of data copying between client & server If a shared memory segment is attached It become a part of a process data space, and shared among multiple processes Readers and writers may use semaphore to synchronize access to a shared memory segment

Shared Memory Segment Structure - skip APUE (Interprocess Communication Each shared memory has a structure struct shmid_ds { struct ipc_perm shm_perm; struct anon_map *shm_amp; /* pointer in kernel */ int shm_segsz; /* size of segment in bytes */ ushort shm_lkcnt; /* # of times segment is being locked */ pid_t shm_lpid; /* pid of last shmop() */ pid_t shm_cpid; /* pid of creator */ ulong shm_nattch; /* # of current attaches */ ulong shm_cnattch; /* used only for shminfo() */ time_t shm_atime; /* last-attach time */ time_t shm_dtime; /* last-detach time */ time_t shm_ctime; /* last-change time */ }; We can get the structure using shmctl() function. Actually, however, we don’t need to know the structure in detail.

shmget() Obtain a shared memory identifier APUE (Interprocess Communication #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key, int size, int flag); Returns: shared memory ID if OK, -1 on error Obtain a shared memory identifier size: is the size of the shared memory segment flag: ipc_perm.mode Example shmId = shmget(key, size, PERM|IPC_CREAT|IPC_EXCL|0666);

shmctl() - skip Performs various shared memory operations APUE (Interprocess Communication #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> int shmctl(int shmid, int cmd, struct shmid_ds *buf); Returns: 0 if OK, -1 on error Performs various shared memory operations cmd = IPC_STAT: fetch the shmid_ds structure into buf cmd = IPC_SET: set the following three fields from buf: shm_perm.uid, shm_perm.gid, and shm_perm.mode cmd = IPC_RMID: remove the shared memory segment set from the system

shmat() Attached a shared memory to an address APUE (Interprocess Communication #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> void *shmat (int shmid, void *addr, int flag); Returns: pointer to shared memory segment if OK, -1 on error Attached a shared memory to an address flag = SHM_RDONLY: the segment is read-only addr==0: at the first address selected by the kernel (recommended!) addr!=0: at the address given by addr

Memory Layout command-line arguments and environment variables APUE (Interprocess Communication shared memory uninitialized data (bss) stack heap initialized data text high address low address command-line arguments and environment variables 0xf7fffb2c 0xf77e86a0 0xf77d0000 shared memory of 100,000 bytes 0x0003d2c8 0x00024c28 malloc of 100,000 bytes array[] of 40,000 bytes 상기 주소는 절대적인 값이 아니며, 시스템에 따라 달라질 수 있음

shmdt() Detach a shared memory segment #include <sys/types.h> APUE (Interprocess Communication #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> void shmdt (void *addr); Returns: 0 if OK, -1 on error Detach a shared memory segment

예제: memlayer.c (1/3) APUE (Interprocess Communication

예제: memlayer.c (2/3) APUE (Interprocess Communication

예제: memlayer.c (3/3) command-line arguments and environment variables APUE (Interprocess Communication shared memory uninitialized data (bss) stack heap initialized data text high address low address command-line arguments and environment variables 0xf7fffb2c 0xf77e86a0 0xf77d0000 shared memory of 100,000 bytes 0x0003d2c8 0x00024c28 malloc of 100,000 bytes array[] of 40,000 bytes

예제: shm_wr.c APUE (Interprocess Communication

예제: shm_rd.c APUE (Interprocess Communication

예제: shm_wr/shm_rd, ipcs/ipcrm APUE (Interprocess Communication 실행 결과

Semaphores APUE (Interprocess Communication A counter to provide access to shared data object for multiple processes (복수의 프로세스가 데이터를 공유하는데 사용하는 카운터) To obtain a shared resource: 1. Test semaphore that controls the resource (확인하여) 2. If value > 0, value--, grant use (양수이면, 감소시키고 사용하고) 3. If value == 0, sleep until value > 0 (0이면 기다림) 4. Release resource, value ++ (다 쓴 후에는 다시 양수로 만듦) Step 1, 2 must be an atomic operation

세마포 개념(1/2) APUE (Interprocess Communication 세마포는 한정된 자원을 공유하여 사용하고자 할 때, 충돌이 발생하지 않도록 제어하는 역할을 한다.  임계 영역 문제 세마포에 대한 모든 수정은 원자적(atomic)이다. 한 프로세스가 세마포 값을 수정하려고 할 때, 다른 어떤 프로세스도 동 시에 같은 세마포 값을 수정할 수 없다. [세마포 종류] 카운팅 세마포(counting semaphore) 주어진 영역의 값을 가질 수 있다. 공유 가능한 자원의 개수를 의미한다. 예제: 0 . . 10 이진 세마포(binary semaphore) 정수 값은 단지 0과 1 값만을 가질 수 있다. 이를 특별히 mutex lock이라 부른다.

세마포 개념(2/2) 1. 임계 영역 문제를 해결하기 위한 이진 세마포 APUE (Interprocess Communication 1. 임계 영역 문제를 해결하기 위한 이진 세마포 n개의 프로세스들이 세마포(mutex)를 공유한다 mutex 는 1로 초기화된다. 프로세스 Pi 의 구조는 오른쪽과 같다. 2. 카운팅 세마포는 유한 개수 자원의 접근을 제어하는데 사용할 수 있다. 세마포는 사용 가능한 자원의 개수로 초기화된다. 세마포 값이 0일 때는 모든 자원이 사용되고 있음을 의미한다. 세마포 값이 양수이면 그 수만큼 자원을 사용할 수 있음을 의미한다. 세마포 값이 음수이면 그 수만큼 자원 사용을 기다리는 프로세스가 있음을 의미한다. do { wait (mutex); CRITICAL SECTION signal (mutex); REMAINDER SECTION } while (TRUE);

Semaphore Structure - skip APUE (Interprocess Communication Each semaphore has a structure struct semid_ds { struct ipc_perm sem_perm; struct sem *sem_base; /*ptr to first semaphore in set */ ushort sem_nsems; /* # of semaphors in set */ time_t sem_otime; /* last-semop() time */ time_t sem_ctime; /* last-change time */ }; struct sem { ushort semval; /* semaphore value, always >= 0 */ pid_t sempid; /* pid for last operation */ ushort semncnt; /* # processes awaiting semval > currval */ ushort semzcnt; /* # processes awaiting semval = 0 */ We can get the structure using semctl() function. Actually, however, we do not need to know the structure in detail.

semget() Obtain a semaphore ID APUE (Interprocess Communication #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semget(key_t key, int nsems, int flag); Returns: semaphore ID if OK, -1 on error Obtain a semaphore ID nsems: sem_nsens (# of semaphores in set) flag: ipc_perm.mode

semop() (1/2) semid: semget()을 통해 얻은 세마포 식별자 APUE (Interprocess Communication #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semop(int semid, struct sembuf *sops, size_t nsops); Returns: 0 if OK, -1 on error semid: semget()을 통해 얻은 세마포 식별자 sops: 세마포에 어떤 연산을 수행할지를 결정하는 구조체 struct sembuf { short sem_num; // 세마포 개수 short sem_op; // 세마포 연산 short sem_flg; // IPC_NOWAIT, SEM_UNDO }

semop() (2/2) APUE (Interprocess Communication sops: 세마포에 어떤 연산을 수행할지를 결정하는 구조체 struct sembuf { short sem_num; // 세마포 개수 short sem_op; // 세마포 연산 short sem_flg; // IPC_NOWAIT, SEM_UNDO } sem_num: 하나의 세마포를 사용하면 0, 여러 개이면 nsems – 1 sem_op: 양수이면 그 수만큼 자원 반환, 음수이면 그 수만큼 자원 요청 sem_flg: IPC_NOWAIT 주어지면 none block 모드/아니면 block 모드, SEM_UNDO는 프로세스가 세마포를 반환하지 않고 종료할 경우 커널에서 알아서 세마포 값을 조정(증가)함 nsops: 변경하려는 세마포 개수 (통상 한 개이면 1)

semctl() - skip 세마포 삭제, 특성 변경 등 여러 가지 제어 기능을 담당한다. APUE (Interprocess Communication #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semctl(int semid, int semnum, int cmd, union semun arg); union semun { int val; /* for SETVAL */ struct semid_ds *buf; /* for IPC_START and IPC_SET */ ushort *array; /* for GETALL and SETALL */ }; 세마포 삭제, 특성 변경 등 여러 가지 제어 기능을 담당한다.

Semaphore 예제 (1/5) 세마포를 잡은 후에 counter.txt 파일의 카운터를 1 증가시킨다. APUE (Interprocess Communication 세마포를 잡은 후에 counter.txt 파일의 카운터를 1 증가시킨다. 세마포를 잡지 못한 상황에서는 대기한다. semex 1 // argument를 주면 semaphore를 초기화(1) 한다. semex // argument가 없으면 초기화 과정을 하지 않는다.

Semaphore 예제 (2/5) APUE (Interprocess Communication

Semaphore 예제 (3/5) APUE (Interprocess Communication

Semaphore 예제 (4/5) APUE (Interprocess Communication

Semaphore 예제 (5/5) APUE (Interprocess Communication

ipcs, ipcrm ipcs:System V IPC의 상태를 확인하는 명령어 ipcrm: 정의된(생성된)IPC를 삭제함 APUE (Interprocess Communication ipcs:System V IPC의 상태를 확인하는 명령어 $ ipcs // IPC 정보를 확인 (q, m, s 모두) $ ipcs –q // Message Queue 정보를 확인 $ ipcs –m // Shared Memory 정보를 확인 $ ipcs –s // Semaphore 정보를 확인 ipcrm: 정의된(생성된)IPC를 삭제함 $ ipcrm –q id // Message Queue를 삭제 $ ipcrm –m id // Shared Memory를 삭제 $ ipcrm –s id // Semaphore를 삭제

Homework#12