달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

'OS이야기'에 해당되는 글 86

  1. 2012.01.04 프로세스 생성 (2.4)
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
:
Posted by НooпeУ


Code Start Code End