동시성(Concurrency) | 병렬성(Parallelism) | |
---|---|---|
정의 | · 서로 다른 작업들이 동시에 처리하는 것처럼 보이게 하는 것 · 실제로는 번갈아가며 실행되며 서로 영향을 미침 | · 여러 작업을 실제로 동시에 처리하는 것 · 작업들이 각각 독립적으로 실행되며 서로 영향을 주지 않음 |
동작 방식 | 싱글 코어에서 멀티 스레드를 동작 | 멀티 코어에서 멀티 스레드를 동작 |
개념적 차이 | 논리적 개념 | 물리적 개념 |
🔎 예시
프로세스 A가 어떤 작업을 처리한 후 프로세스 B가 이어서 처리해야 하는 코드가 있다면, 프로세스 B는 프로세스 A가 해당 작업의 처리를 마칠 때까지 특정 코드를 수행하지 않고 기다리도록 함
🔎 예시
계좌의 잔고를 읽고 입금액을 더한 후, 더해진 액수를 계좌에 쓰는 입금과정에 해당하는 코드
뮤텍스 | 세마포어 | |
---|---|---|
개념 | · 자원을 점유한 프로세스나 스레드가 잠시 소유했다가 작업이 끝나면 반환 · 세마포어의 바이너리 값을 가짐 | 자원의 상태를 나타내는 일종의 변수(소유 X) |
호환 | X(세마포어가 될 수 없음) | O(뮤텍스가 될 수 있음) |
생명주기 | · 시스템 범위에 걸쳐있음 · 파일 시스템 상의 파일 형태로 존재 | · 프로세스 범위를 가짐 · 프로그램이 종료될 때 자동으로 삭제 |
사용범위 | 동기화 대상이 하나일 때 | 동기화 대상이 여러개일 때 |
synchronized
, wait()
, notify()
)wait
, sifnal
설정 없이 함수 앞에 synchronized
키워드를 사용하기만 하면 상호배제하여 메서드 작업 수행다음 조건을 모두 충족할 경우 발생
조건 | 설명 |
---|---|
상호배제 (Mutual exclusion) | 프로세스들이 필요로 하는 자원에 대해 배타적인 통제권을 요구함 |
점유대기 (Hold and wait) | 프로세스가 할당된 자원을 가진 상태에서 다른 자원을 기다림 |
비선점 (No preemption) | 프로세스가 어떤 자원의 사용을 끝낼 때까지 그 자원을 뺏을 수 없음 |
순환대기 (Circular wait) | 각 프로세스는 순환적으로 다음 프로세스가 요구하는 자원을 가지고 있음 |
✅ 방법
방법 | 설명 |
---|---|
상호배제 조건 제거 | · 교착 상태는 두 개 이상의 프로세스가 공유 가능한 자원을 사용할 때 발생 · 공유 불가능한, 즉 상호 배제 조건을 제거하면 교착 상태를 해결할 수 있음 |
점유와 대기 조건 제거 | 한 프로세스에 수행되기 전에 모든 자원을 할당시키고 나서 점유하지 않을 때는 다른 프로세스가 자원을 요구하도록 하는 방법 |
비선점 조건 제거 | 비선점 프로세스에 대해 선점 가능한 프로토콜을 만들어 줌 |
환형 대기 조건 제거 | · 자원 유형에 따라 순서를 매김 · 대부분의 접근들은 이 조건을 막음으로써 동작함 |
✅ 문제점
✅ 자원 할당 그래프 알고리즘(Resource Allocation Graph Algorithm)
정의
자료 구조
정점 집합 𝑉
와 edge 집합 𝐸
로 구성(G = (V, E)
)
𝑉의 노드 유형
노드 유형 | 설명 |
---|---|
𝑇 = {𝑇1, 𝑇2, ⋯, 𝑇𝑛} | 시스템의 모든 활성 스레드 집합 |
𝑅 = {𝑅1, 𝑅2, ⋯, 𝑇𝑚} | 시스템의 모든 리소스 집합 |
directed edge
유형 | 상태 | 설명 |
---|---|---|
request edge | Ti → Rj | 스레드 Ti가 Rj의 인스턴스를 요청 |
assignment edge | Rj → Ti | Rj의 인스턴스가 스레드 Ti에 할당 |
교착 상태 판별
cycle 존재 여부 | 교착 상태 |
---|---|
X | 없음 |
O | 있을 수도 있고 없을 수도 있음 |
단점
✅ 은행원 알고리즘(Banker's Algorithm)
정의
자료 구조
유형 | 설명 | 예시 |
---|---|---|
Available (𝑨𝒗𝒂𝒊𝒍𝒂𝒃𝒍𝒆[𝒎]) | 사용 가능한 자원의 수 | 𝐴𝑣𝑎𝑖𝑙𝑎𝑏𝑙𝑒[𝑗] == 𝑘 → 𝑅𝑗의 𝑘개의 인스턴스 사용 가능 |
Max (𝑴𝒂𝒙[𝒏 × 𝒎]) | 프로세스 별 최대 자원의 요구 개수 | 𝑀𝑎𝑥[𝑖][𝑗] == 𝑘 → 𝑇𝑖가 𝑅𝑗의 최대 𝑘개의 인스턴스 요청 가능 |
Allocation (𝑨𝒍𝒍𝒐𝒄𝒂𝒕𝒊𝒐𝒏[𝒏 × 𝒎]) | 현재 프로세스 별 할당되어 있는 자원의 수 | 𝐴𝑙𝑙𝑜𝑐𝑎𝑡𝑖𝑜𝑛[𝑖][𝑗] == 𝑘 → 𝑇𝑖가 현재 𝑅𝑗의 𝑘개의 인스턴스를 할당받고 있음 |
Need (𝑵𝒆𝒆𝒅[𝒏 × 𝒎]) | 프로세스 별 남아있는 자원의 수 | 𝑁𝑒𝑒𝑑[𝑖][𝑗] == 𝑘 → 𝑇𝑖가 𝑅𝑗의 인스턴스를 𝑘개 더 요청 |
알고리즘
Safety Algorithm
현재 system의 snapshot이 safety한가를 판별
Resource-Request Algorithm
단점
✅ 방식
✅ single instance
💡 wait-for graph
Resource Allocation Graph에서 변형된 형태
✅ multiple instances
wait-for graph로 해결이 불가능함
Banker's Algorithm과 흡사한 알고리즘을 적용함
자료 구조
유형 | 설명 | 예시 |
---|---|---|
𝑨𝒗𝒂𝒊𝒍𝒂𝒃𝒍𝒆[𝒎] | 사용 가능한 자원의 수 | - |
𝑨𝒍𝒍𝒐𝒄𝒂𝒕𝒊𝒐𝒏[𝒏 × 𝒎] | 현재 프로세스 별 할당되어 있는 자원의 수 | - |
𝑹𝒆𝒒𝒖𝒆𝒔𝒕[𝒏 × 𝒎] | 각 스레드의 현재 요청 | 𝑅𝑒𝑞𝑢𝑒𝑠𝑡[𝑖][𝑗] == 𝑘 → 𝑇𝑖가 𝑅𝑗의 인스턴스를 𝑘개 더 요청 |
Detection Algorithm