관리 메뉴

일서방

테스크(TASK) 본문

IT공부/리눅스커널이야기

테스크(TASK)

0asis 2025. 9. 30. 11:20

 

■리눅스의 task 관리 구조

출처 : https://jinkyu.tistory.com/67

 

 

프로세스는 자신이 사용하는 자원과 그자원에서 수행되는 수행흐름으로 구성된다.

리눅스에서는 이를 관리하기 위해 각 프로세스마다 task_struct라는 자료 구조를 생성한다. 새로운 스레드가 생성되어도 스레드를 우히ㅐ task_struct 자료 구조를 하나 더 생성한다. 결국 리눅스에서는 프로세스가 생성되든 쓰레드가 생성되든 task_struct라는 동일한 자료구조를 생성하여 관리한다.

 

 

출처 : https://blog.naver.com/phj790122/221166841763

 

사용자의 프로세스 혹은 스레드생성 요청은 라이브러리를 거쳐 시스템 호출을 통해 리눅스 커널에 전달된다. 

fork() , clone() , pthread_create()는 커널에 구현되어 있는 sys_clone() 시스템 호출을 사용하며 ,  vfork()는 sys_vfork()를 사용한다. sys_clone()과 sys_vfork()는 모두 커널 내부함수인 do_fork()를 호출한다.

 

 

fork와 clone모두 마지막으로 호출되는 함수는 do_fork인데 이유는 리눅스 입장에서 보면 모두 'task'를 생성하기 때문이다.

fork는 비교적 부모 태스크와 덜공유하는 task이고 , clone으로 생성되는 task는 비교적 부모 태스크와 많이 공유하는 테스크이다.

 

테스크의 문맥은 크게 세부분으로 구분할 수있다.

 

첫번째 부분은 시스템 문맥(System Context)으로 테스크의 정보를 유지하기 위해 커널이 할당한 자료구조들이다.

대표적인 자료구조로는 task_struct , 파일 디스크립터 , 파일 테이블 , 세그먼트 테이블 , 페이지 테이블 등이 있다.

 

두번째 부분은 메모리 문맥(Memory Context)으로 텍스트 , 데이터, 스택 , heap 영역 , 스왑 공간 등이 여기에 포함된다.

 

세번째 부분은 하드웨어 문맥(Hardware Context)으로 문맥교환(context switch)할 때 테스크의 현재 실행 위치에 대한 정보를 유지하며 , 쓰레드(thread) 구조 또는 하드웨어 레지스터 문맥이라고 불린다. 이 부분은 실행중이던 테스크가 대기상태나 준비상태로 전이할 때 이 테스크가 어디까지 실행했는지 기억해두는 공간으로, 이후 이 테스크가 다시 실행될 때 기억해 두었던 곳부터 다시 시작하게 된다.

 

■ task identification

테스크를 인식하기 위한 변수들이다. 대표적으로 테스크ID를 나타내는 PID, 테스크가 속해있는 쓰레드 그룹 ID를 나타내는 tgid , pid를 통해 해당 테스크의 task_struct를 빠르게 찾기 위해 커널이 유지하고 있는 해쉬 관련 필드 등의 변수가 있다.

한편, audit_context 구조체를 통해 이 테스크에 대한 사용자 접근 권한을 제어할 때 이용되는 uid(사용자ID) , euid(유효 사용자 ID) , suid(저장된 사용자 ID)