개발일지

프로세스 동기화와 동기화기법 본문

운영체제

프로세스 동기화와 동기화기법

딸기아사이레모네이드리프레셔 2024. 1. 9. 17:00
728x90

목차

    동기화란?

    운영체제 동기화는 여러 프로세스가 동시에 실행될 때 발생할 수 있는 문제를 해결하고 시스템의 안정성과 일관성을 유지하기 위해 필요하다.

    사전적 의미 : 프로세스들의 수행 시기를 맞추는 것

    구체적인 정의

    1️⃣ 실행 순서 제어를 위한 동기화 : 프로세스를 올바른 순서대로 실행하기
    
    2️⃣ 상호 배제를 위한 동기화 : 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하기

     

    1. 실행 순서 제어를 위한 동기화 : reader writer problem

    Writer : Book.txt 파일에 값을 저장하는 프로세스

    Reader : Book.txt 파일에 저장된 값을 읽어들이는 프로세스

     

    여러 프로세스가 공유 데이터를 동시에 읽을 수는 있지만, 데이터를 쓰는 경우에는 동시에 접근해서는 안된다.

    Reader와 Writer 프로세스는 무작정 아무렇게나 실행되어선 안된다. 실행의 순서가 있기 때문이다. (Reader 프로세스는 ‘Book.txt 안에 값이 존재한다’는 특정 조건이 만족되어야만 실행 가능하다. 즉, Writer 프로세스가 실행이 끝난 다음에야 비로소 실행이 된다. )

    2. 상호 배제를 위한 동기화 : Bank account problem,Producer & Consumer problem

    Bank account problem,Producer


    공유가 불가능한 자원의 동시 사용을 피하기 위한 동기화를 의미한다. 즉, 한번에 하나의 프로세스만 접근해야 하는 자원에 동시 접근을 피하기 위한 동기화를 의미한다.

    한 프로세스가 잔액이라는 자원에 접근했을 때, 다른 프로세스는 자원 접근을 막아야지 예시와 같은 일이 발생하지 않는다.

    두 개의 프로세스가 같은 자원에 접근했을 때, 발생하는 문제

    하나의 자원에 한번의 프로세스만 접근하도록 허용

    Producer & Consumer problem

    1. 물건을 계속해서 생산하는 소비자 (producer, 프로세스 혹은 스레드)
    2. 물건을 계속해서 소비하는 소비자 (consumer, 프로세스 혹은 스레드)
    3. 총합 변수 공유


    위 와 같이 정의되었을 때, 생산자를 100,000번, 소비자를 100,000번 실행했을 때 총합은?

    때로는 0과 다른 값이 되거나, 오류가 발생하기도 한다. 동시에 접근해서는 안되는 자원에 동시에 접근해서 발생하는 문제이다.

    공유 자원과 임계 구역

    공유자원

    여러 프로세스 혹은 스레드가 공유하는 자원이다. ex) 전역 변수, 파일, 입출력 장치, 보조기억장치

    임계 구역

    동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역 ex) 총합 변수, 잔액 변수

    임계구역에 진입하고자 하면 진입한 프로세스 이외에는 대기해야 한다.

    레이스 컨디션

    : 임계 구역에 동시에 접근하면 자원의 일관성이 깨질 수 있으며 이를 레이스 컨디션이라고 한다(race condition) Bank account problem,Producer & Consumer problem 모두 race condition의 사례

     

    운영체제가 임계구역 문제를 해결하는 세 가지 원칙⭐️

    1. 상호 배제(mutual exclusion) 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 들어올 수 없다.
    2. 진행 (progress) 임계 구역에 어떤 프로세스도 진입하지 않았다면 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.
    3. 유한 대기 (bounded waiting) 한 프로세스가 임계 구역에 진입하고 싶다면 언젠가는 임계 구역에 들어올 수 있어야 한다. 즉, 임계 구역에 들어오기 위해 무한정 대기해서는 안된다.

    동기화 기법

    1. 뮤텍스 락
    2. 세마포
    3. 모니터

    뮤텍스 락

    상호 배제를 위한 동기화 도구로, 임계구역을 가진 스레들의 실행 시간을 서로 겹치지 않게 단독으로 실행하게 하는 기술이다.

    즉, 한번에 하나의 프로세스만 공유 자원에 접근할 수 있게 하는 기법을 말한다.

    자바에서는 synchronized 키워드를 사용해 뮤텍스 락을 구현할 수 있고,Lock 인터페이스를 이용하는 방법이 있다.

    • 뮤택스 락 형태
      • 전역 변수 하나, 함수 두개
      • 자물쇠 역할 : 프로세스들이 공유하는 전역 변수 lock
      • 임계 구역을 잠그는 역할 : acquire 함수
      • 임계 구역의 잠금을 해제하는 역할 : release 함수

    세마포어

    좀 더 일반화된 방식의 동기화 도구로, 공유 자원이 여러 개 있는 경우에도 적용 가능하다.

    임계 구역 앞에서 멈춤 신호를 받으면 잠시 기다리고, 임계 구역 앞에서 가도 좋다는 신호를 받으면 임계 구역에 진입한다.

    허용 가능한 Counter의 갯수를 나타내는 카운터로, 세마포어의 값에 따라 운영체제는 프로세스가 즉시 자원을 사용할 지 정한다.


    ❓ 상호배제는 하나의 자원에는 하나의 프로세스만 접근할 수 있는데, 카운팅 세마포어는 상호배제를 깨는걸까?

    → 맞다. 다만 제한적으로, 즉 임계값 만큼이 동시에 깰 수 있게 된다. 임계구역은 상호 배제를 깨게 되지만, 자원 자체에서는 상호 배제를 유지할 수 있는 것이다.

     

    • 세마포 형태
      • 전역변수 하나, 함수 두개
      • 임계 구역에 진입할 수 있는 프로세스의 개수를 나타내는 전역 변수 S
      • 임계 구역에 들어가도 좋은지, 기다려야할지를 알려주는 wait 함수
      • 임계 구역 앞에서 기다리는 프로세스에 가도 좋다고 신호를 주는 signal 함수

    뮤텍스 락과 세마포의 공통적인 단점 → Busy waiting (CPU 사이클 낭비)

     

    해결방법

    • 사용할 수 있는 자원이 없을 경우 대기 상태로 만든다. (해당 프로세스의 PCB를 대기 큐에 삽입)
    • 사용할 수 있는 자원이 생겼을 경우 대기 큐의 프로세스를 준비상태로 만든다. (해당 프로세스의 PCB를 대기 큐에서 꺼내 준비 큐에 삽입)

    모니터

    모니터는 상호배제를 위한 동기화, 실행 순서 제어를 위한 동기화 모두 제공한다.

    공유 자원에 대한 접근을 제어하는 동시에, 특정 조건을 만족할 때까지 프로세스나 스레드를 대기 상태로 만든다.

    1. 상호 배제를 위한 동기화
    • 공유자원에 접근하고자 하는 프로세스를 인터페이스를 위한 큐에 삽입한다.
    • 큐에 삽입된 순서대로 한 번에 하나의 프로세스만 공유 자원으로 이용한다.
    1. 실행 순서 제어를 위한 동기화
    • 프로세스나 스레드의 실행 순서를 제어하기 위해 사용하는 조건 변수를 이용한다.
      • 조건 변수.wait() : 대기 상태로 변경, 조건 변수에 대한 큐 삽입
      • 조건변수.signal() : wait()으로 대기 상태로 접어든 조건변수를 실행 상태로 변경
    • 특정 프로세스가 아직 실행될 조건이 되지 않았을 때에는 wait를 통해 실행을 중단하고, 특정 프로세스가 실행될 조건이 충족되었을 때에는 signal을 통해 실행을 재개한다.

    면접 예상 질문

    1. 프로세스 동기화에 대해 설명해 보세요.

    다중 프로세스 환경에서 자원등에 한 프로세스만이 접근가능하도록 하는 것입니다. 
    (여기에 동기화가 필요한 이유도 같이 말하자⬇️)

    2. 동기화가 필요한 이유는 무엇인가요?

    공유 데이터의 동시 접근(Concurrent access)은 데이터의 불일치 문제를 발생시킬 수 있습니다.

    따라서, Race condition을 막고 일관성을 유지하기 위해서는 협력 프로세스 간의 실행 순서를 정해주는 메커니즘인 동기화(Synchronization)가 필요합니다. 

    3.임계구역에 대해 설명해 보세요.

    임계구역은 여러 스레드가 동시에 접근해서는 안되는 공유자원에 접근하는 코드 블럭을 얘기합니다.

    한 임계구역에서 하나의 스레드는 하나의 스레드 혹은 프로세스만 접근이 가능합니다. 임계구역에 접근하는 것을 제어하기 위해 세마포어, 뮤텍스와 같은 매커니즘을 사용합니다. 

    4. 임계구역을 해결하기 위한 조건에는 뭐가 있나요?

    1. 상호배제 : 한 프로세스가 임계구역에서 동작중이면 다른 프로세스는 접근할 수 없습니다. 
    2. 진행 : 임계구역에서 작업중인 프로세스가 없다면 임계구역으로 진입하려는 프로세스는 적절히 선택해서 진입할 수 있어야 합니다.
    3. 유한 대기 : 한 프로세스가 임계영역으로 진입을 요청한 후 다른 프로세스는 진입이 유한한 횟수로 제한되어야 합니다. 

    5. 세마포어와 뮤텍스의 차이에 대해 설명해 보세요.

    세마포어는 여러개의 프로세스가 접근 가능한 공유자원을 관리하는 방식이며, 뮤텍스는 한번에 한 개의 프로세스만 접근 가능하도록 관리하는 방식입니다. 

     

    참고 문헌 

    https://github.com/ksundong/backend-interview-question

    https://velog.io/@kyeun95/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EB%8F%99%EA%B8%B0%ED%99%94-%EB%8F%99%EA%B8%B0%ED%99%94-%EA%B8%B0%EB%B2%95

     

    [운영체제] 프로세스 동기화 & 동기화 기법

    동시다발적으로 실행되는 프로세스들은 공동의 목적으로 서로 협력하는데 프로세스들은 실행 순서와 자원의 일관성을 보장하기 위해 동기화를 함공유 데이터의 동시 접근(Concurrent access)은 데

    velog.io

     

    GitHub - ksundong/backend-interview-question: 백엔드 개발자로 입사를 준비하며 받았던 질문, 예상했던 질

    백엔드 개발자로 입사를 준비하며 받았던 질문, 예상했던 질문, 인터넷 참고한 질문(CC BY-NC) - GitHub - ksundong/backend-interview-question: 백엔드 개발자로 입사를 준비하며 받았던 질문, 예상했던 질문,

    github.com

    •  
    728x90

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

    연속메모리 할당과 스와핑  (0) 2024.01.10
    스케쥴러(Scheduler)  (1) 2024.01.09
    멀티 프로그래밍, 멀티 프로세싱, 멀티 태스킹  (0) 2024.01.09
    프로세스와 스레드  (2) 2024.01.08
    운영체제 시작하기  (1) 2024.01.08
    Comments