2012. 1. 4. 22:48
프로세스 생성 (2.4) OS이야기2012. 1. 4. 22:48
copy_fs -----------------------|
copy_files하고, copy_fs->copy_sighand순으로... (그림에서 짤림)
어떤 바이너리를 읽어서 프로그램을 실행할지 결정하기 위해 get_exec_domain()함수를 호출
copy_flags()함수는 프로세스 생성할 때 전달된 다양한 인자들을 복사.
get_pid()새로 생성할 프로세스의 ID를 할당. 만일 CLONE_PID 플래그가 선언되었다면, 같은 PID를 사용한다.
(이렇게 해서 어떤 경우에 써먹는거지?)
CLONE_PID 플래그가 설정되지 않은 경우는 부모 프로세스와 자식 프로세스는 다른 PID를 할당 받지만, 같은 프로세스 그룹에 속함.
copy_sighand() : CLONE_SIGHAND가 설정되지 않으면 kmem_cache_alloc()에서 슬랩 할당자로부터 할당받으면, 캐시의 이름은 sigact_cachep
copy_mm() 함수는 프로세스의 메모리를 관리하는 mm멤버와 관련된 내용을 초기화한다.
CLONE_VM 플래그로 설정된 경우에는 메모리 공간을 부모 프로세스와 공유
그렇지 않으면 슬랩 할당자로부터 객체를 할당받음 캐시의 이름은 mm_cachep
dup_mmap() 함수를 호출해서 메모리 매핑과 관련된 내용들을 복사
vm_area_cachep 캐시를 할당. vm_area_struct.next를 순회하면서 부모 프로세스의 메모리 매핑 내용을 모두 복사.
copy_namespace() 함수는 네임스페이스 함수를 복사. 다중 마운트와 관련된 기능을 위해 제공
#mount --bind /tmp /root/tmp <- 두 디렉토리가 연결됨
#mount --bind /tmp /root/tmp2 <- 이 또한 마찬가지
copy_thread()는 스레드가 사용하는 CPU에서 사용하는 레지스터 정보를 복사
hash_pid()는 프로세스를 보다 빠르게 탐색하기 위해 사용하는 해쉬테이블
-struct task_struct *pidhash[PIDHASH_SZ];
- 이 함수를 호출하기 전에, SET_LINKS() 매크로를 호출
- 프로세스 연결 리스트에 새로 생성한 프로세스를 추가
-
#define SET_LINKS(p) do { \ 1185 if (thread_group_leader(p)) \ 1186 list_add_tail(&(p)->tasks,&init_task.tasks); \ 1187 add_parent(p, (p)->parent); \ 1188 } while (0)
do while(0)의 의미가 뭐까? 디버깅에 쓰면 좋다고 생각하지만, 이렇게 사용하면 장점이 머지?
wake_up_process() 함수는 새로 생성한 프로세스의 task_struct.state 멤버를 TASK_RUNNING으로 변경하여, 실행가능한 상태로 만들고 실행가능 큐에 집어넣는 add_on_runqueue() 함수를 호출
프로세스를 넣는 작업은 방해되면 안되므로, spin_lock_irqsave(), spin_unlock_irqsave()함수를 사용해 동기화를 건다.
spin_lock_irqsave(&runqueue_lock, flags)
spin_unlock_irqstore(&runqueue_lock, flags)
인터럽트와 관련된 CPU플래그값을 두번째 인자 flags에 저장하고, cli()을 호출해서 인터럽트 금지
spin_unlock_irqstore()는 flags 변수로부터 CPU 레지스터의 값을 복원
process가 cpu를 점유할 수 있는 시간을 나타내는 변수 counter 멤버
자식을 할당하면 절반으로 나눔.. 이렇게 함으로써 무제한 자식을 발생시켜 cpu를 독점하는 일을 방지할 수 있음
스케줄링을 호출
'OS이야기' 카테고리의 다른 글
O(1) 스케줄러 (0) | 2012.01.05 |
---|---|
프로세스 종료 (0) | 2012.01.04 |
프로세스 관리 - execv() fork() (0) | 2012.01.04 |
프로세스 관리 - 파일시스템 & 파일 (0) | 2012.01.04 |
C 컴파일러 과정 (0) | 2012.01.04 |