Operating System 10 주차 - IPC(InterProcess Communication) - Real-Time Computing and Communications Lab. Hanyang University jtlim@rtcc.hanyang.ac.kr yschoi@rtcc.hanyang.ac.kr shpark@rtcc.hanyang.ac.kr
Contents About IPC Message Queue Quiz #1 과제 #5 2 2
About IPC 프로세스간통신 (Inter Process Communication, IPC) 이란프로세스들사이에서로데이터를주고받는행위또는그에대한방법이나경로를뜻한다. IPC 를통해프로세스들은다음이수행가능하다. Data transmission Data sharing Event Alarm Resource sharing 3 3
About IPC Signal Pipe Message Queue 4 4
Signal 시그널이란메시지형식이아닌신호형식의통신방법이며, 이벤트가발생했음을알리기위해 Process 에전달되는소프트웨어인터럽트다. 프로세스의수행시점과관계없이임의로발생하는비동기적인특성을가지고있다. 5 5
Signal Signal 을발생시키는 Event 4 가지 System Call ( Kill 등 ) 사용자입력 ( ^c, ^z 등 ) Hardware Exception ( 나누기 0 등 ) Software Condition ( alarm 시간등 ) 시그널명 SIGKILL SIGALARM SIGSTP SIGCONT SIGINT SIGSEGV 의미프로세스를죽여라알람발생프로세스멈춤멈춰진프로세스동작프로세스인터럽트발생프로세스가다른메모리영역을침범 6 6
Message Queue 메시지큐란 IPC 에서 메시지단위 의송수신을가능하게해주는큐이다. Linux Kernel 에서전역적으로관리되며, 모든프로세스에서접근이가능하도록구현되어있다. 7 7
Message Queue 프로세스가생성한메시지는 IPC 메시지큐에저장되고, 다른프로세스가메시지를읽으면큐에서제거된다. 8 8
Message Queue Message Queue 구조 Message : 메시지큐에서메시지는고정된크기의헤더 (Header) 와가변적인크기를가지는 Text 로이루어진다. 메시지의헤더 (Header) 부분에는메시지유형 (type) 을나타내는값이붙을수있다. 이값을이용해선택적으로메시지를읽는것이가능하다. include/linux/msg.h 에 struct msg_msg 로정의되어있다. 9 9
Message Queue Message Queue 구조 Message Queue : 시스템에서각각의메시지큐는 msg_queue 라는 structure 를가지게된다. msg_queue structure 는 permission 정보외에현재큐의 bytes 수, message 의개수, 큐의최대 bytes 수등의정보를가지고있다. include/linux/msg.h 에 struct msg_queue 로정의되어있다. 10 10
Message Queue Message Queue 구조 struct msg_queue 는각각의메시지와 linked list 의구조로연결되어있다. msg_queue 의 q_messages 는메시지큐의가장앞쪽의메시지와연결이되고, 각각의메시지는 m_list 를통해연결을이룬다. 11 11
Message Queue Message Queue 구조 Message Queue 객체 : 메시지큐가생성될때마다메시지큐에대한정보를가진객체가생성된다. 마지막으로송수신한프로세스 ID, 송수신시간, 큐의최대바이트수등여러정보가저장된다. include/uapi/linux/msg.h 에 struct msqid_ds 로정의되어있다. 12 12
Message Queue msgget function 메시지큐를생성하거나기존의메시지큐를참조하는함수 Def : int msgget(key_t key, int msgflg) Parameters key : 메시지큐를구분하기위한고유키 msgflg : 메시지큐를생성할때옵션을지정 13 13
Message Queue msgsnd function 메시지큐에해당데이터를전송하는함수 Def : int msgsnd(int msqid, struct msgbuf *msgp, size_t msgsz, int msgflg) Parameters msqid : 메시지큐 ID msgbuf structure 데이터전송시사용되는메시지구조 msgbuf 의첫 4 bytes 는반드시 long 타 입이어야하며, 값은 1 이상이어야함 mtext 는문자열이나 binary 등임의의 데이터로사용이가능함 msgflg : 메시지전송의옵션을지정 14 14
Message Queue msgrcv function 메시지큐로부터데이터를수신하는함수 Def : ssize_t msgrcv(int msqid, struct msgbuf *msgp, size_t msgsz, long msgtype, int msgflg) Paramters msqid : 메시지큐 ID msgp : 메시지큐에서읽은메시지를저장하는공간 msgsz : 메시지저장공간의크기 msgflg : 메시지가없는경우의옵션을지정 15 15
Message Queue msgrcv function Parameters msgtyp : 메시지큐에있는자료중어떤자료를읽을지에대한옵션을지정 16 16
Message Queue msgctl function 메시지큐의현재상태정보를보거나변경, 삭제등을수행하는함수 Def : int msgctl(int msqid, int cmd, struct msqid_ds *buf) Parameters msqid : 메시지큐의 ID cmd : 메시지큐에대한제어명령 buf : cmd 명령에따라동작하는메시지큐객체 structure 17 17
Message Queue Message Queue 리소스확인 IPC 메시지큐의자원수 $ cat /proc/sys/kernel/msgmni 각메시지의크기 (Default : 8192) $ cat /proc/sys/kernel/msgmax 큐에있는메시지의총크기 (Default : 16,384) $ cat /proc/sys/kernel/msgmnb 18 18
Message Queue 실습 - sender 19 19
Message Queue 실습 - receiver 20 20
Kernel s Linked List 일반적인 Linked List 보통 Generic 한 linked list 는구현하고자하는구조체에해당구조체를가리키는포인터변수를삽입하여구현 하지만이런방식으로구현할경우여러구조체에대해해당되는 linked list 를동적으로생성해야한다는번거로움이존재 21 21
Kernel s Linked List Linux Kernel 에서는일반적인방식대신생각을전환하여반대로구현 linked list node 를 Data 안에넣는방식으로구현 include/linux/list.h 에해당매크로들이선언되어있음 22 22
Priority 확인및변경 여러개의프로세스들이실행하려시도될때, 그들각각이가진 priority 가그프로세스가가져갈 CPU 의점유율을결정한다. Linux CFS 의경우 -20~19 사이에서동작한다. priority 는낮은숫자일수록더자주실행됨을의미한다. 즉, priority(=nice) 값이작을수록높은우선순위를가지게된다. 다음슬라이드에서설명할 2 개의함수는지정한타겟의 priority 를확인하고변경하는함수로 sys/resource.h 에선언되어있다. int getpriority(int which, id_t who) int setpriority(int which, id_t who, int priority) 23 23
Priority 확인및변경 getpriority 지정한타겟의 priority 를반환하는함수 Def : int getpriority(int which, id_t who) Parameters which 는다음중하나로설정한다. PRIO_PROCESS : 프로세스 PRIO_PGRP : 프로세스그룹 PRIO_USER : 유저 who 는 which 의 ID 로차례로 PID, PGID, UID 를의미한다. 성공하면해당되는 ID 를반환하고, 실패하면 -1 을반환한다. 24 24
Priority 확인및변경 Example> getpriority source code result 25 25
Priority 확인및변경 setpriority 지정한타겟의 priority 를변경하는함수 Def : int setpriority(int which, id_t who, int priority) Parameters which 는앞의 getpriority 에서와동일 who 는 which 의 ID 로차례로 PID, PGID, UID 를의미한다. priority 는변경하고자하는우선순위값으로, -20~20 사이에서실행된다. 성공하면해당되는 0 을반환하고, 실패하면 -1 을반환한다. 위의함수를사용하기위해서는관리자권한으로실행하여야한다. $ sudo./ File name 26 26
Priority 확인및변경 Example> setpriority source code result 27 27
Quiz #1 1. 현재구현되어있는 Message Queue 의의미구조를파악하고커널코드를수정하여 Priority 기반의새로운 Message Queue 를구현한다. Priority 는해당 task 의 Priority 를참조 Message structure 에 Priority 개념을추가하여, 우선순위가높은 task 가보낸메시지가큐의앞쪽에배치되도록변경 Test Program : 총 3 개의프로그램을통해테스트 Normal sender : nice value = 0 의우선순위를가지고메시지큐에메시지를보내는프로그램 Priority sender : 0 이아닌다른 nice value 를가지고메시지큐에메시지를보내는프로그램 Receiver : 메시지큐의전체메시지를모두출력하는프로그램 ( 모든메시지는같은메시지타입을가지고있다고가정 ) 2. Test 두개의 terminal 에서 Normal sender 와 Priority sender 가 1 초의간격을가지고각각메시지큐에메시지를보낸다. 전송이모두끝나면 Receiver 를통해메시지큐의전체메시지를모두출력 28 28
Quiz #1 Hint1 : ipc/msg.c 를참조하여기존 msgsnd, msgrcv 함수의동작을파악 Hint2 : Kernel 에서사용되는연결리스트인 struct list_head 의구조와동작을참조 Hint3 : 메시지데이터구조는실습예제의구조를참조하며, 메시지데이터의순서와우선순위에따른메시지의구별이이루어져야함 29 29
Quiz #1 Example (Normal sender, Priority sender) 30 30
Quiz #1 Example ( 기존의 Message Queue) 31 31
Quiz #1 Example (Priority Message Queue) 32 32