728x90

본 글은 대학 수업 듣다가 하도 이해가 안돼서 정리하면서 이해해보고자 쓰는 글입니닷

 

Process 들은 분리 된 데이터 영역을 가진다.

 

그치만 우린 그 프로세스 간에 데이터를 주고받고싶을때가 있는 것이다.

 

이를 IPC(Inter-Process Communication)라고 하고 그 수단은 크게 두가지로 나뉘고 또 그 두개에서 세부적으로 나뉜다.

 

내가 수업에서 배운 큰 분류는 다음과 같다.

Message passing
커널이 관리, 동기화 문제 신경쓸 필요X
오버헤드 큼
PIPE
부모-자식 프로세스간 단방향 전송(read or write)
FIFO
부모자식 관계가 아닌 프로세스들도 통신 가능
Shared Memory
메모리 공간을 할당받아 2개 이상의 프로세스들이 같은 메모리공간에 접근함
동기화문제가 생길 수 있다. < 보통 세마포어를 써서 해결

shared memory 관련 system call 사용
MMP
(Memory mapped file) 을 shared memory로 사용

 

PIPE 는 시스템콜 PIPE로 생성할 수 있으며 그냥 파일디스크립터 처럼 read, write 시스템콜을 사용하면 된다.

파일 디스크립터를 복사하는 dup라는 기능도 있다.

이걸 사용하면 STD_OUT에 써지는 내용을 PIPE에도 동일하게 보내거나

STD_OUT은 닫아버리고 모든 출력을 PIPE가 받도록 할 수도 있다.

 

FIFO는 자료구조의 FIFO가 맞다.

프로세스로부터 메시지를 받아 요청이 들어올 때마다 선입선출시킴..

mkfifo 시스템콜로 FIFO를 만들고 그 객체를 open, close, read, write 할 수 있다.

 

Shared Memory 내 머리를 터지게 하는 유용한 기능

사실 쉐어드메모리 개념 자체가 아니라 동기화문제가 구웨엑이다..

서로 다른 둘 이상의 프로세스가 같은 메모리를 함께 사용한다.

일단 관련 시스템콜은 아래와같다.

 

shget :운영체제야 쉐어드메모리 줘 없으면 만들어서 줘!!!

 - shared memory ID 를 리턴.

shmat : Virtual address 에 physical memory 주소 연결해줘!!!(= mapping)

 - 쉐어드메모리의 포인터가 리턴

  그리고 이때 얘가 가리키는 주소에는 flag로 0이 들어있다

shmdt : 연결한거 떼줘!!

 - 정상적으로 수행 시 0 리턴

 

할당해제는 컨트롤 오퍼레이션을 사용한다

shmctl( 쉐어드메모리ID, IPC_RMID, 0 )

두번째 인자로 IPC_RMID 를 주면 system 상에서 shared memory가 사라진다. 옵션은 보통 NULL로 준다. 

 

그리고 Memory mapped file

디스크상의 파일을 Virtual address와 mapping 해서 쓰는것인데

file 에 바로 쓰므로 file I/O와는 다르다...........고 하나

실상 페이지가 메모리에서 내려갈 때 변경사항이 반영되므로 File I/O와 섞어쓰다가는 동기화문제가 생긴다고 한다.

 

 

관련 시스템콜은

mmap : VA를 할당

munmap: 할당 해제

이 있다.

mmap 은 파라미터가 좀 복잡하다고 느껴지는데... 순서대로

mapping할 address : 0추천 > 시스템이 알아서 고름

사이즈

prot : PROT_READ, PROT_WRITE, PROT_EXEC, PROT_NONE

flag : offset, 보통 0 넣으면 됨

 

이렇게 4개가 들어간다

 

끝!

 

 

 

 

728x90

+ Recent posts