07 linux system process and Job Control

Sisyphus·2022년 7월 16일

Ubuntu

목록 보기
8/9

프로세스

프로그램이 시스템에서 실행중인 상태
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, 작업 우선순위 스케줄링

user 정보

UID, GID, eUID, eGID
⇾ 권한과 접근 통제를 위한 것

프로세스 간의 관계 정보

PID, PPID, PGID



프로세스 구성요소

주소 공간 - 메모리에 매핑
이진 코드 - 프로그램
데이터 - 프로그램의 초기 데이터
실행 스텍과 스텍 포인터 - 데이터의 현재 실행 위치를 가리킴
카운터 - 코드의 현재 실행 위치를 가리킴
프로세서 레지스터
시스템 리소스



32bit 주소 공간



PID and PPID

Process ID (PID) : 프로세스에 할당된 특별한 식별자, 범위 (0~65535), 시스템에서 PID를 재사용하는데 오랜 시간이 걸림
Parent Process ID (PPID) : 부모 프로세스, fork() 함수를 통해 자식 프로세스를 생성함



PGID

Process Group ID (PGID) : 하나 혹은 그 이상의 프로세스 무리, 프로세스 그룹 리더에게 신호를 보내면 그룹내 모든 프로세스에게 신호 전송 가능



init

init process는 모든 프로세스의 조상이다.



pstree command

실행되고 있는 모든 프로세스 이름을 트리구조로 보여줌



ps command

프로세스 스냅샷을 보여줌

Optinos

-ef | grep value가장 많이 사용, value 값이 포함된 모든 프로세스를 트리구조로 보여줌
a다른 유저의 프로세스를 보여줌
f트리 포멧으로 보여줌
u유저 이름과 프로세스 상태, 프로세스 시작 시간을 보여줌
wwider output format
x터미널이 컨트롤 하지 않는 프로세스도 포함
-e모든 프로세스를 보여줌
-lPRI(우선 순위), NI(CPU 자원 소모 정도) 같은 자세한 정보를 보여줌
-fSTIME(프로세스 시작 시간), CMD(명령어 이름) 같은 자세한 정보를 보여줌
-Ccmd에서 해당 이름의 프로세스만 보여줌
-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터미널
TIMECPU 작동시간
CMD명령어 이름
%CPUCPU 사용량
%MEM메모리 사용량
VSZ가상 메모리 사용량
RSS물리적 메모리 사용량
STAT프로세스 상태 (Ss ⇾ sleep,  R+ ⇾ running)
START프로세스 시작 시간


top command

전체 화면에 지속적으로 업데이트 하며 프로세스 활동 스냅샷을 보여줌

Options

-d delay : 업데이트 까지 해당 초만큼 지연시키겠다.  
-i : 한가한 프로세스는 무시한다.  


Interactive command of top

qquit
Ctrl + l업데이트
hhelp page
k신호와 연관 됨   Ex) kill
r프로세스 우선 순위 변경
ssecond delay 숫자 변경
M메모리 사용량 기준 정렬
PCPU 사용량 기준 정렬


사용자 관점의 동시에 실행되는 프로세스

사용자 : 동시에 실행되는 프로세스는 병행하여 실행된다고 생각
그러나 동시에 실행된느 프로세스의 제어 흐름은 시간상 물리적으로 분리 되어 있음



프로세스의 논리적 제어 흐름 

두 프로세스 동시에 실행 ⇾ 프로세스는 연달아 실행 됨(동시에 실행 X)



문맥 변환

실행중인 프로세스가 변경됨
커널 코드가 이전 프로세스를 PCB에 저장하고 다음 프로세스 PCB를 복구한다.



프로세스의 신호 보내기

프로세스는 커널이나 또다른 프로세스에 신호를 보낼 수 있음
신호 ⇾ 매우 간단한 메세지 (작은 정수, 니모닉 이름으로)
신호 이름 ⇾ 모두 대문자
몇몇 신호 ⇾ 커널에서 처리됨
30가지의 신호가 이용가능



흔한 시그널

이름숫자의미
INT2Stop Running (Ctrl + C)
TERM15끝내기
KILL9가장 자주 사용, Die!
TSTP20Stop (Ctrl + Z)
HUB1두번째로 자주 사용, Restart


kill command

kill -9  PID : 해당 PID의 프로세스 Kill


nice command

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 &


Job control

쉘 ⇾ 작업 컨트롤을 제공

command & ⇾ 백그라운드에서 실행  
Ctrl + z ⇾ 일시 중지


command

jobs : 활성화된 작업과 작업 번호를 출력해줌  
%+ : 가장 최근에 실행된 작업  
%- : +작업 바로 전 작업  
  
fg : 백그라운드 프로세스를 포그라운드 프로세스로 바꿈 ⇾ 중지된 프로그램이 실행된다.  
fg %1 : 1번 작업을 포그라운드 프로세스로 변경  
cf)  
foreground process : 해당 프로세스 종료 전까지 다른 입력을 못 받음  
background process : 사용자 입력과 상관없이 실행되는 프로세스  
  
bg : 일시정지된 작업을 재시작, 백그라운드에서 실행 됨  
bg %1 : 1번 작업 백그라운드에서 재 실행 


at command

인자로 제공된 시간에 해당 명령어 실행

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 명령어 삭제  


Cron jobs

정기 작업



포멧

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       76:47에 일요일 마다 실행  
52 6     16: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 출력  


cron 권한

/etc/cron.allow에 등록된 사용자만 crontab 사용가능  
/etc/cron.deny에 등록되어 있으면 crontab 실행불가  
둘다 존재X 이면 모든 유저가 crontab을 사용할 수 있다.

0개의 댓글