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
'OS' 카테고리의 다른 글
도우의 가상 메모리란 무엇인가? - 가상 메모리(페이징 파일) 관리하기 (2) | 2015.10.28 |
---|---|
pintos 요약 - 3. Virtual Memory (5) | 2015.07.05 |
pintos 요약 - 2-1. User Program Basic (3) | 2015.07.05 |
pintos 요약 - 1. Thread (0) | 2015.07.05 |
8장 memory management (0) | 2013.12.09 |