강의: 비전공자를 위한 운영체제
프로세스 간 통신
프로세스는 다른 프로세스와 데이터를 주고받으며 통신을 하는 경우도 있다. 한 컴터내에서 실행되는 다른 프로세스와 통신할수도 있고, 네트워크와 연결된 다른 컴터의 프로세스와 통신하기도 한다.
파일 이용하는 방법)
통신하려는 프로세스들이 하나의 파일을 이용해 읽고 쓰는 법
파이프 이용하는 방법)
운영체제가 생성한 파이프 이용해 데이터를 읽고 쓰는 방법
쓰레드 이용하는 방법)
한 프로세스 내에서 쓰레드 간 통신하는 방법임. 쓰레드는 코드, 데이터, 힙 영역을 공유하고 스택만 각자 자기의 것만 가지고 있음. 여기서 데이터영역에 있는 전역변수가 힙을 이용하면 통신가능
네트워크 이용하는 방법)
운영체제가 제공하는 소켓통신이나, 다른 컴터에 있는 함수를 호출하는 RPC(원격 프로시져 호출)을 이용해 통신하는 방법
공유자원과 임계구역
공유자원)
프로세스 간 통신시 공동으로 이용하는 변수가 파일들.
-> 동기화 문제 발생가능함.
근데 공유자원은 여러프로세스가 공유하고 있기에 각 프로세스의 접근순서에 따라 결과가 달라질 수 있음. 또, 컨텍스트 스위칭으로 순서가 정해지기 때문에 어떤 프로세스가 먼저 실행되는지 모름. 따라서 연산결과를 예측하기 힘들다. 이런 문제를 동기화 문제라 함.
ex) 게임에서 공격을 받는 상황에서 물약을 먹었어. 그럼 아래 코드에서 왼쪽의 물약먹느노드의 2번줄의 코드가 실행되고, 곧바로 컨텍스트스위칭되서 오른쪽 공격받는 코드의 2번째줄의 코드가 실행됨. 또다시 콘텍스트스위칭되서 물약먹는코드 실행되면 health = 70인데, 다시 컨텍스트스위칭되서 공격받는 코드에서 health = 10이 되버림. 서로 달라져.
-> 이런 이유는 health라는 공유자원을 여러 프로세스가 동시에 사용했기 때문. 따라서 여러 프로세스가 동시에 사용되는 영역을 정의했는데 이를 '임계구역'이라고 함.
임계구역 문제를 해결하기 위해선 상호배제 매커니즘이 필요하고 다음 조건이 있음.
1) 임계구역엔 동시에 하나의 프로세스만 접근가능하다
2) 동시에 여러요청 있더라도 하나의 프로세스만 접근 허용한다
3) 임계구역에 들어간 프로세스는 최대한 빠르게 나와야 한다.
세마포어)
상호배제 매커니즘 중 하나임. 단순무식하지만 동기화에서 가장 중요한 개념임.
ex) 프린터를 서로 두명이 이용하는 경우, 동시에 프린트했더니 프린트가 두명 꺼가 섞여서 나오네?? 이를 방지하기 위해 프린터실 안에 들어가서 프린트하도록 열쇠관리자가 키를 관리하면서 프린터실에 들어가는 사람한테 키를 주고 키없으면 못들어가게 함. 들어간사람이 나오면 키 반납하고 다음사람 들어감. 단순무식.
-> 운영체제에서 쓰이는 용어로 매칭시키면,
프린트 사용하려는 직원 = 프로세스들.
프린터 = 공유자원
기다리는 공간 = 대기큐
열쇠관리자 = 운영체제
열쇠 = 세마포어
어떻게 세마포어가 활용되는가?
위에서 게임예시 계속 해보자. 공격받기 직전 물약먹는 예시)
1. 세마포어 선언
공유번수가 health 하나라서 초기값을 1로 함(여러개면 2,3 등 정수형으로 설정가능)
2. 먼저 도착한 물약먹는 코드 실행됨
wait()함수는 열쇠받을 때까지 기다렸다가 열쇠받으면 방에 들어가 문을 잠그는 역할임.
지금은 젤 먼저 도착했으니까 열쇠가 있어서 바로 실행고고
3. 이 순간 공격받는 코드로 cpu넘어감.
앗 근데 위 물약먹는 코드에서 열쇠를 가져갔으니 wait()함수에서 기다려야 함.
4. 다시 물약먹는 코드로 cpu넘어감.
signal()함수가 호출되서 열쇠가 반납되야 하고, 그제서야 공격받는 코드의 wait()함수가 종료됨
5. 이제 열쇠(= 세마포어)반납됐으니까, wait()에서 세마포어 받아서 실행됨.
이렇게 세마포어 사용하면 공유자원에 여러 프로세스가 동시에 접근하지 못하기 때문에 동기화 문제가 발생하지 않는다.
그러나, 세마포어가 좋아만 보이지만, 단점도 있음. wait wait을 연속으로 쓰거나 signal signal을 연속으로 써서 잘못 사용할 수도 있다는 것임.
-> 모니터로 해결
모니터
세마포어의 단점을 해결한 상호배제 메커니즘.
모니터는 os에서 지원하는 방법이 아님. 따로 프로그래밍 언어차원에서 지원하는 방법임.
자바 예시)
synchronized키워드를 활용하는 것임. 이 키워드가 붙은 함수는 동시에 여러 프로세스에서 실행시킬 수 없다. 즉, 상호배제가 완벽하게 이뤄짐.
만약 프로세스 A에서 increase()를 실행하면, 프로세스 B에서는 increase()함수 뿐 아니라 synchronized함수가 붙은 decrease()도 실행할 수 없음.
모니터 구현만 완벽하다면 프로그래머는 세마포어처럼 wait()이나 signal()함수를 임계영역에 감싸지 않아도 되서 안전하고 편리하게 코딩가능함.
'개발인강' 카테고리의 다른 글
[운영체제] 컴파일과 프로세스 (0) | 2022.01.12 |
---|---|
[운영체제]데드락(교착상태) (0) | 2022.01.09 |
[운영체제] cpu 스케쥴링 (0) | 2022.01.01 |
[운영체제] 프로세스와 쓰레드 (0) | 2021.12.31 |
[JAVA 복습] 자바구동방식, call by value , JVM 작동방식 등 (0) | 2021.12.27 |
댓글