글
(1) 프로세스의 생성
○ 가장 일반적인 생성방법
: "fork() 시스템 호출" -> 호출한 태스크이미지와 같은 이미지를 갖는 새로운 태스크를 생성. sys_fork() 에서 do_fork 함수 호출
○ 생성 과정
- task_struct 를 하나확보
- PID를 할당
- task_struct의 각멤버 변수 초기화
- 새로운 자료구조들 생성
- 해당 부모 프로세스의 자료구조값을 복사해서 큐에 넣는다.
○ do_fork() 함수
- task_struct 구조체 확보해서 PID를 할당바든다.
p=alloc_task_struct();
- 부모프로세서 : 디스크립터를 자식프로세스 디스크립터로 복사
*p=*current; // current 는 현재 수행중인 태스크를 가리키는 포인터(=부모프로세스)
- 새로운 태스크를 위한 자원검사 : 태스크를 생성할 자원이 남았는지 검사 (제한된 수보다 많은 프로세스를 가질수 없기 때문)
- 실행 도메인 검사 및 커널 모듈참조 검사
get_exec_domain(); // 함수로 생성될 태스크의 실행도메인을 검사
// 만약 부모프로세스가 커널 모듈 사용하는 중이라면 모듈카운터 증가!
-> 모듈사용중에 종료함으로인한 문제 발생을 막기위해
- flag필드 갱신 -> copy_flags(clone_flags, p)
부모프로세스에서 복사한 플래그 가운데 태스크생성시 필요한 몇가지 플래그를 갱신한다.
- 프로세스 디스크립터 갱신
부모 프로세스로부터 상속해서 쓸 수 없는 프로세스 디스크립터들을 갱신
- 부모프로세스 복사
- counter 값 설정
생성되는 태스크의 시간할당량 설정
부모프로세스의 counter값의 절반을 할당
-> 하나의 프로세스가 fork를 연속적으로 사용해서 CPU를 독점하는 것을 방지
- 태스크 리스트에 추가
SET_LINKS(p); // 새로운 프로세스 디스크립터를 태스크리스트에 삽입 (태스크리스트 마지막에 연결)
- 해시테이블에 추가
hash_pid(p) // 태스크를 빨리 찾기위해 해시테이블에 추가
- 태스크의 상태변경
wake_up_process(p); // TASK_RUNNING상태로 변경해서 실행 큐에 삽입한다.
(2) 프로세스의 소멸
○ 소멸되는 경우
- 자신의 코드를 모두 수행하고 자발적으로 종료
- 다른 프로세스에 의해 강제로 소멸 -> kill() 과 같은 시그널 호출에 의해 발생한다.
- 프로세스가 비정상적인 작업을 수행, 더이상 작업을 진행 할 수 없을때... ex) 세그먼트 결함, 잘못된 명령어
- 프로세스 소멸시 kernel/exit.c 의 do_exit() 함수가 호출된다.
○ 소멸 과정
- 현재 태스크를 tsk변수에 저장
- 현재 태스크와 타이머를 중지시킴
- 태스크가 사용하던 가상 메모리 해제
- 세마포어 큐에서 제거
- 태스크가 열었던 파일 디스크립터 제거
- 파일 시스템 정보제거
- 네임 스페이스 정보 제거
- 시그널 핸들러 제거
- 태스크가 세션 리더인 경우 가상터미널 해제
- 태스크가 사용하던 모듈있으면 참조 횟수 감소
- 프로세스 종료 통보
- 스케줄러 통보
※ 출처 : http://idkkangjs.blog.me/30091117058
'L inux > Kernel' 카테고리의 다른 글
프로세스 - 스케줄링과 시그널 (0) | 2011.09.27 |
---|---|
프로세스 - 상태와 전이 (0) | 2011.09.27 |
프로세스 - Task 자료 구조체 (0) | 2011.09.26 |
프로세스 - 프로세스와 프로세스 디스크립터 (0) | 2011.09.26 |
모듈(Module) (0) | 2011.09.26 |
RECENT COMMENT