Download presentation
Presentation is loading. Please wait.
Published byHandoko Kartawijaya Modified 5년 전
1
Operating System 10주차 - IPC(InterProcess Communication) -
Real-Time Computing and Communications Lab. Hanyang University
2
Contents About IPC Message Queue Quiz #1 과제 #5
3
About IPC 프로세스 간 통신(Inter Process Communication, IPC)이란 프로세스들 사이에 서로 데이터를 주고받는 행위 또는 그에 대한 방법이나 경로를 뜻한다. IPC를 통해 프로세스들은 다음이 수행 가능하다. Data transmission Data sharing Event Alarm Resource sharing
4
About IPC Signal Pipe Shared Memory Message Queue
5
Message Queue 메시지 큐란 IPC에서 “메시지 단위”의 송수신을 가능하게 해주는 큐 이다.
Linux Kernel에서 전역적으로 관리되며, 모든 프로세스에서 접근이 가능하도록 구현되어있다.
6
Message Queue 프로세스가 생성한 메시지는 IPC 메시지 큐에 저장되고, 다른 프로세스가 메시지를 읽으면 큐에서 제거된다.
7
Message Queue Message Queue 구조
Message : 메시지 큐에서 메시지는 고정된 크기의 헤더(Header)와 가변적인 크기를 가지는 Text로 이루어진다. 메시지의 헤더(Header) 부분에는 메시지 유형(type)을 나타내는 값이 붙을 수 있다. 이 값을 이용해 선택적으로 메시지를 읽는 것이 가능하다. include/linux/msg.h에 struct msg_msg로 정의되어 있다.
8
Message Queue Message Queue 구조
Message Queue : 시스템에서 각각의 메시지 큐는 msg_queue라는 structure를 가지게 된다. msg_queue structure는 permission 정보 외에 현재 큐의 bytes 수, message의 개수, 큐의 최대 bytes 수 등의 정보를 가지고 있다. include/linux/msg.h에 struct msg_queue로 정의되어 있다.
9
Message Queue Message Queue 구조
struct msg_queue는 각각의 메시지와 linked list의 구조로 연결되어 있다. msg_queue의 q_messages는 메시지 큐의 가장 앞쪽의 메시지와 연결이 되고, 각각의 메시지는 m_list를 통해 연결을 이룬다.
10
Message Queue Message Queue 구조
마지막으로 송수신한 프로세스 ID, 송수신 시간, 큐의 최대 바이트 수 등 여러 정보가 저장된다. include/uapi/linux/msg.h에 struct msqid_ds로 정의되어 있다.
11
Message Queue msgget function 메시지 큐를 생성하거나 기존의 메시지 큐를 참조하는 함수
Def : int msgget(key_t key, int msgflg) Parameters key : 메시지 큐를 구분하기 위한 고유 키 msgflg : 메시지 큐를 생성할 때 옵션을 지정
12
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 : 메시지 전송의 옵션을 지정
13
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 : 메시지가 없는 경우의 옵션을 지정
14
Message Queue msgrcv function Parameters
msgtyp : 메시지 큐에 있는 자료 중 어떤 자료를 읽을지에 대한 옵션을 지정
15
Message Queue msgctl function 메시지 큐의 현재 상태 정보를 보거나 변경, 삭제 등을 수행하는 함수
Def : int msgctl(int msqid, int cmd, struct msqid_ds *buf) Parameters msqid : 메시지 큐의 ID cmd : 메시지 큐에 대한 제어 명령 buf : cmd 명령에 따라 동작하는 메시지 큐 객체 structure
16
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
17
Message Queue 실습 - sender
18
Message Queue 실습 - receiver
19
Kernel’s Linked List 일반적인 Linked List
보통 Generic한 linked list는 구현하고자 하는 구조체에 해당 구조체를 가리키는 포인터 변수를 삽입하여 구현 하지만 이런 방식으로 구현할 경우 여러 구조체에 대해 해당되는 linked list를 동적으로 생성해야 한다는 번거로움이 존재
20
Kernel’s Linked List Linux Kernel에서는 일반적인 방식 대신 생각을 전환하여 반대로 구현
linked list node를 Data 안에 넣는 방식으로 구현 include/linux/list.h 에 해당 매크로들이 선언되어 있음
21
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를 통해 메시지 큐의 전체 메시지를 모두 출력
22
Quiz #1 Hint1 : ipc/msg.c를 참조하여 기존 msgsnd, msgrcv 함수의 동작을 파악
Hint2 : Kernel에서 사용되는 연결 리스트인 struct list_head 의 구조와 동작을 참조 Hint3 : 메시지 데이터 구조는 실습 예제의 구조를 참조하며, 메시지 데이터의 순서와 우선순위에 따른 메시지의 구별이 이루어져야 함
23
Quiz #1 Example (Normal sender, Priority sender)
24
Quiz #1 Example (기존의 Message Queue)
25
Quiz #1 Example (Priority Message Queue)
26
과제 #5 1. 구현되어 있는 Message Queue 커널 코드를 수정하여 Signal 기반의 Message Queue 함수를 구현 사용자로부터 보내고자 하는 Process ID를 Parameter로 받음 Message structure에 PID 개념을 추가하여, 해당 Message를 Signal을 통해 Direct로 주고 받을 수 있게 구현 Test Program Sender : 사용자로부터 Message를 보내고자 하는 Process의 ID를 받으면, 해당 Message를 Queue에 삽입하고 Process로 Signal을 보냄 Receiver : 다른 일을 하고 있다가, Signal을 받으면 Message Queue에 접근하여 Signal을 보낸 프로세스의 Message를 읽음 Edited (or New) Functions msgsnd : ‘pid’ parameter를 추가, pid >= 0 이면 Message Queue에 사용자로부터 받은 Message를 넣고 pid로 Signal을 보냄 msgrcv : ‘pid’ parameter를 추가, Message Queue에서 해당 pid 값을 가지고 있는 Message 검색
27
과제 #5 2. Test 첫 번째 terminal에서는 Receiver Program을 실행하여 일반적인 task( Reading messages, Calculating matrix 등)를 수행, 두 번째 terminal에서는 사용자로부터 PID 값을 입력 받아 Signal msgsnd 함수 수행 Receiver Program에서 Signal handling을 통해 해당 Message를 제대로 읽는지 확인 5/22 실습 수업시간 조교들이 프로그램 동작 유무 직접 확인
28
과제 #5 Example
29
과제 #5 Example
30
과제 #5 Due : 2015/05/22 실습 수업 시간 5/22 실습 보고서 출력해서 수업시간에 제출 보고서 표지
과제 내용 요약 Kernel Code 수정한 부분에 대한 설명 (스크린샷 첨부할 것) 추가한 시스템 콜이 있다면 핸들러 함수부분만 스크린샷 첨부하고 설명 Example의 나온 receiver, sender처럼, Signal을 이용하여 어떻게 동기적으로 구현하였는지 Kernel Code 수정한 부분과 연관 지어 설명 최종 결과 스크린샷 및 분석
Similar presentations