리눅스 Process, Shell(kernel), Archive, 압축

Yeeun_An·2024년 1월 28일
2

프로세스

프로세스와 프로그램의 차이점

프로그램이란?
: 컴퓨터가 실생할 수 있는 명령 집합
코드 소스의 집합이며 디스크에 저장되는 정적인 개체

우리가 평소에 말하는 '프로그램을 실행'하려면 소스코드만 출력되어서는 안 된다. 디스크 에 저장된 코드를 메모리 or cpu 로 보내서 작동을 시켜야 한다

프로세스란?
: 메모리에 존재하는 프로그램의 형태, 프로그램의 실행을 의미하는 동적인 개체

개발자에 의해 짜여진 프로그래밍 언어들이 기계어로 변환되어 메모리에서 드디어 실행이 되는 것이다
이렇게 실행하는 주체를 프로세스 라고 한다
프로세스는 프로그램이 실행 될 때, 운영체제에 의해 생성되며

  • PID (Process Identification Number)가 프로세스에 할당된다
  • 부모-자식 관계 파악을 위해 PPID(Parent Process Identification Number) 부여된다

🤔프로세스에 왜 PID를 할당할까?

프로세스도 부모-자식 관계로 이루어져 있다
부모 프로세스가 자식을 kill해야 한다 (물론, 자식보단 부모가 먼저 죽는 경우도 있다. 이런 경우 init process가 대신하여 종료한다.)
그렇다면 왜 이렇게 진행될까?

서버 자원이 한정적 이기 때문!
한정적인 자원을 할당하고 회수하고를 굉장히 효율적으로 진행해야 하는데, 따라서 적재적소에 프로세스를 종료하는 게 필요하다. 이를 위해서 부모 프로세스 산하에 자식 프로세스들이 관리되는 구조인 것이다

프로세스 종류

  • init process
    맨 처음 시작되는 프로세스
    부모 프로세스라고 부름 (조상이라고 생각하면 좋다)
    init process가 시작되어야 자식 프로세스들이 실행 됨
  • demon process
    커널에 의해 구동되며, 백그라운드에서 특정 서비스를 제공하기 위해 돌아가는 프로세스 (유저가 직접 실행시킨 게 아니라는 점)
    파일 이름 끝에 d를 붙임
  • 고아 프로세스 orphan process
    자식 프로세스가 작업이 종료되기 전, 부모 프로세스가 종료된 경우
    그럼 누가 종료해줄까? init프로세스가 종료해준다(조상님st)
  • zombie process
    이미 종료된 프로세스지만, 리소스 반환을 하지 못한 상태로 남아있는 프로세스
    일이 끝났는데도 자원을 반납하지 않고 남아있는 놈!

🤔고아와 좀비 프로세스 어떻게 kill 처리?

  • 고아 프로세스는 앞서 언급한 봐와 같이, init 프로세스의 도움을 받아 PID를 kill한다
  • 좀비 프로세스를 찾아 PID를 종료하는 스크립트를 돌리지만, 그래도 죽지 않는 프로세스가 간혹 있다. 이런 경우에는 컴퓨터를 껐다 켜서 한다고 한다

Shell이란? kernel과 shell

들어가기 전에, 그래서 컴퓨터가 어떻게 돌아가길래 이걸 알아야 하는 건데? 에서 시작해보자

사람이 일을 하는데 한계가 있으니 기계를 시키는 것처럼 시스템이 하드웨어에게 일을 시켜야 한다
여기서 커널이 하드웨어를 컨트롤하여 동작하게 만든다.
그런데 커널이 동작하려면 누군가 또 커널에게 명령을 해줘야 한다. 여기서 shell이 등장! 인간의 말을 기계어로 변경하여 커널에게 명령어를 전달해주는 역할을 shell이 한다

  • kernel:
    하드웨어를 컨트롤하는 핵심 프로그램

  • shell:
    a command-line interpreter program
    유저가 유틸리티를 통해서 명령어를 내리면 분석하여 OS에게 보내는 역할이다
    쉽게 말해, 기계어로 변환하여 넘기는 변역가라고 보면 된다

Process 확인

ps 명령어

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 : 명령

pstree - 부모-자식 프로세스 관계

prstee : 트리 형태로 부모-자식간 관계를 출력함

특정 프로세스 검색 pgrep

  1. ps -ef | grep [찾고자하는 워드 (pattern)]
    예를 들어 ps -ef | grep bash 👉 전체 프로세스에서 bash 정보만 추출

  2. pgrep [option] [찾고자하는 워드 (pattern) ]
    ps와 grep을 합친 형태

    option
    -x : 패턴과 정확히 일치하는 PID정보 출력
    -n : 패턴 포함 + 최근에 생성된 PID
    -u uid : uid와 일치하는 사용자의 프로세스 출력
    -l : pid와 프로세스 이름 출력

Quiz

bash 프로세스 정보만 출력 하시오 (정확하게 bash정보만 필요)
pgrep -x bash
sh패턴 포함하고 가장 최근에 생성된 PID정보 출력하시오
pgrep -n sh 
UID가 100번인 사용자 프로세스 정보 출력하시오
pgrep -u 100
bash패턴을 찾아 결과를 출력할 때 PID와 프로세스 이름을 함께 출력하시오
pgrep -l bash

ps vs top

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 
  • total : total process in Active mode
  • running : current running process
  • sleeping : total process in sleep mode
  • stopped : total process stopped
  • zombie : total process in zombie state

Archive

아카이브란?

사전적 정의: 역사적 가치 혹은 장기 보존의 가치를 지닌 기록이나 문서들의 컬렉션을 의미 - 위키백과

즉, 무언가를 "보관"한다 => 오랜시간 저장하기 위함이니 "장기 저장소" 라고 볼 수 있다
시스템 입장에서 아카이브란, 파일의 카피본을 백업 장치에 저장할 때의 저장소라고 볼 수 있다

좀 더 깊이 있게 동작으로 개념을 정리하자면,
리눅스에게 아카이브란? 여러 개의 파일 혹은 디렉토리를 묶어서 하나의 파일로 만드는 것

그렇다면 왜? 아카이브가 필요할까??

파일의 이동/공유/저장을 쉽게하기 위해서이다

네트워크로 데이터를 보낼 때, 여러 파일을 하나의 파일로 만들어(=아카이브) 보내는 것이 효율적이기 때문!

아카이브 생성과 해지 tar

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%정도 효율적으로 공간을 줄여서 사용할 수 있음

파일 압축 compress, gzip, tar -zcvf

profile
뒹굴 뒹굴 개발일지

0개의 댓글