일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- Bandit
- Linux
- 노말틱
- 리눅스 기초
- Normaltic
- Bitnami
- 보안
- 네트워크
- 기초
- 칼리
- mysql
- kali
- Web shell
- kali linux
- virtualbox
- Vitual Disk Image
- VDI
- Error
- shell
- 리눅스
- Virtual Box
- nomaltic place
- nomaltic
- MariaDB
- 칼리 리눅스
- Today
- Total
게으른 개발자
4강-2. Process Management 2 본문
부모 프로세스의 code, data, stack, pc , 등등을 그대로 복사해서 자식 프로세스를 만듦
원칙적으로는 부모 프로세스와 자식 프로세스는 서로 경쟁하면서 자원을 서로 많이 차지하려고 함.
Copy-on-write(COW)
리눅스나 효율적인 운영체제에서는 일단 자식이 부모의 공간을 공유하고 있다.
그러나 자식이 write가 발생한다면 그때 copy를 한다.( 내용이 수정이 될 때, 부모의 code, data, stack을 카피한다. )
그러나 부모의 모든 걸 copy 하는 게 아니다.
-> 원래 프로세스는 메모리에서 실행될 때, 모든 부분을 메모리 영역에 올려두고 작업하지 않는다. 따라서 잘게 쪼개서 물리적인 메모리에 올린다.
-> 그 쪼개져서 올려진 메모리 부분에서 write가 발생한다면 그 메모리(부모)의 code, data, stack, 등등을 copy 한다.
fork를 하게 되면 부모 프로세스의 문맥을 복제하게 된다. 따라서 부모의 pc register도 copy 하는데, 부모 프로세스가 [ pid = fork(); ]를 실행하게 되면 copy 가 되고 자식 프로세스의 pc register가 가리키는 명령어는 main 함수의 첫 라인이 아니라 fork() 바로 다음줄을 가리키게 된다.
자식 프로세스는 fork가 이루어진 다음 시점부터 실행이 된다.
if(pid == 0) printf("\n Hello, I am child!\n"); . . .
fork()의 리턴값이 자식|부모 프로세스마다 다르다.
따라서 원본 복제본 구분이 가능해진다. ---> 부모 프로세스 | 자식 프로세스에게 서로 다른 일을 시킬 수 있게 된다.
exec() 하게 되면 date라는 프로그램으로 덮어씌어지게 된다. exec를 하게 되면 되돌릴 수 없게 된다.
리눅스 shell
echo hello 3
output -> hello 3
echo라는 프로그램은 뒤에 있는 아규먼트를 그대로 출력해 준다.
execlp를 사용할 때는 프로그램 이름을 2번 써주고 그 프로그램에 전달할 아규먼트를 뒤에 넣어준다.(따옴표[""] 안에 넣어주고 콤마[,]로 구분해 준다. ) 그리고 마무리로 (char*) 0 끝내기
스레드 간의 협력은 프로세스 간의 협력보다 더 수월하다. 서로 같은 주소공간을 공유하기 때문.
메시지(direct, indirect 둘 다)는 커널을 통해서 전달된다.
shared memory를 하려면 초반에 kernel에게 shared memory를 한다는 system call를 해서 mapping을 해야 한다.
'cs > 운영체제' 카테고리의 다른 글
5강-2. CPU Scheduling 2 (1) | 2023.11.04 |
---|---|
5강-1. CPU Scheduling1 (0) | 2023.11.03 |
4강-1. Process Management 1 (0) | 2023.11.03 |
3강-2. Process2 (0) | 2023.11.03 |
3강-1. Process1 (1) | 2023.11.03 |