프로세스와 프로그램의 차이점
프로그램이란?
: 컴퓨터가 실생할 수 있는 명령 집합
코드 소스의 집합이며 디스크에 저장되는 정적인 개체
우리가 평소에 말하는 '프로그램을 실행'하려면 소스코드만 출력되어서는 안 된다. 디스크
에 저장된 코드를 메모리 or cpu
로 보내서 작동을 시켜야 한다
프로세스란?
: 메모리에 존재하는 프로그램의 형태, 프로그램의 실행을 의미하는 동적인 개체
개발자에 의해 짜여진 프로그래밍 언어들이 기계어로 변환되어 메모리에서 드디어 실행이 되는 것이다
이렇게 실행하는 주체를 프로세스
라고 한다
프로세스는 프로그램이 실행 될 때, 운영체제에 의해 생성되며
프로세스도 부모-자식 관계로 이루어져 있다
부모 프로세스가 자식을 kill해야 한다 (물론, 자식보단 부모가 먼저 죽는 경우도 있다. 이런 경우 init process가 대신하여 종료한다.)
그렇다면 왜 이렇게 진행될까?
서버 자원이 한정적
이기 때문!
한정적인 자원을 할당하고 회수하고를 굉장히 효율적으로 진행해야 하는데, 따라서 적재적소에 프로세스를 종료하는 게 필요하다. 이를 위해서 부모 프로세스 산하에 자식 프로세스들이 관리되는 구조인 것이다
들어가기 전에, 그래서 컴퓨터가 어떻게 돌아가길래 이걸 알아야 하는 건데? 에서 시작해보자
사람이 일을 하는데 한계가 있으니 기계를 시키는 것처럼 시스템이 하드웨어에게 일을 시켜야 한다
여기서 커널이 하드웨어를 컨트롤하여 동작하게 만든다.
그런데 커널이 동작하려면 누군가 또 커널에게 명령을 해줘야 한다. 여기서 shell이 등장! 인간의 말을 기계어로 변경하여 커널에게 명령어를 전달해주는 역할을 shell이 한다
kernel:
하드웨어를 컨트롤하는 핵심 프로그램
shell:
a command-line interpreter program
유저가 유틸리티를 통해서 명령어를 내리면 분석하여 OS에게 보내는 역할이다
쉽게 말해, 기계어로 변환하여 넘기는 변역가라고 보면 된다
ps(Process Status):
ps명령어를 사용하면 현재 구동 중인 (사용자와 관련된)프로세스 정보를 확인할 수 있음
ps -ef
e
옵션 : 시스템 전체 프로세스를 출력f
옵션 : 전체 포맷을 출력 Do full-format listing , (verbose모드와 비슷하게 작동하며 상세 정보 출력)ps ef | more
: 내용이 많아서 스크린을 넘어가기 때문에 more로 분할하여 출력해줘!
$ps ef
UID PID PPID C STIME TTY TIME CMD
deserialize 22
root 2 0 0 Nov26 ? 00:00:00 [kthreadd]
* UID : user id 프로세스 소유자
* PID : 프로세스 id
* PPID : 부모 프로세스 id
* C : 스케줄링을 위한 cpu 사용량
* STME : 프로세스 시작시간
* TTY : 프로세스를 위한 단말기 제어 (?로 출력되는 경우 터미널로 시작하지 않은 프로세스인 demon process의미)
* CMD : 명령
prstee
: 트리 형태로 부모-자식간 관계를 출력함
ps -ef | grep [찾고자하는 워드 (pattern)]
예를 들어 ps -ef | grep bash
👉 전체 프로세스에서 bash 정보만 추출
pgrep [option] [찾고자하는 워드 (pattern) ]
ps와 grep을 합친 형태
option
-x : 패턴과 정확히 일치하는 PID정보 출력
-n : 패턴 포함 + 최근에 생성된 PID
-u uid : uid와 일치하는 사용자의 프로세스 출력
-l : pid와 프로세스 이름 출력
Quiz
bash 프로세스 정보만 출력 하시오 (정확하게 bash정보만 필요)pgrep -x bash
pgrep -n sh
pgrep -u 100
pgrep -l bash
ps : 프로세스 전체 사용 시간 동안의 cpu 사용률
$ ps
PID TTY TIME CMD
1373 pts/1 00:00:00 bash
1729 pts/1 00:00:00 bash
1872 pts/1 00:00:00 bash
29824 pts/1 00:00:00 ps
32178 pts/1 00:00:00 bash
top : 그때 그때의 cpu 사용률(전체 리소스에서 얼마나 차지하고 있는 가)
$top
//출력
top - 16:52:05 up 18:01, 3 users, load average: 0.00, 0.01, 0.05
Tasks: 236 **total**, 2 **running**, 234 **sleeping**, 0 **stopped**, 0 **zombie**
%Cpu(s): 0.3 us, 0.0 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1014540 total, 73796 free, 654592 used, 286152 buff/cache
KiB Swap: 2097148 total, 1744892 free, 352256 used. 107696 avail Mem
PID USER PR NI VIRT RES SHR
아카이브란?
사전적 정의: 역사적 가치 혹은 장기 보존의 가치를 지닌 기록이나 문서들의 컬렉션을 의미 - 위키백과
즉, 무언가를 "보관"한다 => 오랜시간 저장하기 위함이니 "장기 저장소" 라고 볼 수 있다
시스템 입장에서 아카이브란, 파일의 카피본을 백업 장치에 저장할 때의 저장소라고 볼 수 있다
좀 더 깊이 있게 동작으로 개념을 정리하자면,
리눅스에게 아카이브란? 여러 개의 파일 혹은 디렉토리를 묶어서 하나의 파일로 만드는 것
그렇다면 왜? 아카이브가 필요할까??
파일의 이동/공유/저장을 쉽게하기 위해서이다
네트워크로 데이터를 보낼 때, 여러 파일을 하나의 파일로 만들어(=아카이브) 보내는 것이 효율적이기 때문!
tar
: 파일을 압축하고 저장하기 쉽게 여러 파일을 하나로 만드는 유틸리티
우리는 tar의 도움을 받아 아카이브를 생성할 수 있다.
tar [option] [아카이브 파일.tar] [아카이브로 만들 파일들 나열]
옵션
c
create : 새로운 tar파일 생성v
verbose: tar파일 내부 디테일한 정보들f
file = archive: use archive file or device ARCHIVE 아카이브를 만들어 줘 (아카이브 파일이나 데이프 장치 지정)x
extract : tar파일 해제tar
확장자를 정해주는 게 좋은 편이라 한다tar cvf weekends.tar sat, sun
#weekends.tar 아카이브 파일 생성
tar xvf weekends.tar
#weekends.tar 아카이브 파일 해지
이렇게 하면 weekends.tar라는 파일에 sat, sun 파일이 들어가게 된다
이 과정에서 어떤 tar파일이 합쳐졌는 지에 대한 메타데이터 정보가 들어가기 때문에 원본 파일들 용량 합이 아카이브 파일 용량보다 크다
따라서 압축을 해야 한다
여기서! 왜 압축을 할까?
1. 파일을 압축해서 네트워크를 통해 전송한다면 트래픽을 줄이게 됨
2. 압축을 통해 디스크 공간을 50~60%정도 효율적으로 공간을 줄여서 사용할 수 있음