본문 바로가기
운영체제

동기와 비동기, 프로세스 동기화 #4

by 성장하는 Sap린이 2020. 2. 9.

동기/ 비동기

동기와 비동기는 상황에 따라서 각각의 장단점이 있다.

동기방식설계가 매우 간단하고 직관적이지만 결과가 주어질 때까지 아무것도 못하고 대기해야 하는 단점이 있고,

비동기 방식은 동기보다 복잡하지만 결과가 주어지는데 시간이 걸리더라도 그 시간 동안 다른 작업을 할 수 있으므로 자원을 효율적으로 사용할 수 있는 장점이 있다.

 

 

동기(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의 계좌는 서로 요청과 응답(1~3 과정)을 확인한 수 같은 일을 동시에 진행하였다. (4번 과정)

 

 

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

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

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

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

 

 

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

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

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

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

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

 

학생과 선생은 시험지라는 연결고리가 있지만 시험지에 행하는 행위(목적)는 서로 다르다. 학생은 시험지를 푸는 역할을 하고 선생은 시험지를 채점하는 역할을 한다. 서로의 행위(목적)가 다르기때문에 둘의 작업 처리 시간은 일치하지 않고, 일치하지 않아도 된다.

 

비동기 방식 예제를 통해서 블록과 논블록의 차이를 간략하게 설명하자면, 학생이 시험지를 선생에게 건넨 후 가만히 앉아 채점이 끝나서 시험지를 돌려받기만을 기다린다면 학생은 블록상태이고, 학생이 시험지를 건넨 후 선생에게 채점이 완료되었다는 전송을 받기 전까지 다른 과목을 공부한다거나 게임을 한다거나 다른 일을 하게되면 학생의 상태는 논블록 상태이다.

 

 


 

프로세스 동기화

 

프로세스 동기화가 무엇인가에 대해 말하기 전에 어떤 상황에서 동기화의 작업이 필요한지에 대해 알아보려고 한다.

 

프로세서(cpu)는 한 번에 하나의 프로세스만 실행 할 수 있다. 하지만 프로세스 스케줄링을 통해서 cpu에서 프로세스들을 바르게 교체하면서 여러개를 동시에 실행하는 것처럼 보이게 하는데 이러한 것을 병행 프로세스라고 한다.

 

병행 프로세스에는 독립적 프로세스와 협력 프로세스로 나누어진다.

 

1. 독립적 프로세스 (Independent process)

 

단일 처리 시스템 (cpu 1개) 에서 각각 독립적으로 여러 프로세스들이 병행 수행되는 것이다.

실행중인 다른 프로세스들에게 영향을 주지도, 받지도 않고, 데이터를 공유하지 않는다.

 

2. 협력 프로세스 (cooperaitng process)

 

다중 처리 시스템에서 모든 입출력 장치와 메모리에 참조가 가능하기 때문에 다른 프로세스의 실행에 영향을 주거나 받는데 주로 스레드와 같이 논리 주소 공간을 통해 공유하거나 공유 변수, 공유 파일을 통해 공유, 메세지를 전달하여 데이터를 공유하는 방식을 취한다.

 

이때 크게 비동기적 수행 방식과 동기적 수행 방식이 존재한다.

 

비동기적 수행 방식은 프로세스들 간에 어떤 정교한 협력을 통해서만 기능을 수행한다.

동기적 수행 방식은 프로세스 동괴화가 필요하다.

 

즉, 프로세스 동기화란 입출력장치나 메모리와 같은 자원 한 순간에 하나의 프로세스만 이용하도록 제어해 데이터의 일관성을 보장해 주는것이다.

 


 

병행 프로세스 해결 과제

 

병행 프로세스를 사용하게 되면

 

1) 정보를 공유 할 수 있다.

2) 계산 속도 향상

3) 모듈적 구성 강화

4) 편의성 증대

 

라는 장점이 있지만, 꼭 해결해야하는 문제가 생기게 된다.

 

  • 입출력 장치, 메모리와 같은 공유 자원을 상호 베타적으로 사용해야 한다.
  • 한정된 자원에 대한 사용 순서 문제
  • 병행 프로세스 간에 동기화 문제
  • 두 프로세스 간의 자료 교환을 위한 메세지 전달 방식 문제
  • 프로세스들의 실행 순서와 관계없이 항상 같은 결과값을 얻어야 하는 문제
  • 교착상태 문제

그렇다면 프로세스 동괴화를 위해서 첫번째에 적힌 공유 자원에 대한 상호배제에 관한 내용에 대해 알아보려고 한다.

 

상호 배제란 이미 어떤 프로세스가 공유자원을 사용하고 있다면 다른 프로세스는 해당 공유자원에 접근 할 수 없다 라는 것을 말한다. 즉 위에서 본 동기화와 같은 의미라고 생각하면 된다.

 

이 때 공유자원을 사용하고 있는 프로세스가 존재하는 일정 공간을 '임계구역' 이라고 한다.

 

해리포터 마법부 직원용 출입구

 

예를 들면, 변기(공유자원), 사용자(프로세스), 화장실칸(임계구역) 이라고 생각하면 된다.

다시 말하면 프로세스가 공유자원을 임계구역 안에서 사용하고 있다면 작업이 끝날 때 까지 다른 프로세스는 임계구역에 잇는 공유자원을 사용할 수 없다.

 

이러한 내용으로 임계구역 생성시 꼭 가져야하는 조건 3가지를 알 수 있다.

 

1. 상호배제 : 이미 하나의 프로세스가 임계구역에서 자원을 사용하고 있다면, 다른 프로세스는 임계구역에서 자원을 사용하여 작업을 할 수 없다.

 

2. 진행: 하나의 프로세스가 임계구역에서 작업이 끝나게 되면, 대기중인 프로세스가 임계구역을 사용한다.

 

3. 제한된 대기: 대기중인 프로세스가 임계구역에 접근하겠다는 요청 후 유한한 시간내에 요청이 받아 들여져야 한다.

 


 

뮤텍스(Mutex) / 세마포어(Semaphores)

 

동시성 프로그래밍의 가장 큰 숙제는 '공유자원 관리'일 것이다. 공유자원을 안전하게 관리하기 위해서는 상호배제를 달성하는 기법이 필요하다. 

 

뮤텍스와 세마포어는 이를 위해 고안된 기법으로 서로 다른 방식으로 상호배제를 달성한다. 이 둘의 차이를 알아봐자.

 

1. Mutex

 

뮤텍스는 화장실이 하나 뿐이 없는 식당과 비슷하다. 화장실을 가기 위해서는 카운터에서 열쇠를 받아가야 한다.

 

당신이 화장실을 가려고 하는데 카운터에 키가 있으면 화장실에 사람이 없다는 뜻이고 당신은 그 열쇠를 이용해 화장실에 들어갈 수 있다.

 

당신이 화장실에서 행복한 시간을 보내고 있는데 다른 테이블에 있는 어떤 남자가 화장실에 가고 싶어졌다. 이 남자는 아무리 용무가 급하더라도 열쇠가 없기 떄문에 화장실에 들어갈 수 ㅇ벗다. 결국 남자는 당신이 용무를 마친 후 나올 떄까지 카운터에서 기다려야 한다.

 

곧이어 옆 테이블에 있는 남자도 화장실에 가고싶어졌고 이 남자 또한 화장실에 들어가기 위해서는 카운터에서 대기해야한다.

 

이제 당신이 화장실에서 나와 카운터에 키를 돌려놓았다. 이제 기다리던 사람들 중 맨 앞에있떤 사람은 키를 받을 수 있고 이를 이용해 화장실에 갈 수 있다.

 

이것이 뮤텍스가 동작하는 방식이다. 화장실을 이용하는 사람은 프로세스 혹은 쓰레드이며 화장실은 공유자원, 화장실 키는 공유자원에 접근하기 위해 필요한 어떤 오브젝트이다.

 

즉 뮤텍스는 Key에 해당하는 어떤 오브젝트가 있으며 이 오브젝트를 소유한 (쓰레드, 프로세스) 만이 공유자원에 접근할 수 있다.

 

2. Semaphore

 

세마포어는 손님이 화장실을 좀 더 쉽게 이용할 수 있는 레스토랑이다. 세마포어를 이용하는 레스토랑의 화장실에는 여러 개의 칸이 있다. 그리고 화장실 입구에는 현재 화장실의 빈 칸 개수를 보여준다.

 

만약 당신이 화장실에 가고 싶다면 입구에서 빈 칸의 개수를 확인하고 빈 칸이 1개 이상이라면 빈칸의 개수를 하나 뺀 다음에 화장실로 입장해야 한다. 그리고 나올 때 빈 칸의 개수를 하나 더해준다.

 

모든 칸에 사람이 들어갔을 경우 빈 칸의 개수는 0이 되며 이때 화장실에 들어가고자 하는 살마이 있다면 빈 칸의 개수가 1로 바뀔 때까지 기다려야 한다.

 

사람들은 나오면서 빈 칸의 개수를 1씩 더한다. 그리고 기다리던 사람은 이 숫자에서 다시 1을 뺀 다음 화장실로 돌진한다.

 

이처럼 세마포어는 공통으로 관리하는 하나의 값을 이용해 상호배제를 달성한다.

 

세마포어도 아까와 똑같이 화장실이 공유자원이며 사람들이 쓰레드, 프로세스이다. 그리고 화장실 빈칸의 개수는 현재 공유자원에 접근할 수 있는 쓰레드, 프로세스의 개수를 나타낸다.

 

뮤텍스: 한 쓰레드, 프로세스에 의해 소유될 수 있는 Key를 기반으로 한 상호배제기법

 

세마포어: Signaling mechanism. 현재 공유자원에 접근할 수 있는 쓰레드, 프로세스의 수를 나타내는 값을 두어 상호배제를 달성하는 기법