OS 면접 스터디 4주차 - 프로세스 동기화

    동시성과 병렬성

    동시성 (병행성): 여러 작업을 동시에 실행하는 것이 아니라, CPU가 작업마다 시간을 분할해 적절하게 Context Switching 함으로써 동시에 실행되는 것처럼 보이게 하는 것

    병렬성: 여러 작업이 실제로 동시에 실행되는 것으로, 멀티 코어 시스템에서 여러 프로세서가 각각의 작업을 동시에 수행하여 성능을 높이는 방식

    프로세스 동기화

    여러 프로세스가 공유 자원에 접근할 때, 데이터의 일관성과 정확성을 보장하기 위한 기법

    여러 프로세스가 서로 협력해 공유자원을 사용하는 상황에서 race condition이 발생 시 데이터 불일치를 방지하기 위해 사용됨

    Race Condition

    여러 프로세스가 공유 자원에 동시에 접근할 때 발생할 수 있는 문제로, 각 프로세스나 스레드가 실행되는 순서에 따라 결괏값이 달라지는 상황으로 데이터의 불일치 문제를 발생시킬 수 있음

    Race Condition 발생 상황 및 해결법

    1. 커널 모드로 수행 중 인터럽트가 발생하는 경우

    해결법: 커널 모드의 수행이 끝나기 전에는 인터럽트를 받지 않도록 하는 방법(disable/enable)

     

    2. Process가 system call을 하여 kernel mode로 수행 중인데 context switch가 일어나는 경우

    두 프로세스의 address space 간에는 데이터 공유가 일어나지 않지만, system call을 하는 동안에는 kernal address space의 데이터에 접근하게 됨. 이 작업 중간에 CPU를 선점해 가면 race condition 발생

    해결법: 커널 모드에서는 CPU preempt하지 않고, 유저 모드로 돌아갈 때 preempt

     

    3. Multiprocessor에서 공유 메모리 내의 커널 데이터에 접근하는 경우

    어떤 CPU가 마지막으로 저장했는지에 따라 데이터가 달라짐

    해결법: 커널 내부에 있는 각 공유 데이터에 접근할 때마다 그 데이터에 대해서만 lock/unlock을 하는 방식

    임계구역 (Critical Section)

    각 프로세스의 코드 상에서 공유 데이터를 접근하는 코드, 즉 Race Condition이 발생할 수 있는 부분

     

    Critical Section으로 인해 발생하는 문제들을 해결하기 위해 만족해야 하는 조건:

    • Mutual Exclusion (상호배제) : 하나의 자원에는 하나의 프로세스만 접근할 수 있어야 한다.
    • Progress(진행): Critical Section 비었으면 Critical Section에 진입하고자 하는 프로세스가 진입할 수 있게 해야 함
    • Bounded Waiting (한정 대기): starvation이 없도록 기다리는 시간이 유한해야 함

    상호 배제 (Mutual Exclusion)

    동시성 제어 기법 중 하나로, 하나의 프로세스만이 특정 시점에 공유 자원에 접근할 수 있도록 제어하는 것.

    이를 위해 뮤텍스(Mutex)나 세마포어(Semaphore), 스핀락(Spinlock), 모니터(Monitor)와 같은 동기화 도구가 사용됨

    뮤텍스(Mutex)

    임계 구역에 들어갈 때 뮤텍스 락을 얻고, 자원을 사용한 후 잠금을 해제하여, 공유 자원에 접근하는 프로세스가 하나만 존재하도록 보장하는 방식. lock이 하나만 존재할 수 있는 locking 메커니즘

    동작 방식:

    • lock: 프로세스나 스레드가 자원에 접근하려고 할 때 뮤텍스 락을 얻습니다. 만약 락이 이미 다른 프로세스에 의해 점유되어 있다면, 해당 프로세스는 block 상태가 되어 락이 해제될 때까지 기다립니다.
    • unlock: 자원에 대한 작업이 끝나면 락을 해제하여 다른 프로세스나 스레드가 자원에 접근할 수 있도록 합니다.

    세마포어(Semaphore)

    하나 이상의 프로세스나 스레드가 임계 구역에 진입할 수 있도록 제어하는 동기화 기법으로, 카운터(Counter)를 이용하여 동시에 자원에 접근할 수 있는 프로세스를 제한

    동작 방식:

    • 카운터 (세마포어 변수 S): 세마포어는 내부적으로 카운터 값을 유지하고, 이는 자원에 접근할 수 있는 프로세스의 수를 나타냄. 한 프로세스가 세마포어 변수를 수정할 때 다른 프로세스가 동시에 같은 세마포어 변수를 수정할 수 없음
      • 카운터 값이 0보다 크면 자원에 접근이 가능하며, 접근 시 카운터를 감소시킵니다.
      • 카운터 값이 0이면 자원이 모두 사용 중이므로 접근할 수 없으며, 프로세스는 대기 상태가 됩니다.
    • P (wait/down) 연산: 자원에 접근하려는 프로세스가 카운터 값을 감소시키고, 값이 0이면 접근이 불가능한 상태로 전환됩니다.
    • V (signal/up) 연산: 자원을 해제하고 카운터 값을 증가시켜, 다른 프로세스가 자원에 접근할 수 있게 해 줍니다.

    종류: 

    Counting Semaphore : 정수 값의 범위가 0 이상. 주로 자원의 개수를 세는 데 사용

    Binary Semaphore : 정수 값이 오직 0 또는 1이다. Mutex lock과 동일하게 동작

    뮤텍스 vs 이진 세마포어

    뮤텍스를 잠근 스레드는 반드시 자원 사용이 끝난 후 스스로 잠금을 해제해야 함. 다른 스레드는 이 잠금을 해제할 수 없음.

    이진 세마포어는 소유권 개념이 없으므로, 자원을 점유한 프로세스(또는 스레드) 외에도 다른 프로세스가 세마포어를 해제할 수 있음.

    스핀락(Spinlock)

    Busy Waiting의 대표적인 예로, 프로세스가 락을 얻을 때까지 계속 반복적으로 확인하는 방식. 단순한 구조지만, 자원 소모가 크기 때문에 짧은 임계 구역에서 주로 사용됨

    모니터(Monitor)

    자바나 파이썬 같은 고급 언어에서 제공하는 동기화 메커니즘으로, 프레임워크나 라이브러리에서 제공되어 개발자가 바로 사용 가능

    모니터는 공유 자원을 내부적으로 숨기고 공유 자원에 접근하기 위한 인터페이스(프로시저)만을 제공해서 상호배제를 구현

    데드락 (Deadlock)

    두 개 이상의 프로세스나 스레드가 서로가 소유한 자원을 기다리면서 영원히 실행을 완료할 수 없는 상태. 

    데드락 발생 조건:

    • 상호 배제(Mutual Exclusion): 자원이 한 번에 한 프로세스만 사용할 수 있음 즉, 자원이 공유되지 않고 독점적으로 사용됨
    • 점유 대기(Hold and Wait): 자원을 이미 점유하고 있는 프로세스가 자신이 점유한 자원을 해제하지 않은 상태에서 추가적인 자원을 요청하며 대기
    • 비선점(No Preemption): 프로세스가 점유한 자원을 강제로 빼앗을 수 없음. 즉, 자원은 프로세스가 자발적으로 해제할 때까지 다른 프로세스가 사용할 수 없음
    • 순환 대기(Circular Wait): 두 개 이상의 프로세스가 순환적으로 서로 다른 프로세스가 점유하고 있는 자원을 요청하며 대기하는 상태. 예를 들어, 프로세스 A가 자원 1을 점유하고 자원 2를 요청하며 대기하고 있고, 프로세스 B는 자원 2를 점유하고 자원 1을 요청하며 대기하는 상황

     

    데드락 해결 방법

    1. 데드락 예방 (Deadlock Prevention)

    데드락의 발생 조건 중 하나 이상을 사전에 차단

    사용률, 처리량 저하와 starvation 문제 발생 가능한 문제점 있음

     

    2. 데드락 회피 (Deadlock Avoidance)

    은행원 알고리즘(Banker's Algorithm): 프로세스가 자원을 요청할 때, 시스템은 해당 자원을 할당하면 데드락이 발생할 수 있는지 판단하고, 데드락 위험이 없다면 자원을 할당. 데드락이 발생할 가능성이 있는 경우, 요청을 거절하고 대기시킴

     

    3. 데드락 탐지 및 복구 (Deadlock Detection and Recovery)

    시스템은 주기적으로 데드락이 발생했는지 확인하고, 데드락이 탐지되면 비용을 최소화할 수 있는 자원을 강제로 회수하거나 프로세스를 강제로 종료하여 데드락을 해결

     

    4. 데드락 무시 (Deadlock Ignorance)

    데드락이 발생할 가능성이 매우 낮다고 판단하여 데드락 문제를 무시. 현대의 운영체제인 유닉스나 윈도우 시스템에서는 대부분 데드락을 탐지하거나 방지하는 특별한 메커니즘을 사용하지 않고, 데드락이 발생하면 사용자가 직접 시스템을 재부팅하는 등의 방식으로 처리

     

    728x90

    댓글