Cohe
5장 프로세스 동기화 본문
728x90
반응형
프로세스 간 통신
프로세스 간 통신의 개념
- 프로세스 간 통신(IPC; Inter Process Communication)의 종류
- 공유 메모리나 공유 파일을 이용한 통신
- 일정한 메모리 영역이나 파일을 공유하고 이를 통해 데이터를 주고받음
- 데이터를 주고받는 방법을 프로세스끼리 알아서 결정해야 하므로 가장 원시적인 방식
- 파이프를 이용한 통신
- 프로세스 간 통신을 위해 운영체제가 제공하는 통신 기법
- 예) fork()로 만들어진 부모-자식 간 통신에 파이프 사용
- 소켓을 이용한 통신
- 네트워크로 연결된 컴퓨터에서 데이터를 주고받기 위한 통신 기법
- 소켓 방식은 초기화할 내용도 많고 시스템 자원도 많이 사용하므로 같은 컴퓨터 내에서 소켓으로 통신하는 것은 비효율적
- 공유 메모리나 공유 파일을 이용한 통신
프로세스 간 통신의 분류
- 통신 방향에 따른 분류
- 양방향 통신(duplex communication)
- 데이터를 양쪽 방향으로 동시 전송할 수 있는 구조로, 일반적인 통신은 모두 양방향 통신
- 프로세스 간 통신에서는 소켓 통신이 양방향 통신에 해당
- 양방향 통신(duplex communication)
- 반양방향 통신(halfduplex communication)
- 데이터를 양쪽 방향으로 전송할 수 있지만 동시 전송은 불가능하고 특정 시점에 한쪽 방향으로만 전송할 수 있는 구조
- 대표적인 예는 무전기
- 단방향 통신(simplex communication)
- 모스 신호처럼 한쪽 방향으로만 데이터를 전송할 수 있는 구조
- 프로세스 간 통신에서는 공유 메모리/공유 파일 이용 통신, 파이프 이용 통신이 해당
- 방향이 정해져 있다.
- 통신 구현 방식에 따른 분류
- 대기가 있는 통신(blocking communication)
- 동기화를 지원하는 통신 방식(synchronous communication)
- 데이터를 받는 쪽은 데이터가 도착할 때까지 자동으로 대기 상태에 머물러 있음
- block이 되는지 안되는지 파악, 받는 쪽이 다 할 때까지 아무것도 못한다 (block)
- 대기가 없는 통신(non-blocking communication)
- 동기화를 지원하지 않는 통신 방식(asynchronous communication)
- 데이터를 받는 쪽은 바쁜 대기를 사용하여 데이터가 도착했는지 여부를 직접 확인
- 보내 놓고 신경쓰지 않음
- 대기가 있는 통신(blocking 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)하지 않아야 함
- 해결 방법을 제안, 이 자원을 언젠간 써야한다.
- 어떤 프로세스도 무한 대기(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); 문에서 무한 루프에 빠짐
- 프로세스 P1이 lock1=true; 문 실행 후 자신의 CPU 시간 다 씀(타임아웃).
- 교착상태
- 상호 배제와 한정 대기 조건을 충족하는 코드
- 대부분 번갈아 사용하게 됨 → 자원이 비면 사용 가능해야 하지만 여기서에는 불가능
- 대부분 번갈아 사용하게 됨 → 자원이 비면 사용 가능해야 하지만 여기서에는 불가능
- 임계구역 문제의 하드웨어적인 해결 방법
- 검사와 지정(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개의 원소를 가진 배열로 정의. 원소 하나는 읽기용, 하나는 쓰기용으로 사용
네트워킹
관련 없는 프로세스 간 통신에 사용
728x90
반응형
'운영체제' 카테고리의 다른 글
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 |