
exec 함수 호출과정
Pintos에서 사용자 프로그램을 실행하기 위해 새로운 자식 프로세스를 생성하고, cmd_line에 해당하는 프로그램을 그 자식 프로세스에서 실행하는 역할




⸻
Pintos에서 fork() 시스템 콜을 구현하다 보면, 부모 프로세스의 정보(intr_frame 포함)를 자식 프로세스에게 넘겨야 하고, 두 스레드 간 동기화도 필요하다. 이 과정을 효율적으로 처리하기 위해 struct fork_info와 sema_down/up을 활용하게 된다.
⸻
fork(): 자식 프로세스를 만들고 부모를 복제하는 시스템 콜
하지만 Pintos에서는 다음과 같은 제약이 있다:
• struct thread에는 부모의 유저 레지스터 값 (intr_frame) 정보가 저장되어 있지 않다.
• 자식은 thread_create()로 새 커널 스레드를 만들어서 복사를 시작해야 한다.
• thread_create()에 인자를 넘길 수 있는 방식은 void *aux 하나뿐이다.
• 부모는 자식이 주소 공간 복사를 마칠 때까지 기다려야 한다.
⸻
그래서 구조체가 필요하다
struct fork_info {
struct thread parent;
struct intr_frame parent_if;
struct semaphore fork_sema;
};
⸻
부모는 단순히 자식을 만들고 바로 리턴하면 안 된다.
자식이 주소 공간 복사를 성공했는지 확인한 뒤에 리턴해야 한다.
따라서:
부모는 자식이 준비될 때까지 기다린다
sema_down(&fork_info->fork_sema); // 자식이 sema_up 할 때까지 블록
자식은 복사가 끝났음을 알린다
sema_up(&fork_info->fork_sema); // 부모를 깨움
⸻
[parent] process_fork()
│
├─ fork_info 구조체 할당 및 채움
├─ thread_create(name, PRI_DEFAULT, __do_fork, &fork_info)
└─ sema_down(&fork_info->fork_sema); // 자식 복사 완료까지 대기
[child] __do_fork(void *aux)
│
├─ aux → fork_info로 캐스팅
├─ parent_if 레지스터 복사
├─ 주소 공간, 파일 디스크립터 복사
├─ sema_up(&fork_info->fork_sema); // 부모 깨움
└─ do_iret() → 유저 프로그램 실행
⸻

semaphore를 3개썼는데 1개쓰거나 2개 쓴 사람들도 있어서 시간이 되면 한번 해봐야겟다
증명사진은 왜 올리시는거?