다중 프로그래밍 시스템
여러 개의 프로세스들이 존재
프로세스들은ㅇ 서로 독립적으로 동작
공유 자원 또는 데이터가 있을 때, 문제 발생 가능
동기화 (Synchronization)
프로세스들이 서로 동작을 맞추는 것
프로세스들이 서로 정보를 공유하는 것
비동기적 (Asynchronous)
프로세스들이 서로에 대해 모름
병행적 (Concurrent)
여러 개의 프로세스들이 동시에 시스템에 존재
병행 수행중인 비동기적 프로세스들이 공유자원에 동시 접근할 때 문제가 발생할 수 있음
공유 데이터 (Shared data/Critical data)
여러 프로세스들이 공유하는 데이터
임계 영역 (Critical section)
공유 데이터를 접근하는 코드 영역 (code segment)
프로세스들이 동시에 작업하면 안 됨
어떤 프로세스가 임계영역에 들어가면 다른 프로세스는 임계영역 밖에서 기다려야하며 임계영역의 프로세스가 나와야 들어갈 수 있음
상호배제 (Mutual exclusion)
둘 이상의 프로세스가 동시에 임계영역에 진입하는 것을 막는 것
한정대기
어떤 프로세스도 무한 대기하지 않아야 함
진행의 융통성
한 프로세스가 다른 프로세스의 진행을 방해해서는 안됨
세마포어
임계구역에 진입하기 전에 스위치를 사용 중으로 놓고 임계구역으로 들어감
이후에 도착하는 프로세스는 앞의 프로세스가 작업을 마칠 때까지 기다림
프로세스가 작업을 마치면 다음 프로세스에 임계구역을 사용하라는 동기화 신호를 보냄
세마포어 내부 코드
Semaphore(n) : 전역 변수 RS를 n으로 초기화, RS에는 현재 사용 가능한 자원의 수가 저장
P() : 잠금을 수행하는 코드로 RS가 0보다 크면(사용 가능한 자원이 있으면) 1만큼 감소시키고 임계구역에 진입, 만약 RS가 0보다 작으면(사용 가능한 자원이 없으면) 0보다 커질 때까지 기다림
V() : 잠금 해제와 동기화를 같이 수행하는 코드로, RS 값을 1 증가시키고 세마포어에서 기다리는 프로세스에게 임계구역에 진입해도 좋다는 wake_up 신호를 보냄
공유자원이 여러개 일때 세마포어 사용 예
[출처] https://drive.google.com/file/d/1WoDL7Slth2sN2_Qzj6Oij0ZddU6dkAht/view