본문 바로가기

IT

프로세스 개요

반응형
반응형

 

 

#####. 프로세스

###. 프로세스의 개요

#. 프로세스의 개념

+. 프로세스의 정의

 - 프로세스는 디스크의 프로그램을 메모리에 적재하고 실행한 상태

 - 하나의 프로그램은 여러 개의 프로세스로 중복 생성될 수 있기 때문에 프로세스는 프로그램의 인스턴스라 정의 할 수 있음.

+. 프로세스의 특징

 - 프로세스는 생성, 실행, 대기, 중지, 좀비, 종료 등의 라이프 사이클을 갖음

 - 프로세스는 고유의 아이디 (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 방식으로 프로세스를 실행할 수 있음

빠져 나올 수 없다... os 재부팅했다...

+. 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 명령어의 특정 시그널을 옵션으로 지정할 수 있음

 

 

 

반응형

'IT' 카테고리의 다른 글

CNCF란?? 오픈 허브?? 알기 쉽게 풀어 쓴 개념  (0) 2023.07.19
도커 개요  (0) 2023.07.18
리눅스 쉘 개요 및 이해  (0) 2023.07.18
가상 메모리  (0) 2023.07.17
블로그를 열면서  (0) 2023.07.17