Cohe

5장 프로세스 동기화 본문

운영체제

5장 프로세스 동기화

코헤0121 2024. 1. 10. 16:15
728x90

프로세스 간 통신

프로세스 간 통신의 개념

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

프로세스 간 통신의 분류

  • 통신 방향에 따른 분류
    • 양방향 통신(duplex communication)
      • 데이터를 양쪽 방향으로 동시 전송할 수 있는 구조로, 일반적인 통신은 모두 양방향 통신
      • 프로세스 간 통신에서는 소켓 통신이 양방향 통신에 해당
  • 반양방향 통신(halfduplex communication)
    • 데이터를 양쪽 방향으로 전송할 수 있지만 동시 전송은 불가능하고 특정 시점에 한쪽 방향으로만 전송할 수 있는 구조
    • 대표적인 예는 무전기
  • 단방향 통신(simplex communication)
    • 모스 신호처럼 한쪽 방향으로만 데이터를 전송할 수 있는 구조
    • 프로세스 간 통신에서는 공유 메모리/공유 파일 이용 통신, 파이프 이용 통신이 해당
      • 방향이 정해져 있다.
  • 통신 구현 방식에 따른 분류
    • 대기가 있는 통신(blocking communication)
      • 동기화를 지원하는 통신 방식(synchronous communication)
      • 데이터를 받는 쪽은 데이터가 도착할 때까지 자동으로 대기 상태에 머물러 있음
        • block이 되는지 안되는지 파악, 받는 쪽이 다 할 때까지 아무것도 못한다 (block)
    • 대기가 없는 통신(non-blocking communication)
      • 동기화를 지원하지 않는 통신 방식(asynchronous communication)
      • 데이터를 받는 쪽은 바쁜 대기를 사용하여 데이터가 도착했는지 여부를 직접 확인
        • 보내 놓고 신경쓰지 않음

종류 통신기법 통신 기기

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

종류 통신기법 통신기기

대기가 있는 통신(동기화) 파이프 이용 통신, 소켓 이용 통신 전화
send와 recieve가 있음    
대기가 없는 통신(비동기화) 공유 메모리나 공유 파일 이용 통신 전보
제공 이후에 신경 안씀. 알아서 읽어라    

프로세스 간 통신의 종류 (1-3)

  • 파일을 이용한 통신
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

int main(){
int fd;
char buf[5];
fd=open("com.txt", 0_RDWR);
write(fd,"Test", 5); //process: 단방향
read(fd, buf, 5); //process: 단방향
close(fd);
exit(0);}
  • 파이프를 이용한 통신
    • 운영체제가 제공하는 동기화 통신 방식
    • 파일 입출력과 같이 open()함수로 id를 얻고 작업 후 close()함수로 마무리
    • 파이프로 양방향 통신을 하려면 파이프 2개 사용
    • 이름 없는 파이프 : 일반적으로 파이프라고 하면 이름 없는 파이프를 가리킴
    • 이름 있는 파이프 : FIFO라 불리는 특수 파일을 이용하여 서로 관련 없는 프로세스 간 통신에 사용
  • 소켓을 이용한 통신
    • 여러 컴퓨터에 있는 프로세스끼리 통신하는 방법
    • 네트워크에서 데이터를 보내는 것은 클라이언트 소켓이 서버 소켓에 데이터를 보내는 것이므로 네트워크 프로그래밍을 소켓 프로그래밍이라 부름
    • 프로세스가 소켓에 쓰기 연산을 하면 데이터를 보내고, 읽기 연산을 하면 데이터를 받음

공유 자원과 임계구역

공유 자원에 대한 접근

  • 공유 자원
    • 여러 프로세스가 공동으로 이용하면 변수, 메모리, 파일 등을 말함
    • 공동으로 이용되기 때문에 누가 언제 데이터를 읽거나 쓰느냐에 따라 그 결과가 달라질 수 있음
  • 경쟁 조건
    • 2개 이상의 프로세스가 공유 자원을 병행적으로 읽거나 쓰는 상황
    • 경쟁 조건이 발생하면 공유 자원 접근 순서에 따라 실행 결과가 달라짐

임계구역

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

생산자-소비자 문제

  • 공유변수뿐 아니라 하드웨어 자원도 임계구역
    • 메모리를 포함한 모든 하드웨어 자원 → 1개만 있기 때문

생산자/소비자 프로세스 – 실행에 따른 결과차이

  • count++ 명령어의 실제 실행 과정
register1 = count

register1 = register1 + 1

count = register1
  • count-- 명령어의 실제 실행 과정
register2 = count

register2 = register2 - 1

count = register2
  • 이 실행들이 count = 5에서 다음과 같은 순서로 실행되었다고 가정해보자.
S0 생산자가 수행
register1 = count
{register1 = 5}
S1 생산자가 수행
register1 = register1 + 1
{register1 = 6}
S2 소비자가 수행
register2 = count
{register2 = 5}
S3 소비자가 수행
register2 = register2 - 1
{register2 = 4}
S4 생산자가 수행
count = register1
{count = 6 }
S5 소비자가 수행
count = register2
{count = 4}

count = 4

임계구역 문제 해결 조건

  • 상호 배제(mutual exclusion)
    • 한 프로세스가 임계구역에 들어가면 다른 프로세스는 임계구역에 들어갈 수 없음
      • 필수 조건! 절대 깨지면 안됨
      • 한 번에 하나만 들어가렴
  • 한정 대기(bounded waiting)
    • 어떤 프로세스도 무한 대기(infinite postpone)하지 않아야 함
      • 해결 방법을 제안, 이 자원을 언젠간 써야한다.
  • 진행의 융통성(progress flexibility)
    • 한 프로세스가 다른 프로세스의 진행을 방해해서는 안 됨
    • 임계구역에 프로세스가 없으면 임계구역 사용을 원하는 프로세스중에 하나를 선택하여 진행시켜야 함

임계구역 해결 방법

기본 코드 소개

  • 단순한 방법 : lock을 사용한다
  • 기본코드
#include <stdio.h>

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

main(){
while(lock==true);
lock=true;
balance+=10;//임계구역
lock=false;}

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

  • 전역 변수로 잠금을 구현한 코드의 문제
    • 상호배제보장 안됨
      ① 프로세스 P1은 while(lock==true); 문 실행
      ② 프로세스 P2는 while(lock==true); 문 실행
      ③ 프로세스 P1이 lock=true; 문 실행하여 임계구역에 잠금을 걸고 진입
      ④ 프로세스 P2도 lock=true; 문 실행하여 임계구역에 잠금을 걸고 진입. (결국 둘 다 임계 구역에 진입)
  • 상호 배제 조건을 충족하는 코드
  • 상호 배제 조건을 충족하는 코드의 문제
    • 프로세스 P1이 lock1=true; 문 실행 후 자신의 CPU 시간 다 씀(타임아웃).
      • 문맥 교환 발생, 프로세스 P2가 실행 상태로 바뀜
    • 프로세스 P2도 lock2=true; 문 실행 후 자신의 CPU 시간 다 씀(타임아웃).
      • 문맥 교환 발생, 프로세스 P1이 실행 상태로 바뀜
    • 프로세스 P2가 lock2=true; 문 실행하여
      • 프로세스 P1은 while(lock2==true); 문에서 무한 루프에 빠짐
    • 프로세스 P1이 lock1=true; 문 실행하여
      • 프로세스 P2도 while(lock1==true); 문에서 무한 루프에 빠짐
  • 교착상태
  • 상호 배제와 한정 대기 조건을 충족하는 코드
  •  
    • 대부분 번갈아 사용하게 됨 → 자원이 비면 사용 가능해야 하지만 여기서에는 불가능
  • 임계구역 문제의 하드웨어적인 해결 방법
    • 검사와 지정(test-and-set) 코드로 하드웨어의 지원을 받아 while(lock==true); 문과 lock=true; 문을 한꺼번에 실행
    • 검사와 지정 코드를 이용하면 명령어 실행 중간에 타임아웃이 걸려 임계구역을 보호하지 못하는 문제가 발생하지 않음

 

 

피터슨 알고리즘

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

데커 알고리즘

  • 알고리즘
  • 동작
    ① 프로세스 P1은 우선 잠금을 건다(lock1=true;).
    ② 프로세스 P2의 잠금이 걸렸는지 확인한다[while(lock2==true)].
    ③ 만약 프로세스 P2도 잠금을 걸었다면 누가 먼저인지 확인한다[if(turn==2)].
         만약 프로세스 P1의 차례라면(turn==1) 임계구역으로 진입
         만약 프로세스 P2의 차례라면(turn==2) ④로 이동
    ④ 프로세스 P1은 잠금을 풀고(lock1=false;) 프로세스 P2가 작업을 마칠 때까지 기다린다[while(turn==2);]
  • 프로세스 P2가 작업을 마치면 잠금을 걸고(lock1=true;) 임계구역으로 진입

세마포어(semaphore)

  • 임계구역에 진입하기 전에 스위치를 사용 중으로 놓고(P()) 임계구역으로 들어감
  • 이후에 도착하는 프로세스는 앞의 프로세스가 작업을 마칠 때까지 기다림
  • 프로세스가 작업을 마치면 다음 프로세스에 임계구역을 사용하라는 동기화 신호를 보냄(V())
    • P(wait)연산: 자원을 접근할 때
    • V(signal)연산: 자원 사용이 끝났을 때
    • 세마포어에 대한 연산은 원자적으로 처리되어야 함
      • 중간에 타임 아웃이 없다. 쪼개지면 안된다는 뜻~ 한 덩어리
    • 응용 레벨과 커널 레벨에서 구현이 가능
  • 세마포어 내부 코드
    • Semaphore(n) : 전역 변수 RS를 n으로 초기화, RS에는 현재 사용 가능한 자원의 수 저장
    • P() : 잠금을 수행하는 코드로 RS가 0보다 크면(사용 가능한 자원이 있으면) 1만큼 감소시키고 임계구역에 진입, RS가 0보다 작으면(사용 가능한 자원이 없으면) 0보다 커질 때까지 기다림
    • V() : 잠금 해제와 동기화를 같이 수행하는 코드로, RS 값을 1 증가시키고 세마포어에서 기다리는 프로세스에게 임계구역에 진입해도 좋다는 wake_up 신호를 보냄
      • 이제 사용 가능하다고 말해

모니터

  • 세마포어의 잘못된 사용 예
    ① 프로세스가 세마포어 사용하지 않고 임계구역에 바로 들어간 경우로, 임계구역을 보호할 수 없음
    ② P()를 두 번 사용하여 wake_up 신호가 발생하지 않은 경우로, 프로세스 간 동기화가 이루어지지 않아 세마포어 큐에서 대기하던 프로세스들이 무한 대기에 빠짐
    ③ P()와 V()를 반대로 사용해 상호 배제가 보장되지 않은 경우로, 임계구역을 보호할 수 없음
  • 모니터(monitor)
    • 공유 자원을 내부적으로 숨기고 공유 자원에 접근하기 위한 인터페이스만 제공해 자원을 보호하고 프로세스 간의 동기화를 시킴
      • 위험한 녀석들끼리만 묶어 놓고 알아서 해주기
  • 모니터의 작동 원리
    • ① 임계구역으로 지정된 변수나 자원에 접근하려는 프로세스는 직접 P()나 V()를 사용하지 않고 모니터에 작업 요청
    • ② 모니터는 요청받은 작업을 모니터 큐에 저장 후 순서대로 처리하고 결과만 해당 프로세스에 알려줌

파일, 파이프, 소켓 프로그래밍

중요하지 않음

파일

  • 순차 파일(sequential file)
    • 아무리 큰 파일이라도 파일 내의 데이터는 개념적으로 한 줄로 저장됨
      • 순차적 접근
  • 파일을 이용한 통신
    • read( )와 write( ) 함수가 파일 기술자를 공유하며 통신
    • 두 프로세스 간 동기화를 운영체제가 지원해 주지 않으므로 프로세스가 알아서 해야 함

파이프

  • 파이프를 이용한 통신
  • 파이프는 파일 기술자를 2개의 원소를 가진 배열로 정의. 원소 하나는 읽기용, 하나는 쓰기용으로 사용

 

네트워킹

관련 없는 프로세스 간 통신에 사용

'운영체제' 카테고리의 다른 글

6장 교착상태  (1) 2024.01.10
4장 CPU 스케줄링  (1) 2024.01.10
3장 프로세스와 스레드  (0) 2024.01.10
2장 컴퓨터의 구조와 성능 향상  (1) 2024.01.10
1장 운영체제의 개요  (1) 2024.01.10