Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

운기의 블로그

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

운영체제

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

운띠야 2020. 2. 7. 02:38

동기와 비동기

 

1. 동기식 처리 모델

 

동기식 처리 모델은 직렬적으로 태스크를 수행한다.

예를 들면 우리는 집안일을 해야한다. 집안일에는 빨래, 설거지, 청소가 있다.

동기식 방법이라면 우리는 빨래를 하고 설거지를 하고 청소를 하는 순서로 하나의 업무가 끝나야지 다른업무를 할 수 있는 것이다. 

 

https://martech.zone/javascript-async/ 참조

각각의 색들은 하나의 스레드 (=task) 라고 보자.

그리고 파란색 스레드에서 하얗게 빈 공간은 파란색 스레드가 진행하고 있다가, 외부에서 데이터를 가져오는 부분이다.

다시 말하면, 하나의 스레드가 진행하고 있다가 외부에서 데이터를 요청하고 데이터 응답을 기다릴 때 까지 파란색 스레드는 작업을 중단하게 된다. 

 

즉, 파란색 스레드가 실행되고 외부에서 값이 반환될 때 까지 스레드는 작업중단( Blocking ) 되어있다.

 

 

 

2. 비동기식 처리 모델

 

동기식 처리 모델은 병렬적으로 태스크를 수행한다.

동기식에서 예시를 들었던 것과 똑같이 예시를 들겠다.

 

집안일에는 빨래, 설거지, 청소가 있다.

비동기식 방법이라면 우리는 빨래는 빨래 업체에, 설거지는 설거지 업체에, 청소는 청소업체에 맡겼기 때문에 나는 작업이 끝났다는 알람만 기다리고 다른일을 할 수 있는 것이다.

 

https://martech.zone/javascript-async/ 참조

위의 예시에서 들은 것 처럼 각각의 스레드가 종료되지 않아도 대기하지 않고 다른 스레드를 실행 할수 있다.

아까처럼 파란색 스레드에서 외부에서 데이터를 요청하고 응답 받을려고 한다면, 이 부분은 다른 색의 스레드에 요청하고 자신은 데이터가 응답됬다는 이벤트가 발생하면 그 데이터만 받아서 작업을 수행하면 된다. 

 =

 

 

이러한 모델을 Non - Blocking 이라고 한다.

 

 

예시참조 : https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/OS


프로세스 동기화

 

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

 

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

 

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

 

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

 

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

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

 

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

 

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

 

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

 

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

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

 

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

 


병행 프로세스 해결 과제

 

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

 

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

2) 계산 속도 향상

3) 모듈적 구성 강화

4) 편의성 증대 

 

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

 

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

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

 

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

 

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

 

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

 

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

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

 

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

 

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

 

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

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

 

 


Mutex Lock / Semaphores 

 

위의 조건을 가지고 임계구역을 만드는 방법으로는 Mutex Lock (뮤텍스 락) / Semaphores ( 세마포어 ) 가 있다.

 

1. Mutex Lock

 

뮤텍스 락은 아래와 같은 코드로 구현 할 수 가 있다.

나머지 구역은 코드에 나머지 부분들을 총칭 하는 겁니다.

 

동작원리로는

프로세스는 입장구역 ( entry section ) 에서 출입을 허가 받아야지 임계구역 ( critical section ) 으로 진입 할 수 있다. 

임계구역에 진입한 프로세스는 Lock을 획득하고 다른 프로세스들이 진입하지 못하게 한다. 작업이 끝나게 되면 임계구역을 나올 때 Lock 을 반납함으로써 다른 프로세스들이 접근 할 수 있게 만든다. 

즉, 하나의 프로세스만 동기화 할 수 있다.

 

단점으로는 바쁜대기가 발생하게 된다. 임계영역에 계속해서 진입해야하기 때문에 프로세스는 진입코드를 계속 반복적으로 수행하기 때문에 Cpu의 낭비가 발생한다.

 

 

2. 세마포어

 

뮤텍스락은 하나의 동기화 대상을 Lock 으로 임계영역에 들어올 수 있는 권한부여해서 관리했지만,

세마포어의 경우 하나 이상의 동기화 대상들을 관리할수 있다.

https://sycho-lego.tistory.com/11 참조

 

세마포어는 자원을 사용하면 세마포어 감소, 방출하면 세마포어가 증가하는 방식으로 구현되어있다.

 

프로세스가 임계영역에 들어가서 자원을 사용하면 세마포어를 감소시키는데,

이때 세마포어의 값이 0이 되면

자원을 사용하고 있는 프로세스들이 반환되기 전까지는 다른 프로세스들은 기다려야 한다.

 

뮤텍스락에서는 계속해서 Lock이 반환이 됬는지 안됬는지 확인하는 절차가 존재해 바쁜대기 상황이 발생하지만,

 

세마포어의 경우에는 대기 큐에 들어가 sleep 상태로 대기하게 된다.

그렇게 세마포어가 반환이 되면 대기큐에서 sleep 중인 프로세스를 깨우기 때문에 바쁜대기가 발생하지 않는다.

 

단점으로는 교착상태에 빠질 수 있다. 

교착상태란 세마포어가 Ready Queue를 가지고 있고, 둘 이상의 프로세스가 임계 영역 진입을 무한정 기다리고 있다면, 

임계영역에서 실행되는 프로세스는 진입 대기중인 프로세스가 실행되어야만 빠져나올 수 있는 상황을 지칭한다.

 

다시 말하자면,

 

A 프로세스가 A' 라는 임계 영역에서 공유자원 Am을 사용하고 있다고 생각해보자

그런데 A프로세스는 공유자원인 Bm도 필요로 한다. 

 

하지만 공유자원 Bm은 임계영역 B'에서 B 프로세스가 사용하고 있다.

그런데 우연히도 B 프로세스는 공유자원 Am을 필요로 한다. 

 

이럴경우 A 프로세스는 공유자원 Bm을 받기 위해 대기할 것이고 B 프로세스 역시 공유자원 Am을 받기 위해 대기하게 되는데 이때 두 프로세슨느 무한정 대기 상태에 빠지게 되고 이것을 DeadLock (교착상태) 이라고 한다.