IPC(Inter-Process Communication): 프로세스간 데이터를 공유하기 위한 방법.
프로세스 내부 데이터 통신: 프로세스 내 스레드 간 통신→ 스레드는 전역변수나 파일을 이용하여 데이터를 공유
프로세스 간 데이터 통신: 같은 컴퓨터(동일 호스트)에 있는 프로세스간 통신→ 공용 파일 또는 운영체제가 제공하는 자원을 이용
네트워크를 이용한 데이터 통신: 여러 컴퓨터가 네트워크로 연결되어 있을 때 통신→ 소켓을 이용한 데이터 공유
방향성에 따른 분류
단방향 통신(simplex communication): 한쪽 방향으로만 데이터를 전송할 수 있는 구조. 대표적으로 파이프(PIPE) 기법이 있음.
양방향 통신(duplex communication): 데이터를 동시에 양쪽 방향으로 전송할 수 있는 구조. 대표적으로 소켓 통신이 있음.
반양방향 통신(half-duplex communication): 특정 시점에 한쪽 방향으로만 전송할 수 있는 구조.(동시전송불가) 대표적으로 메시지 큐, 공유 메모리가 있음.
동시성에 따른 분류
대기가 있는 통신: 동기화를 지원하는 통신 방식. 데이터를 받는 쪽은 데이터가 도착할 때까지 자동 대기 상태(블록킹, blocking)
대기가 없는 통신: 동기화를 지원하지 않는 통신 방식. 다른 작업을 하는 중에 데이터가 수신되면 처리(인터럽트 처리방식, 폴링 처리방식)
IPC 기법
시그널(signal): 운영체제는 프로세스를 관리하기 위한 시그널을 정의함. 시그널을 수신한 프로세스는 그에 맞는 행위를 수행함.
인터럽트(interrupt): 이벤트 발생에 따른 처리를 위한 방식. 프로세스가 동작 중 인터럽트가 발생하면 해당 기능을 수행.
공유 파일: 서로 다른 프로세스가 동일한 파일을 공유하여 사용하는 방식. 프로세스 처리 성능은 기록 장치의 읽기, 쓰기 속도에 영향을 받음.
예시
- fd=open("file.txt", O_RDWR): 파일 열기, 파일 기술자(fd)를 리턴
- write(fd,"TEST",5): 파일 쓰기
- read(fd, buf, 5): 파일 읽기
- close(fd): fd가 가리키는 파일을 닫음.
순차 파일(sequential file): 아무리 큰 파일이라도 파일 내 데이터는 개념적으로 한 줄로 저장.
파일 기술자(File Descriptor, fd): 열린 파일이나 다른 입출력 자원을 가리키는 정수 값.
역할: 프로그램이 파일, 소켓, 파이프 등 다양한 입출력 자원에 접근할 때, 운영체제는 각 자원에 고유한 파일 기술자를 할당함. → 프로그램은 이 파일 기술자를 사용하여 해당 자원에 데이터를 읽고 쓰거나 제어하는 등의 작업을 수행함.
특징
- open()함수로 파일을 열면 파일 기술자 fd를 얻음
- 파일 접근 권한 외에 현재 파일의 어느 위치를 읽고 있는지에 대한 정보 보관
- 파일에서 파일 기술자는 단 하나
- 처음 파일이 열리면 파일 기술자는 맨 앞에 위치함
- 파일을 읽거나 쓰면 파일 기술자는 계속 전진함
파이프(PIPE): 한 프로세스의 출력을 다른 프로세스의 입력으로 연결해주는 역할. 데이터가 한 방향으로 흐르는 단방향 통신 채널을 제공함.
특징
- 단방향 통신: 파이프는 한쪽 끝에서 데이터를 쓰고, 다른 쪽 끝에서 데이터를 읽는 단방향 통신을 지원함.
- 부모-자식 관꼐 프로세스 간 통신: 부모 프로세스가 생성하고, fork() 시스템 호출을 통해 생성된 자식 프로세스와 통신하는데 사용됨.
- 버퍼: 파이프는 내부적으로 버퍼를 가지고 있어 데이터를 임시로 저장함.
- 동기화: 파이프는 읽기/쓰기 작업 시 동기화를 제공하여 데이터 손실이나 경쟁 상태를 방지함.
#include <stdio.h>
#include <unistd.h>
int main() {
int pid, fd[2];
char buf[5];
if (pipe(fd) == -1) exit(-1); // 파이프 생성
pid = fork(); // 자식 프로세스 생성
if (pid < 0) exit(-1); // fork 실패 시 종료
else if (pid == 0) { // 자식 프로세스
close(fd[0]); // 읽기 닫음 (자식은 쓰기만 함)
write(fd[1], "Test", 5); // "Test" 문자열 쓰기
close(fd[1]); // 쓰기 종료
}
else { // 부모 프로세스
close(fd[1]); // 쓰기 닫음 (부모는 읽기만 함)
read(fd[0], buf, 5); // 파이프로부터 읽기
printf("%s\n", buf); // 읽은 데이터 출력
close(fd[0]); // 읽기 종료
}
return 0;
}
메시지큐: 큐(queue) 방식으로 데이터를 접근.
특징
- 큐는 행위에 따라 En-queue(큐에 데이터를 삽입)와 De-queue(큐에서 데이터를 추출)로 분류
- 양방향, 비동기 방식
- 부모-자식 간의 프로세스가 아니더라도 프로세스 간 메시지 송수신 가능함
공유 메모리: 운영체제에서 별도로 할당해준 공유 영역 활용하는 방식. 각 응용 프로그램을 해당 영역 포인터로 접근. (공유 메모리 확인 명령: ipcs/ 자원 생성: ipcmk/ 자원 삭제: ipcrm)
소켓: 여러 컴퓨터에 있는 프로세스끼리 통신하는 방법. 네트워크 소켓은 컴퓨터 네트워크를 공유하는 프로세스 간의 통신.
종류(socket()의 옵션)
- PF_LOCAL: 같은 호스트 내 프로세스 간 통신
- PF_INET: 인터넷을 통한 다른 호스트 통신(ipv4)
- PE_INET6: 인터넷을 통한 다른 호스트 통신(ipv6)
임계구역(critical section): 둘 이상의 프로세스(또는 스레드)가 동시에 접근하면 안되는 공유자원(데이터, 메모리 등)을 접근하는 코드 영역.
해결법
1. 상호 배제(mutual exclusion): 한 프로세스가 임계 구역에 들어가면 다른 프로세스는 임계구역에 들어 갈 수 없음.
2.한정 대기(bounded waiting): 어떤 프로세스도 무한 대기(infinite postpone)하지 않아야 함.
3.진행의 융통성(progress flexibility): 한 프로세스가 다른 프로세스의 진행을 방해해서는 안됨.
데커 알고리즘
특징
- 두 개의 프로세스가 임계구역에 동시에 진입하지 않도록 보장.
- 최초의 소프트웨어 기반 상호 배제 알고리즘 중 하나.
- 플래그와 turn 변수를 사용함.
- 서로 양보하거나 대기하면서 임계구역 진입을 조절함.
flag[0] = true; // 나 들어갈래!
while (flag[1]) { // 상대도 들어가고 싶다면
if (turn != 0) { // 내 차례가 아니면
flag[0] = false;
while (turn != 0); // 차례 올 때까지 대기
flag[0] = true;
}
}
// → 여기서 임계구역 진입
...
turn = 1; // 상대 차례 줌
flag[0] = false; // 나 이제 안 들어갈래
장점: 상호배제, 진행, 한정 대기 모두 만족함.
단점: 구현 복잡, CPU 명령어 수준에서 완벽히 구현하려면 까다로움.
피터슨 알고리즘
특징
- 데커 알고리즘을 단순화한 형태.
- 여전히 두 개의 프로세스만을 위한 알고리즘.
flag[0] = true; // 나 들어갈래!
turn = 1; // 상대에게 양보할게
while (flag[1] && turn == 1); // 상대도 들어가고 싶고, 내 차례 아니면 기다려
// → 임계구역 진입
...
flag[0] = false; // 나 이제 안 들어갈래
장점: 매우 간단, 상호 배제 조건 만족. 교착상태 없이 공정함.
세마포어(semaphore): 프로세스가 임계구역에 진입하기 전에 스위치를 사용 중으로 놓는 것.
- 후에 도착하는 프로세스는 앞의 프로세스가 작업을 마칠 때까지 기다림.
- 프로세스가 작업을 마치면 세마포어가 다음 프로세스에 임계구역을 사용하라는 동기화 신호를 보냄.
내부코드
- Semaphore(n) : 전역 변수 RS를 n으로 초기화, RS에는 현재 사용 가능한 자원의 수 저장
- P() : 잠금을 수행하는 코드로 RS가 0보다 크면(사용 가능한 자원이 있으면) 1만큼 감소시키고 임계구역에 진입, RS가 0보다 작으면(사용 가능한 자원이 없으면) 0보다 커질 때까지 기다림
- V() : 잠금 해제와 동기화를 같이 수행하는 코드로, RS 값을 1 증가시키고 세마포어에서 기다리는 프로세스에게 임계구역에 진입해도 좋다는 wake_up 신호를 보냄
모니터(monitor): 공유 자원을 내부적으로 숨기고 공유 자원에 접근하기 위한 인터페이스만 제공해 자원을 보호하고 프로세스 간의 동기화를 시킴. (자원을 숨기고 인터페이스만 제공하는 시스템 호출과 같은 개념)
작동원리
- 임계구역으로 지정된 변수나 자원에 접근하려는 프로세스는 직접 P()나 V()를 사용하지 않고 모니터에 작업 요청
- 모니터는 요청받은 작업을 모니터 큐에 저장 후 순서대로 처리하고 결과만 해당 프로세스에 알려줌.
'2025-1 > 운영체제' 카테고리의 다른 글
06. 교착상태 (0) | 2025.04.13 |
---|---|
04. CPU 스케줄링 (0) | 2025.04.12 |
03. 프로세스와 스레드 (0) | 2025.03.22 |
02. 컴퓨터시스템 구조와 성능 향상 (0) | 2025.03.22 |
01. 커널과 인터페이스 (0) | 2025.03.12 |