프로그램이 시스템에서 실행중인 상태
Lives : 실행중인
Dies : 종료된
커널 ⇾ PID로 프로세스 식별
1. system boots
2. 크롬 같은 다른 프로그램 실행
3. 사용자가 terminal에 command 입력
4. batch program이 실행
1. 정상적인 종료
2. 프로세스가 에러를 인지하고 종료시킴
3. CPU가 정지되어서 프로세스가 중단됨
4. 터미널에서 명령어로 종료
fork() 함수
현재 프로세스와 동일한 자식 프로세스를 만들어줌
어디에 쓸까?
서버 프로세스에서 여러 클라이언트로 부터 요청이 오면 본인이 아닌 자식 프로세스를 만들어 요청 처리
어떻게 작동할까?
1) 새로운 PCB(Process Control Block)을 할당 받음. PCB ⇾ 프로세스 정보를 가지고 있음
2) PCB를 복제하여 자식 프로세스를 만든다.
3) 자식프로세스에게는 0, 부모 프로세스에게는 Child's PID를 리턴.
execl ("path", "program", "program2", "program3", ...)
1) 실행 파일을 로드하고 실행
2) exec system call에서 현재 프로세스를 다른 프로세스로 덮어씀(swap)
Ex)
현재 프로그램 : bash
exec("/usr/bin/", "cp")
bash shell 프로그램이 cp 프로그램으로 덮어쓰기 됨
프로세스 ⇾ 프로세스 테이블로 표시 됨
프로세스 테이블 항목 ⇾ 프로세스 컨트롤 블록(PCB) ⇾ 모든 프로세스 정보에 대한 자료구조
프로세스 상태, 포인터의 메모리 영역, 현재 디렉터리, 파일을 가리킬 포인터, signals, 작업 우선순위 스케줄링
UID, GID, eUID, eGID
⇾ 권한과 접근 통제를 위한 것
PID, PPID, PGID
주소 공간 - 메모리에 매핑
이진 코드 - 프로그램
데이터 - 프로그램의 초기 데이터
실행 스텍과 스텍 포인터 - 데이터의 현재 실행 위치를 가리킴
카운터 - 코드의 현재 실행 위치를 가리킴
프로세서 레지스터
시스템 리소스
Process ID (PID) : 프로세스에 할당된 특별한 식별자, 범위 (0~65535), 시스템에서 PID를 재사용하는데 오랜 시간이 걸림
Parent Process ID (PPID) : 부모 프로세스, fork() 함수를 통해 자식 프로세스를 생성함
Process Group ID (PGID) : 하나 혹은 그 이상의 프로세스 무리, 프로세스 그룹 리더에게 신호를 보내면 그룹내 모든 프로세스에게 신호 전송 가능
init process는 모든 프로세스의 조상이다.
실행되고 있는 모든 프로세스 이름을 트리구조로 보여줌
프로세스 스냅샷을 보여줌
| -ef | grep value | 가장 많이 사용, value 값이 포함된 모든 프로세스를 트리구조로 보여줌 |
|---|---|
| a | 다른 유저의 프로세스를 보여줌 |
| f | 트리 포멧으로 보여줌 |
| u | 유저 이름과 프로세스 상태, 프로세스 시작 시간을 보여줌 |
| w | wider output format |
| x | 터미널이 컨트롤 하지 않는 프로세스도 포함 |
| -e | 모든 프로세스를 보여줌 |
| -l | PRI(우선 순위), NI(CPU 자원 소모 정도) 같은 자세한 정보를 보여줌 |
| -f | STIME(프로세스 시작 시간), CMD(명령어 이름) 같은 자세한 정보를 보여줌 |
| -C | cmd에서 해당 이름의 프로세스만 보여줌 |
| -U | 해당 유저의 프로세스만 보여줌 |
ps u
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
eun 3547 0.0 0.3 5764 3132 pts/0 Ss 03:42 0:00 bash
| TTY | 터미널 |
|---|---|
| TIME | CPU 작동시간 |
| CMD | 명령어 이름 |
| %CPU | CPU 사용량 |
| %MEM | 메모리 사용량 |
| VSZ | 가상 메모리 사용량 |
| RSS | 물리적 메모리 사용량 |
| STAT | 프로세스 상태 (Ss ⇾ sleep, R+ ⇾ running) |
| START | 프로세스 시작 시간 |
전체 화면에 지속적으로 업데이트 하며 프로세스 활동 스냅샷을 보여줌
-d delay : 업데이트 까지 해당 초만큼 지연시키겠다.
-i : 한가한 프로세스는 무시한다.
| q | quit |
|---|---|
| Ctrl + l | 업데이트 |
| h | help page |
| k | 신호와 연관 됨 Ex) kill |
| r | 프로세스 우선 순위 변경 |
| s | second delay 숫자 변경 |
| M | 메모리 사용량 기준 정렬 |
| P | CPU 사용량 기준 정렬 |
사용자 : 동시에 실행되는 프로세스는 병행하여 실행된다고 생각
그러나 동시에 실행된느 프로세스의 제어 흐름은 시간상 물리적으로 분리 되어 있음
두 프로세스 동시에 실행 ⇾ 프로세스는 연달아 실행 됨(동시에 실행 X)
실행중인 프로세스가 변경됨
커널 코드가 이전 프로세스를 PCB에 저장하고 다음 프로세스 PCB를 복구한다.
프로세스는 커널이나 또다른 프로세스에 신호를 보낼 수 있음
신호 ⇾ 매우 간단한 메세지 (작은 정수, 니모닉 이름으로)
신호 이름 ⇾ 모두 대문자
몇몇 신호 ⇾ 커널에서 처리됨
30가지의 신호가 이용가능
| 이름 | 숫자 | 의미 |
|---|---|---|
| INT | 2 | Stop Running (Ctrl + C) |
| TERM | 15 | 끝내기 |
| KILL | 9 | 가장 자주 사용, Die! |
| TSTP | 20 | Stop (Ctrl + Z) |
| HUB | 1 | 두번째로 자주 사용, Restart |
kill -9 PID : 해당 PID의 프로세스 Kill
nicer processes ⇾ 더 적은 cpu자원을 소모 한다.
범위 : +19(very nice) ~ -20(not very nice)
non-root user ⇾ 1 ~19
if) 많은 리소스를 필요로 하는 프로세스
⇾ 처리에 많은 시간이 걸림 ⇾ not very nice ⇾ nice가 작음(-20) ⇾ PRI(우선순위)가 높아짐 ⇾ 더 많은 CPU 실행 시간을 얻게 됨
nice증가 명령어 실행 ⇾ 더 낮은 우선 순위
nice -10 long-running-command &
nice -n 10 long-running-command &
nice 감소 명령어 실행 ⇾ 더 높은 우선 순위
nice --15 important-command &
nice -n -15 important-command &
쉘 ⇾ 작업 컨트롤을 제공
command & ⇾ 백그라운드에서 실행
Ctrl + z ⇾ 일시 중지
jobs : 활성화된 작업과 작업 번호를 출력해줌
%+ : 가장 최근에 실행된 작업
%- : +작업 바로 전 작업
fg : 백그라운드 프로세스를 포그라운드 프로세스로 바꿈 ⇾ 중지된 프로그램이 실행된다.
fg %1 : 1번 작업을 포그라운드 프로세스로 변경
cf)
foreground process : 해당 프로세스 종료 전까지 다른 입력을 못 받음
background process : 사용자 입력과 상관없이 실행되는 프로세스
bg : 일시정지된 작업을 재시작, 백그라운드에서 실행 됨
bg %1 : 1번 작업 백그라운드에서 재 실행
인자로 제공된 시간에 해당 명령어 실행
at 16:30 < clean\_process.sh
⇾ 16:30에 clean\_process.sh 명령어 실행
at 09:30
at 17:00 tomorrow
at 11:00 Nov 11
at 00:30 16.04.12
at now + 45 minutes ⇾ 지금 부터 45분 후
at 16:00 + 3 days ⇾ 3일뒤 4시
atq : 보류중인 at명령어 나열
at -c number : 해당 at 명령어 나열
atrm number : 해당 at 명령어 삭제
정기 작업
30 9 root /usr/local/bin/check\_logins
⇾ at 09:30
⇾ on all days ( )
⇾ for root user
⇾ Run /usr/local/bin/check\_logins
Minute (0-59)
Hour (0-23)
Day of the month(dom) (1-31)
Month(mon) (1-12)
Day of the week(dow) (0-7, 0 and 7 Sunday)
Ex)
m h dom mon dow
17 ⇾ 매시간 17분 마다 매일 실행
47 6 7 ⇾ 6:47에 일요일 마다 실행
52 6 1 ⇾ 6:52에 매달 마다 실행
15,45 ⇾ 매일 매 시간 15분, 45분 마다 실행
15, 45 9-17 1-5 ⇾ 월~금요일 9~17시에 15분, 45분 마다 실행
30 8-18/2 1-5 ⇾ 월~금요일 8~18시에 2시간 간격으로 30분 될때 마다 실행
crontab -e : crontab 편집
crontab -l : crontab 출력
/etc/cron.allow에 등록된 사용자만 crontab 사용가능
/etc/cron.deny에 등록되어 있으면 crontab 실행불가
둘다 존재X 이면 모든 유저가 crontab을 사용할 수 있다.