전공/시스템 프로그래밍(운영체제)

8. Multy-Process와 Mutual Locking

문정훈 2021. 11. 6. 08:27

1. Process management 개요

1) 프로세스의 형태

운영체제는 직역을 하면 구성 시스템이다. 

그럼 무엇을 구동하냐? 프로세스를 구동시키기 위해 존재한다. 

Mutual Locking이 왜 필요한지는 프로세스를 알아야 왜 필요한지를 알게 된다. 

 

프로그램은 storage(such as HDD)에 저장되어 있다. (이는 실행될 수 있는 2진 형태이다.)

이 프로그램을 실행하게 되면 실행되 수 있는 2진 소프트웨어가 메인메모리에 적재가 된다. 이것이 loading이라고 한다. 

HDD->RAM으로 loading 될 때 기존의 프로그램에서 모양이 달라지며 loading되는데 

아래와 같은 메모리 구조를 가지며 프로세스가 된다. 위와같이 생긴것이 프로세스이다. 

Stack
 
heap
data section
text section

● data section

int g;// 전역 변수
int main() {
  int i = 0; //데이터이다.
  i = 3; //명령이다. 
  i = i + 1; //명령이다. 
}

data section에는 전역 변수가 들어간다. 

 

● text section

우리가 짠 소스코드를 보면 데이터가 있고 명령이 있다. 명령어들이 위치하는 곳이다. 

 

● stack

함수가 실행될 때 마다 해당 함수 프레임을 만든다. 그 프레임안에 함수의 변수들을 저장한다. 

 

2) 프로세스가 실행되는 방식

● 프로세스 구동 방식

p1, p2, p3... 프로세스가 있다고 하면 cpu는 코어의 개수 1개라 가정하면 여러 프로세스를 조금씩 빠르게 실행한다.

이것의 처리 속도가 빨라 여러 프로세스가 동시에 처리되는 것 처럼 보이는 것이다. 

이런 구동 방식은 여러 프로세스가 동일한 파일을 공유할 때(특히 write를 할 때) 문제가 발생한다. 

실제로 위 프로세스들이 한 공유 파일을 모두 read하는 경우는 문제가 발생하지 않지만 한 프로세스라도 write를 할 때 문제가 발생한다.

=> 하나의 자원에 여러 프로세스가 동시에 write 하면 문제가 발생한다. 

=> 한 프로세스만 write하고 나머지 프로세스는 읽기만하는데도 컴퓨터 입장에서는 문제가 발생한다. 

 

● 여러 프로세스가 한 파일을 동시에 사용할 때 문제점 발생

p1, p2, p3 프로세스는 RAM안에서 본인의 메모리 공간 영역을 할당받는다. 

그리고 세 프로세스에서 HDD 에 있는 파일을 동시에 open한다고 하면 이 HDD의 동일한 파일이 세 프로세스 버퍼에 3번 복사가 된다. 

p1, p2, p3에서 write라는 IO작업을 하면(세 IO 작업은 파일의 서로 부분을 수정한다고 가정)

그리고 p1이 flush를 한 뒤 p2가 flush를 하면 HDD 입장에서는 p1이 작업한 내용에 p2가 작업 한 내용을 덮어쓰게 되는 것이다. (p1의 작업이 날아가는 문제가 발생한다.)

 

● 문제점 해결 방법

위와 같은 문제점을 해결하기 위해

HDD에 파일이 우선 있다.

p1이 write mode로 open 했다. (p1이 RAM에 차지하고 있는 버퍼의 영역에 HDD-> RAM loading 작업함)

p1 write mode로 파일을 가져간다면 해당 파일은 잠근다. (Locking 한다.) 그래서 p1이 write가 끝나고 close 할 때까지 른 p2 프로세스에서 locking된 파일을 read mode로 open 하지 못한다. 

그럼 p2는 무엇을 하냐?=> p1이 close할 때까지 p2는 하던일을 멈추고 sleep 한다. 

그리고 p1이 close를 하는 순간 운영체제가 sleep 하고있는 p2를 깨우고 p2는 open을 진행하게 된다. 

 

※ write는 atomick operation이라고 하는데 write는 open된 시점부터 close될 때까지 누군가가 개입할 수 없다는 것을 의미한다. 

 

● flockfile

#include <stdio.h>
void flockfile(FILE* stream);

위 함수는 스트림을 locking 해주는 메소드이다.

즉 스트림 형태의 buffer가 업데이트 될 때까지 다른 프로세스에서 read mode open을 하지 말라는 의미이다. 

 

● ftrylockfile

#include <stdio.h>
int ftrylockfile(FILE* stream);

해당 스트림의 locking을 해제한다. 즉 다른 프로세스의 sleep을 깨우라고 os에게 알린다. 

'전공 > 시스템 프로그래밍(운영체제)' 카테고리의 다른 글

10. Threading  (0) 2021.12.27
9. Process Management  (0) 2021.11.11
7. Buffered IO  (0) 2021.10.17
6. Blocking, non-Blocking  (0) 2021.10.17
5. 추가적인 System Call  (0) 2021.10.17