공유자원과 경쟁 상태, 임계영역

2024. 10. 31. 20:20·Computer Science/Operating System
반응형

공유 자원 (Shared Resource)

공유자원이란 시스템 안에서 각 프로세스, 스레드가 함께 접근할 수 있는 자원을 말한다.

 

공유 자원의 특징

  • 다중접근
    여러 프로세스나 스레드가 동시에 접근할 수 있기 때문에 관리가 필요.
  • 데이터 일관성
    올바르게 관리되지 않으면 데이터 일관성이 깨질 수 있음
  • 동기화 필요
    여러 접근을 조율하기 위한 동기화 매커니즘 필요

공유 자원의 예시

  • 여러 스레드가 동시에 접근하는 전역변수
  • 여러 프로세스가 동시에 접근하는 파일
  • 메모리, 파일, 데이터베이스...

 

 

경쟁 상태 (Race Condition)

두개 이상의 프로세스나 스레드가 공유 자원에 동시에 접근할 때 발생하는 문제.

동시에 접근을 시도할 때 타이밍이 예상되는 결과 값에 영향을 줄 수 있는 상태.

 

이를 잘 해결하지 못하면 데이터 정합성, 데이터 무결성을 지키지 못할 수 있음.

  • 데이터 정합성: 예상되는 데이터값과 다른 것 (0원으로 읽어야 하는데 1000원으로 읽음)
  • 데이터 무결성 : 데이터의 규칙을 위반하면 안되는 것. (0원인데 출금 함)

 

 

임계 영역 (Critical Section)

공유 자원에 접근하는 코드의 특정 부분을 의미. 이 영역은 한번에 하나의 프로세스나 스레드만 접근할 수 있도록 해야한다.

 

임계 영역의 특징

  • 상호 배제: 임계 영역에 한 번에 하나의 프로세스나 스레드만 진입할 수 있도록 보장해야 합니다.
  • 잠금 메커니즘: 뮤텍스, 세마포어 등의 동기화 메커니즘을 사용하여 임계 영역을 보호합니다.
  • 성능 고려: 너무 많은 잠금은 성능 저하를 초래할 수 있으므로 적절하게 설계해야 합니다.

예시 코드 (Java)

두 개의 스레드가 동시에 공유 자원에 접근하여 counter 변수를 증가시키는 상황을 다뤄보자.

synchronized 키워드를 사용하여 임계 영역을 보호할 수 있다!

public class Counter {
    private int counter = 0; // 공유자원

	// increment() 메서드에 synchronized를 사용하여 임계영역 보호
    public synchronized void increment() {
        counter++;
    }

    public int getValue() {
        return counter;
    }

    public static void main(String[] args) {
        Counter counter = new Counter(); // Counter 객체 생성

		// 두개의 스레드 생성하고 CounterRunnable 실행
        Thread thread1 = new Thread(new CounterRunnable(counter));
        Thread thread2 = new Thread(new CounterRunnable(counter));
        thread1.start();
        thread2.start();

        try {
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Final counter value: " + counter.getValue());
    }
}


class CounterRunnable implements Runnable {
    private final Counter counter;

    public CounterRunnable(Counter counter) {
        this.counter = counter; // 생성자 호출: Counter 객체를 받아서 저장
    }

    @Override
    public void run() {
        for (int i = 0; i < 100000; i++) {
            counter.increment(); // increment()메서드를 호출하여 counter 값 증가.
        }
    }
}

최종적으로 counter 값은 200,000이다. 여기서 중요하게 살펴야 할 것은 synchronized 키워드를 사용하여 increment() 메서드를 임계 영역으로 보호한다는 것이다.

728x90
반응형

'Computer Science > Operating System' 카테고리의 다른 글

교착 상태(deadlock)와 은행원 알고리즘  (0) 2024.11.02
경쟁상태 해결하기 - 뮤텍스, 세마포어, 모니터  (0) 2024.11.01
멀티태스킹(Multitasking)과 CPU 스케줄링(선점형, 비선점형, 라운드로빈, 우선순위 기반 스케줄링, FIFO, SFJ ...)  (0) 2024.10.30
프로세스의 상태  (0) 2024.10.29
IPC(Inter-Process Communication)  (0) 2024.10.29
'Computer Science/Operating System' 카테고리의 다른 글
  • 교착 상태(deadlock)와 은행원 알고리즘
  • 경쟁상태 해결하기 - 뮤텍스, 세마포어, 모니터
  • 멀티태스킹(Multitasking)과 CPU 스케줄링(선점형, 비선점형, 라운드로빈, 우선순위 기반 스케줄링, FIFO, SFJ ...)
  • 프로세스의 상태
settong
settong
    250x250
  • settong
    개 발 자 국
    settong
  • 전체
    오늘
    어제
    • 전체보기 (202)
      • Computer Science (50)
        • Network (7)
        • Operating System (18)
        • Data Structure (9)
        • Database (11)
        • Algorithm (5)
      • Language (17)
        • Java (17)
        • Javascript (0)
        • Python (0)
      • Devops (20)
        • AWS (0)
        • Naver Cloud (16)
        • CICD (3)
        • 웹 서버 관리 (1)
      • Front (0)
        • React (0)
      • Backend (5)
        • Spring (5)
      • 코딩 테스트 정복기 (110)
        • 백준 (51)
        • 프로그래머스 (53)
        • 기타 (6)
      • etc (0)
      • 경제 상식 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    다이나믹프로그래밍
    BFS
    프로그래머스
    ncp200
    Network
    DFS
    lcs
    github actions
    다익스트라
    벨만포드
    Spring Boot
    완전탐색
    분할정복
    백준
    CI/CD
    백트래킹
    집합
    해시
    ncp
    ncp202
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
settong
공유자원과 경쟁 상태, 임계영역
상단으로

티스토리툴바