실제로 개발을 하면서 프로세스, 테스크, 스레드 등을 자주 사용 한다.
객체지향인 C++ 에서도 API 에서 제공하는 스레드를 사용하기도 하고
MFC 로 개발할 경우 MFC 에서 제공하는 스레드를 사용하곤 한다.
물론 스레드는 프로세스와 다르게 메모리를 공유하여 컨텍스트 스위칭이
빠른 장점도 있지만, 그 만큼 임계영역을 나누어야 하며,
필자는 실무로 C++ 개발 시 임계영역으로 Critical Secsion 을 사용했었다.
이렇듯, OS 별로 사용 방식이 상이하다.
리눅스에서도 위의 개념이 존재하게 되는데,
유저영역과 커널영역에 따라 나누어진다.
이 글에서는 리눅스 시스템에서의 프로세스에 대하여 알아가 보도록 하자.
프로세스
우선 프로세스는 실제 리눅스 시스템 메모리에서 실행 중인 프로그램을 뜻한다.
리눅스 개발자 입장에서는 프로세스는 메모리에 적재되어 실행을 대기하거나,
실행하는 흐름을 의미한다.
프로세스를 관리하는 자료구조인 객체를 Task Descriptor 라고 부르기도 하며,
task_struct 구조체로 표현된다.
위의 구조체로 모두 표현되는것은 아니고, thread_info 구조체를 통해
프로세스의 실행 흐름을 표현하는 또 한 가지 중요한 공간인 프로세스 스택 공간이 있다.
프로세스 스택의 최상단 주소에 thread_info 구조체가 있다.
정리를 하자면,
task_struct : 테스크 디스크립터
thread_info : 프로세스 스레드 정보 로 볼 수 있다.
테스크
리눅스 커널 코드에서는 task 의 이름의 코드가 많이 보인다.
테스크는 실행 가능한 단위라고 볼 수 있다.
사실 예전 개발자들이 쓰던 용어를 테스크로 Legacy 하였기 때문에
사용한다고 봐도 될 것 같다.
하여 task_struct 로 쓰는 이유 또한 그러하다.
task 가 붙여진 함수들은 프로세스 관련 함수라고 봐도 무방하다.
예시로 아래와 같은 함수들을 볼 수 있다.
- dump_task_regs()
- get_task_mm()
- get_task_pid()
- idle_task()
- task_tick_stop()
정리를 하자면,
리눅스 커널에서 테스크는 프로세스와 같은 개념이다.
코드에서 task 란 단어가 보이면 프로세스로 생각을 하자.
스레드
리눅스에서의 스레드는 유저 레벨에서 생성된 가벼운 프로세스이다.
위에서 말했듯이, 스레드는 프로세스에 비해 컨텍스트 스위칭 시간이 빠르다.
이유는 자신이 속한 프로세스 내의 다른 스레드와
파일 디스크립터, 파일, 시그널 정보에 대한 주소 공간을 공유하기 때문이다.
일반적인 프로세스는 각각 stack 영역을 따로 갖게 되는데 스레드는 다르다.
이외 에는, 커널 입장에서는 스레드를 프로세스와 동등하게 관리를 한다.
대신 task_struct에서 스래드 그룹 여부를 점검은 한다.
'Embedded > Linux Kernel' 카테고리의 다른 글
[Linux Kernel] ftrace 를 통한 유저 레벨 프로세스 분석(Signal 종료 방식) (0) | 2022.02.07 |
---|---|
[Linux Kernel] 커널 스레드(프로세스) 생성 과정 소스 분석 (0) | 2022.02.07 |
[Linux Kernel] 커널 디버깅용 Debugfs 드라이버 코드 (0) | 2022.02.06 |
[Linux Kernel] ftrace Log 포맷 해석 및 발생 경로 확인 (0) | 2022.02.01 |
[Linux Kernel] ftrace 디버깅 사용하기 (0) | 2022.02.01 |