운영체제 26

스레드 풀과 Executor 프레임워크 - 2

ExecutorService 우아한 종료서비스를 안정적으로 종료하는 것도 매우 중요하다. 이렇게 문제 없이 우아하게 종료하는 방식을 graceful shutdown 이라 한다.  서비스 종료void shutdown()새로운 작업을 받지 않고, 이미 제출된 작업을 모두 완료한 후에 종료한다.논 블로킹 메서드(이 메서드를 호출한 스레드는 대기하지 않고 즉시 다음 코드를 호출한다.) List shutdownNow()실행 중인 작업을 중단하고, 대기 중인 작업을 반환하며 즉시 종료한다.실행 중인 작업을 중단하기 위해 인터럽트를 발생시킨다.논 블로킹 메서드 서비스 상태 확인boolean isShutdown(): 서비스가 종료되었는지 확인한다.boolean isTerminated(): shutdown(), shut..

운영체제 2024.12.21

스레드 풀과 Executor 프레임워크

스레드를 직접 사용할 때의 문제점스레드 생성 시간으로 인한 성능 문제스레드 관리 문제Runnable 인터페이스의 불편함 1. 스레드 생성 비용으로 인한 성능 문제스레드를 사용하려면 먼저 스레드를 생성해야 한다. 그런데 스레드는 다음과 같은 이유로 매우 무겁다. 메모리 할당 : 각 스레드는 자신만의 호출 스택(call stack)을 가지고 있어야 한다. 이 호출 스택은 스레드가 실행되는 동안 사용하는 메모리 공간이다. 따라서 스레드를 생성할 때는 이 호출 스택을 위한 메모리를 할당해야 한다. 운영체제 자원 사용 : 스레드를 생성하는 작업은 운영체제 커널 수준에서 이루어지며, 시스템 콜(system call)을 통해 처리된다. 이는 CPU와 메모리 리소스를 소모하는 작업이다. 운영체제 스케줄러 설정 : 새로..

운영체제 2024.12.21

원자적 연산

원자적 연산 (atomic operation)의 의미는 해당 연산이 더 이상 나눌 수 없는 단위로 수행된다는 것을 의미한다. 즉, 원자적 연산은 중단되지 않고, 다른 연산과 간섭 없이 완전히 실행되거나 전혀 실행되지 않는 성질을 가지고 있다. 쉽게 이야기해서 멀티스레드 상황에서 다른 스레드의 간섭 없이 안전하게 처리되는 연산이라는 뜻이다. 성질을 가지고 있다. 쉽게 이야기해서 멀티스레드 상황에서 다른 스레드의 간섭 없이 안전하게 처리되는 연산이라는 뜻 synchronized 블록이나 Lock 등을 사용해서 안전한 임계 영역을 만들어야 한다. public interface IncrementInteger { void increment(); int get();}public class BasicInt..

운영체제 2024.12.20

생산자 소비자 문제

public interface BoundedQueue { void put(String data); String take();} BoundedQueue: 버퍼 역할을 하는 큐의 인터페이스이다.put(data) : 버퍼에 데이터를 보관한다. (생산자 스레드가 호출하고, 데이터를 생산한다.)take(): 버퍼에 보관된 값을 가져간다. (소비자 스레드가 호출하고, 데이터를 소비한다.) import java.util.ArrayDeque;import java.util.Queue;import static util.MyLogger.log;public class BoundedQueueV implements BoundedQueue{ private final Queue queue = new Array..

운영체제 2024.12.18

concurrent Lock

synchronized 단점무한 대기 :  BLOCKED 상태의 스레드는 락이 풀릴 때 까지 무한 대기한다.특정 시간까지만 대기하는 타임아웃X중간에 인터럽트X공정성: : 락이 돌아왔을 때 BLOCKED 상태의 여러 스레드 중에 어떤 스레드가 락을 획득할 지 알 수 없다. 최악의 경우 특정 스레드가 너무 오랜기간 락을 획득하지 못할 수 있다. LockSupport 를 사용하면 synchronized 의 가장 큰 단점인 무한 대기 문제를 해결할 수 있다.  LockSupport 는 스레드를 WAITING로 변경하는데 WAITING이란 상태는 누가 깨워주기 전까지는 계속 대기한다. 그리고 CPU 실행 스케줄링에 들어가지 않는다.park() : : 스레드를 WAITING 상태로 변경한다.parkNanos(nan..

운영체제 2024.12.16

Synchronized

멀티스레드를 사용할 때 가장 주의해야 할 점은, 같은 자원(리소스)에 여러 스레드가 동시에 접근할 때 발생하는 동시성 문제이다. 참고로 여러 스레드가 접근하는 자원을 공유 자원이라고 한다. 대표적인 공유 자원은 인스턴스의 필드(멤버 변수)이다. 멀티스레드를 사용할 때는 이런 공유 자원에 대한 접근을 적절하게 동기화(synchronization)해서 동시성 문제가 발생하지 않게 방지하는 것이 중요하다. import static util.MyLogger.log;import static util.ThreadUtils.sleep;public class BankMain { public static void main(String[] args) throws InterruptedException { ..

운영체제 2024.12.15

체크 예외 재정의

Runnable 인터페이스의 run() 메서드를 구현할 때 InterruptedException 체크 예외를 밖으로 던질 수 없는 이유 체크 예외부모 메서드(상위 타입)가 체크 예외를 던지지 않는 경우, 재정의된 자식 메서드도 체크 예외를 던질 수 없다.자식 메서드는 부모 메서드가 던질 수 있는 체크 예외의 하위 타입만 던질 수 있다.언체크(런타임) 예외예외 처리를 강제하지 않으므로 상관없이 던질 수 있다.자바는 왜 이런 제약을 두는 것일까?부모 클래스의 메서드를 호출하는 클라이언트 코드는 부모 메서드가 던지는 특정 예외만을 처리하도록 작성된다. 자식 클래스가 더 넓은 범위의 예외를 던지면 해당 코드는 모든 예외를 제대로 처리하지 못할 수 있다. 이는 예외 처리의 일관성을 해치고, 예상하지 못한 런타임 ..

운영체제 2024.11.29