profile image

L o a d i n g . . .

동기화 문제

한정적인 시스템 자원에 여러 스레드가 동시에 접근해서 사용하면 문제가 발생할 수 있다. 이 문제를 방지하기 위한 기법

스레드 동기화

-   실행 순서의 동기화

-   스레드의 실행 순서를 정의하고, 이 순서를 반드시 따르도록 하는 것.

-   메모리 접근에 대한 동기화

-   메모리 접근에 있어서 동시 접근을 막는 것

동기화 기법

-   유저 모드의 동기화
    -   커널의 힘을 빌리지 않는 동기화 기법. 커널의 코드가 실행되지 않음
    -   성능상 이점이 있으나 기능상의 제한점이 존재. 상당히 빠름.
    -   임계 구역(critical section) 기반의 동기화, 인터락 함수 기반의 동기화
        -   critical section 기반의 동기화 (critical section은 동기화 문제의 일으키는 코드블록)
            -   한번의 하나의 스레드만이 접근 가능. 열쇠를 얻은 프로세스만이 critical section으로 들어갈 수 있다.
            -   critical section 진입을 위해 critical section object를 얻음.
        -   인터락 함수 기반의 동기화
            -   함수 내부적으로 한 순간에 하나의 스레드에 의해서만 실행되도록 동기화된다.
            -   임계 구역 기반의 동기화도 내부적으로 인터락 함수를 기반으로 구현.

-   커널 모드의 동기화
    -   커널에서 제공하는 동기화 기능을 이용하는 방법.
    -   커널 모드로의 변경이 필요하고 이는 성능 저하로 일어난다. 그러나 다양한 기능을 활용할 수 있다.
    -   세마포어, 뮤텍스, 모니터 등등
        -   세마포어
        -   현재 공유자원에 접근할 수 있는 스레드, 프로세스의 수를 나타내는 값을 두어 상호배제를 달성하는 기법
        -   뮤텍스
        -   한 스레드, 프로세스에 의해 소유될 수 있는 key를 기반으로 한 상호배제 기법.
        -   세마포어와 뮤텍스의 목적
        -   상호 배제를 달성하는 것. 특정 동기화 대상이 이미 특정 스레드에 의해 사용 중일 경우, 다른 스레드가 해당 동기화 대상에 접근하는 것을 제한하는 것.
        -   세마포어와 뮤텍스의 차이
        -   관리하는 동기화 대상이 몇개인가에 따라
        -   뮤텍스, 모니터, 세마포어의 차이
        -   뮤텍스, 모니터는 상호 배제를 함으로써 임계구역(공유 자원에 접근하는 프로세스 내부의 코드 영역)에 하나의 스레드만 들어갈 수 있음. 세마포어는 여러개의 스레드가 들어갈 수 있다.
        -   뮤텍스와 모니터의 차이
        -   뮤텍스는 다른 프로세스 간에 동기화할 때 사용할 수 있음. 모니터는 하나의 프로세스 내에에 다른 스레드 간의 동기화할 때 사용.  
            보통 뮤텍스는 운영체제 커널에 의해 제공.  
            모니터는 프레임워크나 라이브러리 그 자체에서 제공.  
            따라서 뮤텍스는 무겁고 느리며, 모니터는 가볍고 빠르다.
        -   모니터와 세마포어 차이
        -   관리하는 동기화 대상의 몇개인지(모니터는 이진 세마포어만 가능, 세머포어는 binary 세머포어가 아니라 counting 세마포어를 제공)  
            세마포어에 비해 모니터쪽이 접근할 수 있는 락의 획득과 해제가 간단하다. 세마포어는 직접 키해제와 공유자원 접근 처리를 해주어야 한다. 자바는 모니터 방식.

교착 상태

한정된 자원을 여러 프로세스가 사용하려 할 때 발생하는 문제.
다중 프로세싱 환경에서 두 개 이상의 프로세스가 특정 자원할당을 무한정 대기하는 상태.

발생조건

-   상호배제(Mutual Exclusion)
    자원은 한 번에 한 프로세스 만이 사용 가능
-   점유 대기(Hold and Wait)
    최소한 하나의 자원을 점유하고 있으면서 다른 프로세스에 할당되어 사용하고 있는 자원을 추가로 점유하기 위해 대기하는 프로세스가 있어야 한다.
-   비선점(No Preemption)
    다른 프로세스에 할당된 자원은 사용이 끝나서 반납할 때까지 강제로 빼앗을 수 없다.
-   순환 대기(Circular Wait)이처럼 프로세스의 집합에서 순환 형태로 자원을 대기하고 있어야 한다.
    프로세스의 집합 {P0, P1, ..., Pn}에서 0은 1이 점유한 자원을 대기하고 1은 2가 점유한 자원을 대기하고 Pn은 P0이 점유한 자원을 요구해야 한다.

해결방안

4가지: 교착상태 예방, 회피, 탐지, 복구

교착 상태 예방

1.  상호 배제 부정  
    여러 프로세스가 공유 자원을 사용하도록 한다.
2.  점유 대기 부정  
    프로세스가 실행되기 전 필요한 모든 자원을 할당.
3.  비선점 부정  
    점유중인 프로세스가 다른 자원을 요구할 때, 점유 중인 자원을 반납하고, 요구한 자원을 사용하기 위해 기다리게 한다.
4.  순환 대기 부정  
    자원에 고유한 번호를 할당하고, 번호 순서대로 자원을 요구하도록 한다.

교착 상태 발생 조건 중 하나를 제거함으로써 해결

교착 상태 회피 기법 - > 자원을 할당해도 안정 상태인지 사전에 검사 /은행원 알고리즘

은행원 알고리즘에서 운영체제는 안정상태를 유지할 수 잇는 요구만을 수락하고 불안정 상태를 초래할 사용자의 요구는 나중에 만족될 수 있을 때까지 계속 거절합니다. (최소 고객 한명에게 대출해줄 금액은 항상 은행이 보유하고 있어야 한다'는 개념에서 나옴.
-   안정상태(safe state)
    시스템이 교착상태를 일으키지 않으면서 각 프로세스가 요구한 최대 요구량만큼 필요한 자원을 할당해 줄 수 있는 상태로 안전순서열이 존재하는 상태를 말합니다.
-   불안정상태(Unsafe state)불안정상태는 교착상태이기 위한 필요조건.
    교착상태는 불안정상태에서만 발생. Unsafe state라고 해서 무조건 교착 상태가 발생하는 것은 아님.
    안전순서열이 존재하지 않는 상태를 말합니다.

프로세스가 가지고 있어야 할 자원의 최대 개수를 미리 알아야 하기 때문에 오버헤드가 크다 → 현재 채택하고 있는 방식x

교착 상태 탐지

자원 할당 그래프를 통해 교착 상태를 탐지

교착 상태 회복 (복구)

1.  프로세스를 종료
2.  자원을 선점

교착 상태를 일으킨 프로세스를 종료하거나 할당된 자원을 해제함으로써 회복하는 것을 의미

참고자료

https://github.com/JaeYeopHan/Interview_Question_for_Beginner
https://github.com/WooVictory/Ready-For-Tech-Interview
https://about-myeong.tistory.com/34
https://velog.io/@goblin820/TIL-4-쓰레드Thread-싱글과-멀티-쓰레드

'개발자: 지식 정리 > CS 지식: 컴퓨터 구조와 운영체제' 카테고리의 다른 글

쓰레드가 많아질 때 해결법  (0) 2022.06.30
멀티코어 CPU란  (0) 2022.06.30
메모리 관리  (0) 2021.11.10
CPU 스케줄링  (0) 2021.11.10
프로세스와 스레드  (0) 2021.11.10
복사했습니다!