5주차. 프로세스 동기화 (1) - race condition

2021. 10. 15. 11:12·CS/운영체제 정리

Process Synchronization

Process Synchronization 문제
  • 데이터를 읽고 씀에 있어서 특정 주소 공간에서 값을 가져와서 연산 후 다시 저장을 하는 과정에서 프로세스끼리 충돌이 발생할 수 있다.
  • 공유 데이터의 동시 접근은 데이터의 불일치를 발생할 수 있다.
  • 일관성 유지를 위해 협력 프로세스 간의 실행 순서를 정해주는 메커니즘이 필요하다
Race Condition이란?

A. 두개 이상의 Thread or Process가 공유자원을 병행적으로 읽거나 쓰는 상황을 말한다.

 

Storage(Memory Address Space)를 공유하는 Execution(CPU Process)이 여러개가 있는 경우 Race Condition의 가능성이 있다.

  • Multi-Processor System의 경우
  • 여러 프로세스에서 동시에 공유 메모리(Shared Memory)의 데이터를 사용하는 경우
  • 커널 내부 데이터를 접근하는 루틴들 간
    • 프로세스에서 시스템 콜(인터럽트)이 발생하여 커널의 코드가 수행되면서 커널의 데이터를 접근하는 도중에 프로세스가 바뀌는 경우
    • 커널의 코드가 수행되는 중 인터럽트가 발생되어 해당 인터럽트를 처리하기 위한 커널의 코드가 수행되는 경우

 

OS에서의 Race Condition

  1. 커널 코드 수행 중에 인터럽트가 발생한 경우
  2. Process가 System Call(trap)을 요청하여 커널 모드로 수행 중에 Context Switch가 발생한 경우
  3. Multi-Processor 환경에서 Shared-Memory로 커널 접근 시

1) Kernel code 수행 중에 인터럽트가 발생 한 경우

  1. 커널의 코드가 수행중인 상황에서 count++을 위해 [1. load]를 진행하여 레지스터에 변수를 저장
  2. Interrupt가 발생하여 인터럽트 핸들러를 통해 처리, count-- 를 수행
  3. 1 감소된 count값이 다시 1 증가되길 원했으나, 인터럽트 이전에 레지스터에 저장한 값을 load하여 [2. Inc]이 이어서 실행된다.

→ 결과적으로 1증가된 값이 [3.store] 를 수행하여 저장된다.

 

해결방법

→ 커널 코드 수행중에는 인터럽트 처리 루틴을 수행하지 않고 작업이 끝난 후에 처리하도록 한다.

 

2) Process의 시스템 콜로 인해 커널 모드로 수행 중에 Context Switch 발생 시

  1. P(a)가 User모드로 수행중에 시스템콜을 요청 → Kernel 모드 진입, 커널 코드 상에서 count++ 수행 중
  2. 커널 모드 수행 중에 Time Quantum 만료로 인해 Context Switch 발생 → P(b)로 Context Switch
  3. P(b)에서도 시스템 콜을 통해 커널모드 진입 후 동일한 커널 데이터에 대해 count++ 수행
  4. (b)P의 quantum time 만료 후 P(a) 이전 작업 이어 수행 -> P(b)에서 증가시킨 count값을 또 증가시킨다.

→ 결과적으로 Kernel의 Count++가 중복으로 발생하게 된다

 

해결방법

→ 커널 모드 수행 중에는 프로세스에게서 CPU를 preemptive하게 빼앗지 않도록 한다. 커널 모드 종료 후 해당 프로세스가 유저 모드로 돌아갔을 때 빼앗고 진행.

 

3) Multi Processor 환경 내 공유 메모리 동시 접근 시

멀티 프로세서 환경에서는 공유되는 메모리에 다른 커널들이 동시에 특정 값에 접근할 수 있다

 

해결방법

→ 방법 1) 커널 내부에 있는 각 공유 데이터(다른 커널도 접근할 수 있는)에 접근할 때마다 그 데이터를 lock / unlock 함으로서 다른 커널의 해당 데이터로의 접근을 막는다.

→ 방법 2) 커널에 접근하는 CPU를 매순간 하나만 접근할 수 있도록 한다.
사실상 커널을 CPU가 점유할 때마다 커널을 lock, unlock을 하는 방법이므로, CPU가 여러개이더라도 동시에 커널을 사용할 수 없으므로 비효율적이다.

반응형
저작자표시 (새창열림)

'CS > 운영체제 정리' 카테고리의 다른 글

5주차. 프로세스 동기화 (3) - 세마포어 (busy-wating, block & wakeup)  (0) 2021.10.15
5주차. 프로세스 동기화 (2) - Critical Section Problem & Sloving Algorithm  (0) 2021.10.15
4주차. CPU Scheduling (3) - Multi level Queue  (0) 2021.10.01
4주차. CPU Scheduling (2) - FCFS, SJF, Priority, RR  (1) 2021.10.01
4주차. CPU Scheduling (1) - CPU, I/O burst & 스케줄링의 기준 척도  (0) 2021.10.01
'CS/운영체제 정리' 카테고리의 다른 글
  • 5주차. 프로세스 동기화 (3) - 세마포어 (busy-wating, block & wakeup)
  • 5주차. 프로세스 동기화 (2) - Critical Section Problem & Sloving Algorithm
  • 4주차. CPU Scheduling (3) - Multi level Queue
  • 4주차. CPU Scheduling (2) - FCFS, SJF, Priority, RR
구름뭉치
구름뭉치
구름의 개발일기장
  • 구름뭉치
    구름 개발일기장
    구름뭉치
  • 전체
    오늘
    어제
    • ALL (283)
      • 프로젝트 (23)
        • 토스페이먼츠 PG 연동 시리즈 (12)
        • JWT 방식 인증&인가 시리즈 (6)
        • 스우미 웹 애플리케이션 프로젝트 (1)
        • 스프링부트 기본 보일러 플레이트 구축 시리즈 (2)
        • 마이크로서비스 아키텍쳐 시리즈 (1)
      • 스프링 (43)
        • 스프링부트 API 설계 정리 (8)
        • 스프링부트 RestAPI 프로젝트 (18)
        • 스프링부트 WebSocket 적용기 (3)
        • 스프링 JPA 정리 시리즈 (5)
        • 스프링 MVC (5)
        • 스프링 배치 (2)
        • 토비의 스프링 정리 (2)
      • 기술 학습 (28)
        • 아파치 카프카 (9)
        • 클린 코드 (4)
        • 디자인 패턴의 아름다움 (2)
        • 모던 자바 인 액션 (7)
        • JVM 스레드 딥다이브 (6)
      • Web (25)
        • 정리글 (20)
        • GraphQL 정리글 (2)
        • Jenkins 정리글 (3)
      • 취업 (6)
      • CS (77)
        • 네트워크 전공 수업 정리 (11)
        • OSI 7계층 정리 (12)
        • 운영체제 정리 (19)
        • 데이터베이스 정리 (5)
        • MySql 정리 (17)
        • GoF의 Design Pattern 정리 (12)
      • 알고리즘 (70)
        • 백준 (56)
        • 프로그래머스 (12)
        • 알고리즘 정리본 (1)
      • 기초 지식 정리 (2)
      • 일상 (8)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    류블라냐
    레이저
    마우스 패드
    마우스
    mx master s3 for mac
    크로아티아
    키보드 손목 받침대
    동유럽
    부다페스트
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
구름뭉치
5주차. 프로세스 동기화 (1) - race condition
상단으로

티스토리툴바