※ 해당 글은 아래의 포스트를 읽은 다음, 읽는 것이 더 좋습니다. 

https://taeyoungcoding.tistory.com/345

 

프로세스 동기화

컴퓨터 환경에서 여러 프로세스가 동시에 실행될 때, 공동의 목적을 올바르게 수행하기 위해 서로 협력하고 영향을 주고 받는다. 예를 들어, 워드 프로세서에서는 사용자 입력을 받는 프로세스,

taeyoungcoding.tistory.com

프로세스의 동기화는 어떻게 이루어질까? 어떻게 해야 임계 구역에 오직 하나의 프로세스만 진입하게 하고, 올바른 실행 순서를 보장할 수 있을까? 이를 위해 동기화를 위한 대표적인 도구인 뮤텍스 락, 세마포,모니터가 있다. 

 

< 뮤텍스 락 (Mutex Lock) > 

뮤텍스 락은 프로세스의 동기화를 위한 가장 기본적인 도구이다. Mutex란 'Mutual Exclusion'의 약자로, 한 번에 하나의 프로세스만 공유 자원에 접근할 수 있게 하는 기법을 말한다. 이는 동시에 실행되는 여러 프로세스 또는 스레드가 동일한 자원을 동시에 사용하려 할 때 발생하는 경쟁 조건을 방지하는데 사용된다.

 

Java에서는 'synchronized' 키워드를 사용해 뮤텍스 락을 구현할 수 있고, Lock 인터페이스를 이용하는 방법이 있다. 

 

synchronized 키워드 : 이 키워드를 메서드 또는 블록 앞에 사용하면 해당 메서드는 블록에 동시에 하나의 스레드만 접근할 수 있다. 'synchronized' 키워드는 내부적으로 락을 관리하므로 사용자가 락을 명시적으로 획득하거나 해제하는 코드를 작성할 필요가 없다. 그러나 'synchronized' 키워드를 사용할 때는 잘못된 사용으로 인해 교착 상태(deadlock)이 발생할 가능성을 주의해야 한다.

 

[synchronized 키워드를 이용한 뮤텍스 락 구현 코드 1]

class SharedResource {
    synchronized void accessResource() {
        // 임계 영역
    }
}

[synchronized 키워드를 이용한 뮤텍스 락 구현 코드 2]

class SharedResource {
    synchronized void access(String threadName) {
        System.out.println(threadName + " is accessing shared resource");
        // 작동하는 코드 여기 넣기
        System.out.println(threadName + " is leaving shared resource");
    }
}

이 코드에서 synchronized 키워드는 한 번에 한 스레드만 'access'메서드를 실행할 수 있게 해준다. 이런 방식은 "영화관에서 한 번에 하나의 티켓만 팔 수 있다"는 개념과 유사하다.

 

 

Lock 인터페이스 (ReentrantLock 클래스): 

java.util.concurrent.locks 패키지에 있는 Lock 인터페이스와 그 구현체인 ReentrantLock 클래스를 사용하면 뮤텍스 락을 구현할 수 있다. 이 방법을 사용하면, 락의 획득과 해제를 명시적으로 제어할 수 있다. 또한, 'tryLock'메서드를 사용해 락을 시도적으로 획득할 수 있는 옵션이 있어 데드락을 피하는 데 도움이 될 수 있다.

 

[ReentrantLock 클래스를 구현해서 만든 뮤텍스 락]

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

class SharedResource {
    private Lock lock = new ReentrantLock();

    void accessResource() {
        lock.lock();
        try {
            // 임계 영역
        } finally {
            lock.unlock();
        }
    }
}

< 세마포어 (Semaphore) >

세마포어는 뮤텍스 락과 비슷하게 공유 자원에 대한 접근을 제어한다. 그러나 세마포어는 한 번에 여러 개의 동일한 자원을 사용할 수 있는 프로세스나 스레드의 수를 제한할 수 있다. "한 번에 n 개의 티켓을 팔 수 있는 영화관"과 유사한 개념이다.

 

자바에서는 'Semaphore' 클래스를 사용해 세마포어를 구현할 수 있다.

import java.util.concurrent.Semaphore;

class SharedResource {
    private Semaphore semaphore = new Semaphore(3);

    void access(String threadName) {
        try {
            semaphore.acquire();
            System.out.println(threadName + " is accessing shared resource");
            // 여기다가 작동할 코드넣기
            System.out.println(threadName + " is leaving shared resource");
            semaphore.release();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

< 모니터 (Monitor) >

모니터는 뮤텍스 락과 세마포어를 확장한 개념이다. 모니터는 공유 자원에 대한 접근을 제어하는 동시에, 특정 조건을 만족할 때까지 프로세스나 스레드를 대기 상태로 만든다. 이것은 "영화가 시작할 때까지 대기실에서 기다리는 고객"과 유사한 개념이다.

C#에서는 Monitor 클래스를 사용해 모니터를 구현할 수 있다.

using System;
using System.Threading;

class SharedResource {
    private static readonly object _lock = new object();

    public void Access(string threadName) {
        Monitor.Enter(_lock);
        try {
            Console.WriteLine($"{threadName} is accessing shared resource");
            // do some work here
            Console.WriteLine($"{threadName} is leaving shared resource");
        } finally {
            Monitor.Exit(_lock);
        }
    }
}

 

Reference: https://www.guru99.com/mutex-vs-semaphore.html

 

Mutex vs Semaphore – Difference Between Them

Mutex vs Semaphore: The key difference between Mutex and Semaphore is that Mutex is a locking mechanism whereas Semaphore is a signaling mechanism.

www.guru99.com

혼자 공부하는 컴퓨터 구조+운영체제

https://product.kyobobook.co.kr/detail/S000061584886

 

혼자 공부하는 컴퓨터 구조+운영체제 | 강민철 - 교보문고

혼자 공부하는 컴퓨터 구조+운영체제 | 혼자 해도 충분합니다! 1:1 과외하듯 배우는 IT 지식 입문서42명의 베타리더 검증으로, ‘함께 만든’ 입문자 맞춤형 도서이 책은 독학으로 컴퓨터 구조와

product.kyobobook.co.kr

 

'컴퓨터구조,운영체제' 카테고리의 다른 글

CPU 레지스터(Register)  (0) 2023.06.07
교착 상태(Dead Lock)  (0) 2023.06.07
프로세스 동기화  (0) 2023.06.07
CPU 간편 소개  (0) 2023.04.25
Memory란?  (0) 2023.04.13

+ Recent posts