linux 2.5.75 do_fork 코드 보기
:
long do_fork(unsigned long clone_flags,//clone할때 사용될 플래그
unsigned long stack_start,//새로운 프로세스의 스택 시작 주소
struct pt_regs *regs,//복사될 CPU레지스터 상태를 가리키는 포인터
unsigned long stack_size,//새로운 프로세스의 스택 크기
int __user *parent_tidptr,//부모 thread ID 가리키는 포인터
int __user *child_tidptr)//자식 thread ID 가리키는 포인터
{
struct task_struct *p;
int trace = 0;
long pid;
if (trace)
clone_flags |= CLONE_PTRACE; }
=> 현재 실행중인 프로세스가 trace 중인 경우 자식 프로세스도 trace되게 한다.
trace : 소프트웨어 프로그램 실행 정보 기록,모니터링해서 디버깅, 문제 감지 등을 한다.
=> 프로세스 생성을 위한 초기화 작업. 리눅스 구현 상 허용되지 않은 flag 설정인지 확인한다. copy_process 함수는 부모 프로세스의 메모리 및 시스템 정보를 생성하려는 자식 프로세스에게 복사한다.
- 주석에 달린 내용을 보면 새로운 thread를 깨우기 전에 이 작업을 수행해야 thread pointer가 invalid되는 경우가 생기는 걸 막을 수 있다고 한다.
=> 새로 만든 프로세스에 에러가 있는지 확인해, 에러가 없는 경우 pid에 새로 만든 프로세스의 id를 저장한다
if (!IS_ERR(p)) {
struct completion vfork;
. . .
}
return pid;
=> 에러가 없을 경우 안의 함수들 실행하고 최종적으로 생성한 프로세스의 id 반환한다.
if (clone_flags & CLONE_VFORK) {//새로운 프로세스가 vfork로 생성되었을 경우
p->vfork_done = &vfork;//vfork완료 나타내는 변수 설정하고
init_completion(&vfork);//완료 신호 대기열을 초기화한다.
}
if (p->ptrace & PT_PTRACED) {//프로세스가 tracing 상태인지 확인해 SIGSTOP 시그널 설정해서 중지
}
wake_up_forked_process(p);//새로운 프로세스 실행하게 깨우기. copy_process함수를 통해 프로세스 생성을 마치면 함수 호출해서 프로세스 실행 요청
++total_forks;//전체 포크 수 증가
}
if (clone_flags & CLONE_VFORK) {//vfork로 생성되었을 경우
wait_for_completion(&vfork);//race condition 막기 위해 block
} else
set_need_resched();//vfork()로 생성되지 않았을 경우 자식 프로세스를 먼저 실행시켜서 자식이 exec()를 빨리 호출하게 해 메모리 복사 오버헤드를 줄인다
- fork로 자식 프로세스 만들 때 부모 프로세스의 자원을 복사하는 데 걸리는 시간 때문에 프로세스 생성 시간이 길다는 단점이 있다. 이 단점 보완을 위해 만들어진 게 vfork. vfork는 자원 복사가 이루어지지 않아 부모 프로세스와 자원을 공유한다.
clone_flag
stact_start
pt_regs
댓글