본문 바로가기
Linux/Kernels

태스크(task)관리-(5)

by neohtux 2016. 9. 2.
728x90

□ 문맥 교환(context switch)

 

 - 수행 중이던 태스크의 동작을 멈추고 다른 태스크로 전환하는 과정을 문맥 교환이라 부른다.

 

리눅스 커널은 태스크가 문맥교환 되는 시점에 어디까지 수행했는지, 현재 CPU의 레지스터 값은 얼마인지 등을

 

저장해 둔다. 이를 문맥 저장(context save)이라 한다. 즉, 스케줄링이 일어나면 문맥 교환이 발생하고, 문맥 교환 시엔 현재

 

수행 중이던 태스크의 문맥을 저장해 두어야 한다.

 

□ 문맥 저장(context save)

 - 태스크가 문맥 교환 시점에 어디까지 수행되었는지를 현재 CPU의 레지스터값이 얼마인지를 저장한다.

 - task_struct의 thread 필드(struct thread_struct 타입)에 저장

 - 태스크가 실행하다가 중단되어야 할 때 태스크가 현재 어디까지 실행했는지 기억하는 공간

 

 

pc(program counter, 인텔 CPU에서는 eip 레지스터라고 불린다)

 - 태스크가 어떤 명령어까지 수행했으며, 다음에 수행해야할 명령어가 어디인지 정보를 기억

 

sp(stack pointer)

 -  태스크가 수행되다 중지할 때 현재 스택의 사용 위치(top)가 어디인지 정보를 기억

 

eflags : cpu 상태를 나타냄

 

cs : 세그먼트 관리

 

ds 레지스터 내용 기억

 

 

 

□ 태스크와 시그널

 - 시그널은 태스크에게 비동기적인 사건의 발생을 알리는 매커니즘

 

리눅스는 총 64개의 시그널을 지원(일반 시그널 32개 + 실시간 시그널 32개)

 

시그널을 보내는 과정

 

1) 해당 task_struct 구조체 찾기

 

2) 보내려는 시그널 번호를 통해 siginfo 자료 구조 초기화

 

3) 시그널의 성격에 따라 task_struct의 signal, pending 필드 세팅

 

4) blocked 필드를 검사해서 받지 않도록 설정한 시그널이 아닌지 검사

 

 

 

300x250

'Linux > Kernels' 카테고리의 다른 글

메모리(Memory)관리-(2)  (0) 2016.09.09
메모리(Memory)관리-(1)  (0) 2016.09.06
태스크(task)관리-(4)  (0) 2016.09.02
태스크(task)관리-(3)  (0) 2016.09.01
리눅스 커널  (0) 2016.08.31

댓글