프로세스와 시그널

soyeon·2023년 6월 21일
0

Linux

목록 보기
6/7
post-thumbnail

프로세스(process)

  • 프로세스는 메모리 상에 존재
  • 사용자가 디스크에 저장되어있는 프로그램을 실행시키면 생기는 것 => 실행중인 프로그램을 의미
  • 프로세스 스케줄링(process scheduling)
    • CPU의 관점에서 해야 할 일이다.
    • 여러개의 프로세스를 동시에 동작할 수 있도록 한다.
  • 프로세스 상태(process state)
    • CPU가 프로세스를 동작시키기 위해 알아야하는 프로세스의 상태
    • Running: CPU가 프로세스를 처리하고 있는 중
    • Waiting: 다른 프로세스를 처리하는 동안 대기중
    • Blocked: 외부에 있는 자원에 오퍼레이션을 하고 그 작업이 끝날때까지 블록함
    • 프로세스 전이 다이어그램(process transition diagram)
  • 프로세스 계층구조
    • PID(Process ID)
    • 부모 프로세스와 자식 프로세스
    • init 프로세스
      • 리눅스가 종료될때까지 떠있는 프로세스
    • 프로세스 종료 처리
      • 자식 프로세스가 의도치 않게 동작 중 종료되면 부모 프로세스가 signal을 받고 남은 종료처리를 한다.
    • 고아 프로세스와 좀비 프로세스
      • 자식 프로세스보다 먼저 부모 프로세스가 종료된 경우 그 자식 프로세스를 고아 프로세스라 하며 init 프로세스가 입양한다.(부모 프로세스가 init 프로세스가 된다.)
      • 자식 프로세스가 죽었을 때 부모 프로세스가 자식 프로세스를 종료처리하지 않아 반쯤 죽은 자식 프로세스가 되는 것을 좀비프로세스라 한다. 시스템 자원의 낭비가 발생한다.
    • 결국 자식프로세스를 잘 종료시켜줄 수 있도록 부모 프로세스를 잘 개발하는 것이 중요하다.
  • 프로세스 종료 상태(exit status)
    • 프로세스가 종료될 때 넘겨주는 정보
    • 부모 프로세스에게 정보를 넘기게 됨(상태 정보)
      • 정상 종료 여부
      • 시그널을 받아 종료되었는지 여부 및 시그널의 종류
      • 코어 덤프(core dump)를 생성했는지 여부

    시그널(signal)

  • 비동기 이벤트를 처리하기 위한 프로세스간 통신
  • 주요 시그널
시그널 이름의미기본처리
SIGABRTabort()에서 보냄. 의도적인 중단을 의미코어 덤프
SIGALRMalarm()에서 보냄. 정해진 시간이 됐다는 의미종료
SIGBUS하드웨어 버스 에러코어 덤프
SIGCHLD자식 프로세스 종료무시
SIGSTOP프로세스 중지정지
SIGCONT중지된 프로세스 재시작시작
SIGHUP프로세스의 제어 터미널이 닫힘종료
SIGILL프로세스가 부적절한 명령을 실행코어 덤프
SIGINT사용자가 인터럽트를 생성종료
SIGQUIT사용자가 종료 문자 생성코어 덤프
SIGTSTP사용자가 일시 중지 문자 생성정지
SIGIO비동기 입출력종료
SIGPIPE프로세스가 잘못된 파이프에 쓰기 작업을 시도종료
SIGSEGV메모리 세그먼트 접근 위반하는 프로그램 오류코어 덤프
SIGFPE산술 연산 예외가 발생하는 프로그램 오류코어 덤프
SIGKILL프로세스 종료 명령종료
SIGTERM프로세스 종료 명령(조건에 따른 처리 가능)종료
SIGUSR1사용자 정의 시그널1종료
SIGUSR2사용자 정의 시그널2종료

실습

프로세스 목록 조회 및 구조 파악

  • ps: 프로세스 목록 조회
    • 옵션 없이 조회 시 현재 터미널에 존재하는 프로세스만 조회
    • PID: 프로세스 ID
    • TTY
    • TIME: CPU 누적 시간
    • CMD: 커맨드, []로 표시되는 것은 리눅스 커널이 관리하는 커널 스레드이다.
    • ps -f: 프로세스 목록 조회 (아래의 정보 추가)
    • UID: 실행한 유저 ID
    • PPID: 부모 프로세스의 ID
    • C: CPU 사용량
    • STIME: 프로세스가 실행된 시간
    • ps -e, ps -ef: 현재 터미널에서 실행한 프로세스 이외의 시스템의 전체 프로세스 목록 조회
    • ps -ef --forest: 트리 형태로 프로세스 계층 구조 조회
    • echo $$: 현재 실행중인 프로세스 조회

다음과 같이 스크립트를 작성하여 실행해보고 PID의 변화를 알아보자.
vim process.sh

#!/bin/bash

while [ 1 ];do
	echo "hello, PID $$"
    sleep 3
done

먼저 현재 프로세스를 먼저 조회하면 2018 을 조회한다.
이제 방금 만든 스크립트를 실행해보자. 실행 권한 주는 거 잊지말고!(chmod 0755 process.sh)
./process.sh로 실행하면 다음과 같이 3초씩 쉬면서 프린트를 한다.

실행중으로 두고 새로 터미널을 열어 ps -ef --forest를 조회해보자.

2018을 부모프로세스로 가진 2271 프로세스가 있고 이 프로세스를 부모프로세스로 가지는 2287 프로세스가 있는 것을 확인할 수 있다.
2287 프로세스는 sleep을 하는 프로세스로 3초가 지나면 사라지고 다시 sleep을 할 때 새로운 PID를 가진 프로세스가 생성이 된다.

프로세스 종료 상태

echo $?: 직전 커맨드의 실행 결과를 조회한다.

시그널 전송

  • kill: 시그널을 보내는 커맨드
    • -l: 시그널 종류 조회
  • 9) SIGKILL
    다시 스크립트를 실행시키고 시그널을 보내서 프로세스를 종료해보자.
    kill -9 2487
    echo $? 결과: 137
  • 15) SIGTERM
    kill -TERM 2540
    echo $? 결과: 130
  • 텀은 안전하게 프로그램을 종료한다. kill은 강제 종료이므로 텀을 먼저 시도하기를 권장

포어그라운드 프로세스와 백그라운드 프로세스

  • 포어그라운드 프로세스: 사용자의 입력이 연결, 기본 실행
  • 백그라운드 프로세스: 사용자의 입력이 연결되지 않는다. 모니터링과 같이 프로세스 동작
  • 위의 스크립트를 백그라운드로 실행해보자.
    ./process.sh &: 백그라운드로 실행
    jobs: 백그라운드 프로세스 조회
    • -l: PID도 같이 조회
      fg: 다시 포어그라운드로 실행
    • %2: jobs 로 조회한 2번 프로세스를 포어그라운드로 실행
      Ctrl + Z: 프로세스 멈춤
      bg: 다시 포어그라운드로 실행
profile
사부작 사부작

0개의 댓글