리눅스데브코스 [8주차 - 1(1)]<프로세스>

심우열·2023년 5월 23일
0
post-thumbnail

1. 프로세스란?

1. 일반적인 소프트웨어 개발자에게 프로세스란?

  • 리눅스 시스템의 메모리 공간에서 실행 중인 프로그램
  • 다수의 프로세스를 실시간으로 사용하는 기법을 멀티프로세싱이라 함
  • 같은 시간에 여러 프로그램을 실행하는 방식을 멀티태스킹이라 함

2. 리눅스 시스템 개발자에게 프로세스란?

  • 프로세스는 리눅스 시스템 메모리에 적재되어 실행을 대기하거나 실행하는 실행 흐름
  • 프로세스를 관리하는 자료구조이자 객체

2. 프로세스는 왜 알아야 할까?

1. 현업에서 프로세스를 활용하는 방법

  • 프로세스와 관련된 자료 구조로 디버깅 패치 작성 가능
  • task_struct 필드를 활용

2. 프로세스란?

  • 리눅스 커널 소스 코드를 실행하는 주인공은 프로세스
  • 모든 함수는 프로세스의 스택 공간에서 실행

3. 스케줄링의 대상

  • 프로세스
  • __schedule() 함수 리뷰

4. 뮤텍스를 잡는 대상

  • 프로세스
  • mutex_lock() 함수 리뷰

5. 시그널의 전달 대상

  • 프로세스
  • __send_signal() 함수 리뷰

6. 인터럽트 컨텍스트 정보의 저장 위치

  • 프로세스의 task_struct 자료 구조
  • irq_enter() 함수 리뷰

7. 커널 코드를 실행하는 대상

  • 프로세스
  • current -> comm;

따라서 프로세스에 대한 이해는 매우 중요!!

3. 태스크

1. 태스크란?

  • 기존 임베디드 RTOS 기반 시스템에서 특정 코드나 프로그램 실행을 일괄처리 했는데 이런 실행 및 작업 단위를 태스크라 함
  • 기존 임베디드 개발자들이 리눅스를 사용하는 임베디드 프로젝트로 유입
  • 태스크라는 용어에 익숙한 임베디드 개발자들이 리눅스에서도 '태스크' 라는 용어를 사용

결국 태스크와 프로세스는 대부분 같은 의미를 갖음

2. 프로세스 자료구조: 스택

1. 프로세스 소개

1. 프로세스와 관련된 자료 구조

  • 태스크 디스크립터(Task Descriptor)라고 부르고 task_struct 구조체로 표현
  • thread_info 구조체와 thread 구조체로 표현

2. 자료구조의 특징

  • task_struct: 일반적인 프로세스의 속성(아키텍쳐 무관)
  • thread_info, thread 구조체: 아키텍처에 의존적인 프로세스의 동작

2. 프로세스의 스택

1. 프로세스는 자신의 스택 공간에서 실행

  • 프로세스의 스택 사이즈는 0X4000(1<<14), ArmV8 64bit 기준

2. IRQ Stack

  • 인터럽트 처리용 전용 스택
  • per-cpu 타입으로 정의됨

3. 프로세스의 스택 이슈

  • 스택 오버플로우
  • 스택 깨짐(out-of-bound, use-after-free)

4. 프로세스 스택 이슈 대응

  • stack canary
  • compiler option
  • 디버깅
  • 코드 리뷰
  • 프로세스 스택의 내용 상세 분석(스택, 푸시)

3. 프로세스 관리

1. 유저모드와 커널 모드

1. 유저 모드

  • 리눅스 시스템 프로그래밍 코드가 실행되는 모드
  • 카카오톡, 브라우저와 같은 애플리케이션 구동
  • 메모리 접근에 제약이 있어 리눅스 저수준 함수를 사용해 시스템 콜을 호출, 커널에게 요청

2. 커널 모드

  • 리눅스 커널이 실행되는 모드
  • 직접 커널 함수를 호출해 커널 시스템 정보(메모리, 인터럽트, ...) 획득 가능
  • 시스템 레지스터에 접근 가능 -> 시스템 속성 설정

2. 유저 프로세스의 생성 흐름도

  • 유저 공간에서 fork() 함수를 호출하면 리눅스에서 제공한느 유틸리티 라이브러리의 도움을 받아 커널에게 프로세스 생성 요청
  • 리눅스 커널에서는 fork() 함수에 대응하는 시스템 콜 핸들러인 __arm64_sys_clone() 함수를 호출

3. 커널 스레드

1. 커널 스레드란?

  • 커널 프로세스는 커널 공간에서만 실행되는 프로세스
  • 데몬과 같이 백그라운드로 실행되면서 시스템 메모리나 전원을 제어하는 동작을 수행

2. 커널 스레드의 특징

  • 커널 스레드는 커널 공간에서만 실행되며, 유저 공간과 상호작용하지 않음
  • 커널 스레드는 실행, 휴면, 등 모든 동작ㅇ를 커널에서 직접 제어 관리
  • 대부분의 커널 스레드는 시스켐이 부팅할 때 생성되고 시스템이 종료할 때까지 백그라운드로 실행

3. 커널 스레드의 생성 과정

  • 1단계: kthreadd 프로세스에게 커널 프로세스 생성을 요청
  • 2단계: kthreadd 프로세스는 깨어나 프로세스를 생성해달라는 요청이 있으면 프로세스를 생성

4. 커널 스레드의 종류

1. kthreadd 프로세스

  • kthreadd 프로세스는 모든 커널 스레드의 부모 프로세스
  • 스레드 핸들러 함수는 ktreadd()이며, 커널 스레드를 생성하는 역할을 수행

2. 워커 스레드

  • 워크큐에 큐잉된 워크(work)를 실행하는 프로세스
  • 스레드 핸들러 함수는 worker_threa()이며, process_one_work()함수를 호출해 워크를 실행

3. ksoftirq 프로세스

  • Soft IRQ를 위해 실행되는 프로세스
  • ksoftirq 스레드의 핸들러는 run_ksoftirqd() 함수로서 Sofr IRQ 서비스를 실행
  • Soft IRQ 서비스를 처리하는 __do_softirq() 함수에서 ksoftirqd를 깨움

4. IRQ 스레드(threaded IRQ)

  • 인터럽트 후반부 처리를 위해 쓰이는 프로세스

4. 프로세스가 종료되는 흐름

1. exit 시스템 콜

2. kill 시그널

4. 프로세스 관련 커널 자료구조

1. 태스크 디스크립터(task_struct 구조체)

  • 프로세스의 속성 정보를 표현하는 가장 중요한 자료구조
  • 프로세스의 이름과 PID와 같은 프로세스 정보 저장
  • 프로세스의 관계를 알 수 있는 데이터 저장
  • 프로세스가 생성되면 커널이 태스크 디스크립터를 프로세스에 부여

2. thread_info 구조체

  • 아키텍쳐에 의존적인 프로세스의 속성 정보 저장
  • struct task_struct의 시작 주소
  • flags와 preempt_count 필드로 구성
  • preempt_count 는 preemption의 여부를 판단하는 데이터를 저장

3. thread_struct 구조체

  • 프로세스가 실행된 레지스터 세트와 같은 정보 저장

4. Current 매크로

  • current 매크로는 현재 구동 중인 프로세스의 태스크 디스크립터 주소를 알려줌
  • current 매크로를 통해 직접 태스크 디스크립터 필드에 접근할 수 있음

1. current 매크로는 왜 존재할까?

  • struct task_struct 타입의 태스크 디스크립터 는 커널에서 가장 중요하게 관리하는 자료구조
  • 커널은 태스크 디스크립터에 접근해 프로세스 정보를 수시로 접근하고 저장
  • 태스크 디스크립터에 들어 있는 속성 정보로 함수의 실행 흐름이 바뀜

2. current 매크로의 정체


-sp_el0를 'struct task_struct*' 구조체로 캐스팅해 반환

struct task_struct 구조체의 시작 주소가 sp_el0 레지스터에 저장되는 시기

  • 컨텍스트 스위칭 수행시 x1(레지스터)은 앞으로 CPU를 점유하면서 실행할 프로세스의 태스크 디스크립터의 주소를 저장
  • sp_el0 레지스터는 이제부터 CPU를 점유하면서 실행되는 프로세스의 주소로 업데이트
profile
Dev Ops, "Git, Linux, Docker, Kubernetes, ansible, " .

0개의 댓글