Be ready to study forever - 개발자 꿈나무
프로세스 구조와 IPC(Inter Process Communication) 본문
프로세스 구조
컨택스트 스위칭
CPU에 실행할 프로세스를 다른 프로세스로 교체하는 기술
** 하지만 Running상태에서 Ready상태로, Ready상태에서 Running상태로 바뀐 프로세스는 어떻게 멈춘 지점부터 바로 CPU에서 읽을 수 있는 걸까?
정답은 – PC(Program Counter)와 SP(Stack Pointer)에 있다. 이 값들은 CPU에서 읽어 들이는 값을 가르킴. 따라서 CPU는 PC와 SP의 값을 순서대로 읽고 계산하게 된다.
- PC – 프로세스 카운터는 프로세스의 Text영역에서 다음에 실행할 코드의 주소를 가르키고 있다.
- SP – 스택 포인트는 프로세스의 Stack영역의 끝주소, 즉 최근에 스택에 영역에 들어온 데이터가 있는 주소를 가르 키고 있다
** 그렇다면 컨택스트 스위칭이 발생할 때에는 PC와 SP값은 어디에 저장 되고 어디서 불러오는 걸까? – 정답은 프로세스 안에 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 Queue와 Pipe와는 다르게 직접적으로 커널 공간에 메모리 공간을 만들어서 어느 프로세스에서도 접근할 수 있게끔 하는 기법. 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 |