크래프톤 정글 일지

[PintOS] 씨스템 콜 - sema 트리오 - fork_sema, wait_sema, exit_sema - 세마가 세 개 !

나한나한나한나 2024. 5. 27. 22:30

뭔 놈의 세마포어가 세 개 씩이나 필요한 지 도당최 이해가 안 가는 바람에 지피티 선생께 여쭤보았다.

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(), 그리고 프로세스 종료 시나리오를 고려해야 합니다.

  1. fork_sema:
    • fork() 함수는 새로운 자식 프로세스를 생성합니다. 이 과정에서 부모는 자식의 초기화가 완료될 때까지 기다려야 합니다. fork_sema는 자식 프로세스가 완전히 초기화되기 전까지 부모 프로세스를 대기 상태로 만드는 데 사용됩니다.
  2. wait_sema:
    • wait() 함수는 부모 프로세스가 자식 프로세스의 종료를 기다리는 데 사용됩니다. 부모 프로세스는 특정 자식 프로세스가 종료될 때까지 대기해야 하며, wait_sema는 이 동기화 작업을 처리합니다.
    • wait_sema는 부모 프로세스가 wait()를 호출하여 자식 프로세스가 종료될 때까지 기다리게 하는데 사용됩니다. 자식 프로세스가 종료되면 wait_sema를 up()하여 부모 프로세스를 깨웁니다.
  3. 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을 하는구나 !