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 |