Linux System & Kernel
Study
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
8KB륹
할당
받아
PCB와
kernel stack 의
자료륹
저장
.
kernel stack .
process 가
사용자
영역에서
kernel mode 로
전환되었읁
때
kernel 이이
process 에
대해
사용하는
stack영역.
.
task_struct 구조체를
구성하고
있는
멤버
.
정.
매크로륹
통해
kernel 영역
메모리에서
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 공간에
대한
.
File
.
task 는
실행되면서
file 들읁
다룰
수
있음
.
정.
.
open 한
file 들읁
관리하기
위한
구조첮
변수
, directory 접근
구조첮
변수가
존재
.
.
Context Switch( 문맥
교홖
)
.
context( )은
task 가
생성됚
때
kernel 이
task
료구조륹
지칭
. 즉, kernel 이
관리하는
task 의
자원과
수행
환경들의
집.
.
.
thread_struct 륹
사용
.(include/asm_i386/processor.h)
정보륹
담는
구조첮
: mm_struct
.
자원
.
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 생성과
소멸
.
Process descriptor 갱신
.
부모
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 상태와
전이
.
Process 상태와
전이
ready
exit
running
wait
dispatch
fork timeout
Sleep, lock
zombie
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 처리
.
사용자
모드로
복귀하기
전에
시그널이
있는지
검사하고
, 존재한다면
시그널읁
처리
.