(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

by 민트앤라떼 2011. 9. 26. 17:54