[CS - OS] 프로세스 동기화 - 뮤텍스,세마포어

링딩·2023년 12월 7일
0

다시 공부하는 CS

목록 보기
3/4



1. 동기와 비동기

< 쉬운예시 >
할 일(task)가 : 빨래, 설거지, 청소 라고 할 경우
동기 : 빨래 끝내고-> 설거지 끝내고 -> 청소를 한다.
비동기 : 빨래 대행 업체, 설거지 대행 업체, 청소 대행 업체
=> task가 언제 끝날지는 모르지만 완료되면 나한테 알려주니 난 다른 작업을 할 수 있다

* 동기의 정의

  • 요청과 그에 따른 결과가 동시에 일어나는 것
    => 이 말은 값이 반환 되기 전까지는 '블로킹' 되어 있다.
  • 즉 요청 후 결과가 와야만, 그 다음 작업이 이루어지는 방식

🤦‍♀️어떠한 일을 처리하는 동안 다른 일을 할 수 없다.

*비동기 정의

  • 요청과 그 결과가 동시에 일어나지 않는 것
    => 얘는 '블로킹' 되지 않고 이벤트 큐에 넣거나, 백그라운드 스레드에게 해당 task 를 위임하고 바로 다음 코드를 실행하기 때문에 기대되는 값이 바로 반환되지 않는다.
  • 요청 후 결과가 오는 동안, 그 다음 작업을

👍 동기보다 복잡하지만, 일을 처리하면서도 다른 쪽에서도 일을 할 수 있어 효율적임.




🚨 블로킹, 논 블로킹

정의 :

'블로킹'/'논-블로킹'은 동기/비동기와 관점이 다르고, 제어권이 어디에 있느냐에 대한 관점이다.

  • 블로킹
    호출된 함수가 자신의 작업을 모두 끝날 때 까지 제어권을 갖고 있어 호출한 함수가 대기하도록

  • 논-블로킹
    호출된 함수가 바로 return 해서 호출한 함수에게 제어권을 넘겨주어 다른 일을 할 수 있게






2.프로세스 동기화

여러 프로세스가 공유하는 자원의 일관성을 유지하는 것.
=> 공유하는 자원에 하나의 프로세스만이 이용하도록 제어


2-1. 경쟁 상태 (Race Condition)

* 정의

**공유 자원**에 대해 여러 프로세스 or 스레드가 **동시에 접근하려고**할 때, 결과값에 **영향을 줄 수 있는 상태**

=> 동기화 메커니즘을 사용하여 공유 자원에 대한 접근을 조절할 수 있습니다.


2-1-1. '경쟁 상태'가 발생하는 경우

  1. 커널 작업 수행 중 '인터럽트'로 인해 동일한 자원을 조작한 경우
  • 문제: 인터럽트로 인해 현재 작업을 중단하고 인터럽트를 처리하는데 이 둘이 같은 데이터를 조작하는 경우
  • 해결법
    커널모드에서 작업할 때, '인터럽트'를 disable에서 cpu 제어권을 뺏기지 말자
  1. 프로세스가 'System Call'을 하여 커널 모드로 진입하여 작업을 수행하는 도중 '문맥 교환'이 발생

    • 문맥 교환 : 현재 실행 중인 프로세스의 상태를 저장하고 다음 실행할 프로세스의 상태를 복원하는 작업

    • 문제점 :

      프로세스1이 커널모드에서 데이터를 조작하는 도중, 시간이 초과되어 CPU 제어권이 프로세스2로 넘어가 같은 데이터를 조작하는 경우 ( 프로세스2가 작업에 반영되지 않음 )

    • 해결법
      프로세스가 커널모드에서 작업을 하는 경우 시간이 초과되어도 CPU 제어권이 다른 프로세스에게 넘어가지 않도록 함

  1. 멀티 프로세서 환경에서 공유 메모리 내의 커널 데이터에 접근할 때
    • 문제점 : 멀티 프로세서 환경에서 2개의 CPU가 동시에 커널 내부의 공유 데이터에 접근하여 조작하는 경우
    • 해결법 : 커널 내부에 있는 각 공유 데이터에 접근할 때마다, 그 데이터에 대한 lock/unlock을 하는 방법



2-2. 임계영역

* 정의

동일한 자원에 - 동시에 접근하는 작업(ex. 공유하는 변수 사용, 동일 파일 접근 및 수정 등)을 실행하는 코드 영역을 뜻함.

  • 즉 동시에 접근하려고 하는 자원에서 문제가 발생하지 않게 독점을 보장해줘야 하는 영역
    => 멀티 스레딩의 문제점 중 하나

💬 <임계영역을 해결하기 위한 전제 조건>

우리의 목표 = 데이터가 한 번에 하나의 프로세스만 접근할 수 있게 하자

  1. 상호배제
    한 프로세스가 임계영역에 들어갔을 때 다른 프로세스는 접근할 수 없게
  2. 한정 대기
    특정 프로세스가 진입 요청 후, 받아들여질 때까지 다른 프로세스들이 이 임계영역에 진입하는 횟수는 제한이 있어야 함.
    => 아예 한 번도 안들어가는 경우는 x야함.
  3. 진행
    임계 구역에 들어간 프로세스가 없는 상태에서, 들어가려고 하는 프로세스가 여러 개 있다면 어느 것이 들어갈지를 적절히 결정해주어야 한다.

2-3. 임계영역 해결방법

1. Mutex (뮤텍스)

ex) 이해 꿀팁: 화장실 키를 들고 갔다로 이해하자
뮤텍스는 상태가 오직 획득(Lock) / 해제(Unlock)만 존재한다

  • (정의)

    • 임계 영역에 대한 접근을 제어하며 한 번에 하나의 스레드만이 접근 가능하다
    • 임계영역에 진입하는 프로세스는 'Lock'을 획득 -> 영역을 나올 때, 'Lock'을 방출
    • 실행시간이 서로 겹치지 않고 각각 단독으로 실행되게 하는 기술
  • (한계)
    다중처리기 환경에서는 시간적인 효율성 측면에서 적용이 어려움.




2. Semaphores(세마포어)

ex) 이해 꿀팁 🤔:
세마포어는 화장실이 여러 개 있고, 화장실 입구에는 현재 빈 화장실의 개수를 알려주는 전광판이 있는 식당과 비슷하다.
모든 칸의 화장실이 사용중일 때 전광판의 숫자는 0이 되며, 손님들은 전광판 숫자가 1로 바뀔 때까지 대기해야한다.

  • (정의)

    • 여러 개의 스레드 or 프로세스가 동시에 공유자원에 접근하되 이 공유자원의 갯수를 제한한다.
    • 소프트웨어상에서 임계영역 문제를 해결하기 위한 동기화 도구로 2가지로 나뉘어진다.
    • 0 이상의 정수 값 소지
  • (단점)

    • Busy Waiting(바쁜 대기)

      '스핀 락'(세마포어 초기 버전)에서 '임계영역'에 진입해야하는 프로세스는 진입 코드를 계속 반복 실행해야 하며, CPU 시간을 낭비한다는 점.


2-1. 세마포어의 2가지 연산(P,V연산)

  • P (Proberen) 연산
    세마포어 값을 감소시킵니다. 만약 값이 0보다 작다면 프로세스 또는 스레드는 대기 상태로 전환됩니다.
  • V (Verhogen) 연산
    세마포어 값을 증가시킵니다. 대기 중인 프로세스 또는 스레드가 있다면 하나를 깨워 실행 가능 상태로 전환시킵니다.

◽📕 세마포어의 종류

  1. 카운팅 세마포어

    • 도메인이 0 이상인 임의의 정수값인 세마포어
    • 동시에 접근할 수 있는 프로세스 또는 스레드의 '수'를 제한하는 데 사용
    • 여러개의 자원을 가질 수 있으며, 제한된 자원을 가지고 액세스 작업할 때 사용
  2. 이진 세마포어 (뮤텍스)

    • 0 or 1의 값만을 가지는 세마포어
    • 임계영역 문제를 해결하는 데에 사용
      => 자원이 하나라 '뮤텍스'로 알려져있다.


(결론)

  • '뮤텍스'는 상태가 0, 1 두 개 뿐인 '이진 세마포어' 이다.

  • '세마포어'는 프로세스/스레드가 소유할 수 없는 반면, '뮤텍스'는 소유가 가능하며 프로세스/스레드가 이에 대한 책임을 진다.
    => (Mutex 의 경우 상태가 두개 뿐인 lock 이므로 lock 을 ‘가질’ 수 있다.)

  • '뮤텍스'는 동기화 대상이 오직 하나뿐일 때, '세마포어'는 동기화 대상이 하나 이상일 때 사용한다.

  • 사용 목적
    뮤텍스: 주로 임계 영역에 대한 접근을 제어하는 데 사용됩니다. 한 번에 하나의 스레드만이 임계 영역에 접근할 수 있도록 합니다.
    세마포어: 주로 자원의 접근을 조율하고 동기화하는 데 사용됩니다. 여러 개의 스레드 또는 프로세스가 동시에 접근할 수 있는 자원의 개수를 제한하는 데 사용됩니다.

  • '세마포어'는 자원의 가용 개수를 제한하거나 동기화를 위해 카운팅이 필요한 경우

  • 반면 '뮤텍스'는 임계 영역에 대한 동시 접근을 막아야 하는 경우에






3. 교착상태(Dead lock)

두 개 이상의 작업이 서로 상대방의 작업이 끝나기만을 기다리기 때문에 아무것도 완료되지 못하고 있는 상태

외나무 다리에 서있듯이 서로가 비켜주지 않는다.

🤦‍♂️교착상태를 발생시키는 조건[모두 성립되어야 함]

1. 상호배제 : 하나의 프로세스가 자원을 사용중일 때 다른 프로세스는 그를 사용할 수 없다.
2.점유 대기(Hold and Wait) : 1개 이상의 자원을 점유하고 있으면서 다른 프로세스가 사용중인 자원을 추가로 점유하기 위해 대기하는 프로세스가 존재한다.
3. 비선점 : 다른 프로세스가 자원을 사용중인 경우 그 사용이 끝날 때 까지 강제로 뺏을 수 없다.
4. 순환 대기 : 프로세스의 집합에서 순환형태로 자원을 대기하고 있어야 한다.


👍교착상태의 예방과 회피,회복, 무시

(예방)

조건 중 하나를 제거하면서 예방.

  • 상호 배제 부정 : 여러 프로세스가 공유 자원 사용
  • 점유 대기 부정 : 프로세스 실행 전 모든 자원 할당
  • 비선점 부정 : 점유중인 자원을 다른 프로세스가 요구하는 경우 그를 반납
  • 순환 대기 부정 : 자원에 고유 번호를 할당한 후 순서대로 자원 요구

(회피)

  • 은행원 알고리즘

프로세스가 자원을 요구할 때 시스템은 자원을 할당한 후에도 안정 상태로 남아있게 되는지 미리 검사하여 교착 상태를 회피한다.

그 외에 회복과 무시...

교착상태 발생시, 해결한다와 성능저하가 심할 경우 무시한다.


2. 기아상태

특정 프로세스의 우선 순위가 낮아서 원하는 자원을 계속 할당받지 못하는 상태를 말함.

(해결 방법)

  1. 프로세스 우선순위 수시 변경을 통해 각 프로세스 높은 우선순위를 가지도록 기회 부여
  2. 오래 기다린 프로세스의 우선순위 높이기
  3. 요청 순서대로 처리하는 요청큐 사용


profile
초짜 백엔드 개린이

0개의 댓글