3장 프로세스. [554] DATE

Download Report

Transcript 3장 프로세스. [554] DATE

Process
Park, Jinhui
Contents
1. 프로세스
2. 프로세스 생성
3. 프로세스 종료
2
Process
Process
• 실행 중인 프로그램
• 프로그램 코드를 실행하면서 생기는 모든 결과물
- 사용 중인 파일, 대기 중 시그널, 커널 내부 데이터, 프로세서 상태, 하나
이상의 물리적 메모리 영역이 할당된 메모리 주소공간, 실행 중인
Thread, 전역데이터, 저장된 데이터 부분을 포함함
• Process와 Thread의 관계
- 각가의 Thread를 커널이 스케쥴링
- 현재는 다중 Thread 프로그래밍
PC
• Fork() System call로 프로세스 생성
• Exit() 프로세스 종료
• Wait4() 상태 확인
PS
PR
3
Process 서술자와 테스크 구조체
Process 서술자와 테스크 구조체
•
•
•
•
•
Process 서술자라고 불림
Process 목록을 테스크 리스트에 저장
환형 양방향 연결 리스트 형태
<linux/sched.h>에 정의
Struct task_struct 형식
4
Process 서술자와 테스크 구조체
Process 서술자와 테스크 구조체
• 커널이 프로세스를 관리하는 데 모든
정보를 가지고 있음
• 사용중인 파일, 프로세스의 주소공간,
시그널, 프로세스의 상태 등 표시
5
Process 서술자의 할당
Process 서술자의 할당
• 슬랩 할당자(Slab allocator)
- 객체 재 사용 및 캐시 컬러링 기능 지원(12장)
- 동적으로 프로세스 서술자를 생성
- Thread_info 구조체를 스텍 밑 혹은 꼭대기에 배치
- <asm/thread_info.h> 정의
6
Process 서술자의 저장
Process 서술자의 저장
•
•
•
•
프로세스 고유 인식 번호(PID)로 프로세스 구별
Pid_t의 숫자값, int형을 사용
최대값은 32,768(시스템에 동시에 존재할 수 있는 최대 프로세스 수)
<linux/thread.h>을 통해 4백만까지 상향 가능
Current 매크로
• 테스크의 프로세스 서술자를 빠르게 찾을 수 있도록 함
• 아키텍쳐 별로 다르게 구현되어있음
• Thread_info() task 항목을 참조
7
Process 상태
Process 상태
• State 항목에서 알 수 있는 프로세스의 환경
New
새 프로세스
생성
Task
종료
do_exit()
do_exit()
Task_running
(실행 가능 상태
Task_running
(실행 중)
대기 중)
Task_interrupt
(대기 중)
특정 조건이 발생하는 것을 기다리며 쉬는 중
8
Process 상태 조작
Process 상태 조작
• 커널 코드에서 Process의 상태를 바꾸는 방법
Set_task_state(task, state)
/* 테스크 ‘task’의 상태를 ‘state’로 설정
Task->state = state;
/* 함수의 동작상태
• 특정 테스크의 상태를 지정한 상태로 변경
9
Process 계층트리
Process 계층트리
Init
PID 1
부모 프로세스
Task_struct parent 포인터로 가리킴
Fork()
자식 프로세스
Task_struct children포인터
..........
10
Process 계층트리
Process 계층트리
• 부모프로세스의 프로세스 서술자를 얻을 때
Struct task_struct *my_parent = current->parent;
• 자식 프로세스에 접근할 때
Struct task_struct *task;
Struct list_head *list;
List_for_each(list, &current->children){
task=list_entry(list, struct task_struct, sibling);
}
• Init 테스크의 프로세스 서술자는 init_task로 정적할당 됨
• 계층구조를 이용, 프로세스를 훑고
11
Process 생성
Process 생성
• Process의 생성
-
1. Spawn방식을 사용해 새 주소 공간에 새 프로세스 생성
-
2. 실행파일을 읽음
-
3. 실행
-
위의 과정을 fork()와 exec() 두 함수로 분리해 실행
-
OS에서 조합, 하나의 함수로 제공함
12
Process 생성
Copy-on-Write
• 데이터 복사를 지연 또는 방지하는 기능
address
space
자식 프로세스
부모 프로세스
기록 사항 발생
address
space
address
space
부모 프로세스
자식 프로세스
• 리소스 복사는 해당 리소스에 기록이 발생하는 경우에만 일어남
• 기록작업이 일어날 때까지 복사 작업 지연
13
Process 생성
Process 생성
•
•
•
•
Clone() 시스템 호출을 이용, fork() 구현
실제 생성 작업은 kernel/fork.c의 do_fork() 함수에서 처리
do_fork()는 copy_process()를 호출하고 실행
copy_process()
-
Dup_task_struct() 함수를 호출, 커널 스택을 만듬
-
Thread_info,task_struct 구조체 생성(데이터값은 현 테스크와 동일)
-
프로세스 개수 제한을 넘는지 확인
-
자식/부모프로세스 구별(프로세스 서술자 값을 초기화)
-
자식 프로세스 상태를 TASK_UNINTERRUPTIBLE로 설정(실행X)
-
copy_flags()함수 호출 task_struct의 flags 내용 정리
-
Alloc_pid() 호출해 새로운 PID 값 할당
-
Clone() 함수의 플래그 값에 따라 복제 혹은 공유함
-
do_fork()에게 자식 프로세스 주소값 반환 후 종료
14
Process 생성
리눅스의 Thread 구현
•
•
•
•
Thread는 사용 중인 파일 및 기타 자원을 공유
리눅스 커널에는 별도의 Thread 개념이 없음
기본적인 Process로 Thread를 구현함
각 Thread는 별도의 task_struct를 가지고 있음
15
Process 생성
Thread의 생성
• Clone() 시스템을 호출 할 때 특정 자원을 공유하도록 플래그
지정
Clone(CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND, 0);
• 주소 공간, 파일 시스템 자원, 파일 서술자, 시그널 핸들러 공유
• 일반적인 fork()
Clone(SIGHAND, 0);
16
Process 생성
커널 Thread
• 일부 동작을 백그라운드에서 진행할 때 커널 Thread 이용
-
Flush,ksoftirqd 작업
• 커널 스레드는 다른 커널 스레드에 의해 만들어짐
• Kthreadd 커널 프로세스가 커널 스레드를 만듬
• <linux/kthread.h> 정의
17
Process 생성
커널 Thread
#define kthread_run(threadfn, data, namefmt, …)
{
struct task_struct *k;
k=kthread_create(threadfn, data, namefmt,## __VA_ARGS__);
if(!IS_ERR(k))
wake_up_process(k);
k;
}
• 함수
- Wake_up_process() 프로세스 실행
- kthread_create() : create 함수 호출
• kcreate_run을 사용하면 실행 가능한 프로세스를 바로 만들 수 있음
• Do_exit() 혹은 kthread_stop()을 호출 할 때까지 계속 실행
18
Process 종료
Process 종료
• 명시적 exit() 선언 혹은 묵시적 exit() 함수 호출
• 비자발적으로 종료되는 경우
-
예외처리
-
처리할 수도 무시할 수도 없는 시그널
• Kernel/exit.c에 정의된 do_exit() 함수 통해 진행
-
task struct flags= PF_EXITING 플래그 설정
-
del_timer_sync()를 호출, 커널 타이머 제거
-
Acct_update_integrals() 호출해 관련 정보 기록
-
exit_sem() 호출해 프로세스의 대기상태 해제
-
exit_files(),exit_fs() 호출, 파일 서술자 및 파일 시스템 참조횟수 감소
-
테스크 종료 코드를 task_struct의 exit_code에 저장
-
exit_notify() 함수 호출 부모 프로세스에 시그널을 보낸 후 새로운 부모-자식
프로세스 설정
-
task struct의 exit_state = EXIT_ZOMBIE로 설정
-
Schedule() 함수를 호출 새로운 프로세스로 전홤
19
Process 종료
Process 서술자 제거
• 프로세스가 실행가능 하지 않더라도 서술자는 남아있음
• 종료 후에도 시스템이 자식 프로세스 정보를 얻을 수 있게 하기
위함
• 부모 프로세스가 종료된 자식 프로세스의 정보를 처리 혹은
커널이 해당 정보가 필요 없음을 알릴 때 task_struct 구조체에서
할당된 메모리 제거
20
Process 종료
부모 없는 테스크의 딜레마
• 부모 프로세스가 자식 보다 먼저 종료된 경우 다른 프로세스를
부모 프로세스로 지정해주는 것이 필요함
• 해결책
-
해당 프로세스가 속한 스레드 군의 다른 프로세스를 부모로 지정
-
Init 프로세스를 부모로 지정
• Do_exit() -> exit_notify() -> forget_original() ->
find_new_reaper()(부모 프로세스의 재지정)
21