운영체제실습 - IPC(InterProcess Communication) - Real-Time Computing and Communications Lab. Hanyang University jtlim@rtcc.hanyang.ac.kr dhchoi@rtcc.hanyang.ac.kr beespjh@gmail.com
Introduction 조교소개 이름 : 임정택 Tel : 010-4780 - 9294 E-Mail : jtlim@rtcc.hanyang.ac.kr 이름 : 최대호 Tel : 010-9872 - 9353 E-Mail : dhchoi@rtcc.hanyang.ac.kr 이름 : 박준형 Tel : 010-2859 - 6858 E-Mail : beespjh@gmail.com 실습관련질문시제목을아래의양식에맞춰서메일을보내주세요 ex> [ 운영체제 ] 학번 _ 이름 2 2
About IPC 프로세스간통신 (InterProcess Communication, IPC) 이란프로세스들사이에서로데이터를주고받는행위또는그에대한방법이나경로를뜻한다. IPC 를통해프로세스들은다음이수행가능하다. Data Transmission Data sharing Event Alarm Resource sharing 3 3
About IPC Shared Memory Message Queue 4 4
Memory Space 모든프로세스는동장에필요한자료를저장하기위한메모리공간을가지고있다. 프로세스는동작시작시혹은실행중에이러한메모리공간을 kernel 에요구하여공간을할당받아사용한다. 5 5
Shared Memory 프로세스들이공통으로접근, 사용할수있는메모리이다. 메모리영역을공유해서사용함으로써프로세스간의통신이가능하다. 데이터가메모리에계속유지되어있기때문에, 여러번접근할수있다. 같은값에대해서여러프로세스가값을공유해야될때사용하면효과적이다. Process 1 Process 2 Process n Shared Memory 6 6
Shared Memory Shared Memory 구조 Shared memory 구조를관리하기위한자료구조 segment 크기, creator process ID, Attach time 등과같은여러정보가저장된다. include/uapi/linux/shm.h파일에 struct shmid_ds로정의되어있다. 7 7
Shared Memory(ipc/shm.c) 함수 shmget 공유메모리의 ID 를반환하는함수 Def : int shmget(key_t key, int size, int schflg) Parameters key: 생성되는공유메모리를식별하기위한값 size: 생성할공유메모리의크기 shmflg: 공유메모리생성옵션으로 IPC_CREAT, 파일접근권한등의작업을함 IPC_CREAT: key 에해당하는공유메모리가없다면새로생성한다. 만약메모리가있다면무시하며생성을위해접근권한을지정해주어야한다. IPC_EXCL: 공유메모리가이미있다면실패로반환하며공유메모리에접근하지못한다. 이옵션이없어야기존공유메모리에접근할수있다. 8 8
Shared Memory 함수 shmat 생성된공유메모리에물리적주소를자신의프로세스가할당하는가상메모리와연결시켜주는함수 Def: void *shmat(int shmid, const void *shmaddr, int shmflg) Parameters shmid: shmget가반환하는값 shmaddr: 프로세스의메모리주소로 0을넣으면커널이자동으로빈공간을찾아할당해줌 shmflg: 공유메모리옵션으로 0을설정하면읽기 / 쓰기모드 9 9
Shared Memory 함수 shmctl 공유메모리에대한정보를구하거나변경또는제거하는함수 Def: int shmctl(int shmid, int 층, struct shmid_ds *buf) Parameters shmid: 공유메모리번호 (shmget이반환하는값 ) cmd: 제어명령 IPC_STAT: 공유메모리공간에관한정보를가져옴 IPC_SDT: 공유메모리공간에대한사용자권한변경 IPC_RMID: 공유메모리공간을삭제 (shm_nattach가 0일때까지기다렸다가삭제됨 ) buf: 공유메모리정보를구하기위한버퍼포인터 10 10
Shared Memory 함수 shmdt 프로세스와공유메모리의연결을분리하는함수 Def: int shmdt(const void *shmaddr) Parameter shmaddr: 분리할공유메모리주소 shmdt 함수는 shmid_ds 구조체의정보를갱신 shm_dtime: detach time을 shmdt함수가호출된시간으로갱신 shm_lpid: 호출한프로세스의 ID로갱신 shm_nattach: 1 감소 (0이되어 shmctl에의해삭제표시가되면ㅁ공유메모리는삭제됨 ) 11 11
Shared Memory 실습 - server 12 12
Shared Memory 실습 - client 13 13
Message Queue Message Queue 란 IPC 에서 메시지단위 의송수신을가능하게해주는큐이다. Linux kernel 에서전역적으로관리되며, 모든프로세스에서접근이가능하도록구현이되어있다. 14 14
Message Queue 프로세스가생성한메시지는 IPC 메시지큐에저장되고, 다른프로세스가메시지를읽으면큐에서제거된다. 15 15
Message Queue Message Queue 구조 Message: 메시지큐에서메시지는고정된크기의헤더 (header) 와가변적인크기를가지는문자 (text) 로이루어진다. 메시지의헤더 (header) 부분에는메시지유형 (type) 을나타내는값이붙을수있다. 이값을이용해선택적으로메시지를읽는것이가능하다. include/linux/msg.h 에 struct msg_msg 로정의되어있다. 16 16
Message Queue Message Queue 구조 Message Queue: 시스템에서각각의메시지큐는 msg_queue 라는 structur 를가지게된다. msg_queue structur 는 permission 정보외에현재큐의 bytes 수, message 의개수, queue 의최대 bytes 수등의정보를가지고있다. include/linux/msg.h 에 struct msg_queue 로정의되어있다. 17 17
Message Queue Message Queue 구조 struct msg_queue 는각각의메시지와 linked list 의구조로연결되어있다. msg_queue 의 q_messages 는메시지큐의가장앞쪽의메시지와연결이되고, 각각의메시지는 m_list 를통해연결을이룬다. 18 18
Kernel s linked list 일반적인 linked list 보통의 linked list 는구현하고자하는구조체에해당구조체를가리키는포인터변수를삽입하여구현한다. 보통의 linked list 는구현할때마다여러구조체에대해해당되는 linked list 를동적으로생성해야한다는번거로움이있다. 19 19
Kernel s linked list Linux kernel 에서는일반적인방식을쓰지않고 linked list node 를 data 안에넣는방식으로구현한다. include/linux/list.h 에해당매크로들이선언되어있다. 20 20
Message Queue Message Queue 구조 Message Queue 객체 : 메시지큐가생성될때마다메시지큐에대한정보를가진객체가생성된다. 마지막으로송수신한프로세스 ID, 송수신시간, 큐의최대바이트수등여러정보가저장된다. include/uapi/linux/msg.h 에 struct msqud_ds 로정의되어있다. 21 21
Message Queue msgget function 메시지큐를생성하거나기존의메시지큐를참조하는함수 Def: int msgget(key_t key, int msgflg) Parameters key: 메시지큐를구분하기위한고유키 msgflg: 메시지큐를생성할때옵션을지정 IPC_CREAT: key에해당하는큐가있다면큐의식별자를반환하며, 없으면큐를생성한다. IPC_EXCL: key에해당하는큐가없다면생성하지만큐가있다면 -1을반환하고복귀한다. 22 22
Message Queue msgsnd function 메시지큐에해당데이터를전송하는함수 Def: int msgsnd(int msqid, struct msgbuf *msgp, size_t msgsz, int msgflg) Parameters msqid: 메시지큐 ID msgbuf structure 데이터전송시에사용되는메시지구조 msgbuf 의첫 4bytes 는반드시 long 타입이어야하며, 값은 1 이상이어야한다 mtext 는문자열이나 binary 등임의의데이터로사용이가능하다. msgflg: 메시지전송의옵션을지정 0: 큐에공간이생길때까지기다린다. IPC_NOWAIT: 큐에여유공간이없다면바로 -1 로복귀한다. struct msgbuf{ long mtype; // 메시지타입 > 0 chat mtext[1]; // 메시지데이터 } 23 23
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 : 메시지가없는경우의옵션을지정 IPC_NOWAIT: 메시지큐에메시지가없다면기다리지않고 -1 로복귀한다. MSG_NOERROR: 메시지큐에있는자료가준비된데이터크기보다크다면초과부분을잘라내고읽어들일수있는부분만담아온다. 이옵션이없다면메시지큐에자료가있어도 -1 이반환되어실패한다. 24 24
Message Queue msgrcv function parameters msgtyp: 메시지큐에있는자료중어떤자료를읽을지에대한옵션을지정 0: 큐에자료가있다면첫번째의자료를읽어들인다. 양수 : 양수로지정한값과같은 data_type 의자료중첫번째를읽어들인다. 음수 : 음수값을절댓값으로변경하고, 이절댓값과같거나보다제일작은 data_type 의자료를구한다. 메시지큐에 data_type 이 1, 5, 15 이고 -10 을지정했다면 1 의데이터를구하게된다. 25 25
Message Queue msgctl function 메시지큐의현재상태정보를보거나변경, 삭제등을수행하는함수 Def: int msgctl(int msqid, int cmd, struct msqid_ds *buf) Parameters msqud: 메시지큐의 ID cmd: 메시지큐에대한제어명령 IPC_STAT: 메시지큐의현재상태를 buf 에저장한다. IPC_SET: 메시지큐의상태를 buf 값으로변경한다. 그러나모든정보는안되고 msg_perm 과 msg_qbytes 내용만변경할수있다. IPC_RMID: 메시지큐를삭제한다. 이때는 buf 가필요없으므로 buf 를 0 으로지정한다. buf: cmd 명령에따라동작하는메시지큐객체구조 (structure) 26 26
Message Queue_Receiver 27 27
Message Queue_Sender 28 28
과제 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 를통해메시지큐의전체메시지를모두출력 29 29
과제 Hint1 : ipc/msg.c 를참조하여기존 msgsnd, msgrcv 함수의동작을파악 Hint2 : Kernel 에서사용되는연결리스트인 struct list_head 의구조와동작을참조 Hint3 : 메시지데이터구조는실습예제의구조를참조하며, 메시지데이터의순서와우선순위에따른메시지의구별이이루어져야함 30 30
과제 Hint <linux/include/linux/msg.h> -> prio 변수를추가 31 31
과제 Hint <linux/ipc/msg.c> current task 의 prio 값을저장, enqueue 할때우선순위높은메시지가앞쪽으로오도록코드작성 32 32
과제 Hint priority sender application -> setpriority 함수사용 33 33
과제 Due: 2017/05/09 23:59:59 보고서 과제내용요약 Kernel Code 작성부분에대한설명 ( 스크린샷첨부 ) 최종결과스크린샷 ( 터미널창에서의결과화면 ) 34 34