운영체제(Operating System) - 5

Mins·2023년 4월 18일
0
post-thumbnail

프로세스 간 통신

프로세스 간 통신의 개념

프로세스 간 통신 (IPC; Inter Process Communication)의 종류

  • 공유 메모리나 공유 파일을 이용한 통신
    • 일정한 메모리 영역이나 파일을 공유하고 이를 통해 데이터를 주고 받음
    • 데이터를 주고받는 방법을 프로세스끼리 알아서 결정해야 하므로 가장 원시적인 방법
  • 파이프를 이용한 통신
    \rarr 단방향 통신
    • 파이프(pipe)는 프로세스 간 통신을 위해 운영체제가 제공하는 통신 기법
    • 보통, 파이프는 fork()로 만들어진 부모-자식 간 통신에서 사용
  • 소켓을 이용한 통신
    • 소켓 (socket)은 네트워크로 연결된 컴퓨터에서 데이터를 주고받기 위한 통신 기법
    • 소켓 방식은 초기화할 내용도 많고 시스템 자원도 많이 사용하므로 같은 컴퓨터 내에서 소켓으로 통신하는 것은 비효율적

통신 방향에 따른 분류

  • 양방향 통신 (duplex communication)
    • 데이터를 양쪽 방향으로 동시 전송할 수 있는 구조로, 일반적인 통신은 모두 양방향 통신
    • 프로세스 간 통신에서는 소켓 통신이 양방향 통신에 해당
  • 반양방향 통신 (halfduplex communication)
    • 데이터를 양쪽 방향으로 전송할 수 있지만 동시 전송은 불가능하고 특정 시점에 한쪽 방향으로만 전송할 수 있는 구조
    • 대표적인 예는 무전기 \rarr 예를 들면 군대에서 사용하는 PRC-96k와 같음ㅋㅋ
  • 단방향 통신 (simplex communication)
    • 모스 신호처럼 한쪽 방향으로만 데이터를 전송할 수 있는 구조
    • 프로세스 간 통신에서는 공유 메모리 / 공유 파일 이용 통신, 파이프 이용 통신이 해당
  • 대기가 있는 통신 (blocking communication)
    • 동기화를 지원하는 통신 방식 (synchronous communication)
    • 데이터를 받는 쪽은 데이터가 도착할 때까지 자동으로 대기 상태에 머물러 있음
  • 대기가 없는 통신 (non-blocking communication)
    • 동기화를 지원하지 않는 통신 방식 (asynchronous communication) \rarr 비동기처리방식
    • 데이터를 받는 쪽은 바쁜 대기를 사용하여 데이터가 도착했는지 여부를 직접 확인

정리

  • 통신 방향에 따른 분류

    종류통신 기법통신 기기
    양방향 통신소켓 이용 통신전화
    반양방향 통신무전기
    단방향 통신공유 메모리나 공유파이리 이용 통신, 파이프이용통신모스 부호

  • 통신 구현 방식에 따른 분류

    종류통신기법통신기기
    대기가 있는 통신(동기화 통신)파이프 이용 통신, 소켓 이용 통신전화
    대기가 없는 통신(비동기화 통신)공유 메모리나 공유파일 이용 통신전보

파일을 이용한 통신

  • 파일 열기
    • open("com.txt", O_RDWR) : com.txt 파일을 읽기와 쓰기를 할 수 있는 형태로 준비
    • 파일이 열리면 open 함수는 그 파일에 접근할 수 있는 권한인 파일 기술자 fd를 사용
  • 파일 쓰기 또는 ㅇ릭기
    • write(fd, "Test", 5) : fd, 즉 com.txt 파일에 Test라는 문자열을 쓰라는 뜻
    • read(fd, buf, 5) : fd, 즉 com.txt 파일에서 5B를 읽어 변수 buf에 저장
  • 파일 닫기
    • close(fd) : fd가 가리키는 파일, 즉 com.txt 파일을 닫음

파이프를 이용한 통신

  • 운영체제가 제공하는 동기화 통신 방식, 파일 입출력과 같이 open() 함수로 기술자를 얻고 작업 후 close() 함수로 마무리
  • 파이프로 양방향 통신을 하려면 파이프 2개 사용
  • 파이프에 쓰기 연산을 하면 데이터가 전송, 읽기 연산을 하면 데이터를 받음

이름 없는 파이프 (anonymous pipe)

  • 일반적으로 파이프라고 하면 이름 없는 파이프를 가르킴

이름 있는 파이프 (named pipe)

  • FIFO라 불리는 특수 파일을 이용하며 서로 관련 없는 프로세스 간 통신에 사용

소켓을 이용한 통신

  • 여러 컴퓨터에 있는 프로세스끼리 통신하는 방법
  • 네트워크에서 데이터를 보내는 것은 클라이언트 소켓이 서버 소켓에 데이터를 보내는 것이므로 네트워크 프로그래밍을 소켓 프로그래밍이라 부름
  • 프로세스가 소켓에 쓰기 연산을 하면 데이터 전송, 읽기 연산을 하면 데이터를 받음

공유 자원과 임계구역

공유 자원에 대한 접근

공유 자원 (shared resource)

  • 여러 프로세스가 공동으로 이용하는 변수, 메모리, 파일 등을 말함
  • 공동으로 이용되기 때문에 누가 언제 데이터를 읽거나 쓰느냐에 따라 그 결과가 달라질 수 있음

경쟁 조건 (race conditon)

  • 2개 이상의 프로세스가 공유 자원을 병행적으로 읽거나 쓰는 상황
  • 경쟁 조건이 발생하면 공유 자원 접근 순서에 따라 실행 결과가 달라짐

공유 자원의 접근 예

임계 구역

임계 구역 (critical section)

  • 공유 자원 접근 순서에 따라 실행 결과가 달라지는 프로그램의 영역
  • 믹서는 공유가 불가능한 자원으로서 주방의 임계구역
  • 임계구역에서는 프로세스를 동시에 작업하면 안 됨
  • 어떤 프로세스가 임계구역에 들어가면 다른 프로세스는 임계구역 밖에서 기다려야 하며 임계구역에 들어간 프로세스가 나와야 들어갈 수 있음

생산자 - 소비자 문제

코드 및 실행 순서에 따른 결과

  • 생산자는 수를 증가시키며 물건을 채우고 소비자는 생산자를 쫓아가며 물건 소비
  • 생산자 코드와 소비자 코드가 동시에 실행되면 문제 발생

임계구역 문제 해결 조건

상호 배제 (mutual exclusion)

  • 한 프로세스가 임계구역에 들어가면 다른 프로세스는 임계구역에 들어갈 수 없음

한정 대기 (bounded waiting)

  • **어떤 프로세스도 무한 대기 (infinite postpone) 하지 않아야 함

진행의 융통성 (progress flexibility)

  • 한 프로세스가 다른 프로세스의 진행을 방해해서는 안 됨

임계구역 문제 해결 방법

기본 코드 소개

임계구역 해결 방법을 설명하기 위한 기본 코드

#include <stdio.h>

typedef enum {false, true} boolean;
extern boolean lock=false;
extern int balance;

main() {
	while(lock==true_;
    lock=true;
    balance=balance+10;		/*임계구역*/ // $\rarr$ 공유변수
    lock=false;
}

임계구역 해결 조건을 고려한 코드 설계

전역 변수로 잠금을 구현한 코드

문제점 P1P_1 프로세스와 P2P_2 프로세스가 동시에 도착하면 둘다 임계구역에 진입 \rarr 상호 배제 조건 미충족

상호 배제 조건을 충족하는 코드


문제점 : P1P_1 프로세스와 P2P_2 프로세스가 동시에 들어가면 둘다 무한 루프에 빠짐 \rarr 한정 대기 조건 미충족

상호 배제와 한정 대기 조건을 충족하는 코드


문제점 : 서로 번갈아가면서 실행되는 것이 문제, 즉 한 프로세스가 연달아 임께구역에 진입하고 싶어도 그럴 수가 없다. 결국 한프로세스가 들어가서 종료가 되고 다른 프로세스가 도착할때까지 기다려야한다. 다른프로세스가 도착해서 종료되야 들어갈 수 있기 때문 즉, P2P_2 프로세스가 P1P_1 프로세스의 진행을 방해하는 구조이다.
\rarr 진행의 융통성 조건 미충족

임계구역 문제의 하드웨어적인 해결 방법

  • 검사와 지정 (test-and-set) 코드로 하드웨어의 지원을 받아 le(lock==true); 문과 lock=true; 문을 한꺼번에 실행
  • 검사와 지정 코드를 이용하면 명령어 실행 중간에 타임아웃이 걸려 임계구역을 보호하지 못하는 문제가 발생하지 않음

문제점 : 바쁜 대기를 사용하여 검사하기 때문에 자원 낭비가 있다. 일부 하드웨어에서는 바쁜 대기 없이 잠금을 동기화해주기도 하지만, 성능 좋은 하드웨어에서나 가능한 일

피터슨 알고리즘

피터슨 알고리즘

  • 임계구역 문제 해결의 세 가지 조건을 모두 만족
  • 2개의 프로세스만 사용 가능하다는 한게가 있음

데커 알고리즘

데커 알고리즘

데커 알고리즘의 동작

  1. 프로세스 P1P_1은 우선 잠금을 건다 lock1=true;
  2. 프로세스 P2P_2의 잠금이 걸렸는지 확인한다 [while(lock2==true)].
  3. 만약 프로세스 P2P_2의 차례라면 turn==1 임계구역으로 진입하고 프로세스 P2P_2의 차례라면 turn==2 4번으로 이동
  4. 프로세스 P1P_1은 잠금을 풀고 lock1=false; 프로세스 P2P_2가 작업을 마칠 때까지 기다린다 [while(turn==2);] 프로세스 P2P_2가 작업을 마치면 잠금을 걸고 lock1==true; 임계구역으로 진입

세마포어⭐️

세마포어(semaphore)

  • 프로세스가 임게구역에 진입하기 전에 스위치를 사용 중으로 놓음
  • 후에 도착하는 프로세스는 앞의 프로세스가 작업을 마칠 때까지 기다림
  • 프로세스가 작업을 마치면 세마포어가 다음 프로세스에 임게구역을 사용하라는 동기화 신호를 보냄

세마포어 내부 코드

  • Semaphore(n) : 전역 변수 RS를 n으로 초기화, RS에는 현재 사용 가능한 자원의 수 저장
  • P() : 잠금을 수행하는 코드로 RS가 0보다 크면 (사용 가능한 자원이 있으면) 1만큼 감소시키고 임계구역에 진입, RS가 0보다 작으면 (사용 가능한 자원이 없으면) 0보다 커질 때까지 기다림
  • V() : 잠금 해제와 동기화를 같이 수행하는 코드로, RS 값을 1 증가시키고 세마포어에서 기다리는 프로세스에게 임계구역에 진입해도 좋다는 wake_up 신호를 보냄

모니터

모니터 (monitor)

  • 공유 자원을 내부적으로 숨기고 공유 자원에 접근하기 위한 인터페이스만 제공해 자원을 보호하고 프로세스 간의 동기화를 시킴

모니터의 작동원리

  1. 임계구역으로 지정된 변수나 자원에 접근하려는 프로세스는 직접 P()나 V()를 사용하지 않고 모니터에 작업 요청
  2. 모니터는 요청받은 작업을 모니터 큐에 저장 후 순서대로 처리하고 결과만 해당 프로세스에 알려줌


profile
민성 개발블로그

0개의 댓글