Be ready to study forever - 개발자 꿈나무

프로세스 구조와 IPC(Inter Process Communication) 본문

Programming/Operating System

프로세스 구조와 IPC(Inter Process Communication)

루눌룹 2021. 1. 6. 20:15

프로세스 구조

컨택스트 스위칭

CPU에 실행할 프로세스를 다른 프로세스로 교체하는 기술

** 하지만 Running상태에서 Ready상태로, Ready상태에서 Running상태로 바뀐 프로세스는 어떻게 멈춘 지점부터 바로 CPU에서 읽을 수 있는 걸까?

정답은 – PC(Program Counter)SP(Stack Pointer)에 있다. 이 값들은 CPU에서 읽어 들이는 값을 가르킴. 따라서 CPUPCSP의 값을 순서대로 읽고 계산하게 된다.

-      PC – 프로세스 카운터는 프로세스의 Text영역에서 다음에 실행할 코드의 주소를 가르키고 있다.

-      SP – 스택 포인트는 프로세스의 Stack영역의 끝주소, 즉 최근에 스택에 영역에 들어온 데이터가 있는 주소를 가르    키고 있다

** 그렇다면 컨택스트 스위칭이 발생할 때에는 PCSP값은 어디에 저장 되고 어디서 불러오는 걸까? – 정답은 프로세스 안에 PCB에 저장이 된다.

PCB(Process Control Block)?

프로세스를 관리하기 위해 해당 프로세스의 필요한 정보를 모아 놓은 블록

 

 

1) 프로세스 식별자(Process ID)

2) 프로세스 상태(Process State) : 생성(create), 준비(ready), 실행 (running), 대기(waiting), 완료(terminated) 상태가 있습니다.

3) 프로그램 계수기(Program Counter) : 프로그램 계수기는 이 프로세스가 다음에 실행할 명령어의 주소를 가리킵니다.

4) CPU 레지스터 및 일반 레지스터: 스택 포인트 값을 저장하고 있는 부분

5) CPU 스케줄링 정보 : 우선 순위최종 실행시각, CPU 점유시간 

6) 메모리 관리 정보 : 해당 프로세스의 주소 공간 등

7) 프로세스 계정 정보 : 페이지 테이블스케줄링 큐 포인터소유자부모 등

8) 입출력 상태 정보 : 프로세스에 할당된 입출력장치 목록열린 파일 목록 등

9) 포인터 : 부모프로세스에 대한 포인터자식 프로세스에 대한 포인터프로세스가 위치한 메모리 주소에 대한 포인터할당된 자원에 대한 포인터 정보 등.

프로세스간 커뮤니케이션 – IPC(Inter Process Communication)

프로세스간 데이터 접근은 불가능하다. 프로세스는 가상 메모리를 사용하고 있고, 다른 프로세스가 Heap영역이나 DATA영역에 접근하여 값을 변경한다면 위험하기 때문이다. 하지만 프로세스끼리 통신을 해야 할 경우라면 어떻게 해야할까?

프로세스간 커뮤니케이션은 IPC기법으로 해결한다.

그림에서 보듯이 프로세스는 커널 공간을 공유한다. 이유는 여러가지가 있겠지만, 한 가지 만 꼽자면, 중복되는 1GB나 되는 커널 공간을 각자 가지고 있는 것은 자원 낭비이기 때문이다. 따라서, 대부분의 IPC기법은 커널 공간을 활용해서 프로세스간 값을 전달하고 전달받는다.

IPC기법들

-      file 사용

직접 파일에 접근해서 Write 하고 다른 프로세스에서 수정된 파일에 접근, Read하는 방식, 문제는 값을 전달 받는 프로세스는 값이 변경 됬는지 알 수 있는 방법이 없음. 게다가, Storage에 접근 하기 때문에 속도가 느림(비효율적).

 

-      Pipe

단방향 통신이며, fork()로 자식 프로세스를 만들었을 때만 사용가능(부모->자식 으로 정보 전달)

파이프의 예제코드

-      Message Queue

말그대로 Queue의 자료구조 형태이며, Pipe와는 다르게 양쪽 프로세스에 모두 메시지 큐를 넣는다면, 양방향 통신이 가능하다

메시지 큐의 예제코드

-      Shared Memory

Message QueuePipe와는 다르게 직접적으로 커널 공간에 메모리 공간을 만들어서 어느 프로세스에서도 접근할 수 있게끔 하는 기법. key값을 이용해서 공유 메모리(Shared Memory)의 원하는 Value에 접근할 수 있다.

 

쉐어드 메모리의 예제코드

-      Signal

커널 또는 프로세스에서 다른 프로세스에 어떠한 이벤트가 발생했는지 알려주는 기법으로 프로세스 관련 코드에 관련 시그널 핸들러를 등록해서 시그널을 처리함.

시그널 종류

 

시그널 예제코드

-      Socket

소켓은 네트워크 통신에 사용되는 기술이지만 두개의 프로세스간 통신에도 사용 될 수 있다.

프로세스간 통신 도표

'Programming > Operating System' 카테고리의 다른 글

파일 시스템  (0) 2021.01.07
가상 메모리와 페이징  (0) 2021.01.07
Thread의 이해  (0) 2021.01.06
운영체제의 스캐쥴러 이해  (0) 2021.01.06
운영체제 배경지식  (0) 2021.01.05
Comments