1. 프로그램과 프로세스란?
프로그램과 프로세스의 정의는 다음과 같다. 먼저 프로그램은 "저장 장치(storage, HDD, SSD)에 저장되어 있는, 실행되지 않은 정적인 실행 파일"을 의미한다. 그리고 이러한 프로그램이 실행되어 메모리(Main Memory, RAM)에 올라오면 동적인 상태의 프로세스가 된다고 볼 수 있다.
2. 프로세스의 상태(State)
- Ready
- 프로세스가 모든 자원을 가지고, 실행 준비를 마친 상태. 아직 CPU에서 실행되지 않고, 준비큐에서 실행을 기다리는 단계
- Dispatch (Ready => Running)
- 스케줄러에 의해 선택된 준비큐 맨 앞에 있는 프로세스에게 프로세서를 할당하는 것
- Interrupt (=time out) (Running => Ready)
- 예외, 입출력, 이벤트 등이 발생하여 Running 상태의 프로세스를 Ready 상태로 변경하는 것
- Running
- CPU가 프로세스의 명령어(instruction)을 실행하는 단계
- Block (Running => Waiting)
- 외부 장치의 입출력 또는 이벤트를 처리하는 경우, Running 상태의 프로세스를 Waiting 상태로 변경시킨다
- Waiting
- 외부 장치의 입출력 또는 이벤트가 발생하여 잠시 멈춘 상태로, 자원을 사용할 수 있을 때까지 대기한다
- Wake up (= Completion) (Waiting => Ready)
- 입출력/이벤트가 끝나면 Ready 상태로 전이하여 CPU를 기다린다
3. 프로세스 메모리 구조
- Stack
- 함수 호출 시마다 생성되는 임시 데이터 저장소
- 반환 주소, 매개 변수, 지역 변수 등을 관리
- 함수가 호출 시마다 스택 프레임(해당 함수의 매개 변수, 리턴 주소, 지역 변수를 저장하는 공간)이 생성되고, 종료되면 삭제된다
- Heap
- 동적으로 메모리를 할당할 때 사용되는 영역
- 동적 메모리 할당은 프로그램이 실행되는 동안 필요에 따라 메모리를 할당하고, 사용이 끝나면 메모리를 해제하는 방식
- BSS
- 초기화되지 않은 전역 변수와 정적 변수를 저장하는 메모리
- DATA
- 초기화된 전역 변수와 정적 변수를 저장하는 메모리
- Text (=code)
- 프로그램의 코드 자체를 저장하는 영역
- 읽기 전용이다(쓰려고 하면 오류 발생)
4. 프로세스 제어 블록(PCB; Process Control Block)
프로세스 제어 블록(PCB)는 운영체제에서 프로세스의 상태와 정보를 관리하기 위해 사용하는 자료 구조이다. 각 프로세스가 생성될 때마다 고유의 PCB가 생성되고, 프로세스가 완료되면 PCB는 제거된다. PCB는 프로세스의 상태 전이 시, CPU를 점유하여 작업을 처리하다가 진행 중이던 작업 내용을 모두 정리하고 CPU를 반환해야하는 상황(Interrupt, Block)이 발생하게 되는데, 이때 진행하던 작업을 저장하지 않으면 다시 CPU를 할당 받았을 때, 어떤 작업을 해야하는지 모르는 사태가 발생한다. 이러한 상황을 방지하기 위해 프로세스는 CPU가 처리하던 작업을 자신의 PCB에 저장하고, 다시 CPU를 점유했을 때, PCU로부터 해당 정보를 받아와 정상적으로 작업을 진행하게 된다.
- Process ID(PID)
- 프로세스를 구분하는 ID, PID를 이용해 프로세스를 종료
- Process State
- 생성(Create), 준비(Ready), 실행(Running), 대기(Watiting), 완료(Terminated)의 상태를 저장
- Program Counter
- 다음 명령어(Instruction)의 주소를 저장, CPU는 이 값을 참조해 프로세스의 명령어를 수행
- Register
- CPU Register, General Register
- CPU Scheduling Information
- 우선 순위, 최종 실행시간, CPU 점유 시간 등
- Memory Information
- 해당 프로세스 주소 공간 정보(페이지 테이블, 세그먼트 테이블)를 저장
- Process Information
- 페이지 테이블, 스케줄링 큐 포인터, 소유자 등
- Device I/O Status
- 프로세스에 할당된 입출력 장치 목록, 열린 목록 등
- Pointer
- 부모/자식 프로세스에 대한 포인터, 할당된 자원에 대한 포인터 등
4. 프로세스 관리 명령어
1. ps
: 현재 실행 중이 프로세스 목록을 확인하는 명령
ps
=> 현재 콘솔/터미널에서 실행된 프로세스만 표시(현재 쉘만)
ps -ef
ps aux
=> 현재 시스템에서 실행 중인 모든 프로세스 표시
2. top
: 현재 실행 중인 프로세스의 목록을 보여준다. 각 프로세스의 ID(PID), 사용자, CPU 및 메모리 사용량, 실행 시간 등이 포함
3. kill
: PID를 지정하여 프로세스를 한 개 씩 종료(기본 값으로 15번 시그널 사용)
=> 옵션을 통해 다른 시그널*을 사용할 수 있다
kill [PID]
kill -9 [PID]
=> 9번 시그널을 이용하여 프로세스 종료
pkill [프로세스 이름(명령어)]
=> 명령어/프로세스 이름이 동일한 모든 프로세스를 종료
*시그널(Signal)
: 사용자가 요청하고 커널이 판단해서 프로세스에 전달하는 신호
주로 사용되는 시그널 2, 9, 15, 20번은 알아두자!
- 2번 시그널
- SIGINT = Signal Interrupt
- Ctrl + c
- 현재 콘솔/터미널을 사용 중인 프로세스(포그라운드)에게 작업을 중지하고 종료하라는 신호
- 프로세스가 SIGINT를 무시하는 경우도 있음
- 15번 시그널
- SIGTERM = Signal Terminate
- 프로세스에게 종료하라는 신호. 백그라운드에서 실행중인 프로세스에게도 전달되는 시그널
- kill [PID]
- 프로세스가 스스로 종료할 시간을 주는 방식 (정상종료)
- 프로세스가 스스로 종료할 시간을 주는 방식 (정상종료)
- 프로세스가 SIGTERM을 무시하는 경우도 있음
- 20번 시그널
- SIGTSTP = Signal Stop
- ctrl+z
- 프로세스에게 정지(일시정지)하라고 보내는 신호(시그널) = suspend/pause
- 9번 시그널
- SIGKILL = Signal Kill
- 프로세스에게 종료하라고 알리는 시그널이 아닌, 커널이 강제로 종료시키는 시그널(강제 종료)
- 되도록 사용을 자제 => 좀비 프로세스가 되는 경우가 생김
- 좀비 프로세스: 비정상 작동하면서 종료는 되지 않는 프로세스(재부팅해야 종료 가능)
*Job 프로세스 관리
: 프로세스 중 터미널/콘솔에 의해 제어되는 프로세스
(터미널/콘솔에서 명령어나 프로그램을 실행한 경우)
Job의 세 가지 상태
- 포그라운드(Foreground)
- Foreground Process
- 화면을 점유하고 사용자의 입력을 독식
- bg %[job번호] => 백그라운드로 변경
- 백그라운드(Background)
- Background Process
- 화면을 점유하지 않고, 뒤에서 실행되는 프로세스
- 사용자의 입력이 쉘 프롬프트를 통해 전달될 수 있음
- fg %[job번호] => 포그라운드로 변경
- 정지(Stopped)
- Stopped Process
- 포그라운드로 실행중인 프로세스를 ctrl+z (20번 시그널)를 누르면 프로세스가 일시정지
jobs %4
bg %3
fg %2
[명령어/실행파일] &
=> 처음 실행할 때부터 백그라운드로 실행
힘들지만 오늘도 해낸 나를 위한 한 마디,
"멈추지 않는다면 얼마나 천천히 가는지는 중요하지 않다", 공자
"귀찮고, 포기하고 싶은 순간이 와도 조금 느려질지언정 포기하지 말자"
'System > Linux' 카테고리의 다른 글
[Linux] 작업 예약 명령어: cron (2) | 2024.09.21 |
---|---|
[Linux] DHCP (0) | 2024.09.21 |
[Linux] 파일 소유권 & 권한 / 특수 권한 (0) | 2024.09.19 |
[Linux] Linux 서버를 통해 PC방에서 Tetris 대결을 할 수 있게 하자! (2) | 2024.09.14 |
[Linux] 하드 링크 & 심볼릭 링크 / 파일 관리 명령어 (0) | 2024.09.12 |