본문 바로가기
컴퓨터 공학/운영체제

Chapter 3. 프로세스 - 2부

by 조엘 2020. 9. 17.

안녕하세요 조엘입니다! 운영체제 3단원에 대해 공부해 보았습니다.

Abraham Silberschatz의 Operating System Concepts 10th edition과 학부 수업을 듣고 정리한 내용입니다. 오개념이 있다면 알려주세요~~

1,2부로 나뉘어 있습니다!

 

<프로세스간 통신>

프로세스가 시스템에서 실행중인 다른 프로세스와 데이터를 공유하지 않으면 독립적이라한다.

프로세스가 시스템에서 실행중인 다른 프로세스와 데이터를 공유한다면 협력적이라고 한다. 

프로세스가 데이터를 공유를 해야하는 이유는 다음과 같다. 

  1. 정보 공유가 필요한 경우

  2. 계산을 빨리 할 수 있다. (병렬 처리의 가능성)

  3. 시스템 기능을 별도의 프로세스/스레드로 나누어 모듈식 형태로 시스템 구성을 할 수 있다. 

 

이렇게 좋은 데이터 공유를 하기 위해서는 프로세스간 통신(IPC) 기법이 필요하다. 2가지 방법이 있다. 

  1. 공유 메모리 사용하기 

    장점 - 공유 메모리 영역을 구축할 때만 시스템 콜이 필요하며, 그 이후엔 일반적인 메모리 접근과 동일한 방식이다. 

    단점 - 서로 다른 프로세스가 같은 데이터에 동시에 접근하는 충돌을 조심해야 한다. 

  2. 메시지 전달 사용하기

    장점 - 적은 양의 데이터 교환에 유용하다. 

    단점 - 시스템 콜을 통해 구현하게 된다. 커널의 간섭 등으로 인한 부가작업이 시간을 더 들게 한다. 

 

현 운영체제들은 두 가지 모두를 지원한다. 하나씩 알아보자. 

 

<공유 메모리를 통한 시스템에서의 프로세스 간 통신>

통신하는 프로세스들끼리 공유 메모리 영역을 구축해야한다. 이 영역은 공유 메모리 세그먼트를 생성하는 프로세스의 주소공간에 위치하며, 타 프로세스는 이 세그먼트를 자신의 주소 공간에 추가해줘야한다. 

 

원래 OS는 한 프로세스가 다른 프로세스의 메모리 영역에 접근하는 것을 금지하지만, 공유 메모리는 이 금기사항을 깨는 것이다! 상호 동의를 통해 이루어지며, 동시에 동일한 위치에 메모리 쓰기를 하지 않아야한다!

 

이 공유 메모리를 구현하기 위해서, 생산자 - 소비자 프로세스로 두 프로세스를 나누게 된다.

또한 해당 정보를 담아두기 위해 버퍼를 공유 메모리 영역에 만들어 주게 된다. 

생산자는 버퍼에 정보를 채우고, 소비자는 버퍼에 있는 정보를 소비하게 된다. 

 

공유 메모리를 구현하기 위해서는 메모리에 접근하고, 조작하는 코드를 응용 프로그래머가 직접 작성해야 한다. 

 

<메시지 전달을 통한 시스템에서의 프로세스 간 통신>

메시지 전달을 통해 프로세스들이 통신하기 위해, 최소한 두가지 연산이 필요하다. 

  1. send(message)     2. receive(message)

 

프로세스 P와 프로세스 Q가 메시지 전달을 통해 통신한다고 가정하고 설명을 하겠다. 

프로세스 P와 Q의 통신연결을 설정시 다음을 고려해야 한다.  

  1. 직접/간접 통신

  2. 동기식/비동기식 통신

  3. 버퍼링

 

하나씩 알아보자. 

 

<직접/간접 통신>

프로세스 P와 Q가 서로 연결되기 위해선, 서로를 가르켜야 한다. 직접 통신 방식과 간접 통신 방식이 있다. 

 

직접

통신의 송수신자를 각각 명시해야한다. 방법은 2가지 대칭, 비대칭 방식이 있다. 정확히 하나의 연결이 존재하게 된다. 

  대칭

  - send(P,msg) //P에 msg를 보냄

  - receive(Q,msg) //Q로부터 msg를 받음

  비대칭

  - send(P,msg) //P에 msg를 보냄

  - receive(id, msg) //임의의 프로세스로 부터 msg수신, id는 통신을 발생시킨 프로세스 이름으로 설정됨

직접 통신 방법은 프로세스를 지정하는 방식이 모듈성을 제한한다는 단점이 있다.

 

간접

고유의 id를 가진 mailbox나 port로 메시지를 송수신하게 된다. 간접 통신은 두개 이상의 프로세스들과 연관될 수 있다. 

  - send(A, msg) //메시지를 메일박스 A로 송신

  - receive(A, msg) //메시지를 메일박스 A로 수신

 

<동기식/비동기식 통신>

send와 receive를 구현하는 두가지 방법이 있다. 동기식과 비동기식이 바로 그것이다. 

  - 동기식 send: 송신 프로세스의 메시지가 수신 프로세스 혹은 메일박스에 도착할때 까지 송신 봉쇄

  - 비동기식 send: 송신 프로세스가 메시지를 보내놓고, 작업 재시작

  - 동기식 receive: 메시지가 이용가능할 때 까지 수신 프로세스를 봉쇄

  - 비동기식 receive: 수신프로세스는 null을 받거나, 메시지를 받는다. 

 

<버퍼링>

통신하는 프로세스들에 의해 교환되는 메시지는 큐에 들어가게 된다. 큐를 구현하는 방식은 다음과 같다. 

  - 무용량: 송신자가 수신자 메시지 수신을 기다린다 

  - 유한용량: 송신자 입장에서 큐가 꽉 차면, 이용 가능할 때까지 송신을 멈춘다

  - 무한용량: 큐의 용량이 무한해 메시지를 얼마든지 보낼 수 있다

 

<클라이언트-서버 환경에서의 통신>

위에서의 공유 기법들은 동일 시스템 내에서의 통신이다. 그렇다면 다른 시스템에 있는 프로세스와 통신은 어떤 방식으로 이루어 지는지 알아보자. 두 가지 방식이 책에서는 소개된다. 

  1. 소켓

  2. 원격 프로시저 호출(RPC)

 

<소켓>

네트워크로 연결되어 있는 다른 시스템의 프로세스가 소통하기 위해 소켓을 사용할 수 있다. 

소켓은 통신의 endpoint라는 뜻이며, 소통을 위해선 양 프로세스에 하나씩 필요하다. 

각 소켓은 ip와 port번호 두 가지를 접합하여 구별하게 된다. 소켓을 통해 네트워크의 복잡한 하부 계층 세부 지식이 없이도 네트워크 프로그램이 개발 가능하다. 

Socket을 통한 통신, 응용 계층에서 통신이 가능하다

서버는 지정된 포트의 클라이언트 요청 메시지가 전달될때를 기다리며, listening 상태로 대기한다. 

클라이언트는 해당 서버의 ip주소와 port번호를 통해 서버와 연결을 시도하게 된다.

서버가 클라이언트의 연결 요청을 수락하면, 연결이 완성된다. 

 

<원격 프로시저 호출>

네트워크에 연결된 두 시스템 사이의 통신을 마치 프로시저 호출을 하듯 설계를 한게 원격 프로시저 호출(RPC)이다. 

클라이언트는 일반 프로시저를 호출하듯 실행되어야 할 함수의 식별자, 매개변수를 서버에 전달하게 된다.

서버는 해당 요청을 받아 프로시저를 실행하고 어떤 출력이든지 별도의 메시지를 통해 클라이언트에게 반환한다.

RPC 시스템은 클라이언트와 서버에게 스텁을 제공해 통신을 위한 자세한 사항을 숨겨 준다.

 

과정을 조금 더 자세하게 설명하면 다음과 같다. 

  1. 클라이언트가 원격 프로시저를 호출하면 RPC는 그에 대응하는 스텁을 호출한다. 

  2. 클라이언트가 원격 프로시저가 필요로 하는 매개변수를 건네준다. 

  3. 클라이언트 스텁이 원격 서버의 포트를 찾고, 매개변수를 정돈한다. 

  4. 클라이언트 스텁은 메시지 전달 기법을 통해 서버에게 메시지를 전달한다. 

  5. 이에 대응하는 서버 측 스텁이 메시지를 수신한 후 적절한 서버의 프로시저를 호출한다. 

  6. 반환값도 동일한 방식으로 되돌려준다. 

RPC 메커니즘

 

반응형

'컴퓨터 공학 > 운영체제' 카테고리의 다른 글

Chapter 5. CPU 스케줄링 - 1부  (0) 2020.10.16
Chapter 4. 스레드와 병행성  (0) 2020.09.17
Chapter 3. 프로세스 - 1부  (0) 2020.09.17
Chapter 2. 운영체제 구조  (0) 2020.09.13
Chapter 1. Introduction  (0) 2020.09.10

댓글