관리 메뉴

공부 기록장 💻

[운영체제/OS] 05장 프로세스 동기화 본문

# CS Study/Opearing System

[운영체제/OS] 05장 프로세스 동기화

dream_for 2022. 8. 21. 16:15

5장의 목표

  • 독립적인 프로세스끼리 작업을 하다 서로 데이터를 주고받아야 할 때 통신을 하는 경우, 누가 먼저 작업을 할지, 작업이 언제 끝날지 등을 서로 알려주어야 하는 동기화
    • 같은 데이터를 여러 프로세스가 사용할 때 서로 침범하면 안되는 임계구역 문제 해결

 

1. 프로세스 간 통신

병행 프로세스의 개념

  • 병행 프로세스(Concurrent Process) 종류
    1. 독립 프로세스 - 단일 처리 시스템에서 수행하는 병행 프로세스, 다른 프로세스에 영향을 주고받지 않으면서 독립 실행
    2. 협력 프로세스
    • 다른 프로세스와 상호작용(통신)하며 특정 기능을 수행하는 비동기적 프로세스
    • 제한된 컴퓨터 자원의 효율성 증대, 계산 속도 향상, 모듈적 구성 강화, 개별 사용자의 여러 작업을 동시에 수행하여 편의성 제공에 사용됨
    • 병행 프로세스들이 입출력장치, 메모리, 프로세서, 클록 등 자원을 서로 사용 시 충돌 발생(경쟁 조건 race condition 발생)

 

병행 프로세스의 과제

  • 병행성(Concurrency)
    • 여러 프로세스를 이용해 작업을 수행
    • 스템 신뢰도 높이고, 처리 속도 개선, 처리 능력을 높이는 데 중요
  • 병행 프로세스의 문제
    • 공유 자원 사호 배타적 사용(프린터, 통신망 등은 한 순간에 프로세스 하나만 사용
      • 병행 프로세스 수행 과정에서 발생하는 상호배제 보장
    • 병행 프로세스 간의 협력이나 동기화
    • 프로세스 간 데이터 교환을 위한 통신 (IPC, Intercession of Process Communication)
    • 동시에 수행하는 다른 프로세스의 실행속도와 관계없이 항상 일정한 실행 결과 보장(결정성-determinancy)확보
    • 교착 상태 해결, 병행 프로세스들의 병령 처리 능력 극대화
      • 교착상태(deadlock) : 다른 프로세스가 공유 자원을 사용하고 있다고 착각하여, 무한정 대기하는 상태

프로세스 간 통신의 개념

  • 같은 컴퓨터 내에 있는 프로세스 간 통신(IPC), 또는 스레드 간 통신, 네트워크로 연결된 다른 컴퓨터에 있는 프로세스와의 통신

 

프로세스 간 통신의 종류

  1. OS 도움 X
    1. 프로세스 내부 데이터 통신: 하나의 프로세스 내에 2개 이상의 스레드가 존재하는 경우 통신
      • 전역 변수, 파일을 사용해 통신
    2. 프로세스 간 데이터 통신 : 동일 컴퓨터에 있는 여러 프로세스끼리 통신
      • 공용 파일 또는 OS가 제공하는 파이프, 또는 소켓를 사용하여 통신
        • 파일 입출력은 일반 메모리 입출력보다 10배 이상의 지연이 발생
  2. OS 제공하는 통신
    1. 네트워를 이용한 데이터 통신 : 여러 컴퓨터가 네트워크로 연결되어 있는 경우 소켓으로 데이터 전달 (네트워킹)
      1. 다른 컴퓨터에 있는 함수 호출하여 통신하는 경우, 원격 프로시저(Remote Process Communication) 호출

 


 

프로세스 간 통신의 분류

  • 함수 호출로 데이터를 주고받는 것은 통신이 아니다. 프로세스 간 통신은, 동시에 실행되는 프로세스끼리 데이터를 주고받는 작업이다.
  1. 통신 방향에 따른 분류
    • 양방향 통신(duplex communication) - IPC에서 소켓 통신
    • 반양방향 통신(half-duplex communication) - 동시 전송은 불가능, 특정 시점에 한쪽 방향으로만 전송 가능 (무전기)
    • 단방향 통신(simplex communication) - 모스 신호처럼 한쪽(IPC에서 전역 변수 1개 사용, 파이프)
  2. 통신 구현 방식에 따른 분류
    • 대기가 있는 통신(blocking communication)- 동기화 통신(synchronous)
      • 데이터를 받는 쪽은 데이터가 도착할 때까지 자동으로 대기 상태에 머물러 있음
    • 대기가 없는 통신(non-blocking communication) - 비동기화 통신(asynchronous)
      • 바쁜 대기를 사용하여 데이터가 도착해는지 여부를 직접 확인
      • 바쁜 대기(busy waiting) : 데이터 수신 측에서 반복적으로 전역 변수의 값을 점검하여 반복문을 무한 실행하며 기다리는 것

 

프로세스 간 통신의 종류

send -> write(GV, message)
write -> read(GV, message)
  1. 전역 변수를 이용한 통신
    • 직접적으로 관련 있는 프로세스 간, 공동으로 관리하는 메모리를 사용해 데이터를 주고받는 것
      • ex) 부모 프로세스가 전역 변수를 선언한 후 자식 프로세스를 만들면, 부모 프레스솨 자식 프로세스가 통신 할 수 있음
    • 데이터를 보내는 쪽 → 전역 변수나 파일에 값을 씀
    • 데이터를 받는쪽 → 전역 변수의 값을 읽음
  2. 파일을 이용한 통신
    • 저장 장치의 데이터를 읽고 쓰는 것 또한 일반 프로세스와 입출력 프로세스 간의 통신이다.
    • 부모-자식 관계 프로세스 간 통신에서 많이 사용 (프로세스 동기화를 제공 X)
    1. 파일 열기
      • 파일의 존재 유무, 쓰기 권한 확인
      • 파일 기술자(file descriptor) fp를 통해 접근 → 화장실의 열쇠와 같은 역할
    2. 파일 읽기, 쓰기
    3. 파일 닫기
  3. 파이프를 이용한 통신
    • 프로세스 동기화 문제를 해결하는 방법
    • 운영체제가 제공하는 동기화 통신 방식 (단뱡향)
    • 대기 상태: 파이프에서 읽기 연산을 수행했는데, 타 프로세스에서 쓰기 연산을 하지 않은 경우 대기 상태가 되며, 데이터가 쓰여지는 순간 자동으로 풀려 동기화가 이루어짐
    1. 이름없는 파이프(anonymous pipe) : 부모와 자식 프로세스, 혹은 같은 부모를 가진 프로세스와 같이 서로 관련 있는 IPC에서 사용
    2. 이름있는 파이프(named pipe) : FIFO라 불리는 특수 파일 이용하여 서로 관련 없는 프로세스 간 통신에 사용
  4. 소켓을 이용한 통신
    • 네트워킹(여러 컴퓨터에 있는 프로세스 끼리 통신) - 네트워크, 소켓 프로그래밍
    • 원격 프로시저 호출: 다른 컴퓨터에 있는 함수 호출
      • 자바에서 다른 컴퓨터에 있는 객체의 메소드를 불러와 사용하는 것
      • 소켓을 이용하여 구현
        • 다른 컴퓨터의 위치를 파악
        • 원격지의 시스템 내 여러 프로세스 중 어떤 프로세스와 통신을 할지 결정
        • 자신의 소켓과 상대의 소켓을 연결하는 바인딩(binding) 작업
        • 소켓에 쓰기 연산을 하여 데이터를 전송, 읽기 연산을 통해 데이터를 수신
    • 소켓: 프로세스 동기화 지원(하나만 사용해도 양방향 통신 가능)

 

 


2. 공유 자원과 임계구역

  • 한정된 자원을 가지고 공동으로 작업 하는 경우 문제 발생

 

공유 자원의 접근

  • 공유 자원(shared resource): 여러 프로세스가 공동으로 이용하는 변수, 메모리, 파일
    • 공유 자원 접근 순서를 결정해야 함
  • 경쟁 조건(race condition) : 2개 이상의 프로세스가 공유 자원을 병행적으로 읽거나 쓰는 상황
  • 상호 배제(Mutual Exclusion)
    • 특정 공유 자원을 한 순간에 하나의 프로세스만 사용할 수 있을 때, 프로세스 하나가 공유 데이터를 접근하는 동안 다른 프로세스들은 해당 데이터를 접근할 수 없게 하는 것
    • 동기화(Synchronization)의 필요
      • 공유 자원을 동시에 사용하지 못하게 실행을 제어하는 기법
      • 동기화로 상호 배제 보장할 수 있지만,이 과정에서 교착 상태, 기아 상태 발생 가능
        • 기아상태: 동기화로 인해 누군가는 계속 기다려야 하는 상태
        • 교착상태: 누구도 공유 자원을 사용하지 못하는 상태

 

임계 구역

  • 임계 구역(critical section): 공유 자원 접근 순서에 따라 실행 결과가 달라지는 프로그램의 영역
    • 임계 자원(Critical Resource): 둘 이상의 프로세스가 공유할 수 없는 자원
    • 계 영역(Critical Section): 프로그램에서 임계 자원을 이용하는 부분
  • 임계 구역은 여러 프로세스들이 동시에 작업하면 안되는 구역
  • 다수의 프로세스가 접근 가능하지만, 어느 한 순간에는 프로세스 하나만 사용 가능
  • 어떤 프로세스가 임계구역에 들어가면, 다른 프로세스는 임계구역 밖에서 대기해야 함

 


생산자-소비자 문제 (producer-consumer problem)

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

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

  • 생산자: 계속 물건을 생산해서 버퍼에 넣고[input(buf)] 소비자는 계속 버퍼에서 물건을 가져옴[output(buf)]
  • 원형 버퍼(circular buffer): 작업을 계속하기 위해 사용
  • sum 전역변수: 버퍼가 비었는지 가득 찼는지 확인 (현재 버퍼에 있는 상품의 총수 저장)

 

 

임계구역 해결 조건

  • 어떤 방법이든 만족해야 하는 조건 3가지

1) 상호 배제(mutual exclusion)

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

2) 한정 대기(bounded waiting)

  • 어떤 프로세스든 무한 대기(infinite postpone)해선 안 된다. 특정 프로세스가 임계구역에 진입하지 못하면 안 된다.

3) 진행의 융퉁성(progress flexibility)

  • 한 프로세스가 다른 프로세스의 진행을 방해해서는 안 된다.
  • 임계 영역에 프로세스가 없는 상태에서는 어떤 프로세스든 진행 가능해야 함

 

 


3. 임계구역 해결 방법

 

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

  • 잠금(lock)을 이용하는 것 → 잠금 해재와 동기화 신호 전송
#include <stdio.h>

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

main(){
	while(lock==true);
	lock=true;
	balance=balance+10;
	lock=false;
}

  • p1이 임계 구역에 들어가 있는 경우 lock을 false로 설정하여 다른 프로세스가 들어올 수 없도록 처리. 임계구역을 다 사용한 후에는 lock을 true로 변경

 

문제점

공유 변수를 두 개 사용하여 해결

  • 상대 프로세스의 키를 한 번 더 확인하여 임계구역 진입 여부를 더 명확히 결정
  • 상호 배제에 대한 환경은 확실히 만들어지지만, 무한정 대기라는 문제가 발생 (deadlock) → while loop 안에 묶여 동기화 문제를 해결하기 어렵게 됨

공유 변수 값을 부여

  • boolean이 아닌 실제 정수 값을 사용
  • 문제점 - 다른 프로세스의 진입을 방해하는 문제 발생

하드웨어적 해결 방법

  • 값에 대한 변화를 하드웨어적인 형태로 처리

 

 


피터슨 알고리즘

  • 상호 배제, 한정대기, 진행의 융튱성 제공을 모두 해결하는 알고리즘
  • 2개의 프로세스만 실행할 수 있게 함

 


데커 알고리즘

  • p1이 우선 잠금을 걸고, p2에 대해 작믐을 한 번 더 확인

데커 알고리즘의 동작

  1. 프로세스 P!은 우선 잠금을 검(lock1=true;)
  2. 프로세스 P2의 잠금이 걸렸는지 확인[while(lock2==true)]
  3. 만약 프로세스 P2도 잠금을 걸었다면 누가 먼저인지 확인[if(turn==2)]

만약 프로세스 P1의 차례라면(turn=1) 임계구역으로 진입, P2의 차례라면(turn=2) 4로 이동

  1. 프로세스 P1은 잠금을 풀고(lock=1false) 프로세스 P2가 작업을 마칠 때까지 기다림[while(turn==2);]

프로세스 P2가 작업을 마치면 잠금을 걸고(lock1=true;) 임계구역으로 진입

 

 


세마포어

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

내부 코드

  • RS값이 0인 경우 계속 대기 상태(wait)였다음
    • V: 키를 반납

 

 


모니터

  • 공유 자원을 내부적으로 숨기고, 공유 자원에 접근하기 위한 인터페이스만 제공
    • 작업들이 요구하는 critical section을 처리하고, 그 결과만 해당 프로세스에게 알려줌
  • 독립적인 프로세스끼리 작업을 하다 서로 데이터를 주고받아야 할 때 통신을 하는 경우, 누가 먼저 작업을 할지, 작업이 언제 끝날지 등을 서로 알려주어야 하는 동기화
    • 같은 데이터를 여러 프로세스가 사용할 때 서로 침범하면 안되는 임계구역 문제 해결
  •  
728x90
반응형
Comments