210 likes | 534 Views
Linux System & Kernel Study_03. 도성준 , 차재우. 1. Module. Linux – 모노리딕 kernel Linux 는 모듈 기능을 제공 모듈이란 ? kernel 코드의 일부를 kernel 이 동작하는 상태에서 로드 또는 언로드 할 수 있도록 하는 기능 kernel 이 부팅된 후 동작하는 상태에서 디바이스 드라이버와 같은 kernel 루틴을 동적으로 추가하거나 제거할 수 있는 기능 모듈의 장점 kernel 크기를 최소화
E N D
Linux System & Kernel Study_03 도성준, 차재우
1. Module • Linux– 모노리딕kernel • Linux는 모듈 기능을 제공 • 모듈이란? • kernel 코드의 일부를 kernel이 동작하는 상태에서 로드 또는 언로드 할 수 있도록 하는 기능 • kernel이 부팅된 후 동작하는 상태에서 디바이스 드라이버와 같은 kernel 루틴을 동적으로 추가하거나 제거할 수 있는 기능 • 모듈의 장점 • kernel 크기를 최소화 • kernel을 매우 유연하게 만든다.
1. Module • 모듈 코드 – init_module(), cleanup_module()로구성 • init_module() - kernel에 적재될 때 호출 되는 함수 • cleanup_module() – 모듈이 kernel에서 제거될 때 호출되는 함수 • 오브젝트 파일로 적재 • 명령어 • insmod – 모듈로 작성한 kernel 오브젝트를 kernel에 링크 • rmmod – kernel에서 모듈을 제거 • lsmod – kernel에 적재된 모듈을 목록을 보여줌 • depmod – 모듈간 의존성 정보를 생성 • modprobe – 모듈간의 의존성을 검사해서 필요한 모든 kernel 모듈을 적재
2. Process – Process의 이해 • Process(Task) • Program • 디스크에 저장되어 있는 실행 가능한 형태의 기계어 명령과 자료의 집합. • Process는 통상적으로 ‘실행중인 프로그램’을 뜻함. • Program이 사용자에 의해 실행되거나 현재 실행 중인 다른 프로그램에서 호출되어실행이 되면 Process가 된다. • 자신의 기계어 명령을 실행하면서 종료할 때까지 시스템 내의 많은 자원(CPU, 메모리 등)을 사용하며 끊임없이 변화하는 동적인 존재. • kernel thread • kernel mode에서 실행되며, 다른 kernel thread들과 함께 자원들을 공유. • 독립적인 PID가 부여됨. • 독립적으로 scheduling을 이루는 하나의 객체 • thread • process 내에서 독립적으로 실행되는 흐름의 단위. • 같은 process 내의 thread들은 각종 자원을 서로 공유. • process는 1개 이상의 thread로 구성됨.
2. Process – task_struct구조체 • Process Descriptor • process의 모든 정보를 담고 있는 자료구조. • 운영체제에서는 PCB라 하며, linux에서는 task_struct라는 자료구조를 이용함. • task_struct • 모든 task에 각각 하나씩 할당되고, task ID, 상태 정보, 우선순위, CPU 사용량등 생성된 task의 모든 정보를 담는 자료구조. • task 생성되면 kernel은 alloc_task_struct매크로를 통해 kernel 영역 메모리에서8KB를 할당 받아 PCB와 kernel stack의 자료를 저장 • kernel stack – process가 사용자 영역에서 kernel mode로 전환되었을 때 kernel이 이 process에대해 사용하는 stack영역. • task_struct구조체를 구성하고 있는 멤버.
2. Process – task_struct구조체 • Task 식별정보 • Task는 다른 task와 구별하기 위해 독립적인 PID 하나를 부여 받음. (변수 : pid) • Task가 어떤 그룹, 세션에 속하는지 구별하기 위한 그룹 ID와 세션 ID를 부여 받음. • 상태 정보 • Task는 생성되어 소멸될 때까지 여러 상태를 거치는데 이를 상태 전이라한다. • scheduler는 이 상태정보를 바탕으로 실행할 process를 선택하거나 event를 결정한다. • Process(task)의 상태 정의(include/linux/sched.h) • TASK_RUNNING – task가 실행 중이거나 준비 상태를 나타냄. • TASK_INTERRUPTIBLE – interrup가 가능한 대기 상태. • TASK_UNINTERRUPTIBLE – H/W interrupt에만 반응하며 signal은 무시됨. • TASK_ZOMBIE – task의 수행이 종료되었지만 모든 정보를 반환하지 않은 상태. • TASK_STOPPED – task가 수행을 중단한 상태. • Scheduling 정보 • 주요 변수들 • need_resched – scheduling을 유도하는 변수. • policy – scheduling 정책. • rt_priority, nice, counter – 우선순위 값. • cpus_runnable, cpus_allowed, processor – SMP 환경에서 사용됨.
2. Process – task_struct구조체 • Task 관계 정보 • task는 생성(fork()에 의해 생성)되면 relationship이 형성된다. • 자신을 생성한 부모 task가 존재하게 되면, 자신이 생성한 task는 자식 task가 된다. • kernel에 존재하는 모든 task들은 원형 이중 연결 리스트로 연결되어 있음. • kernel에서 PID를 이용하여 task를 찾는 방법 • 위 그림의 list를 순차적으로 검색하는 방법. • 해시 table을 두고 해시 함수를 사용하여 찾는 방법. • pidhash_next, pidhash_pprev변수를 사용.
2. Process – task_struct구조체 • Signal 정보 • Signal은 task에게 비동기적인 사건을 알려주는 메커니즘. • Memory 정보 • memory 공간에 저장되는 task의 명령어 및 데이터를 관리하기위한 자료구조 필요. • task가 소유한 memory 공간에 대한 정보를 담는 구조체 : mm_struct • File 정보 • task는 실행되면서 file들을 다룰 수 있음. • open한 file들을 관리하기 위한 구조체 변수, directory 접근 구조체 변수가 존재. • Context Switch(문맥 교환) 정보 • context(문맥)은 task가 생성될 때 kernel이 task 정보를 관리하기 위해 할당하는 많은 자료구조를 지칭. 즉, kernel이 관리하는 task의 자원과 수행 환경들의 집합. • thread_struct를 사용.(include/asm_i386/processor.h) • 자원 정보 • kernel은 task가 사용할 수 있는 자원의 양을 제한하여 과도한 자원 사용을 막는다. • include/linux/resource.h에서 자원 한계를 설정할 수 있음.
2. Process – Process 생성과 소멸 • Process 생성 • fork() 사용 • fork() -> sys_fork() -> do_fork() • do_fork() • task_struct생성 • PID 할당 • task_struct의 각 멤버 변수들을 초기화 • 새로운 자료구조를 생성 • 부모 process의 자료구조에서 값을 복사한 후 큐에 삽입
2. Process – Process 생성과 소멸 • task_struct구조체 확보 및 공간 할당 • alloc_task_struct() 함수를 호출 • task_struct와 kernel스택을 저장할 8KB 크기의 메모리 영역을 할당 • 부모 process디스크립터를 자식 process디스크립터에 복사 • 새로운 Tesk생성을 위한 자원 검사 • 일반 사용자가 너무 많은 process를 생성하는 것을 제한 • 실행 도메인 검사 및 kernel 모듈 참조 검사 • get_exec_domain() 함수를 통해 생성될 Test의 실행 도메인을 검사 • kernel 모듈을 참조하는 Test의 개수를 관리 • PID 할당
2. Process – Process 생성과 소멸 • Processdescriptor 갱신 • 부모 process로부터 상속해서 사용할 수 없는 process디스크립터의 필드를 갱신 • 부모 process가 실행 대기 중인 시그널 해제 • 타이머 초기화 • 부모 process의 자료 복사 • copy_files() : 파일 디스크립터 관련 정보 복사 • copy_fs() : 파일시스템관련 정보 복사 • copy_sighand() : 시그널 핸들러 복사 • copy_mm() : 메모리 관련 정보 내용 복사 • copy_namespac() : 네임 스페이스 정보 복사 • copy_thread() : kernel스택 및 레지스터 종보 초기화
2. Process – Process 생성과 소멸 • Tesk리스트에 추가 • 해시 테이블에 추가 • Tesk의 상태 변경 • TASK_RUNNING 상태로 설정하고 실행 큐에 삽입
2. Process – Process 생성과 소멸 • Process 소멸 • do_exit() 함수가 수행 • process에게 할당된 각종 자료구조들을 해제 • process를 좀비 상태로 변경하고, 스케줄러를 호출 • do_exit() • 현재 Tesk를 tsk변수에 저장 • 현재 Tesk의 타이머를 중지 • Tesk가 사용하던 가상 메모리 해제 • 세마포어 큐에서 제거 • Tesk가 열었던 파일 디스크립터 제거 • 파일시스템 정보 제거 • 네임 스페이스 정보 제거 • 시그널의 핸들러 제거 • Tesk가 사용하던 모듈이 있으면 참조 횟수를 감소 • process 종료 통보(시그널) • 스케쥴러 호출
2. Process – Process 상태와 전이 running • Process 상태와 전이 exit dispatch ready timeout zombie wait fork Sleep, lock Wakeup, unlock wait
2. Process - Scheduling • Scheduling • scheduling이란? • 실행 큐에 들어 있는 실행 가능한 task 중 한 task에게 CPU를 할당해주는 것을 의미 • scheduling 정책 • FIFO(First In First Out) 정책 • 먼저 CPU를 요청하는 순서대로 할당하는 방법 • 대기시간이 길어진다는 문제점 • SJF(Shortest Job First) 정책 • task 가운데 가장 짧은 수행 시간을 가진 task를 선택 • 우선순위(Priority) 정책 • task에게 우선순위를 부여하여 우선순위가 높은 task를 먼저 선택 • RR(Round-Robin) 정책 • 시분할 시스템에 일반적으로 적용 • 타임 퀀텀을 설정하여 task를 번갈아가며 선택하는 방법
2. Process - Scheduling • linux– FIFO, 라운드 로빈, 우선순위 정책을 기본적으로 사용 • task_struct내의 priority 변수가 어떤 정책을 적용할지를 저장 • SCHED_NORMAL : 0 • SCHED_FIFO : 1 • SCHED_RR : 2 • kernel 2.4 와 2.6의 scheduling • kernel 2.4 : 사용자 모드일 경우 우선순위가 높은 task가 현재 수행중인 task를 선점, kernel 모드에 있을 때는 선점되지 않는다. • kernel 2.6 : kernel 영역에서도 선점되는 방식으로 scheduling 방식이 변경 • 우선순위 정책 • 실행할 task를 우선순위를 통해 결정 • 우선순위에 따라 다음 task를 선택 • 우선순위 값 -20 ~ 19, 값이 작을수록 우선순위가 높음 • task_struct내의 nice 변수에 저장, 기본 nice값은 0
2. Process - Scheduling • linux에서는 우선순위에 따라 타임 퀀텀을 다르게 설정하는 정책을 사용 • 기본 타임 퀀텀 • #define DEF_COUNTER (10*HZ/100) // 100ms • 최대 타임 퀀텀 • #define MAX_COUNTER (20*HZ/100) // 200ms • task_sturct내의 counter 변수는 틱(tick) 단위로 CPU를 할당 받는다. • 1 tick = 10ms • tick 발생할 때마다 kernel 내부 변수 jiffies 값이 1씩 증가
2. Process - Signal • Signal • kernel 또는 사용자 task에서 특정한 event를 다른 task에게 비동기적으로 통보하는 메커니즘. • Linux에서 지원하는 signal의 목록은 include/asm-i386/signal.h에 정의되어 있음. • Signal을 처리하려면 아래 3가지 기능이 지원되어야 함. • Signal 전송 기능 • Signal 수신 기능 • Signal 처리 기능 • Signal 전송 • 수신할 task에게 특정 event를 포함하여 요청하면 됨. • “kill” 명령을 통한 sys_kill() system call을 사용. signal 전송 시 함수 호출 흐름
2. Process - Signal • Signal 수신 • Task가 signal을 수신하기 위해서는 signal을 받을 수 있는 자료구조가 필요함. • 수신 Task에서 이 자료구조들의 내용을 토대로 signal을 처리. • sig : signal 수신 시 처리할 핸들러 정보 저장. • pending : signal 처리를 기다리는 signal을 저장하기 위한 구조체 변수. • sigpending : block되지 않고 대기 중인 signal이 있는지 표시. • blocked : block된 signal을 표시. • 아래 그림은 task_struct에서 signal과 관련된 멤버 변수들의 구조체 구성과 signal queue가어떻게 연결되는지를 보여준다.
2. Process - Signal • Signal 처리 • 사용자 모드로 복귀하기 전에 시그널이 있는지 검사하고, 존재한다면 시그널을 처리.