본문 바로가기
OS/Linux

[Linux] 리눅스 프로세스와 쓰레드 관리

by Yoon_estar 2025. 1. 17.
728x90

프로세스와 쓰레드의 개념

프로세스

  • 정의: 실행 중인 프로그램으로, 프로그램의 진행 상태를 완전하게 나타내는 자료구조의 집합입니다.
  • 구성 요소: 프로세스 디스크립터를 통해 프로그램의 실행 정보를 관리합니다.

쓰레드

  • 정의: 프로세스 내에서 실행 흐름을 담당하며, 프로세스당 최소 하나 이상의 쓰레드가 존재합니다.
  • 리눅스에서 경량 프로세스(lightweight process)로 취급: 쓰레드 단위로 스케줄링이 이루어집니다.
  • 자원 공유: 쓰레드는 프로세스 내 자원(공간, 열린 파일 등)을 공유하지만, 공유 자원 접근 시 동기화가 필요합니다.

💡 리눅스 커널 관점에서 프로세스와 쓰레드는 동일하게 취급됩니다.

 

 

PID와 PPID

PID (Process ID)

  • 정의: 각 프로세스에 부여되는 고유한 식별자입니다.
  • 특징: 프로세스 생성 순서대로 배정됩니다.

PPID (Parent Process ID)

  • 정의: 해당 프로세스를 생성한 부모 프로세스의 PID입니다.
  • 특징: 리눅스는 새로운 프로세스를 복제(fork)하고, 자식 프로세스는 새로운 프로그램을 실행(exec)하는 방식으로 동작합니다.

 

Niceness: 프로세스 스케줄링 우선순위

  • 정의: CPU 스케줄링의 우선순위를 결정하는 값입니다.
  • 범위: -20(우선순위 높음) ~ +19(우선순위 낮음)
  • 특징:
    • 우선순위가 높을수록 더 많은 CPU 시간을 할당받습니다.
    • 현대 CPU 성능의 향상으로 수작업으로 우선순위를 조정하는 경우는 드뭅니다.

 

신규 프로세스 생성

  1. fork 시스템 콜 사용:
    • 부모 프로세스를 복제하여 자식 프로세스를 생성합니다.
    • 반환 값:
      • 자식 프로세스: 0 반환
      • 부모 프로세스: 생성된 자식 프로세스의 PID 반환
  2. exec 계열 함수 호출:
    • 자식 프로세스는 새로운 프로그램을 실행하기 위해 현재 실행 중인 프로그램을 다른 프로그램으로 교체합니다.

 

프로세스 상태

  1. TASK_RUNNING: 실행 중이거나 실행 대기(runqueue) 상태
  2. TASK_INTERRUPTIBLE: 특정 조건을 기다리는 대기(sleep) 상태로, 시그널 수신 시 깨움
  3. TASK_UNINTERRUPTIBLE: 시그널을 무시하며 대기 상태 유지
  4. TASK_ZOMBIE: 프로세스가 종료되었지만, 부모 프로세스가 이를 회수하지 않은 상태

 

프로세스 상태 확인 명령어

# ps aux
# ps lax
# ps auxf

 

 

프로세스 종료 방법

  1. SIGKILL (-9):
    • 프로세스를 강제 종료하며, 시그널을 수신할 수 없습니다.
    • 사용 예시
# kill -9 <PID>
  1. SIGTERM (-15):
    • 정상 종료 요청 시그널로, 프로세스가 시그널을 수신할 수 있습니다.
    • 사용 예시:
# kill -15 <PID>
  1. SIGINT (-2):
    • Ctrl+C 입력 시 전송되는 시그널로, 프로세스가 시그널을 수신할 수 있습니다.

권장 사항:

  • kill -15로 먼저 종료를 시도하고, 실패 시 kill -9를 사용합니다.

 

 

proc 파일 시스템

정의

  • Pseudo 파일 시스템: 커널이 시스템 상태와 관련된 다양한 정보를 노출합니다.
  • 특징:
    • 실제 파일이 아닌 실시간으로 생성되는 데이터입니다.
    • 운영체제가 유지하는 정보를 일반 파일처럼 접근할 수 있습니다.

사용 예시

  • 명령어로 접근:
# cat /proc/cpuinfo
# cat /proc/meminfo

 

  • 프로세스 정보:
# ls /proc/<PID>