• 2023. 8. 25.

    by. 도 현

    반응형

    프로세스(Process)를 제대로 이해하는 건 어렵다 여러 이유가 있겠지만 프로세스를 이론으로만 이해하는 방식으로 공부하기 때문이다. 프로세스는 그러한 방식으로 학습하기 어렵다. 프로세스와 관련된 자료구조나 ftrace 로그 분석을 통해 프로세스를 익혀야 한다.

     

    1. 프로세스 소개

    프로세스란?

    프로세스라는 용어는 추상적이고 다양한 의미를 담고 있어 프로세스가 무엇인지를 다양한 관점으로 바라볼 수 있다. 프로세스(process)란 무엇일까? 간단히 말해서 리눅스 시스템 메모리에서 실행 중인 프로그램을 말한다. 스케줄링 대상인 태스크와 유사한 의미로도 쓰인다. 다수의 프로세스를 실시간으로 사용하는 기법을 멀티프로세싱이라고 하며, 같은 시간에 여러 프로그램을 실행하는 방식을 멀티태스킹이라고 한다. 

    예를 들어 우리가 쓰고 있는 스마트폼의 동작 방식을 보면, 전화를 하면서 메모를 남기고, 음악을 들으면서 웹 브라우저를 사용할 수 있다. 여러 애플리케이션이 동시에 실행된다. 이것을 멀티태스킹을 통해 프로그램을 시분할 방식으로 처리하기 때문에 가능하다. 

    프로세스를 관리하는 자료구조이자 객체를 태스크 디스크립터(task descriptor)라고 부르고 task_struct 구조체로 표현된다. 이 구조체에 프로세스가 쓰는 메모리 리소스, 프로세스 이름, 실행 시각, 프로세스 아이디(PID), 프로세스 스택의 최상단 주소와 같은 속성 정보가 저장돼 있다. 프로세스의 실행 흐름을 표현하는 또 한 가지 중요한 공간은 프로세스 스택 공간이며, 이 프로세스 스택의 최상단 주소에 thread_info 구조체가 있다. 함수의 실행 흐름으로 다음과 같은 사실을 알 수 있다.

    - 함수 호출 방향은 004번째 줄에서 000번째 줄 방향이다.

    - 유저 공간 프로그램에서 sigtimedwait() 함수를 호출하면 이에 대응하는 시스템 콜 핸들러 함수는 sys_rt_sigtimedwait() 함수가 호출된다.

    - 000번째 줄의 __schedule() 함수가 호출돼 스케줄링된다.

    프로세스는 함수를 호풀하면서 함수를 실행한다. 함수를 호출하고 실행할 때 프로세스 스택의 메모리 공간을 사용하는데, 모든 프로세스들은 커널 공간에서 실행될 때 각자 스택 공간을 할당받으며 스택 공간 내에서 함수를 실행한다.

     

    태스크란?

    태스크는 운영체제에서 말 그대로 실행(Execution)이라 말할 수 있다. 예전에는 특정 코드나 프로그램 실행을 일괄 처리했다. 이러한 실행 및 작업 단위를 태스크라고 불렀다. 임베디드 개발자는 태스크의 개수와 이름을 지정했고 시스템이 구동되는 동안 태스크는 바뀌지 않았다. 예를 들면 화면이 없는 간단한 시나리오를 구동하는 임베디드 시스템에서는 태스크 2개가 서로 시그널을 주고받으며 시스템 전체를 제어했다. 시간이 흘러 기존 임베디드 개발자들이 리눅스를 사용하는 임베디드 프로젝트로 유입됐다. 기존의 태스크라는 용어에 익숙한 임베디드 개발자들이 리눅스에서도 썼던 '태스크'라고 용어를 사용했다. '프로그램을 실행하는 단위'라고 생각했던 태스크의 개념은 프로세스와 겹치는 부분이 많이 때문이다. 그래서 예전에 썼던 태스크라는 용어를 리눅스 커널 소스코드에서 그래도 쓰고 있다. 대표적인 예로 프로세스 속성을 표시하는 구조체의 이름을 process_struct 대신 task_struct로 쓰고 있다. 이처럼 프로세스마다 속성을 표현하는 task_struct 구조체를 태스크 디스크립터 혹은 프로세스 디스크립터라고도 한다. 이처럼 리눅스 커널의 함수 이름이나 변수 중에 task란 단어가 보이면 프로세스 관련 코드라 생각해도 좋다. 예를 들어, 다음 함수는 모두 프로세스를 관리 및 제어하는 역할을 수행하며, 함수 이름에 보이는 task는 process로 바꿔도 무방하다.

    - dump_task_regs()

    - get_task_mm()

    - get_task_pid()

    - idle_task()

    - task_tick_stop()

     

    스레드란?

    스레드(thread)란 무엇일까? 스레드는 유저 레벨에서 생성된 가벼운 프로세스라 할 수 있다. 스레드는 일반 프로세스에 비해 컨텍스트 스위칭을 수행할 때 시간이 적게 걸린다. 그 이유는 스레드는 자신이 속한 프로세스 내의 다른 스레드와 파일 디스크립터, 파일 및 시그널 정보에 대한 주소 공간을 공유하기 때문이다. 프로세스가 자신만의 주소 공간을 갖는 것과 달리 스레드는 스레드 그룹 안의 다른 스레드와 주소 공간을 공유한다. 하지만 커널 입장에서는 스레드를 다른 프로세스와 동등하게 관리한다. 대신 각 프로세스 식별자인 태스크 디스크립터(task_struct)에서 스레드 그룹 여부를 점검할 뿐이다.

    반응형