본문 바로가기

Linux/RaspberryPi

리눅스 및 커널 프로그래밍 스터디 정리 #2

Process Creation

 

fork(): 현재 Task를 복제해 자식 Task를 생성한다.

 

exec(): 새로운 실행파일을 주소공간에 불러온다. (어느 정도 Page Table이 갱신된다.)

 

Copy on Write (CoW)

Task를 Fork 하면 자원은 모두 독립되어 사용되어야한다.

 

하지만 Resource는 한정되어 있으므로 무작정 독립 시키지않고 처음엔 같은 자원을 공유한다.

 

 

이렇게 쓰다가 Child 에서 Resource A를 쓴다고 하면 그떄 Resource A를 복사해서 사용한다.

 

 

 

Parent가 fork() 실행 후 Child Process는 exec() 함수를 실행 하여 새로운 실행파일을 실행하기 전

 

File Descriptor를 수정하여 (dup(), dup2() 함수) 실행 할 수 있다.

 

수정 후 Child 에서 exec() 함수를 호출하여 실행파일을 실행 중 실행파일이 파일입출력을 호출하였을 때

 

파일입출력함수가 변경되었다면 변경된 함수가 실행된다.

 

 

Copy_Process()

 

1. dup_task_struct 함수 호출

-> 부모 프로세스를 복사, 커널 스택 생성, thread_info등 생성

 

2. 프로세스 갯수 제한 확인

-> 갯수 제한이 걸려 만들지 못하면 Err를 Return 한다.

 

3. 부모자식 구별

-> Process descriptor 초기화

 

4. 자식상태: TASK_UNINTERRUPTIBLE

-> 일반적인 Signal 로 Wakeup을 하지못하고 특수 조건에 의해 깨어난다.

 

5. Copy_flags() 함수 실행

 

6. alloc_pid()함수 실행

 

7. 여러자원들을 공유하거나 복제

 

8. 나머지 정리 작업 및 새로만든 자식프로세스의 포인터 반환