devRenio

프로세스 관리

서버프로그래밍(황승연) 9주차 강의내용

프로세스

  • 프로세스의 개념

    • 저장장치(하드 디스크 등)에 저장된 프로그램이 메모리에 적재되어 CPU의 제어를 받아 실행 중인 상태
      실행 중인 프로그램 = 프로세스
    • 프로그램이 실행되면 하나 이상의 프로세스가 생성되며 운영체제는 이 프로세스의 실행 상태, 자원, 스케줄링을 관리 (커널의 기능)

  • 프로세스 상태 전이

    • 프로세스는 운영체제의 스케줄러에 의해 상태가 전이됨
      생성(new) → 준비(ready) → 실행(running) → 대기(waiting) → 종료(terminated)
    • 하나의 프로그램이 실행되면 그 프로그램에 대응되는 프로세스가 생성되어 준비 큐(ready queue)에 들어감
    • CPU를 할당 받은 프로세스는 실행 상태가 되고 실행 도중 I/O 대기 등의 이유로 CPU를 반납하면 대기 상태로 전이됨
    • 다른 프로세스들이 CPU를 사용한 뒤 다시 스케줄링이 이루어지면 준비 상태에 있는 프로세스들이 차례대로 CPU를 할당 받음
    • 대부분의 현대 CPU는 멀티코어를 이용해 병렬로 프로세스를 처리하기에 여러 프로세스를 동시에 처리할 수 있음

  • 프로세스 상태 전이 (비유) - 조별 과제

    • 팀장, 팀원 1, 팀원 2, 팀원 3, 팀원 4로 팀 구성
      - 팀장 – 스케줄링
      - 팀원 1, 2, 3 – 자료 제작
      - 팀원 4 – 자료 취합 (한 번에 한 명의 자료만 취합 가능)
    • 팀원 1, 2, 3이 자료 제작 완료(new)하여 사용 가능 상태 (ready)
    • 팀장이 2 → 1 → 3 순으로 자료 취합 요청 (스케줄링)
    • 팀원 2의 자료를 취합 (running → terminated)
    • 팀원 4가 취합 중, 팀원 1의 자료가 미흡하여 거절 (waiting)
    • 팀원 1이 다시 작업 하는 동안 팀원 3 자료 취합 (running → terminated)
    • 팀원 3의 자료를 취합하는 동안 팀원 1의 자료 제작 완료 (ready)
    • 팀원 1의 자료 취합 (running → terminated)

  • 프로세스 번호와 작업 번호

    • 프로세스 번호
      - CPU가 프로세스를 구분하기 위해 부여되는 고유 번호
      - 각 프로세스가 가지는 고유의 번호를 PID라고 함
    • 작업 번호
      - 셀 환경에서 실행된 작업(포그라운드 또는 백그라운드)에 대해 사용자가 구분할 수 있도록 부여되는 일련번호
    • 프로세스 번호는 운영체제가 관리하는 번호이고 작업 번호는 사용자 세션 내에서 관리되는 번호

  • 프로세스 서비스와 관계

    • 데몬 프로세스(Daemon Process) - 사용자의 직접적인 입력 없이 시스템이 백그라운드에서 지속적으로 실행하는 프로세스 - 네트워크, 인쇄, 로그 관리 등 특정 특정 서비스를 제공하기 위해 존재 - 일반적으로 서비스 요청이 들어오면 즉시 응답하고, 요청이 없을 때는 대기 상태로 존재 - ex) sshd, httpd, systemd 등

  • 부모-자식 프로세스

    • 부모-자식 관계의 프로세스
      - 자식 프로세스(새 프로세스)는 부모 프로세스(기존 프로세스)가 fork() 시스템 호출을 통해 생성
      - 부모 프로세스는 PPID(Parent), 자식 프로세스는 PID를 가지고 있음
      - 부모 프로세스를 종료하면 종속된 자식 프로세스도 함께 종료되거나 고아 프로세스가 될 수 있음

  • 고아 프로세스와 좀비 프로세스

    • 고아 프로세스
      - 자식 프로세스가 종료되지 않은 상태에서 부모 프로세스가 종료되는 경우
      - 고아 프로세스는 1번 프로세스(systemd)가 부모 역할을 이어받아 정상적으로 종료
    • 좀비 프로세스
      - 자식 프로세스가 실행을 완료했지만, 부모 프로세스가 종료 처리하지 않은 경우
      - 좀비 프로세스는 kill 명령으로 제거할 수 없으며 부모 프로세스를 종료하면 자동으로 종료됨


프로세스 관리 명령

ps [옵션] : 프로세스 상태 확인

구분 옵션 설명
유닉스 -e 시스템에서 실행 중인 모든 프로세스의 정보 출력
-f 프로세스에 대한 상세한 정보 출력
-u UID 특정 사용자에 대한 모든 프로세스의 정보 출력
-p PID PID로 지정한 특정 프로세스의 정보 출력
BSD a 터미널에서 실행한 프로세스의 정보 출력
u 프로세스 소유자의 이름, CPU와 메모리 사용량 등 상세한 정보 출력
x 시스템에서 실행 중인 모든 프로세스의 정보 출력
GNU --pid PID 목록 목록으로 지정한 특정 PID 정보 출력
항목 기능 항목 기능
UID 프로세스를 실행한 사용자 ID STIME 프로세스 시작 날짜 또는 시각
PID 실행 프로세스 번호 TTY 터미널의 종류와 번호
PPID 부모 프로세스 번호 TIME 프로세스 실행 시간
C CPU 사용량을 % 값으로 표시 CMD 실행되고 있는 프로그램 이름

입력 예 : ps -ef

pgrep [옵션] [인자] : 특정 프로세스 정보 검색

옵션 설명
-x 인자와 정확히 일치하는 패턴의 프로세스 정보 출력
-n 인자를 포함하고 있는 가장 최근의 프로세스 정보 출력
-u 사용자 계정 이름 특정 사용자 계정에 대한 모든 프로세스의 정보 출력
-l PID와 프로세스의 이름 출력
-t term 특정 단말기와 관련된 프로세스의 정보 출력

입력 예 : pgrep -x bash

활용 예 : ps -fp $(pgrep -x bash)
pgrep으로 반환한 bash의 PID로 ps 검색 실행

프로세스명으로 검색 : pgrep [프로세스명]
프로세스ID(PID)로 검색 : ps -p [PID]

kill [시그널] PID : 프로세스 종료

시그널(옵션) 설명
-2 인터럽트 시그널 전송 (Ctrl+C)
-9 프로세스 강제 종료
-15 프로세스가 관련 파일을 정리 후 종료(종료되지 않는 프로세스도 존재)

yes > /dev/null : 테스트용 무한루프 명령 프로세스 실행
두 번째 터미널을 열고 kill -9 [PID] 수행 시 yes 터미널에서 [죽었음] 출력되며 yes 프로세스 종료
입력 예 : kill -9 4556

pkill [시그널] [프로세스명] : 프로세스 종료
같은 이름의 명령 모두 종료


포그라운드와 백그라운드

포그라운드

  • 터미널 창에서 명령어를 입력하면 셸은 사용자가 입력한 명령을 수행하여 그 결과를 화면에 보여줌
  • 사용자는 화면에 나타난 출력결과를 보고 다른 명령을 입력하는 대화식으로 수행하는 작업
  • 즉 사용자와 상호작용을 하여 작업을 수행하도록 해주는 프로세스를 포그라운드 작업이라고 함

백그라운드

  • 프로세스가 실행되었지만 직접 눈으로 프로세스가 확인되지 않는 작업을 백그라운드 작업이라고 함
  • 예를 들어 백신 프로그램, 서버 데몬 등과 같이 화면에 나타나 눈에 보이지는 않지만 실행되는 명령을 작업을 의미
  • 이때 수행하는 프로세스를 백그라운드 프로세스라고 함

sleep [시간(초)] : 설정 시간만큼 휴식
쉬는 동안 터미널 사용 불가능, PID 반환

활용 예 : sleep 30&
30초 동안 쉬는 프로세스를 백그라운드로 실행 이후 터미널을 사용자에게 반환
하지만 진정한 백그라운드 프로세스는 아님
터미널에 종속되어 터미널 종료 시 프로세스도 종료

nohup : 터미널을 종료해도 프로세스가 실행되도록 함
입력 예 : nohup sleep 300 > sleep.log 2>&1 &
2> : 에러 출력 스트림
&1 : 표준 출력 스트림
sleep.log 파일에 표준 출력과 에러 출력을 모두 출력하라

  • 작업 제어
    • 포그라운드 작업을 백그라운드 작업으로 전환하거나 백그라운드 작업을 포그라운드 작업으로 전환하는 제어를 의미
    • 작업 제어는 작업 전환과 작업의 일시 중지, 작업 종료로 구분되어 수행됨

jobs [%작업 번호] : 현재 실행 중인 작업 목록 출력

옵션 설명
%번호 해당 작업의 정보만 출력
%+ 또는 %% 작업순서가 +인 작업 정보를 출력
%- 작업순서가 -인 작업 정보를 출력
  • 작업 전환
    - 현재 포그라운드로 실행 중인 작업을 백그라운드 작업으로 전환하거나 백그라운드 작업을 포그라운드 작업으로 전환
    - 작업 전환 명령은 다음 표와 같음
명령 의미
Ctrl+Z 또는 stop [%작업 번호] 포그라운드 작업을 잠시 중단
Ctrl+C 포그라운드 작업을 강제 종료
kill [%작업 번호] 백그라운드 작업을 강제 종료
bg [%작업 번호] 작업 번호가 지시하는 작업을 백그라운드로 전환
fg [%작업 번호] 작업 번호가 지시하는 작업을 포그라운드로 전환