개발자 면접 공부/운영체제,CS

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

chogyujin 2020. 1. 20. 21:27
728x90

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

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

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

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

 

동기방식의 예(A가 B에게 10,000원을 송금)

출처:https://private.tistory.com/24

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 : 동시에 일어나지 않는)

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

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

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

 

비동기방식의 예(시험날의 학생과 선생)

출처:https://private.tistory.com/24

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) 음악을 듣다가 전화가온다.

 

모니터

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

 

모니터 구조

위는 모니터의 구조는 간단히 나타낸 그림이다. 모니터는 공유 자원 + 공유 자원 접근함수 로 이루어져 있고, 2개의 큐를 가지고 있다. 각각 (상호배타) 큐, (조건동기) 큐 이다.

 

출저:http://blog.skby.net/%EC%84%B8%EB%A7%88%ED%8F%AC%EC%96%B4%EC%99%80-%EB%AA%A8%EB%8B%88%ED%84%B0/

모니터와 세마포어의 큰 차이점이라면 역시 개발의 편의성의 차이가 많이 난다.
세마포어는 저급 언어 특히 int를 통해 카운트를 하나식 세어 락을 걸지만 모니터는 고급 언어 특히 큐를 사용하여
개발의 편의하고 공유자원 관리도 확실히 할수있다. 또한 추상화를 지원한다(개발자가 상호배제 가능)