[CS/운영체제] 스레드기초 - 4부

황제연·2025년 6월 21일
0

CS학습

목록 보기
112/193
post-thumbnail

프로세스 vs 스레드

운영체제에서 프로그램이 실행될 때의 최소 단위는 프로세스(Process)와 스레드(Thread)로 나뉩니다

구분프로세스(Process)스레드(Thread)
정의실행 중인 프로그램의 독립적인 인스턴스프로세스 내에서 실행되는 작업 단위
메모리독립된 메모리 영역 소유(코드, 데이터, 힙, 스택)프로세스 내의 힙, 데이터 영역 공유, 스택은 별도 소유
컨텍스트 스위칭 오버헤드크다 (메모리 공간 전환 필요)작다 (공유 메모리로 전환 빠름)
통신 방식IPC(파이프, 소켓 등)공유 메모리, 스레드 간 변수 직접 접근 가능
안정성하나의 프로세스 종료 시 다른 프로세스는 영향 없음하나의 스레드 오류 시 전체 프로세스에 영향 가능

동시성 vs 병렬성

동시성(Concurrency)

  • 하나의 CPU로 여러 작업이 동시에 진행되는 것처럼 보이는 개념입니다
  • 작업을 빠르게 전환하며 처리함으로써 실시간성을 확보합니다
  • 예: 멀티태스킹, UI 이벤트 처리 등

병렬성(Parallelism)

  • 여러 CPU(Core)를 활용해 작업을 동시에 처리하는 개념입니다
  • 멀티코어 프로세서 환경에서 성능 향상하는 것이 목적입니다
  • 예: 멀티코어 기반 데이터 병렬 처리(MapReduce 등)

사용자 스레드 vs 데몬 스레드

자바에서는 스레드를 사용자 스레드와 데몬 스레드로 구분합니다

구분사용자 스레드데몬 스레드
JVM 종료 조건모든 사용자 스레드 종료 시 JVM 종료사용자 스레드 종료 시 데몬도 종료
용도일반적 작업 수행 (비즈니스 로직 등)백그라운드 작업(로그, GC 등) 수행
예시Main Thread, Worker ThreadGarbage Collector Thread 등

자바에서 데몬 설정법

Thread daemonThread = new Thread(() -> {
    while(true) {
        // 백그라운드 작업
    }
});
daemonThread.setDaemon(true);
daemonThread.start();

컨텍스트 스위칭 오버헤드

컨텍스트 스위칭은 CPU가 다른 작업으로 전환할 때 수행하는 과정으로,
다음과 같은 오버헤드를 발생시키빈다

  • 상태 저장 및 복원: CPU 레지스터, 프로그램 카운터 저장/복구 비용
  • 캐시 성능 저하: 캐시 미스 증가로 인한 성능 저하
  • OS 스케줄러 실행: 새로운 스레드 선정 작업 수행 비용

스레드의 수가 많아지고 전환이 빈번할수록 성능이 저하됩니다

스레드 우선순위

자바는 1(MIN) ~ 10(MAX)까지 우선순위를 부여합니다.

Thread thread = new Thread(() -> {});
thread.setPriority(Thread.MAX_PRIORITY);
  • 단, 우선순위는 운영체제에 따라 무시되거나 영향이 적을 수 있습니다
  • 실무적으로 정확한 스케줄링을 위해 우선순위에만 의존하는 것은 좋지 않습니다

CPU Affinity

CPU Affinity는 특정 스레드를 특정 CPU 또는 코어에 고정하여 캐시 활용 효율성을 높이고 성능을 향상시키는 기법입니다

자바에서는 기본 API로 제공하지 않아 JNI 또는 JNA 등 네이티브 접근 방법을 사용해야 합니다

  • 장점: 컨텍스트 스위칭과 캐시 미스를 감소
  • 단점: CPU 로드 불균형 가능성 존재

Thread.yield(), Thread.sleep()

Thread.yield()

  • 현재 스레드가 실행 중인 CPU 점유를 잠시 포기하고 다시 스케줄링 대기 큐에 들어가는 메소드입니다
  • 다른 스레드에게 실행 기회 제공하지만, 반드시 보장되지는 않습니다
  • 자주 사용하는 건 권장되지 않습니다

Thread.sleep(long millis)

  • 지정된 시간 동안 스레드를 확실히 중단시킵니다
  • 타이머 기반 인터럽트를 통해 CPU에서 제외됩니다
  • 중단 시 InterruptedException 발생 가능합니다
Thread.sleep(1000); // 1초 일시 정지
Thread.yield(); // CPU 점유권 양보 요청
profile
Software Developer

0개의 댓글