프로세스 생성
부모 프로세스가 자식 프로세스를 복제생성
ㅡ> 트리 형성
자원은 부모와 공유하지 않는 모델이 일반적이다
ㅡ> 각자 자원을 얻으려고 경쟁한다
자원 공유 모델
ㅡ> Copy-On-Write (COW)
ㅡ> 부모와 자원을 공유하며 쓰다가, write가 발생하면 그제서야 copy한다
ㅡ> 다 복제하는 것도 아니고, 수정하는 부분만 copy한다
<시스템콜>
fork()
ㅡ> 부모 프로세스를 복제
exec()
ㅡ> 복제한 것에 새로운 프로그램을 덮어 씌움
■ 복제
ㅡ> 프로그램의 문맥을 모두 복사
ㅡ> code, data, stack
ㅡ> cpu 문맥 등
프로세스 종료
■ C언어에서 main함수 중괄호가 닫히면
컴파일러가 거기에 exit()이라는 시스템콜을 넣어준다
■ exit할때 부모 프로세스한테 output 데이터를 보낸다
■
자발적 종료 : exit
비자발적 종료 : abort
■ 프로세스에는, 자식이 먼저 죽고 부모가 죽어야 함
ㅡ> 부모가 exit하는 경우 자식을 먼저 abort함
시스템콜
fork()
pid=fork()를 통해 자식 프로세스가 생성될때
PC도 복제되어서
자식 프로세스는 main()부터 시작하는게 아니라 fork() 이후부터 시작하게 된다
문제
ㅡ> 1. 복제본이 자기가 원본이라고 생각할 수 있다
ㅡ> 2. 복제하다보니 모든 프로세스가 동일할 수 있다
원본
ㅡ> OS가 원본과 복제본을 구분해준다
ㅡ> 원본 프로세스는 fork()의 return값이 양수이다. (정확히는 자식 프로세스의 PID)
ㅡ> 복제본은 fork()의 return값이 0이다.
ㅡ> PID = 프로세스의 주민번호 같은 식별자
ㅡ> 위 그림에서는 fork()의 결과값(pid)를 통해 부모와 자식에게 다른 일을 시키고 있다
동일
ㅡ> exec()을 통해 새로운 프로세스로 만든다
exec()
여기서 자식 프로세스는 execlp를 통해 date라는 프로그램으로 교체된다.
wait()
wait()에서 sleep상태에 들어갔다가
자식 프로세스가 종료된면 그제서야 ready상태가 돼서 cpu를 얻고 다음 코드를 수행한다
ex)
리눅스 쉘에서 프로그램 이름을 치면 프로그램을 실행하는데
그게 wait()시스템을 사용한 것이다.
쉘에서 프롬프트($ or #)을 띄우고 사용자 입력을 대기하는게 하나의 프로그램이고,
입력을 받아서 프로그램을 실행하면 그동안 쉘은 sleep상태였다가
프로그램이 끝나면 쉘에 프롬프트가 다시 뜬다.
exit()
프로세스 협력
IPC
ㅡ> Interprocess Communication
ㅡ> 프로세스 간 협력 메커니즘
ㅡ> 1. message passing
ㅡ> 2. share memory
Message passing
ㅡ> 커널을 통해 프로세스끼리 메시지 전달
받는 프로세스 명시
ㅡ> Direct
명시안함
ㅡ> indirect
Shared Memory
Shared Memory
ㅡ> 일부 메모리를 공유해서 써서 통신함
ㅡ> 커널한테 shared memory 쓴다는 시스템콜을 통해 부여받음
쓰레드간의 협력
ㅡ> 프로세스간의 협력은 아님
'CS > 운영체제' 카테고리의 다른 글
[OS] Process Synchronization (0) | 2025.01.03 |
---|---|
[반효경os] CPU Scheduling (1) | 2024.12.10 |
Process (0) | 2024.11.25 |
[반os] 시스템구조 & 프로그램 실행 (1) | 2024.11.06 |
[반os] 운영체제란 무엇인가 (0) | 2024.11.04 |