[TIL/크래프톤 정글] DAY 74

배재준·2025년 5월 22일

크래프톤 정글 - TIL

목록 보기
66/93
post-thumbnail

2025.05.22

TIL(TODAY I LEARN)


  • 오늘한 내용 : PintOS - Project2: UserProgram - , System calls
    System calls 구현 (exit, wait, exec, fork 구현 중)
  • WEEK 10 : 정글 끝까지(PintOS) - UserProgram

어제 게시글에 이어 SYSCALL 구현

  • int exec(const char *file); 호출 시
    • 새로운 프로그램을 로드해 실행하는 콜
    • exec(file) 호출 → SYS_EXEC ,file 담고 syscall 실행
    • process_exec(void *f_name) 수행

  • 추가) exec 오류 수정
case SYS_EXEC:
	{
		char *file_name = (char *)f->R.rdi;
		check_user_address(file_name);
		check_user_buffer(file_name, strlen(file_name) + 1);
		char *kpage = palloc_get_page(PAL_USER | PAL_ZERO);
		if (!kpage)
			sys_exit(-1);
		// f->R.rax = -1;
		else
		{
			strlcpy(kpage, file_name, PGSIZE);
			// f->R.rax = process_exec(kpage);
			/* process_exec이 성공하면 여기로 돌아오지 않음.
			   실패 시 -1을 반환하므로, 즉시 종료. */
			process_exec(kpage);
			sys_exit(-1);
		}
		break;
	}

exec의 경우, process_exec를 수행하게 되면 돌아오지 않고, 실패 시 -1을 반환한다.

실패해서 종료해야하는 경우, rax에 반환이 아닌 exit를 해주어야 함


  • pid_t fork (const char *thread_name); 호출 시
    • 부모 프로세스의 주소 공간을 완전히 복제하여, 같은 코드와 데이터를 가지는 새로운 자식 프로세스를 생성하는 콜
    • fork(thread_name) 호출 → 레지스터에 SYS_FORKthread_name 포인터를 담고 syscall 실행
      • process_fork(const char *name, struct intr_frame *if_) 수정 필요

프로세스 생명주기

  • 1) fork 로 자식 생성 → 2) wait 로 자식 종료 대기 → 3) exit 으로 자식 종료 통보 → 4) exec 로 (필요 시) 프로세스 이미지 교체

  • process_fork(), process_wait(), process_exit() 수정 필요

process_wait()

  • 부모는 자식이 완전히 종료될 때까지 블록되고, 종료 상태를 정확히 전달받을 수 있음.
thread 구조체
/* process의 부모 자식 관계를 위한 변수 추가*/
struct list children; // struct child_status elem 들의 리스트
tid_t parent_tid;	  // 나의 부모를 기록
int exit_status;	  // exit()를 위한 자신의 종료 상태

	/* 자식 프로세스 상태를 기록할 구조체 */
	struct child_status
	{
	  tid_t tid;               /* 자식 스레드/프로세스 id */
	  int exit_status;         /* 자식이 exit() 에서 넘긴 상태 코드 */
	  bool has_exited;         /* exit() 이 이미 호출되었는지 */
	  struct semaphore sema;   /* 부모가 대기(sema_down)할 세마포어 */
	  struct list_elem elem;   /* 부모의 children 리스트 항목 연결자 */
	};

----
init_thread()
추가한 변수들 초기화 수행
/* pid 및 자식 리스트 초기화*/
	t->parent_tid = TID_ERROR;
	list_init(&t->children);
  • 동작 과정
    1. 내 자식 목록 검색
    2. 이미 종료된 자식인가?
      1. 아니면 sema_down → 블록됨.
      2. 종료 신호 수신 후 리턴 준비

process_exit()

  • 종료 메시지: printf("%s: exit(%d)\n", ...)
  • 부모 신호:
    • thread_by_tid(parent_tid) 로 부모 스레드를 찾고,
      • all_list 순회를 통해 tid를 통해 스레드를 찾는 함수
    • children 리스트 중 c->tid == curr->tid 인 항목을 찾아
    • c->exit_statusc->has_exited 를 설정한 후 sema_up(&c->sema) 호출
  • 파일 닫기: 자신이 연 모든 파일을 file_close()
    • fd 하고 구현할 부분, 아직 미구현
  • 정리: process_cleanup() 에서 페이지 디렉토리 등 나머지 리소스 해제
  • pintos 에서는sema를 통해 부모 프로세스에게 sigchild 신호를 보내는 것과 같음

process_fork()

내일 게시글에 이어서 구현해야지. fork 너무 어렵다.

0개의 댓글