프로세스 동기화

2022. 11. 15. 12:16cs 상식/운영체제

프로세스간 통신

프로세스는 독립적으로 실행

 

다른 프로세스랑  데이터를 주고 받으며  통신

 

 

한컴퓨터 내에서 실행하고 있는 다른 프로세스랑
네트워크와 연결된 다른 컴퓨터 프로세스

:  프로세스는 독립적으로 실행되기도 하지만 
다른 프로세스랑  데이터를 주고 받으며  통신  할수도있다 
통신은 한컴퓨터 내에서 실행하고 있는 다른 프로세스랑  할수있고 
네트워크와 연결된 다른 컴퓨터 프로세스랑도 할수았다

 

프로세스간 통신의 종류 

첫번째

한컴퓨터 내에서는  프로세스간 통신을 하는 방법

  • 파일과 파이플 이용하는 방법
    파일: 통신을 하려는 프로세스들이 하나의 파일을가지고 읽고 쓰는 방법이다 
    파이프: 운영체제가 생성한 파이프를 이용해 데이터를 읽고 쓰는것이다.

두번째

쓰레드를 이용한 방법

  • 쓰레드는 코드 ,데이터, 힙 영역을 공유하고 SKACK만
    각각 자신의 것이 있다 DATA있는 전역 변수나 힙을 이용하면 통신이 가능히다.

 

세번째

네트워크를 이용한 방법이다.

운영체제가 제공하는 소켓통신이나 , 다른 컴퓨터에 있는 함수를 호출하는 RPC를 이용해 통신 하는 방법이 있습니다.

 

 

공유자원가 임계구역

 

프로세스간 통신이 가능하다는 것을 알아 보았습니다.!

 

 

 

 

프로세스간 통신을  할떄 공동으로  이용하는 변수나 파일이 있는데 그것을 공유자원이라고 한다.

 

 

문제 : 공유자원은 여러 프로세스가 공유하고 있기에  각 프로세스에  접근 순서에 따라 결과가 달라 질 수있다.

또한 컨텍스트 스위칭으로 시분할 처리를 하기 에 어떤 프로세스가 먼저 실행되고 나중에 실행되는지 예측 하기 가

힘들다.(운영체제만 안다)따라서  연산 결과를 예측하기 힘들고 여기서 발생한 문제를 동기화 문제라고 한다.

 

 

EX) 게임

 

케릭터 : 총체력  100인데 현재 체력은 20 인 상황    (20/100)

 상황: 지금은 적에게 공격을 받고 있고 플레이어는 죽지 않기 위해 물약을 먹었다.

이때 물약을 먹는 코드와 적에게 공격을 받는 코드에서 발생하는 문제 가 있따,

 

 

 

두가지 코드가 동시에 실행되었는데 CPU스케줄러에 의해  공격 받는 코드가 먼저 실행이 된다고 하면 ??

 

  1. currentHealth에 20이 저장이된다./ currentHealth =20;
  2. 여기서 컨텍스트 스위칭을 하여 물약 먹는 코드가 실행이 된다.

  3. 물약먹는 코드의 두번쨰 줄이 실행되면서  currentHealth=20이 저장되고

  4. 세번쨰 줄 코드를 실행하여 health를 70으로 변경한다.

  

 

5.다시 컨텍스트 스위칭을 하여 공격받는 코드가 실행이 된다 .

(이전에 두번쨰 줄까지 실행이되어서 세번째 줄부터 실행이 된다) 

6.현재 공격 받는  코드  currentHealth 에는  20이 저장 되어있는 상황이다 .

7. 20-10을하면 health=10이 된다 .

 

결과적으로 는 60이 아니라 10이 되었다.

이유는 health라는 공유 자원을  여러 프로세스가 동시에 사용하기 때문에 문제 가 생긴다 

 

따라서 !  여러 프로세스가 동시에 사용하면 안되는 영역 정의  "임계구역(Critical Section)" 을 말한다 .

공유자원을 서로 사용하기 위해 경쟁하는 것은 경쟁 조건 (Race Condition) 이라고 한다.

임계구역에서 발생하는 문제를  조건

 

 

세마 포어 

상호 배제 메커니즘 하나인 세마포어에 대해 보겠다.

ex) 회사에서 직원들이 프린터를 한다. 직원들은 자신의 문서 작업이 마치면 프린터로 문서를 출력한다.

 

:프린터는 네트워크 통해 여러 컴퓨터와 연결이 되어있다 

직원a와 직원b은 동시에 프린터 출력을 하게되면   프린터를 차지 하기 위해 경쟁 조건에 있게 된다

이렇게 되면 프린터의 결과물이 두개의 결과물이 섞여서 나오기에 쓸모가 없어진다.

 

 

이런 상황을 막기 위해 다른 방법 

 

 

 

ex)프린터실을 따로 만들고 거기에 컴퓨터와 프린터가 있다 그것을  관리하는 관리자가 있따 직원은 관리자에게 열쇠를 받아서 프린터실에 입장해 혼자 사용할수 있다.늦게 온 직원은 이미 열쇠를 뺏겼기에 잠시 대기하고 있다.

직원a가 프린터를 다 사용하면  방에서 나오고 열쇠관리자에게 그 열쇠를 반납하고 직원b 가 열쇠를 받고 프린터실에 들어가 프린터를 사용한다 , 지금 사용한 것이 세마포어 메커니즘 이다 

 

동기화에 가장 중요한 개념이다.

 

 

프린터를 사용하는 직원: 프로세스

프린터: 여러 프로세스가 같이 쓰는 공유자원 

프린터를 쓰기 위해 프로세스가 기다리는 공간은 대기큐이다.

 

열쇠관리자:운영체제 이다. 

 

열쇠 관리자가 가지고 있는 열쇠는 : 세마포어 이다.

 

세마포어: 실제로 정수형 변수이다.

 

코드 작성

 

ex)게임 예시

 

공유자원은 1개이니  정수형 세마포어를 1로 준다 .

세마포어 초기 값을 1로 설정한다 , 

1.물약 먹는 코드가  실행된다 , wati ()함수를 호출한다 wait 함수는 열쇠를 획득하면 방에 들어가 문을 잠근다.

2.공격 받는 코드에서도 wati 함수를 호출했지만 열쇠가 없어서 기다린다, 다음 코드가 실행되지 않고 멈춰있게 된다.

3.다시  시간이 지나  물약 먹는 코드로 cpu가 넘어가게 되고  signal함수가 호출될때 까지 물약먹는 코드가 실행됩니다.

4.   물약먹는 코드가 signal 함수를 호출해서 열쇠가 반납이 된다. 그러면 작업 끝나고 

5. 시간이 지나 공격받느 코드로 cpu가 넘어가면 health 값을 변경하고 singnal()함수로 세마포어 (열쇠)를 반납 한다.

이렇게 세마포어를 이용하면 공유자원에 여러 프로세스가 접근하지 않기 에 동기화 문제가 발생하지 않는다.

세마포어는 실제로 여러개의 열쇠를 가질수 있따 

정수형 변수라고 했는데 , 공유자원이 2개면 세마포어는 2로 (열쇠) 설정하면된다.

 

 잘못 호출하여 세마포어를 잘못 사용할 수 있다.

이것을 해결하기 위해 "모니터" 라는 방법이 있다.

 

 

모니터

세마포어의 단점을 해결한 상호배제 매커니즘 이다.

 

모니터는 따로 윤영체제가 처리하는 것이 아니라 프로그램 언어차원에서 지원하는것이다.

 

 

ex)

 

syncronized 

만약  프로세스 a에서 increase 호출하면  그 뿐 아니라 decrease도 실행  할수가 없다.

 

모니터 구현만 완벽하면 프로그래머는 세마포어처럼 wati함수나 signal함수를 임계 영역에 작성하지 않아도 되서 편하게 코딩 할수 가 있다.

'cs 상식 > 운영체제' 카테고리의 다른 글

데드락  (0) 2022.11.16
CPU스케줄링 (2)  (0) 2022.11.14
CPU스케줄링  (0) 2022.11.14
프로세스와 쓰레드  (0) 2022.11.09
운영체제 들어가기  (0) 2022.11.09