IPC Systems 사례
Shared Memory: POSIX Shared Memory
Message Passing: Pipes
Shared Memory: POSIX Shared Memory
POSIX(Portable Operating System Interface(for uniX)):
서로 다른 UNIX OS의 공통 API를 정리하여 이식성 높은 유닉스 응용 프로그램을 개발하기 위한 목적으로 IEEE가 책정한 애플리케이션 인터페이스 규격
memory-mapped 파일 이용할 수있다. -> 파일이 보통 HDD의 스토리지 시스템에 있는데, 메모리에 파일을 생성하면 겁나 빠름
memory-mapped files 이용해서 shared 메모리를 점유한다.-> 파일을 메모리에 매핑시킨다.
fd = shn_open(name, O_CREAT | ORDWR, 0666);
오브젝트의 크기 지정 : 4096바이트씩 읽고 쓰겠다.
ftruncate(fd, 4096)
memory-mapped file을 shared memory에다가 매핑
mmap(0, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)
Producer 파일
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/mman.h>
int main()
{
const int SIZE = 4096; // shared memory 사이즈
const char *name = "OS"; // shared memory 이름
const char *message_0 = "Hello, ";
const char *message_1 = "Shared Memory!\n";
int shm_fd;
char *ptr;
}
shn_open 파일디스크립터 생성한다.
ftruncate 사이즈 지정
mmap로 파일shared메모리 shm_fd가 영역을 잡음
sprintf(ptr, "%s", message_0); ptr포인터가 메시지를 가리킴
.c -irt 하여 실행
consumer파일 : 읽어오기
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/mman.h>
int main()
{
const int SIZE = 4096; //shared memory 크기
const char *name = "OS"; // shared memory 이름
int shm_fd;
char *ptr;
shm_open, mmap 똑같음
printf("%s", (char *)str); 로 포인터 사용
-> "hello ~"
shm_unlink(name); 다 썼으니까 언링크함
.c -lrt 실행
Message Passing: Pipes
초기 UNIX 시스템의 최초의 IPC 메커니즘 중 하나
파이프는 두 프로세스가 통신할 수 있도록 하는 통로 역할을 수행함
half-duplex : 한쪽 방향으로만 통신하는 파이프
full-duplex : 파이프 2개를 사용하여 송수신
익명 파이프(Ordinary pipes)
익명 파이프는 생성된 프로세스의 외부에서 접근할 수 없음
일반적으로 부모 프로세스는 파이프를 생성하여 생성한 자식 프로세스와 통신하기 위하여 사용된다.
명명 파이프(Named pipes)
명명 파이프는 부모-자식 프로세스 관계없이 접근이 가능함
익명 파이프
두개의 프로세스가 puducer - consumer fashion이다.
producer가 쓰고, consumer 읽기
unidirectional한 one-way 커뮤니케이션을 두개의 파이프로 two-way 커뮤니케이션이 가능하다.
단방향(unidirectional) : 한쪽 방향으로만 통신이 가능함
만약 양방향 통신을 사용하고 싶다면 2개의 파이프를 사용해야함
양방향 통신을 위해 두개의 파이프 필요, two way 커뮤니케이션 가능하다.
UNIX 시스템의 익명 파이프 구성
pipe(int fd[]) -> 파이프갯수 배열은 2여야한다.
fd[0] -> read end 읽기
fd[1] -> write end 쓰기
#define BUFFER_SIZE 25
#define READ_END 0
#define wRITE_END 1
int main()
{
char write_msg[BUFFER_SIZE] = "Greetings";
char read_msg[BUFFER_SIZE];
int fd[2]; // 파이프갯수
pid_t pid;
/* create the pipe */
pipe(fd); // 여기서 fd를 넘겨주면 파이프 생성
}
메세지 쓴거에 "Greeting"넣음
pid = fork() 해서 child만듦
if(pid > 0) (pid == 0) 으로 parent child 구분
parent는 write , fd[1]에다가 write_msg("Greeting")를 적는다.
child는 read 한다.
파이프모델
fork하는 순간 parent 돌고 child가 돌고, 두개의 fd[1] fd[2]가 생성이됐고 read 하면 한쪽이 write하고
클라이언트 - 서버 시스템
소켓:
커뮤니케이션을 위한 두개의 앤드포인트, 두개의 원격지를 연결하는 파이프형태의 커넥션
ip adress + port 하나로 묶으면 socket
RPC(Remote Procedure Calls)
원격에 있는 프로시저(컴퓨터)를 호출하겠다. 네트워크 시스템의 프로세스들 간에 원격호출 추상화 하겠다.
원격에 있는 함수를 내가 호출하는 것
IP 주소 , 소켓 번호
이 아이피주소를 가진 8080포트에다가 리퀘스트 URI를 보내줘
맺어진 소켓 커넥션으로 이 웹서버가 데이터를 보내주면 한쪽이 죽 받아서 화면에 보여줌
hostX가 통시하기 위해서 web server의 ip와 port넘버 알아야함
Java소켓 API
Soket : connection-oriented(TCP)
DatagramSocket : connectionless(UDP) 브로드캐스팅
MulticastSocket : multiple recipients 특정한 recipients한테만 주겠다.
ServerSocket server = new: 서버 객체 생성, 6013번
server.accept(): ip adress를 파라미터를 줄 필요가 없다. 자기자신이니까 리퀘스트 보내라
.accept() 받아들여지면 클라이언트 소켓을 리턴해준다.
PrintWriter로 outputStream 만들어서 pout.println에다가 써줌
서버컴퓨터에다가 6013포트에다가 전송하고싶다.
new Socket: ip adrress 알아야한다. "127.0.0.1"하고 생성
BufferedReader만들고 br.readLine으로 받는다.
=> 데이터서버가 리스닝하고있고 데이터 클라이언트가 받아서 출력
원격에 있는 프로세스 P ,Q 소켓은 일종의 파이프, IP어드레스와 포트번호로 바인딩 되어있다.
RPC (Remote Procedure Call)
원격 서비스의 가장 일반적인 형태 중 하나
원격지에 있는 프로시져를 네트워크 커넥션을 통해서 호출하고 싶다.
클라이언트는 리모트 호스트에 있는 함수 프로시저를 내가 호출할 수 있도록 해주면된다.
stub : A 에서 B에있는 함수를 알아야한다.
함수호출할때 이 stub에 파라미터 넘겨줘야한다.
marshals : 마샬링, 원격 서비스를 이용하는 두개의 API끼리 주고받는데 데이터를 정렬하는 것, 마샬링한 객체를 보내고 return도 마샬링해서 넘겨받는다.
IPC의 확장개념 -> RPC
IPC는 컴퓨터 내부에서 두개의 프로세서가 서로 통신하는 거라면 rpc는 원격 네트워크에 연결되어 있는것끼리 통신하는것. 두개의 프로세서가 굳이 하나의 PC에 있을 필요없다.
마샬드 파라미터를 보내고 마샬드 파라미터를 받는다.
=>RPC는 별도의 원격 제어를 위한 코딩없이 다른 주소 공간에서 함수나 프로시저를 실행할 수 있게하는 프로시저간 통신기술
'OS 공부' 카테고리의 다른 글
OS 공부 - Thread, 멀티스레딩, 멀티코어 (4) | 2024.10.10 |
---|---|
OS 공부 - 프로세스간 통신, IPC, shared memory, Message-Passing (5) | 2024.10.10 |
OS 공부 - parent, child, fork, execlp (0) | 2024.10.10 |
OS 공부- 프로세스, PCB, Context switch, thread (2) | 2024.10.10 |
OS 공부 - 컴퓨터 시스템 구성, 구조, 운영체제 연산 (10) | 2024.10.10 |