COMPUTER SCIENCE/OS

[쉽게 배우는 운영체제 2판] 5. 프로세스 동기화

Tiny Commit 2025. 4. 16. 22:21

 

 

 

1. 프로세스 간 통신

1. 프로세스 간 통신(IPC)의 개념

  • 서로 다른 프로세스는 사용하는 메모리 영역이 다르기 때문에 공유된 메모리를 통하여 통신하는 것이 쉽지 않다.
  • 상대 프로세스를 어떻게 찾을지, 데이터의 크기는 얼마로 할지, 데이터 도착 여부를 어떻게 확인할지 등의 문제

  • 공유 메모리나 공유 파일: 원시적인 방식, 일정 메모리나 파일을 공유하고, 데이터를 주고 받는다.
  • 파이프: 많이 사용되는 수단, 운영채재거 제공하는 통신 기법, fork() 부모-자식 간 통신에 사용된다.
  • 소켓: 네트워크로 연결된 경우, 데이터를 주고받기 위한 통신 기법

2. 프로세스 간 통신의 분류

통신 방향에 따른 분류 - 양방향, 반양방향, 단방향

  • 양방향: 양쪽으로 동시 전송, 소켓, 전화
  • 반양방향: 양쪽으로 동시 x, 특정 시점에 한쪽 방향으로만, 무전기
  • 단방향: 한쪽 방향으로만, 공유메모리나 공유 파일, 파이프, 모스부호

통신 구현 방식에 따른 분류

  • 언제 보낼지 받는 쪽에서 모른다. -> 수시로 열어 본다. (바쁜 대기)
  • 동기화: 바쁜 대기 문제를 해결하기 위해 데이터가 도착했음을 알려주는 것.
  • 동기화 여부
    • 대기가 있는 통신(동기화 통신): 데이터를 받는 쪽은 데이터가 도착할 때까지 자동으로 대기 싱태에 머물러 있다.
      파이프, 소켓, 전화
    • 대기가 없는 통신(비동기화 통신): 바쁜 대기를 사용하여, 도착여부를 직접 확인, 공유 메모리나 파일, 전보

3. 프로세스 간 통신의 종류

파일을 이용한 통신

  • 일반 프로세스와 입출력 프로세스 간의 통신
  • 부모-자식 간의 프로세스 통신에 많이 사용됨
  • 프로세스 동기화 제공 x 
  • 파일 열기: open("파일명", 전용), fd 파일 기술자, ( 0_RDWR: 읽기와 쓰기 작업, 0_RD0NLY: 읽기 전용 )
  • 파일 쓰기 / 읽기: write(fd , , ) / read(fd, , )
    • 쓰기는 하드디스크에 데이터를 전송하는 명령이다.
    • 읽기는 하드디스크로 데이터를 가져오는 명령이다.
  • 파일 닫기: close(fd)

 

파이프를 이용한 통신

  • 동기화 통신 방식 (바쁜 대기 x)
  • 단반향 통신 (양방향은 파이프 2개 필요)
  • 이름 없는 파이프: 일반적, 부모-자식 프로세스, 서로 관련 있는 프로세스 간 통신
  • 이름 있는 파이프: FIFO 특수 파일 이용해서 서로 관련 없는 프로세스 간 통신

 

소켓을 이용한 통신

  • 네트워킹: 여러 컴퓨터에 있는 프로세스끼리 통신 가능
  • 인터넷 사용: TCP/IP (IP: 주소)
    • 데이터는 IP주소에 해당하는 컴퓨터에 도착한다.
    • 같은 서버로부터 도착하는 IP주소는 동일하다.
  • 하나의 컴퓨터 내 네트워크를 사용하는 프로세스 구분하는 것이 포트 번호
    • 포트 번호는 TCP가 네트워크를 사용하는 프로세스를 구분한기 위해 사용하는 주소이다.
  • 데몬: 서버에서 돌아가는 프로세스, 포트번호 필요
    • 서버용 프로세스 (데몬)에는 미리 정해진 포트번호가 필요하다.
    • 웹 데몬: 80번
    • 파일 데몬: 21번
  • 하나의 포트에 여러 클라이언트를 연결하려면 소켓이 필요한다. 클라이언트들은 포트에 연결된 멀티 소켓에 하나씩 연결된다.
    • 서버는 소켓을 사용해서 동시에 여러 클라이언트에 서비스를 제공한다.
    • 데이터를 보낸다: 클라이언트 소켓 -> 서버 소켓으로 데이터를 보낸다. 
  • 원격 프로시저 호출: 다른 컴퓨터에 있는 함수를 호출하는 것
    • 소켓으로 구현
    • 다른 컴퓨터에 있는 프로세스와 통신하려면 엄퓨터의 위치를 파악하고, 원격지의 시스템 내 여러 프로세스 중 어떤 것과 통신할지 결정해야 한다.
    • 프로세스가 소켓에 쓰기 연산을 하면 데이터가 전송되고, 읽기 연산을 하면 데이터를 받는다.

 

 

 

 

 

 

2. 공유 자원과 임계구역

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

1. 공유 자원에 대한 접근

  • 공유 자원: 변수, 메모리, 파일 등
  • 공유자원 접근 순서를 정해야 한다.
  • 경쟁 조건: 2개 이상의 프로세스가 공유 자원을 병행해서 읽거나 쓰는 상황
    • 접근 순서에 따라 실행 결과가 달라진다.

2. 임계구역

  • 임계구역: 공유 자원 접근 순서에 따라 실행 결과가 달라지는 프로그램의 영역
  • 임계구역에서는 프로세스들이 동시에 작업하면 안 된다. 임계구역에 들어간 프로세스가 나와야 밖에 있던 프로세스가 들어갈 수 있다.

3. 생산자 - 소비자 문제

  • 생산자 프로세스와 소비자 프로세스가 서로 독립적으로 작업하는데, 생산자 코드와 소비자 코드가 다음과 같이 동시에 실행되면 문제가 발생한다.
  • 생산자와 소비자가 전역 변수에 접근하는 타이밍을 서로 맞추지 않았기 때문이다.
  • 한번에 한 프로세스만 사용해야 한다.

4. 임계구역 문제 해결 조건

  • 상호 배제: 한 프로세스가 임계구역에 들어가면 다른 프로세스는 임계구역에 들어갈 수 없다.
  • 한정대기: 무한 대기하지 않아야 한다.
  • 진행의 융통성: 한 프로세스가 다른 프로세스의 진행을 방해해서는 안 된다는 것을 의미한다.

 

 

 

 

 

 

3. 임계구역 문제 해결 방법

  • 잠금
  • 잠금 해제와 동시에 동기화 신호 보내기

1. 기본 코드 소개

#include <stdio.h>

typedef enum {false, true} boolean;
extend boolean laco=false; //잠금표시
extern int balaance; // 임계구역 변수

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

 

 

2. 임계구역 문제 해결 조건을 고려한 코드 설계

상호 배제 문제

  • P1이 타임아웃이 되고 문맥교환으로 P2가 접근해서 임계구역에 들어가고 P1이 잠근다.
    • 둘다 임계구역에 접근한 것이다. (상호 배게 조건 보장 x)
    • 바쁜대기: 잠금이 풀리기를 기다려야 한다.

 

 

한정 대기 문제

  • P1이 잠그고 P2가 잠겼는지 확인한다. (상호 배게 보장)
  • 무한대기
    • P1 타임아웃이 되고 P2실행, P2실행후 타임아웃되고 P1실행 -> P1 무한대기, P2무한대
  • 확장선: lock의 개수가 늘어나면 비효율적이다.
  • 교착 상태는 프로세스가 살아 있으나 작업이 진행되지 못하는 상태다.

진행의 융통성 문제

  • 잠금을 확인하는 문장이 하나이므로 상호 배제와 한정 대기를 보장
  • 무조건 번갈아 가며 실행 (우선순위 상관 x)
  • 경직괸 동기화: 프로세스의 진행이 다른 프로세스로 인해 방해받는 현상

 

하드웨어로 해결 방법

  • lock검사를 두줄로 하면 timeout문제-> 한줄로 한꺼번에 실 (검사와 지정 코드)
  • 바쁜대기를 사용해서 검사하기 땜문에 자원 낭비 발생

 

 

3. 피터슨 알고리즘

  • turn공유 변수 한개 더 사용
  • 변수 turn은 두 프로세스가 동시에 lock을 설정하여 임계구역에 못 들어가는 상황에 대비하기 위한 장치
  • 두 프로세스가 동시에 lock을 설정했더라도 turn을 사용하여 다른 프로세스에 양보한다.
  • 프로세스 2개일 때만 사용 가능

 

 

4. 데커 알고리즘

  • 하드웨어 도움 없이 해결

 

 

 

 

  • 피터슨과 데커 모두 임계구역 문제해결 세가지 조건을 모두 만족하지만 복잡하다.
  • 프로세스가 늘어나면 변수도 늘어나고 전체 알고리즘도 복잡해진다.

5. 세마포어

  • 임계구역 진입 전 스위치를 사용중으로 놓고 들어간다.
  • 프로세스 작업이 끝나면 임계구역을 쓰라는 동기화 신호를 보낸다.
  • 세마포어 알고리즘에서는 다른 알고리즘과 달리 임계구역이 잠겼는지 직접 점검하거나, 바쁜 대기를 하거나, 다른 프로세스에 동기화 메시지를 보낼 필요가 없다.

  • 기다리는 프로세스는 세마포어 큐에 저장되어 있다가 wake_up신호를 받으면 큐에서 나와 임계구역에 진입한다.
  • P(), V()는 검사와 지정 코드를 사용한다.

 

6. 모니터

  • 임계구역이 보호받지 못한다는 것이다.
    • 세마포어를 사용하지 않고 임계구역에 들어간 경우
    • P() - P() , V() - P() 등 잘못사용
  • 모든 프로세스가 세마포어 알고리즘을 따른다면 자동으로 처리된다. 
  • 모니터: 공유 자원을 내부적으로 숨기고 공유 자원에 접근하기 위한 인터페이스만 제공함으로써 자원을 보호하고 프로세스 간에 동기화시킨다.
    • 모니터 자원은 숨기고, 모니터 큐에 저장했다가 결과만 프로세스에 알려준다.
    • 사용자 입장에서는 복잡한 코드를 실행하 지 않아서 좋고, 시스템 입장에서는 임계구역을 보호할 수 있어서 좋다.
  • increase()를 통해서만 값을 변결할 수 있다.
    • 프로세스 P1은 increase(10)을, 프로세스 P2는 increase(5)를 사용하면 입금이 끝난다

 

 

 

 

 

 

4. 파일, 파이프, 소캣 프로스래밍

  • 유닉스 기반으로 더 자세히 알아보기

1. 파일

순차파일

  • 파일 내의 데이터는 개념적으로 한 줄로 저장된다.
  • 순차적 접근으로 접근한다.
  • 카세트테이
  • open(), read (), write (), close() 구조
  • 파일기술자: 현재 파일에서 어느 위치를 읽고 있는지를 가르킨다.
    • 파일에서 파일 기술자는 단 하나이고, 읽기와 쓰기가 파일 기술자를 공유한다
    • 파일이 열리면 파일 기술자는 맨 앞에 위치한다.
    • 파일을 읽거나 쓰면 파일 기술자는 전진 한다.

 

 

파일을 이용한 통신

  • 문자열 끝에 널문자 (\0)
  • 부모 프로세스는 wait()를 사용하여 자식 프로세스를 기다린다.
  • fork() 이전에 파일을 open()하면 생성된 파일 기술자가 자식 프로세스에도 상속된다는 점이다
    • 파일 기술자의 위치 정보는 부모 프로세스와 자식 프로세스가 공유한다 (동기화 x)
    • 자식 프로세스가 종료된 후 부모 프로세스가 이 상태에서 읽 으면 엉뚱한 값을 읽게 된다
    • 부모 프로세스는 파일 기술자를 0번 위치로 이동시킨 후 값을 읽어야 하는데, 이때 사용하는 명령어가 Iseek() 다
      • SEEK_SET은 파일의 맨 처음 위치, SEEK_CUR는 파일 기술자의 현재 위치. SEEK_END는 파일의 맨 마지막위치가 기준

2. 파이프 - 이름 없는 파이프

  • 파일 기술자의 위치 정보는 부모 프로세스와 자식 프로세스가 따로 존재한다.(동기화 가능)
  • 2개의 원소를 가진 배열 로 정의하는데, 원소 하나는 읽기용이고 다른 하나는 쓰기용이다.
  • 파이프는 단방향 통신이므로 프로세스당 하나의 기술자만 사용한다. 따라서 필요 없는 기술자는 닫아버린다.
  • 파이프는 대기가 있는 통신이기 때문에 wait()가 필요 없다.

3. 네트워킹 - 소켓

 

  • 클라이언트
    • 는 소켓을 생성한 후 connectQ를 사용하여 서버와의 접속을 시도
    • 서버와 접속되면 read() 혹은 write() 작업
    • 작업이 끝나면 사용한 소켓 기술자를 닫고 종료한다.
  • 서버
    • 소켓을 생성한 후 bind()를 사용하여 생성한 소켓을 특정 포트에 등록한다.
      • IP주소와 포트번호로 구분
      • 서버는 동시에 여러 클라이언트에 서비스하기 위해 하나의 포트 번호에 여러 개의 소켓을 생성한다. 따라서 bind()는 특정 포트에 새로운 소켓을 등록하겠다는 의미다.
    • bind()로 소켓이 정상적으로 등록되면 listen() 을 실행하여 클라이언트를 받을 준비를 한다
    • accept()는 여러 명의 클라이언 트가 동시에 connect()를 하는 경우에 하나를 골라 작업을 시작하게 해준다
    • 클라이 언트가 acceptQ되면 소켓 기술자가 생성되고 작업이 시작된다.

 

 

 

 

 

 


출처 : 조성호 , 『IT CookBook, 쉽게 배우는 운영체제(2판)』한빛아카데미(2023).