TechY
Process Management 2 본문
kocw 강의 : 이화여자대학교 반효경 교수님의 운영 체제 강의,9강 Process Management
- 부모 프로세스의 문맥 (pc까지)을 복사해서 자식 프로세스를 만든다.
- 새로운걸 만드는데 왜 바꾸는걸까
- 기존에 띄워져 있던 프로세스와 아무 관계가 없는 완전히 새로운 프로세스를 실행한다고 하더라도, 복제 작업이 효율성 측면에서 의미가 있다고 한다.
- 완전히 새 프로세스를 만들기 위해 모든 리소스를 처음부터 설정해야 한다면, 이는 매우 비싼 작업임. 반면, fork()로 부모의 현재 상태를 복사한 다음, 필요한 부분만 변경하거나 새로운 실행 파일로 대체(exec)하면 훨씬 효율적으로 새로운 프로세스를 초기화
- 많은 os 는 Copy-On-Write (COW) 기술을 사용하여, 실제로 필요한 데이터만 복사하기 때문에 fork는 효율적으로 동작, COW 기술이란 자식 프로세스가 우선 부모 프로세스를 복제하지 않고, 메모리 주소 공간을 참조만 하다가 해당 값을 바꿔야 하는 일이 있을 때 (exec) 그때서야 메모리 공간을 복제하는 것을 의미.
- 임의의 프로세스가 생길 때, 누가 부모 프로세스가 되는가?
- fork()를 호출한 프로세스가 명시적으로 부모가 된다.
- 사용자가 특정 작업을 실행하려면 그 작업을 시작한 쉘(bash, zsh 등)이 보통 부모가 된다. 예를 들어, 터미널에서 명령을 실행하면 명령을 실행한 쉘이 부모, 시스템 서비스나 데몬 프로세스가 fork()를 호출했다면, 해당 서비스가 부모
- 그럼 그 bash shell 은 누가 만든거냐? 이게 약간 재귀적으로 들어가는데 os 를 부팅하면 가장 처음의 process 인 init process 가 생김 (약간 모든 프로세스의 어머니, 가이아 프로세스라고 생각하면 됨) 그 다음에 유저가 로그인하면 로그인 프로세스가 생기는데, 이건 init process 의 복제임. 그리고 bash shell 을 쓰면 이 bash process는 login process 의 복제임. 그래서 아래의 hierarchy 가 있음
- init → /bin/login → bash → python
- 그럼 그 bash shell 은 누가 만든거냐? 이게 약간 재귀적으로 들어가는데 os 를 부팅하면 가장 처음의 process 인 init process 가 생김 (약간 모든 프로세스의 어머니, 가이아 프로세스라고 생각하면 됨) 그 다음에 유저가 로그인하면 로그인 프로세스가 생기는데, 이건 init process 의 복제임. 그리고 bash shell 을 쓰면 이 bash process는 login process 의 복제임. 그래서 아래의 hierarchy 가 있음
- 새로운걸 만드는데 왜 바꾸는걸까
fork()
- 아래는 fork() system call 에 대한 코드 예시인데, pid = fork() 가 실행되면, 부모 프로세스와 자식 프로세스로 분기가 나뉜다. 그리고 프로세스가 복제될 때, 프로세스의 문맥까지 함께 복사가 되기 때문에 그 아래 if 문부터 부모와 자식이 시작되게 된다. 그리고 자식 프로세스의 경우엔 pid가 0, 부모의 경우 양수의 함수의 결과값이 된다. 해당 값으로 누가 복제본인지를 알 수 있다.
- 하나의 부모는 하나의 자식 프로세스만을 가질 수 있는가?
- 여러개 가질 수 있다. 트리 구조임
- 자식 프로세스가 또 복제를 통해 자식 프로세스를 만들면, pid 는 어떻게 되는거지?
- pid 는 고유해야 하며, incremental 하게 생성될 필요는 없다. 운영체제는 사용 가능한 PID 중에서 가장 낮은 값을 할당하는 경우가 많다고 한다.
- 하나의 부모는 하나의 자식 프로세스만을 가질 수 있는가?
int main()
{
int pid;
pid = fork();
if (pid == 0) /* this is child */
printf("Hello, I am child!");
else if (pid > 0) /* this is parent */
printf("Hello I am parent!");
}
exec()
아래는 아예 새로운 프로그램을 만드는 exec() system call 이다. execlp 를 만나게 되면, 기존의 기억을 아예 잃어버리고, 해당 함수 (date라는 별개의 프로그램) 의 시작부터 하는 것이다. 즉, 프로세스에 대한 문맥없이 처음부터 진행한다. 한번 exec() 을 하게 되면, 다시 기존의 코드로 돌아갈 수 없다.
int main()
{
int pid;
pid = fork();
if (pid ==0)
{
printf("hello, I am child! now I'll run date");
execlp("/bin/date", "/bin/date", (char *) 0);
printf("I'm back") /* this code cann't be reached */
}
else if (pid >0)
printf("hello, I am parent!")
}
wait()
- 자식 프로세스가 종료될 때까지 block 상태가 되는 것, 일반적인건 아니고, 이런 모델도 있다. 대부분 경쟁한다고 함
- 자식 프로세스와 cpu 를 두고 경쟁하지 않고, 자식을 기다리는 모델
- 예로 들면 리눅스 cli 의 커서가 있다. 프로그램을 실행하면, 그게 끝날 때까지 shell 이 block 된다.
exit()
- 프로세스를 종료시킬 때 호출하는 system call
- 프로그램이 자발적으로 종료될 때 호출된다.
- 프로그램과 프로세스의 차이가 뭘까
비자발적 종료
- 부모 프로세스가 자식 프로세스를 강제 종료
- 자식 프로세스가 한계를 넘는 자원 요청
- 자식에게 할당된 태스크가 필요하지 않음
- 부모 프로세스의 종료
- 키보드로 kill,break 등을 친 경우
프로세스 간 협력
- 독립적 프로세스
- 각 프로세스가 서로에게 영향을 주지 않는다.
- 협력 프로세스
- 각 프로세스가 서로에게 영향을 준다.
- 협력 메커니즘 (IPC : Interprocess communication)
- 메세지를 전달하는 방법
- message passing
- kernel 을 통해 메시지 전달
- process 간 공유 변수를 사용하지 않고 통신
- Directed communication 과 Indirect Communication 으로 분류됨
- Directed Communication : 통신하려는 Process 의 이름을 명시
- Send (Q, message) -kernel-> Receive(P, message)
- Indirect Communication : mailbox or port 를 통해 메시지를 간접 전달
- Send (M, message) -> Mailbox (M) -> Receive(M, message)
- 누가 받을지가 명시되어 있지 않는데.. 누가 받는거지?
- mailbox 를 구독하는 형태라고 함. 구독한 process 중 누구에게 갈지는 아래의 방법 중 하나라고 함
- FIFO 방식: Mailbox에서 메시지가 먼저 요청한 프로세스에게 전달.
- Broadcast 방식: Mailbox에 연결된 모든 프로세스가 메시지를 받음.
- 우선순위 방식: 특정 프로세스가 우선적으로 메시지를 받을 수 있음.
- mailbox 를 구독하는 형태라고 함. 구독한 process 중 누구에게 갈지는 아래의 방법 중 하나라고 함
- 주소 공간을 공유하는 방법
- shared memory : 서로 다른 프로세스 간에도 일부 주소 공간을 공유하게 하는 shared memory 메커니즘이 있음
- kernel 한테 shared memory 를 따로 요청해서 process 간 shared memory 공간을 확보함
- thread : thread 는 사실상 하나의 process 이므로 IPC는 아니지만, thread 간에는 기본적으로 shared memory이기 때문에, 협력이 가능 -> 참고용
- shared memory : 서로 다른 프로세스 간에도 일부 주소 공간을 공유하게 하는 shared memory 메커니즘이 있음
- message passing
- 메세지를 전달하는 방법
'[개발 정리] > [OS]' 카테고리의 다른 글
CPU Scheduling 1 (0) | 2024.11.27 |
---|---|
Process Management 1 (0) | 2024.11.27 |
Thread (1) | 2024.11.26 |
Process (0) | 2024.11.23 |
System Structure & Program Execution 2 (0) | 2024.11.20 |