뭔 놈의 세마포어가 세 개 씩이나 필요한 지 도당최 이해가 안 가는 바람에 지피티 선생께 여쭤보았다.
struct thread {
...
/* Owned by thread.c. */
struct intr_frame tf; /* Information for switching */
unsigned magic; /* Detects stack overflow. */
/* 씨스템 콜 */
int exit_status; // _exit(), _wait() 구현 때 사용
struct file *fdt[FDT_MAX]; // File Descriptor Table
int fdidx; // file descriptor index
struct list child_list; // _fork(), _wait() 구현 때 사용
struct list_elem child_elem; // _fork(), _wait() 구현 때 사용
struct intr_frame parent_if; // __do_fork() 구현 때 사용
struct semaphore fork_sema; // 포크포크 때 부모를 재우기 위함
struct semaphore wait_sema; // 왜필요한지모르겟옹
struct semaphore exit_sema; // 왜필요한지더모르겟옹
struct file *opened_file; // 지금 열려있는 파일 (닫을라고)
/* 씨스템 콜 */
};
fork_sema, wait_sema, 그리고 exit_sema는 모두 부모와 자식 프로세스 간의 동기화를 관리하기 위해 사용됩니다. 각각의 세마포어의 역할을 이해하기 위해서는 fork(), wait(), 그리고 프로세스 종료 시나리오를 고려해야 합니다.
- fork_sema:
- fork() 함수는 새로운 자식 프로세스를 생성합니다. 이 과정에서 부모는 자식의 초기화가 완료될 때까지 기다려야 합니다. fork_sema는 자식 프로세스가 완전히 초기화되기 전까지 부모 프로세스를 대기 상태로 만드는 데 사용됩니다.
- wait_sema:
- wait() 함수는 부모 프로세스가 자식 프로세스의 종료를 기다리는 데 사용됩니다. 부모 프로세스는 특정 자식 프로세스가 종료될 때까지 대기해야 하며, wait_sema는 이 동기화 작업을 처리합니다.
- wait_sema는 부모 프로세스가 wait()를 호출하여 자식 프로세스가 종료될 때까지 기다리게 하는데 사용됩니다. 자식 프로세스가 종료되면 wait_sema를 up()하여 부모 프로세스를 깨웁니다.
- exit_sema:
- exit_sema는 자식 프로세스가 종료될 때 부모 프로세스에게 알리기 위해 사용됩니다. 자식 프로세스가 종료될 때 부모 프로세스는 wait()를 통해 자식의 종료 상태를 확인할 수 있습니다. exit_sema는 자식 프로세스가 종료되었음을 부모 프로세스에게 알리는 역할을 합니다.
- exit_sema는 자식 프로세스가 종료될 때 부모 프로세스가 자식의 종료 상태를 수집하고 적절한 종료 처리를 할 수 있도록 동기화하는 데 사용됩니다.
요약하면:
- fork_sema: 자식 프로세스가 초기화될 때까지 부모 프로세스를 대기 상태로 유지합니다.
- wait_sema: 부모 프로세스가 자식 프로세스의 종료를 기다릴 때 사용됩니다.
- exit_sema: 자식 프로세스가 종료될 때 부모 프로세스에게 종료를 알리는 데 사용됩니다.
이러한 세마포어들은 부모와 자식 프로세스 간의 정확한 동기화와 자식 프로세스의 상태를 올바르게 관리하기 위해 필수적입니다. 이를 통해 부모 프로세스는 자식 프로세스가 올바르게 초기화되고 종료되었는지 확인할 수 있으며, 시스템 자원을 적절히 관리할 수 있습니다.


- fork_sema: 자식 프로세스가 초기화될 때까지 부모 프로세스를 대기 상태로 유지합니다.
- wait_sema: 부모 프로세스가 자식 프로세스의 종료를 기다릴 때 사용됩니다.
- exit_sema: 자식 프로세스가 종료될 때 부모 프로세스에게 종료를 알리는 데 사용됩니다.
- fork_sema: 자식 프로세스가 초기화될 때까지 부모 프로세스를 대기 상태로 유지합니다.
- wait_sema: 부모 프로세스가 자식 프로세스의 종료를 기다릴 때 사용됩니다.
- exit_sema: 자식 프로세스가 종료될 때 부모 프로세스에게 종료를 알리는 데 사용됩니다.
- fork_sema: 자식 프로세스가 초기화될 때까지 부모 프로세스를 대기 상태로 유지합니다.
- wait_sema: 부모 프로세스가 자식 프로세스의 종료를 기다릴 때 사용됩니다.
- exit_sema: 자식 프로세스가 종료될 때 부모 프로세스에게 종료를 알리는 데 사용됩니다.
아무튼 뭔가 기다릴 때 sema_down을 하고
뭔가 알려줄 때 sema_up을 하는구나 !
'크래프톤 정글 일지' 카테고리의 다른 글
week 0, day 3 - 첫 프로젝트를 마치며 (2) | 2024.05.30 |
---|---|
week2, day2 - 갓생과 이생망 (1) | 2024.05.30 |
[PintOS] fork - 프로세스는 유교보이 (0) | 2024.05.27 |
[PintOS] 디스크와 채널 구조체 (0) | 2024.05.21 |
[PintOS] User Programs - Program Startup Details (0) | 2024.05.20 |