☆★☆2016.01.07 작성☆★☆
☆★☆참고책 _리눅스 커널 내부구조(저자_백승재, 최종무)☆★☆
5. 태스크 문맥
* system context
- 태스크 정보 유지 위해 할당한 자료구조
ex) task_struct, 파일 디스크립터, 파일 테이블, 세그먼트 테이블, 페이지 테이블...
* memory context
- text, data, stack, heap 영역, 스왑공간...
* hardware context
- 문맥 교환시, 태스크 현재 실행 위치 정보 유지
* task_struct 자료 구조 변수
- /usr/src/linux-headers-3.19.0-25/include/linux/sched.h 에서 확인 가능
① task identification
- 태스크를 인식하기 위한 변수들
ex) pid, tgid, 해쉬 관련 필드 등
② state
- 태스크 생성에서 소멸까지의 상태를 관리하는 state 변수
- TASK_RUNNING(0), TASK_INTERRUPTIBLE(1), TASK_UNINTERRUPTIBLE(2), TASK_STOPPED(4), TASK_TRACED(8), EXIT_DEAD(16), EXIT_ZOMBIE(32)
③ task relationship
- 태스크의 가족관계
ex) 현재 태스크를 생성한 부모 태스크의 task_struct을 가르키는 real_parent 필드,
현재 부모 태스크의 task_struct을 가르키는 parent 필드
④ scheduling information
- 스케줄링 관련된 변수
ex) prio, policy, cpus_allowed, time_slice, rt_priority 등
⑤ signal information
- 태스크에게 비동기적인 사건의 발생을 알리는 매커니즘
⑥ memory information
- 태스크는 자신의 명령어와 데이터를 text, data, stack, heap 영역에 저장 -> 이 공간에 대한 위치와, 크기 접근 제어 정보 등을 관리하는 변수
⑦ file information
- 태스크가 오픈한 파일들은 task_struct에서 files_struct 구조체 형태인 files라는 변수형태로 접근 가능
⑧ thread structure
- 문맥 교환을 수행할 때 태스크가 현재 어디까지 실행되었는지 기억해놓는 공간
⑨ time information
- 태스크의 시간 정보를 위한 변수
ex) start_time, real_start_time 등
⑩ format
- 리눅스는 지원가능한 도메인에서 컴파일 된 프로그램도 재 컴파일 없이 수행 가능
⑪ resource limits
- 태스크가 사용할 수 있는 자원의 한계를 의미(배열로 구현, 최대 16개의 한계 설정 가능)
6. 상태 전이와 실행 수준 변화
* 상태 전이 : 당장 제공해 줄 수 없는 자원을 요청했을 떄, 대기 후 다시 수행하는 것
* 상태 전이 종류
① 태스크 종료하고 exit()함수 호출 시, 태스크에 할당되어있던 자원을 커널에 반납한 상태로 전이 EXIT_ZOMBIE
이 상태에서 부모 태스크가 wait()함수 호출, 자식 태스크의 상태는 EXIT_DEAD로 전이
부모는 자식 태스크의 정보를 갖고, 자식의 자원은 모두 반환하고 최종 종료
(자식보다 부모가 먼저 죽으면, 고아 태스크의 부모를 init태스크로 바꾸고, 최종 종료)
② TASK_RUNNING(running) 상태에서 수행 중이던 태스크가 할당된 자원을 모두 사용 or 높은 우선순위 태스크로 인해 TASK_RUNNING(ready) 상태로 전이
③ 정지 신호를 받은 태스크는 TASK_STOPPED 상태로 전이
sigcont 신호를 받으면 다시 TASK_RUNNING(ready) 상태로 전환
④ TASK_RUNNING(running) 상태에 있던 태스크가 요청 완료를 기다리거나 자원 대기해야 할 필요가 있으면 TASK_INTERRUPTIBLE 상태로 전이
* TASK_RUNNING(running) 실행 권한에 따른 상태
- 사용자 수준의 실행(프로그램, 라이브러리 함수 수행 상태)
- 커널 수준의 실행(커널 프로그램 일부분 수행 상태)
- 사용자 수준의 실행 < 커널 수준의 실행
* 사용자수준에서 커널 수준으로의 전이 방법
- 시스템 호출의 사용
: 태스크가 시스템 호출시, 리눅스의 커널에 트랩이 걸리고, 태스크의 상태가 커널 수준의 실행 상태로 전이되어 커널의 시스템 호출 처리 루틴으로 제어가 넘어감
- 인터럽트의 발생
: 인터럽트가 발생하면 리눅스 커널에 인터럽트가 걸리고, 실행 중이던 태스크가 사용자 수준에서 동작하고 있으면 커널 수준의 실행 상태로 넘어감
* thread_union 스택
- 리눅스는 c와 어셈블리로 작성되었기 때문에 스택이 필요
- 태스크 생성시 task_struct 구조체와 8KB 스택 할당
- 프로세스 디스크립터 thread_info를 포함하고 task_struct을 가르키는 포인터(*task), 스케줄링 필요성 여부 플래그, 태스크의 포맷 필드 포함
- 작업 시 사용자와 커널 수준의 변화 작업 상황은 pt_regs(레지스터)에 저장
'나름컴공이라공 > Linux Kernel' 카테고리의 다른 글
Linux Kernal Internal > Ch5 파일시스템과 가상 파일시스템(3) (0) | 2019.07.19 |
---|---|
Linux Kernal Internal > Ch5 파일시스템과 가상 파일시스템(2) (0) | 2019.07.19 |
Linux Kernal Internal > Ch5 파일시스템과 가상 파일시스템(1) (0) | 2019.07.19 |
Linux Kernal Internal > Ch3 태스크 관리(3) (0) | 2019.07.19 |
Linux Kernal Internal > Ch3 태스크 관리(1) (0) | 2019.07.19 |