모니터의 개념
모니터는 세마포어의 단점을 해결하고자 고안된 고급 동기화 메커니즘이다.
모니터는 프로그래밍 언어 수준에서 지원되며,
고수준의 추상화를 제공하여 프로그래머가 저수준의 동기화 작업에 직접 관여할 필요가 없도록 한다.
이로 인해 코드의 복잡성을 줄이고, 오류 가능성을 감소시킬 수 있다.
모니터의 작동 원리
모니터는 내부적으로 한 번에 하나의 프로세스만이 모니터에 정의된 연산을 실행할 수 있도록 제한한다.
모든 공유 변수는 모니터 내에 캡슐화되어 있으며,
이 변수들에 대한 접근은 모니터가 제공하는 절차(함수)를 통해서만 가능하다.
모니터는 자동으로 임계 구역에 대한 진입과 퇴출을 관리한다.
Java에서의 모니터 사용
Java에서는 synchronized 키워드를 사용하여 메소드나 코드 블록을 모니터로 만들 수 있다.
synchronized 키워드가 사용된 메소드나 객체의 코드 블록은 한 번에 한 스레드만 실행할 수 있다.
이는 Java가 모니터를 구현하는 내부 메커니즘을 통해 자동으로 처리된다.
Java 예제 - 은행 계좌 클래스
아래는 Java에서 synchronized를 사용하여 은행 계좌 클래스의 입금 및 출금 메소드를 동기화하는 간단한 예제다.
public class BankAccount {
private int balance = 0;
// 입금 메소드를 동기화
public synchronized void deposit(int amount) {
balance += amount;
System.out.println("Deposited: " + amount + ", Balance: " + balance);
}
// 출금 메소드를 동기화
public synchronized void withdraw(int amount) {
if (balance >= amount) {
balance -= amount;
System.out.println("Withdrawn: " + amount + ", Balance: " + balance);
} else {
System.out.println("Insufficient funds");
}
}
}
이 코드에서 deposit()와 withdraw() 메소드는 synchronized 키워드를 사용하여 동기화된다.
이는 해당 객체의 잠금(lock)을 획득한 단일 스레드만 이 메소드를 실행할 수 있음을 의미한다.
다른 스레드는 잠금이 해제될 때까지 대기해야 한다.
예를 들어, 한 스레드가 BankAccount 객체의
deposit() 메소드를 실행 중이라면, 이 객체의 잠금이 획득된다.
이 상태에서 다른 스레드가 동일한 BankAccount 객체의 withdraw() 메소드를 호출하려고 하면,
첫 번째 스레드가 deposit() 메소드를 완료하고 객체의 잠금을 해제할 때까지 기다려야 한다.
이는 객체 단위로 잠금이 이루어지므로,
deposit() 메소드의 실행 중에는 해당 객체의
다른 synchronized 메소드(여기서는 withdraw())가 실행될 수 없다.
이러한 방식으로 Java는 객체의 상태를 다중 스레드 환경에서 안전하게 보호한다.
결론
모니터는 개발자가 동기화를 처리하는 복잡성을 크게 줄여주며,
코드의 안전성과 신뢰성을 높여준다.
Java의 synchronized 키워드는 모니터 개념을 쉽고 효과적으로 사용할 수 있는 강력한 도구다.
이를 통해 개발자는 동기화를 명시적으로 관리하는 대신,
언어의 내장 기능을 활용하여 보다 안전하고 간결한 동시성 코드를 작성할 수 있다.
'운영체제' 카테고리의 다른 글
[운영체제] 세마포어(Semaphore) (0) | 2024.06.04 |
---|---|
[운영체제] 공유자원과 임계구역 (0) | 2024.06.03 |
[운영체제] 프로세스 간 통신(IPC, Inter-Process Communication) (0) | 2024.05.31 |
[운영체제] MLFQ (Multi-Level Feedback Queue) 스케줄링 알고리즘 (0) | 2024.05.30 |
[운영체제] Round Robin (RR) 스케줄링 알고리즘 (0) | 2024.05.29 |