1. What?

1.1 System calls about file system

1.2 Synchronization


2. How?

2.1 System calls about file system

- file system 을 위해서 thread는 child list외에도 file list가 필요함. 파일이 만들어질 때마다 파일 리스트에   추가해서 thread의 파일 들을 관리함.

- 파일 멤버는 fd(file descriptor), file pointer, file_elem 을 포함해야함


2.2 Synchronization

- process wait, exit 함수에서는 zombie process 처리 필요.

- 부모가 wait할 때는 자식이 zombie일 때, sema_up을 해서 정상적으로 종료 될 수 있도록 다시 꺠워줌

- 자식이 exit할 때는, sema_down을 통해서 재워야함. 부모가 wait해줄 때까지 기다려야함

- 실행 중인 file에 write하면 안됨. file_deny_write 함수를 통해 가능

- load & execute process 들을 synchronization


3. Detail

3.1 System calls about file system

- project 2-1과 마찬가지로, system call handler에서 user function이 system call function을 호출한다

  대신 각 함수마다 추가 작업이 필요하다. 

- user_create : filesys_create 호출

- user_open : filesys_open 호출, file member가 만들어졌으면 file descriptor(fd)를 초기화 후 고유 값으로               지정. 그리고 thread의 file list에 추가해줌

- user_close : file list에서 닫으려는 파일을 찾은 후 리스트에서 지우고, file_close 호출

- user_remove : filesys_remove 호출

- user_read : file list에서 읽으려는 파일을 찾고, file_read로 파일을 읽음

- user_write : user_read와 마찬가지, list에서 파일 찾고, file_write로 씀


3.2 Synchronization

- zombie semaphore와 load semaphore를 추가해줌

3.2.1 process_wait

- parent가 wait하면, wait flag를 setting한다. child는 exit할 때, flag를 통해 zombie인지 아닌지 확인     할 수 있다.

- parent가 child list에서 인자로 받은 tid와 일치하는 child를 찾는다.

  zombie이면 process의 zombie semaphore를 up시켜서 process_exit 에서 zombie process가 block   된 상태의 뒷 부분을 수행 한 후 정상적인 종료가 될 수 있도록 한다.

- zombie가 아니라면 정상적으로 wait operation을 한다.

  child는 process_exit에서 parent의 sema를 up시켜, block 상태에서 깨우고, child list에서 자신을 삭   제한다

- wait 마지막에서 parent는 child의 exit status를 리턴한다.


3.2.2 process_exit

- process_exit가 호출되면 process가 zombie인지 확인한다

  parent가 wait하고 있지 않으면(wait flag가 없으면) 자식은 zombie process이다.

- zombie process임을 확인했으면, zombie sema를 down시켜 재워버린다

  바로 resource deallocation되면 안되고, parent가 제대로 wait을 호출할 때 까지 기다린다

- zombie가 아니면 parent의 sema를 up시켜서 wait중인 parent를 꺠운다. 


3.2.3 denying writes to executables

- file open할 때, 실행 파일에 대해 쓰기 거부를 설정함

  메모리에 파일을 load한 후에 수정하면 안되니까

- user_open system call에서, 파일을 open하면 file list에 삽입

  file list를 탐색해서 일치하는 file을 찾으면 file_deny_write를 통해 쓰기 거부 설정


3.2.5 synchronization in load & execute

- parent가 10개의 child를 생성하고, 각각 load와 execute를 함

  한 child가 execute 하는 도중 다른놈이 load하면 안됨

- execute 하던 놈은 load sema를 down시켜서 block 후 대기

  load 하던놈이 끝나면 load sema를 up시켜 block을 해제 해서 다시 execute


















Posted by bogus919
,