#####. 프로세스
###. 프로세스의 개요
#. 프로세스의 개념
+. 프로세스의 정의
- 프로세스는 디스크의 프로그램을 메모리에 적재하고 실행한 상태
- 하나의 프로그램은 여러 개의 프로세스로 중복 생성될 수 있기 때문에 프로세스는 프로그램의 인스턴스라 정의 할 수 있음.
+. 프로세스의 특징
- 프로세스는 생성, 실행, 대기, 중지, 좀비, 종료 등의 라이프 사이클을 갖음
- 프로세스는 고유의 아이디 (PID)를 갖고 부모 프로세스와 자식 프로세스의 관계를 맺으며 실행 우선순위와 프로세스의 상태를 갖음
- 프로세스는 생성 시간, 시스템 실행 시간, 사용자 실행 시간 등의 시간 정보와 주기적인 이벤트 발생을 위한 타이머를 가질 수 있음
- 프로세스는 사용 가상 메모리, 프로세스 컨텍스트, 파일 핸들 정보 등의 리소스 정보를 갖음
#. 프로세스의 유형
+. 최상위 프로세스
- 시스템 상의 모든 프로세스의 부모 프로세스
- 부트로더에 의해 리눅스의 초기화를 위해 가장 먼저 실행하는 프로세스이며 커널이 직접 시작
- 최상위 프로세스의 부모 프로세스는 존재하지 않고 프로세스 ID(PID)는 항상 1
- CentOs 6의 최상위 프로세스는 init 프로세스이며 파일 위치는 /sbin/init이고, CentOS 7의 경우는 systemd이며 파일 위치는 /usr/lib/systemd/systemd
- 특히 systemd는 init 프로세스의 단점을 보완하기 위해 레나토 포터링(Lennart Poettering)과 케이 세바스 (Kay Sievers)에 의해 개발. systemd는 최소한의 필요한 서비스로만 시작하고 실제 필요한 시점에서 서비스를 실행하는 on-demand 방식을 제공. 또한 최대한 병렬로 서비스를 시작해 부팅시간을 단축
+. init 프로세스의 PID 확인
- pidof 명령어의 프로세스 이름을 인자로 넘기면 PID를 확인할 수 있음
- CentOS 6의 경우 $ pidof inint 이라는 명령어를 사용하면 1이라는 결과를 얻을 수 있음
- CentOS 7
+. 부모 프로세스와 자식 프로세스
- 현재 실행중인 프로세스 A가특정 실행파일을 실행하여 프로세스 B가 생성되었다면 프로세스 A를 부모 프로세스라 하고 프로세스 B를 자식 프로세스라 함
- 자식프로세스의 ID를 PID라고 하고 부모 프로세스의 PID를 PPID라 함
+. 고아 프로세스와 좀비 프로세스
- 자식 프로세스가 부모 프로세스를 잃어버렸을 때 고아 프로세스가 됨. 잃어버린다는 의미는 부모 프로세스가 강제 종료되어 없어졌다느 의미. 고아 프로세스의 부모 프로세스는 Init 프로세스로 변경
- 자식 프로세스가 종료될 때 부모 프로세스가 wait() 시스템 콜 등으로 자식 프로세스의 종료코드를 회수하지 못한 겨웅 좀비 프로세스가 됨. 프로세스가 사용하던 파일 핸들, 메모리 등 리소스는 모두 반환되었지만 플세스 테이블 상에 자식 프로세스는 아직 지워지지 않은 상태로 남음. 브모 프로세스가 wait() 시스템 콜을 통해 자식 프로세스의 종료 코드를 회수하면 프로세스 테이블에서도 PID가 삭제됨
+. 좀비 프로세스 호가인해보기
- 터미널에서 zombie.sh를 실행하고 약 5초후에 ps명령어로 확인해보면 프로세스의 상태(STAT)가 좀비상태 Z가 되었음을 확인 할 수 있음
- 부모 프로세스에게 SIGCONT 시그널을 보내 상태를 실행으로 변경하면 wait() 시스템 콜을 통해 자식프로세스의 종료 코드를 회수하게 되어 좀비 프로세스가 사라짐을 확인할 수 있음
+. 데몬
- 시스템 부팅 시 대부분 자동으로 시작되며 백그라운드로 실행
- 데몬은 사용자가 직접 제어하지 않고 보통 특정 이벤트나 상태와 같은 주기적으로 지속적인 서비스의 요청을 처리하기 위해 데몬의 관련 핸들러가 실행하는 방식
- 작업 예약 (cron), 파일 전송(ftpd), 프린터 (lpd), 원격 접속 (rlogind), 원격 명령 (rshd), 텔넷 (telnet) 등이 데몬의 좋은 예
+. 다양한 프로세스 유형
- 프로세스가 실행하는 메모리 공간에 따라 사용자 메모리에서 실행하는 프로세스는 사용자 프로세스, 커널 메모리에서 실행하는 프로세스는 커널 프로세스라 함
- 프로세스의 성격에 따라 터미널이나 X 윈도우와 같은 사용자와 직접 반응하는 프로세스를 대화형 (Interactive) 프로세스, 미리 정해진 작업을 순서에 따라 실앵하면 배치(batch) 또는 자동 (automatic) 프로세스라고 함
#. 프로세스 식별자
+. PID(Process IDentifier)
- 시스템에서 실행중인 프로세스를 각각 구분하기 위해 시스템에서 유일한 아이디를 부여받는데 이를 PID라 함
+. PPID(Parent Process IDentifier)
- 생성된 프로세스의 부모 프로세스의 아이디를 특별히 PPID라 함
+. UID(User IDentifier) 또는 GID(Group IDentifier)
- 생성된 프로세스가 속한 사용자 또는 그룹 아이디를 말함. 보통 부모 프로세스로부터 상속 받음
###. 프로세스 동작 원리
#. 프로세스 생성하기
+. exec 방식
- exec() 시스템 콜은 현재 프로세스의 이미지를 새로운 프로세스의 이미지로 교체함
- 셸에서도 명령어 앞에 exec를 붙여서 exec 방식으로 프로세스를 실행할 수 있음
+. fork 방식
- 프로세스가 fork()를 호출하여 프로세스를 생성할 수 있음. fork()를 호출한 프로세스를 부모 프로세스라 하고 생성된 프로세스를 자식 프로세스라 함. 자식 프로세스는 시스템상 유일한 PID를 할당 받으며 자식 프로세스의 부모 프로세스는 fork()를 호출한 프로세스의 PID가 됨
- fork()는 프로세스를 생성할 때 호출한 프로세스를 복제하는 방식으로 새로운 프로세스를 생성. 그러나 부모 프로세스의 메모리 락과 세모포어와 비동기 I/O 등은 상속되지 않음
+. fork()와 exec()를 통한 프로세스 생성 과정
- 프로세스가 생성하고 종료하는 과정을 보면 fork()를 통해 부모 프로세스를 복제하여 자식 프로세스가 생성되고 exec() 호출을 통해 자식 프로세스의 프로그램으로 교체됨. 자식 프로세스가 exit()를 호출하면 부모 프로세스는 wait() 시스템 콜을 통해 자식 프로세스의 종료 코드를 회수
+. pstree를 통한 프로세스 구조 확인
- pstree 명령어를 통해 프로세스의 관계를 확인 할 수 있음. init 프로세스가 fork()와 exec()를 통해 다양한 데몬과 프로세스를 실행하고 있고, 각 프로세스가 생성한 자식 프로세스들도 확인할 수 있음
#. 프로세스 제어하기
+. 포어그라운드 프로세스(foreground processes)
- 사용자가 명령어나 프로그램을 실행하면 프로세스가 실행되는 사이에 셸은 블록이 되는데 이러한 프로세스를 포어그라운드 프로세스라 함
- 포어그라운드 프로세스는 사용자의 입력을 받을 수 있고 그 실행 결과를 터미널이나 그래픽 유저 인터페이스를 통해 확인할 수 있음
+. 백그라운드 프로세스(background processes)
- 명령어의 수행 결과를 받을 때까지 오랜 시간이 걸릴 경우 백그라운드에서 프로세스를 실행 시킬 수 있음
- 백그라운드에서 프로세스를 실행하려면 명령어 뒤에 &를 붙임. [ 와 ] 사이의 숫자는 작업 번호 job number이며 그 뒤 숫자는 PID임
- 현재 실행 중인 작업의 정보를 보기 위해서는 jobs 명령어를 사용
- 백그라운드 프로세스를 다시 포어 그라운드 프로세스로 돌리기 위해서는 fg명령어를 사용
+. 우선순위의 설정
- 리눅스 커널에 의해 관리되고 설정되는 PR(ProiRity)과 사용자가 우선순위를 조절할 수 있는 NI(Nice)가 있음
- 특히 NI는 nice 명령어를 통해 프로세스 시작 시 설정할 수도 있고 renice 명령어를 통해 프로세스 실행 중 조절 할 수도 있음
- PR은 0부터 139의 값을 가지며 그 중 0부터 99는 실시간(real time) 태스크에게 할당되고 사용자를 위해서는 100부터 139의 값이 할당 됨
- NI는 -20부터 19까지 할당될 수 있지만 음수의 값은 root 사용자만이 설정할 수 있음
#. 프로세스 중지하기
+. 키보드 단축키 ctrl + c
- 컨트롤 씨는 SIGINT 시그널을 해당 프로그램에 보내는 동작
- 터미널에서 다음과 같이 명령어를 입력하면 3초바다 "I'm King" 메세지를 출력하는 프로세스가 실행 됨. 프로세스를 종료하기 위해 키보드를 통해 ctrl + c를 입렵하면 프로세스가 종료 됨
- 명령어 : while true; do echo "Im King"; sleep 3; done
+. kill 명령어 사용하기
- kill 명령어의 인자에 프로세스의 PID를 지정하면 해당 프로세스를 종료할 수 있음
- 사용자는 사용자가 직접 생성한 프로세스만 킬 할 수 있음
- 오직 root 사용자만이 시스템 프로세스를 kill 할 수 있음
- 오직 root 사용자만이 다른 사용자가 생성한 프로세스를 kill 할 수 있음
- 해당 프로세스가 다양한 수준으로 적절히 종료할 수 있도록 kill 명령어의 특정 시그널을 옵션으로 지정할 수 있음
+. signal
- 프로세스가 다른 프로세스에게 어떤 의미를 담은 신호를 주기 위한 방식
- 운영체제에서 제공하는 시그널은 kill -l 옵션을 통해 확인 가능
- kill 명령을 통해 시그널을 전달할 수도 있고 키보드 입력을 통해 시그널을 전달할 수 도 있음
- ctrl + c는 해당 프로세스에게 SIGINT 시그널을 보냄
시그널 번호 | 시그널 이름 | 설명 |
1 | SIGHUP | 터미널의 접속이 연결이 끊어질 때 보내는 시그널 |
2 | SIGINT | ctrl + c를 통해 인터럽트 발생 시 |
3 | SIGQUT | ctrl + \ 입력시 |
9 | SIGKILL | 프로세스를 강제 종료 시 |
15 | SIGTERM | 프로세스를 정상 종료 시 |
18 | SIGCONT | STOP 시그널을 통해 정지된 프로세스를 다시 재개할 때 |
19 | SIGSTOP | 프로세스를 중지할 때 |
20 | SIGTSTP | 프로세스를 대기(suspend)하기 위해 Ctrl + Z를 입력 |
+. 프로세스의 상태
- 프로세스는 실행 시 종료할 때까지 RDSZT와 같은 다양한 프로세스 상태코드를 갖음
- 이러한 상태 코드는 ps 명령어나 top 명령어를 통해 프로세스의 상태를 확인할 수 있음
상태 코드 | 설명 |
R | 프로세스가 현재 실행중 |
D | I/O와 같은 인터럽트를 할 수 없는 슬립(Sleep) 상태 |
S | 특정 이벤트가 시그널될 때까지 기다리기 위한 인터럽트 가능한 슬립 상태 |
Z | 좀비 프로세스 |
T | 중지 상태 |
+. 프로세스의 구조
- PCB (Process Control Block)
: 프로세스를 실행하고 스케줄링하고 상태가 변경될 때마다 그 정보를 저장하기 위해 커널에서는 PCB라고 불리는 자료구조로 프로세스에 대한 정보를 관리하고 있음
Pointer | 프로세스의 스택 포인터 |
Process State | 프로세스의 상태 |
Process Number | 프로세스의 PID |
Process Counter | 프로세스가 실행할 다음 명령어의 주소 |
Register | CPU 레지스터 |
Memory Limits | 메모리 관리에 대한 정보 |
Open File Lists | 프로세스가 열고 있는 파일 목록 |
+. 프로세스 테이블(Process Table)
- 시스템에 실행하고 있는 모든 프로세스를 관리하기 위한 프로세스 테이블이 존재함
- 프로세스 테이블은 현재 실행 중인 프로세스의 PID와 프로세스의 정보를 담고 있는 PCB를 담고 있음
- 프로세스가 종료하면 프로세스 테이블에서도 삭제됨
###. 데몬
#. 데몬의 실행 방식
+. standalone 방식
- 사용자의 요청 없이 시스템 시작 시 자동으로 시작하여 백그라운드에서 대기
- 클라이언트에서 요청 발생 시 즉각적으로 서비스를 제공
- 데몬이 항상 실행되고 있기 때문에 사용자의 서비스 요청에 즉각적으로 응답할 수 있지만 사용하지 않을 때도 시스템의 메모리를 점유하고 있기 때문에 비효율적인 측면이 있음
- 서비스의 요청이 빈번하게 있는 겨웅 적합한 방식
- CentOS 6에서는 /etc/rc.d/init.d에 데몬을 위한 스크립트가 위치함. chkconfig 명령어의 --add 옵션을 통해 데몬을 추가할 수 있고 --level 옵션을 사용하여 시스템 시 데몬이 시작할 실행 레벨을 지정할 수 있음
- CentOS 7에서는 /etc/systemd/system에 파일이름이 .service로 끝나는 데몬 스크립트가 위치함. 스크립트의 Install 섹션을 통해 시스템 시작 시 실행할 타겟을 명시할 수 있음
+. xinetd 방식 (eXtendid interNet)
- 시스템 시작 시 xinetd를 standalone 방식으로 실행하고 사용자의 서비스 요청이 있을 때만 관련 데몬을 시작하여 서비스를 제공, 사용자의 접속이 종료되면 데몬도 자동으로 종료됨
- 데몬이 필요할 떄 로드되기 때문에 자원 효율이 좋으나 사용자의 서비스 요청에 대하여 standalone 방식 대비 상대적으로 느림
- 커널 2.2 버전까지는 inetd 데몬이 서비스를 관리하였으나 2.4 버전 부터는 xinetd 데몬이 역할을 수행하고 있음
- 서비스의 요청이 빈번하지 않을 때 유리
+. systemd의 온디맨드(on-demand)방식
- CentOS 7의 systemd는 xinetd 방식과 같은 데몬 실행 방식을 제공함, 이를 온디맨드 방식이라고 함
- systemd에서 온디맨드로 데몬을 실행하기 위해 소켓 파일 (*.socket)과 서비스 파일 (*.service)이 필요. 소켓 파일은 프로토콜이나 포트번호와 같은 소켓 정보를 가지고 있고, 서비스 파일은 해당 소켓에서 요청이 발생할 경우 시작할 데몬의 실행 파일과 관련된 정보를 가지고 있음
#. 데몬 시작하기
+. /etc/rc.d/init.d를 통한 데몬 시작하기 (CentOS 6)
- /etc/rc.d/init.d 또는 /etc/init.d에는 데몬을 시작하거나 중지하고 재시작할 수 있는 데몬 스크립트가 위치
+. 심볼릭 링크 경로
- /etc/init.d는 /etc/rc.d/init.d의 심볼릭 링크가 걸려있어서 어느것을 사용하여도 무방함
+. init 프로세스 실행 레벨에 따른 데몬 시작
- init 프로세스의 실행 레벨을 지정하기위해 chkconifg 명령어의 --level 옵션을 사용
- 이 명령어는 사용자가 지정한 실행 레벨에 따라 /etc/rc.d/rc0.d~ /etc/rc.d/rc6.d의 디렉토리에 정보를 갱신
- 만약 사용자가 실행 레벨을 5로 설정하였다면 /etc/rc.d/rc5.d 의 내용이 변경 됨
- 여러 실행 레벨 중 실행레벨 5의 설정을 살펴보면 S로 시작하는 파일은 실행 레벨 5에서 실행하는 데몬을 의미하고 K로 시작하는 데몬은 실행하지 않음을 의미. 또한 두 자리 숫자는 init 프로세스가 데몬을 실행하는 순서를 의미. 시작할 데몬보다 먼저 시작해야 할 의존성이 있는데몬이 존재한다면 두 자리 숫자를 앞선 값으로 설정
+. systemd를 통해 데몬 시작하기 (CentOS 7)
- systemd는 유닛 단위로 서비스를 관리
- 시스템에 로드된 모든 유닛을 확인하려면 list-units 명령을 사용
- 서비스 타이브이 유닛만을 확인하려면 -t 옵션을 사용하고 로드되지 않은 유닛까지 확인하려면 --all 옵션을 사용
- 이 외에도 해당 프로세스를 갱신하는 reload 가 있고 reload-or-restart라는 갱신후 재시작하는 옵션도 있음
+. systemd를 통해 원하는 타겟 실행 시 데몬 시작하기 (centOS7)
- 부팅 시 서비스가 시작할 수 있도록 서비스를 등록
- 서비스 파일의 설정에 따라 /etc/sys-tem/system 디렉토리 이하에 지정한 서비스에 대한 심볼릭 링크가 생성
- systemctl enable docker.service
'OS' 카테고리의 다른 글
[OS] 리눅스 1급_Shell 셸 (0) | 2023.07.01 |
---|---|
[OS] 리눅스 1급 X 윈도우 (0) | 2023.07.01 |
[OS] 리눅스 1급_리눅스의 구조 2 (0) | 2023.07.01 |
[OS] 리눅스1급_리눅스의 구조1 (0) | 2023.07.01 |
[OS] 리눅스1급_리눅스와 하드웨어 (0) | 2023.07.01 |