Task 관리
정의
Task : '자원소유권의 단위'
Thread : '수행의 단위'
Process : '동작중인 프로그램'
사용자 입장에서 프로세스 구조
텍스트 - CPU에서 직접 수행되는 명령어
데이터 - 전역변수
스택 - 지역변수와 인자 그리고 함수의 리턴 주소 존재
힙 - 동적 할당받은 내용이 존재
* 이 때 각 영역을 세그먼트 또는 가상 메모리 객체 라고 함
프로세스와 쓰레드의 생성과 수행
1. 새로운 프로세스를 생성하면, 생성된 프로세스(자식 프로세스)와 생성한 프로세스(부모 프로세스)는 서로 다른 주소공간을 갖는다
반면, 새로운 쓰레드를 생성하면 생성된 쓰레드(자식 쓰레드)와 생성한 쓰레드(부모 쓰레드)는 서로 같은 주소공간을 공유한다.
2. - 같은 프로세스에서 새로운 쓰레드를 생성할 경우 기존 쓰레드와 생성된 다른 쓰레드가 함께 동작하고 있는 것으로 볼 수 있다.
즉, 한 프로세스에 2개의 쓰레드가 동작하는 것. (한 프로세스에 여러 쓰레드가 동작하는 모델 = 다중 쓰레드 시스템)
- 쓰레드 생성은 새로이 모든 자원을 생성해 주어야 했던 프로세스에 비해 생성에 드는 비용이 비교적 적다.
3. 자식 쓰레드에서 결함이 발생하면 그것은 부모 쓰레드로 전파된다.
반면 자식 프로세스에서 발생한 결함은 부모 프로세스에게 전달되지 않음
결국, 쓰레드 모델은 지원공유에 적합하며, 프로세스 모델은 결함 고립에 적합한 프로그래밍 모델이다.
리눅스의 태스크 모델
프로세스는 자신이 사용하는 자원과 그 자원에서 수행되는 수행 흐름으로 구성.
이를 관리하기 위해 각 프로세스마다 task_struct라는 자료 구조를 생성
리눅스 커널은 프로세스 또는 쓰레드 중에서 어떤 것이 요청될 지라도, 모두 task_struct 자료 구조로 동일하게 관리
즉, 사용자 수준에서 쓰레드를 생성하면 그 쓰레드의 존재를 커널도 안다
태스크 문맥
태스크와 관련된 이러한 '모든' 정보를 문맥이라고 부름.
- 시스템 문맥 : 태스크의 정보를 유지하기 위해 커널이 할당한 자료구조들
(task_struct, 파일 디스크립터, 파일 테이블, 세그먼트 테이블, 페이지 테이블 등)
- 메모리 문맥 : 텍스트, 데이터, 스택, heap 영역, 스왑 공간 등이 여기에 포함
- 하드웨어 문맥 : 문맥 교환 할 때 태스크의 현재 실행 위치에 대한 정보를 유지하며, 쓰레드 구조 또는 하드웨어 레지스터 문맥 이라 불림
각 변수를 관련 있는 것 끼리 구분
가. task identification
- 태스크 ID를 나타내는 pid, 태스크가 속해있는 쓰레드 그룹 ID를 나타내는 tgid,
pid를 통해 해당 태스크의 task_struct를 빠르게 찾기 위해 커널이 유지하고 있는 해쉬 관련 필드 등의 변수가 있음
(uid[사용자 ID], euid[유효 사용자ID], suid[저장된 사용자 ID], fsuid[파일시스템 사용자 ID], gid, egid, sgid, fsgid)
나. state
- 생성에서 소멸까지 많은 상태를 거치며, 이를 관리하기 위한 state변수가 존재
(TASK_RUNNING(0), TASK_INTERRUPTIBLE(1), TASK_UNINTERRUPTIBLE(2), TASK_STOPPED(4), TASK_TRACED(8), EXIT_DEAD(16), EXIT_ZOMBIE(32))
다. task realationship
- 태스크는 생성되면서 가족 관계를 갖음
- 현재 테스크를 생성한 부모 태스크의 task_struct 구조체를 가리키는 real_parent와 현재 부모 태스크의 task_struct 구조체를 가르키는 parent 필드가 존재
라. scheduling information
- task_struct에서 스케줄링과 관련된 변수 : prio, policy, cpus_allowed
마. signal information
- 시그널은 태스크에게 비동기적인 사건의 발생을 알리는 매커니즘
- 관련 변수 : signal, sighand, blocked, pending
바. memory information
- 태스크는 자신의 명령어와 데이터를 텍스트, 데이터, 스택 그리고 힙 공간 등에 저장
- task_struct엔 이 공간에 대한 위치와 크기, 접근 제어 정보 등을 관리하는 변수 존재
사. file information
- 태스크가 오픈한 파일들은 task_struct에서 files_struc구조체 형태인 files라는 이름의 변수로 접근 가능
- 루트 디렉터리의 inode와 현재 디렉터리의 inode는 fs_struct 구조체 형태인 fs라는 변수로 접근 가능
아. thread structure
- 문맥 교환을 수행할 때 태스크가 현재 어디까지 실행되었는지 기억해놓는 공간
자. time information
- 태스크 시간 정보를 위한 변수로는 태스크가 시작된 시간을 가리키는 start_time, real_start_time 이 있음
- 사용한 CPU 시간의 통계를 담는 필드도 있음
차. format
- 리눅스는 Linux exec 도메인뿐만 아니라 BSD나 SVR4 exec 도메인도 지원
* BSD나 SVR4 커널에서 컴파일 된 프로그램도 리눅스에서 재 컴파일 없이 수행 될 수 있다는 의미
- personality 변수 사용
- 이진 포맷을 지원하기 위한 필드가 thread_info 내에 존재
카. resource limits
- 태스크가 사용할 수 있는 자원의 한계를 의미
- rlim_max : 최대 허용 자원의 수
rlim_cur : 현재 설정된 허용 자원의 수
- 자원의 한계가 배열로 구현되어 있으며, 현재 리눅스 커널에는 최대 16개의 자원에 대한 한계를 설정