운영체제

동기 비동기(프로세스 동기화)

development study 2022. 2. 9. 20:24

동기(synchronous : 동시에 일어나는)

 - 동기는 말 그대로 동시에 일어난다는 뜻입니다. 요청과 그 결과가 동시에 일어난다는 약속인데요. 바로 요청을 하면 시간이 얼마가 걸리던지 요청한 자리에서 결과가 주어져야 합니다.

-> 요청과 결과가 한 자리에서 동시에 일어남

-> A노드와 B노드 사이의 작업 처리 단위(transaction)를 동시에 맞추겠다.

 

1. A의 계좌는 10,000원을 뺄 생각을 하고 있다.

2. A의 계좌가 B의 계좌에 10,000원을 송금한다.

3. B의 계좌는 10,000원을 받았다는 걸 인지하고, A의 계좌에 10,000원을 받았다고 전송한다.

4. A, B 계좌 각 각 차감과 증가가 동시에 발생하였다.

 

A의 계좌에서 B라는 계좌에 돈을 넣을때 A와 B는 같은 일을 했습니다.

A는 10,000원을 차감 B는 10,000이 증가 '계좌이체'같은 시스템은 돈을 바로 보냈을때 바로 받아야 함

따라서 A->B 는 동기

 

비동기(Asynchronous : 동시에 일어나지 않는)

 - 비동기는 동시에 일어나지 않는다를 의미합니다. 요청과 결과가 동시에 일어나지 않을거라는 약속입니다. 

-> 요청한 그 자리에서 결과가 주어지지 않음

-> 노드 사이의 작업 처리 단위를 동시에 맞추지 않아도 된다.

 

1. 학생은 시험문제를 푼다

2. 시험문제를 모두 푼 학생은 선생님에게 전송한다.

3. 선생은 학생의 시험지를 채점한다.

4. 채점이 다 된 시험지를 학생에게 전송한다.

5. 학생은 선생이 전송한 시험지를 받아 결과를 확인한다.

 

 

학생과 선생의 관계는 밀접해있지만 결과적으로 학생이 푼 시험지를 선생에게 전송하여 결과를 확인하는 시스템
동시에 할필요 없다

학생은 기다렸다가 결과 확인이 가능

 

동기와 비동기는 어떤 작업 혹은 그와 연관된 작업을 처리하고자 하는 시각의 차이

동기는 추구하는 같은 행위(목적)가 동시에 이루어지며,

비동기는 추구하는 행위(목적)가 다를 수도 있고, 동시에 이루어지지도 않습니다.

 

블록과 논블록의 차이

학생이 시험지를 선생에게 건넨 후 가만히 앉아 채점이 끝나서 시험지를 돌려받기만을 기다린다면 학생은 블록 상태

학생이 시험지를 건넨 후 선생에게 채점이 완료되었다는 전송을 받기 전까지 다른 과목을 공부한다거나 게임을 한다거나 다른 일을 하게 되면 학생의 상태는 논블록 상태

 

프로세스 동기화란?

하나의 자원을 한 순간 마다 한 프로세스가 접근하게 하는 기법

만약 통장에서 500원을 찾는데 그 동시에 어머니께서 500원을 입금을 하면?
이런 쉬운 예제에서도 프로세스 동기화를 거처주지 않으면

찾는 A와 입금을 시키려는 B의 프로세스들이 동시 접근을 하면 예상치 못한 오류가 나올 수 있다.

 

Critical Section

멀티 프로세스 환경에서 둘 이상의 프로세스가 동시에 접근해서는 안되는 공유 자원의 코드 영역.

임계구역은 시간이 지나면 종료되며, 어떤 프로세스가 임계구역에 접근하기 위해서는 지정된 시간만큼 대기해야 한다.

이때 쓰레드나 프로세스가 배타적인 사용권을 보장받기 위해 세마포어 같은 동기화 메커니즘이 사용된다.

한 프로세스 내의 쓰레드 사이에서만 동기화가 가능. 유저 객체(커널에서 제공하는 객체가 아니다.)

 

Critical Section Problem

Critical Section을 지정을 해줘야하는 코드에 지정을 안해준 것

 

Critical Section Problem 해결을 위한 기본조건

 

1. 상호 배제

프로세스 P1 이 Critical Section 에서 실행중이라면, 다른 프로세스들은 그들이 가진 Critical Section 에서 실행될 수 없다.

 

2. 진행

Critical Section 에서 실행중인 프로세스가 없고, 별도의 동작이 없는 프로세스들만 Critical Section 진입 후보로서 참여될 수 있다.

 

3. 한정된 대기
P1 가 Critical Section 에 진입 신청 후 부터 받아들여질 때가지, 다른 프로세스들이 Critical Section 에 진입하는 횟수는 제한이 있어야 한다.

 

ex)

생산자-소비자 문제(producer-consumer problem)는 여러 개의 프로세스를 어떻게 동기화할 것인가에 관한 고전적인 문제 한정 버퍼 문제(bounded-buffer problem)라고도 한다.

유한한 개수의 물건(데이터)을 임시로 보관하는 보관함(버퍼)에 여러 명의 생산자들과 소비자들이 접근한다.

 

생산자는 물건이 하나 만들어지면 그 공간에 저장한다.

이때 저장할 공간이 없는 문제가 발생할 수 있다.

 

소비자는 물건이 필요할 때 보관함에서 물건을 하나 가져온다.

이 때는 소비할 물건이 없는 문제가 발생할 수 있다.

 

Critical Section Problem 해결방안

 

뮤텍스vs세마포어

 

뮤텍스와 세마포어의 운영체제의 용어로는 커널 자원에서의 동기화 서비스로 제공

(동기화 프리미티브라고도 불린다)

뮤텍스는 상호 배제를 제공한다.

생산자 또는 구매자는 키(뮤텍스)를 가지고 그들의 일을 진행한다.

생산자(키 소유)로 인해 버퍼가 채운다면, 구매자는 기다려야한다. 반대의 경우에도 동일하다.

그 결과 어느 시점에서든 오직 하나의 스레드만이 전체 버퍼에서 일을 할 수 있다.

이러한 개념으로 세마포어를 발생시킬 수 있다.

 

세마포어를 사용해보자.

세마포어는 일반화된 뮤텍스이다.

 

결과적으로 뮤텍스 안에 세마포어가 있다.

 

이 두개의 공통점은 둘다 소프트웨어적으로 Critical Section Problem을 해결함을 목적

 

간단히 보자면 뮤텍스는 boolean(상태), 세마포어는 int(카운터)라고 볼 수 있다.

그리고 바이너리 세마포어는 카운터를 0,1만 사용하기에 boolean으로 볼 수 있다.

 

 뮤텍스는 자원의 접근에 있어 동기화 할 경우 locking mechanism 을 사용한다.

오직 하나의 일(스레드, 프로세스)이 뮤텍스를 가질 수 있다.

이것이 의미하는 바로는 할당된 뮤텍스를 소유할 수 있다는 것이므로, 오직 소유자만이 락(뮤텍스)을 해제할 수 있다.

 

쉽게 뮤텍스를 설명하면 락(키)를 가지고있는 프로세스,스레드만이 해제할수있는것이다.
"아직 기달려", 대기대기대기"기달려"

 

세마포어는 signaling mechanism ("나는 끝났어, 넌 수행할 수 있어", 신호의 일종) 을 사용한다.

예를 들어, 만약 당신이 휴대폰을 통해 노래를 듣고 있었는데, 친구에게 전화가 왔다.

이 시점에서 전화 관련 프로세스가 호출되도록 신호를 주게 됨으로써 발생된다.

 

세마포어는 두 가지로 나뉜다.

 

바이너리 세마포어(0,1)

바이너리 세마포어를 보통 뮤텍스랑 같이 묶는다 왜냐하면 0,1 뮤텍스에 boolean true,false 비슷한 구조를 가졌기
떄문이다.

 

카운트 세마포어

세마포어의 카운트를 넣어 들어가면 증가 나오면 감소를 해준다. 이로써 좀더 좋은 병렬 실행을 할수가있다.
ex) 음악을 듣다가 전화가온다.

 

모니터

세마포어가 저급 어셈블리어 언어부터 시작됬다면 모니터는 고급언어의 기법이다.

반응형