프로세스

Linux/Linux (CentOS) 2018. 7. 4. 00:29

프로세스란

- 프로세스는 실행중인 프로그램이다

- 프로그램은 하드디스크에 파일 형태로 저장되어 있다.

- 프로그램은 실행시에 프로세스를 어떻게 만들지에 대한 광범위한 정보를 담고 있는 파일이다



운영체제의 실행파일 형식

- Unix , Linux : ELF 포맷을 사용한다.

- Windows : PE 포맷을 사용한다

PE 포맷 : 마이크로소프트의 Window 3.1 부터 지원되는 실행 파일의 형식을 말함 유닉스 COFF를 기반으로

              나왔으며 , PE 포맷을 사용하는 파일의 확장자는 cpl , exe , dll , ocx , vxd , sys , scr , drv 가있다

악성코드 중에는 cpl , scr 형태의 확장자로 배포되므로 사용자가 주의해야 한다.





프로세스의 상태


신규 : 프로세스가 생성된 상태

준비 : 프로세스가 처리기의 배정을 기다리고 있는 상태

실행 : 프로세스의 명령이 실행되고 있는 상태

대기 : 프로세스가 어떤 사건이 발생하기를 기다리고 있는 상태

종료 : 프로세스의 실행이 종료된 상태


     signal           +---------+      signal                                                           

          .--------- | 중단 중 | <------.                                                                 

          |             +---------+           |                                                                 

          v                                        |                                                                 

      +----------+  -------------->  +--------+          +--------+     

---> | 실행준비 |    scheduling  | 실행중 |  --->  | Zombie |    

      +----------+  <--------------  +--------+          +--------+   

          ^                                       |                                                          

          | input/output(완료)          | input/output                                             

          |               +---------+         |                                                              

          `--------- | 중단 중 | <------'                                                                 

                          +---------+     





프로세스의 생성

- 한 프로세스는 다른 프로세스를 fork()를 이용하여 생성하고 exec() 계열의 함수에 의해서 실행

- 부모 프로세스 : 자식 프로세스를 만드는 프로세스

- 자식 프로세스 : 부모 프로세스에 의해 생성된 프로세스

- 부모와 자식은 자원의 일부 혹은 전부를 공유하거나 운영체제로부터 자원을 할당 받는다




 bash 프로세스가 명령어를 실행할 때의 상태


                                     부모 프로세스는 자식 프로세스가                                                           

         +---------------+      종료되기까지 wait() Wait 상태           +---------------+   

 ---> | 부모 프로세스 | ------------------------------------------>  | 부모 프로세스 |  

         +---------------+                                                                +---------------+                     

                |                                                                                        ^         

                | fork() 에 의해                                                                  |        

                | 자식 프로세스 생성                                                           | exit() 에 의해 

                v                                                                                        | 실행 프로세스 종료

           +---------------+                         +--------------------+               |

           | 자식 프로세스 |  ------------>  | 실행 프로세스 대체 |  --------'

           +---------------+                          +--------------------+ 

                              exec() 에 의해    

                              실행해야 할 프로세스로 대체   





프로세스의 실행 측면의 두가지 가능성

- fork()로 자식을 생성하면 부모 프로세스와 자식 프로세스가 동시에 실행된다.

- 부모는 자식의 일부 또는 전부가 종료될때까지 wait

- 부모는 wait가 되지 않게 하기 위해서 명령어 뒤에 & 기호를 입력해야 한다.




주소공간의 경우에서 두가지 가능성

- 자식은 부모의 복사판 (fork())

- 자식 프로세스는 별도의 프로그램을 적재 (exec() 계열의 함수 man excl)



프로세스의 종료

- exit 명령

  : 자신의 마지막 명령이 수행된 후 운영체제에게 요쳥하고 자신은 종료

- abort 명령

  : 강제종료 , 부모프로세스만이 권한 행사

  - Xwindow 가 종료가 되면 Xwindow 에서 실행된 프로세스들 모두 종료

  - 부모가 종료되면 자식들도 따라서 강제 종료

  - 부모가 종료되면 자식들은 init 프로세스가 거둔다



ex)

# ./test.sh 1&

# pstree

init -+

        l:

        l:

        l - sshd --- sshd --- bash -+- pstree 

        l                           `-test.sh --- sleep


# /etc/init.d/sshd stop

init -+- acpid

        l:

        l:

        l- sshd --- bash -+- pstree

        l             `-test.sh --- sleep






프로세스의 우선순위


각 프로세스는 실행시 우선 순위를 가진다

특별히 지정하지 않는다면 우선순위는 모두 동일하게 (0) 으로 지정

nice , renice 명령어를 이용하여 프로세스의 우선순위를 지정할수 있다

nice : 프로세스를 실행할때 우선순위를 지정한다

renice : 실행되고 있는 프로세스의 우선순위를 변경한다


프로세스의 우선순위 범위

+------------+---------------+

-20             0                   +19



프로세스의 우선순위 낮추기 

+ 방향으로 가면 프로세스의 우선순위가 낮아진다 ( 일반사용자도 사용이 가능)

ex) renice +19 PID


프로세스의 우선순위 높이기

- 방향으로 가면 프로세스의 우선순위가 낮아진다 (일반유저는 권한이없다 root만 가능)

ex) renice -1 PID





프로세스 실행방식


- 포그라운드 프로세스로 실행하는 방식

   : 사용자와 직접적으로 대화하는 프로세스

   : bash 에서 실행하는 프로그램은 대부분 포그라운드 프로세스로 실행된다

- 백그라운드 프로세스로 실행하는 방식

  : 사용자와 직접적으로 대화하지 않고 사용자 뒤에서 실행되는 프로세스

  : 데몬 , 시스템 운영에 필요한 프로세스들이 백그라운드 프로세스로 이미 동작한다

  : 쉘에서 명령어를 실행할 때 반드시 & 기호를 명령어 뒤에 쓰고 실행해야 백그라운드로 실행된다

  : 단 백그라운드로 돌지 않는 프로세스들도 있으므로 이런 프로세스를 백그라운드로 실행시 중지된다

  : 중지된 프로세스는 ps 명령어로 확인시 state 에 T(중지) 로 표시된다




프로세스 전환 방법

포그라운드 -> 백그라운드 -> Ctrl + Z + bg %작업번호

백그라운드 -> 포그라운드 -> fg 작업번호



/proc 디렉토리 (가상파일시스템)

  - 실제 메모리에서 동작중인 상태를 보여주는 가상 파일 시스템 디렉토리



signal(신호)


-------------+-----------------------------------------------------------------

시그널명     l 설명

-------------+-----------------------------------------------------------------

SIGHUP     l 터미널을 잃어버렸을 때 발생한다

SIGABRT   l 프로그램의 비정상 종료시 발생한다

SIGINT     l Control-C 나 DELETE 키를 입력했을때 발생한다

SIGKILL    l 프로세스를 죽이기 위해서 사용한다

SIGPIPE    l 단절된 파이프에 write 할경우 발생

SIGSEGV   l 잘못된 메모리 참조 ( 주로 포인터를 잘못 썻을때 )

SIGSTOP   l 프로세스의 일시 중단 (Ctrl + z)

SIGSUSR1 l 사용자를 위해 정의된 시그널

SIGCONT  l 중지된 프로세스를 다시 시작

SIGSTOP  l 실행된 프로세스를 중지 시킨다

-------------+-----------------------------------------------------------------



프로세스 전환

- bash 상태에서 기본적으로 실행되는 프로세스는 기본적으로 포그라운드로 동작을 하지만

  백그라운드로 동작하는 프로세스도 존재한다

  주로 데몬 프로세서들이 이런식으로 동작을 한다

  데몬 프로세스는 대부분이 백그라운드로 실행 되게끔 프로그래밍이 되어있다

ex)

    # /etc/init.d/crond stop

    # /usr/sbin/crond

    # ps aux | grep cron

    root     .... 0:00  /usr/sbin/crond




백그라운드 프로세스 -> 포그라운드 프로세스로 전환

전환하기위해 작업번호를 알아야 한다 (jobs 명령어로 확인)

- 명령어 & <-- background process 로 실행

  & -> jobs -> fg %<작업번호>

여러개의 프로세스가 백그라운드로 실행이 된다면

하나의 프로세스만 동작하면 fg만 쓰면 된다



포그라운드 프로세스 -> 백그라운드 프로세스로 전환

중지하고 백그라운드로 전환

Ctrl + Z -> bg %<작업번호>

Ctrl + Z 를 누르면 프로세스는 중지가 되며 bg %<작업번호> 를 하면 다시 동작한다

여러개의 프로세스가 포그라운드로 실행이 된다면

하나의 프로세스만 동작하면 bg만 쓰면 된다






inin process

- 리눅스 부팅하면서 제일 처음에 실행되는 프로세스

- 부모 프로세스가 죽으면 자식 프로세스가 종료되는 경우도 있지만

  그렇지 않은 경우는 init(/sbin/init) 프로세스가 받아들인다


login 해서 명령어를 실행시킨 상태


~ init -> login -> bash -> 명령어1 -> 명령어2


sshd (원격 로그인쉘) 해서 명령어를 실행시킨 상태


~ init -> sshd -> sshd -> bash -> 명령어1 ...

init(1)-+

           l- sshd(2254)-+-sshd(1279)---bash(1283)-+-grep(8666)

           l                      `-sshd(1830)---bash(1835)





프로세스 관련 명령어

rpm -qf `which ps`

rpm -qi procps

rpm -qi procps | grep bin

rpm -qf `which pstree`

rpm -ql psmisc | grep bin



- ps : 프로세스를 확인한다

모든 프로세스를 보여준다 (BSD계열 , SystemV계열)

사용법

: ps

: ps a

: ps au

: ps x

: ps aux

: ps -ef

: ps 각각의 필드



프로세스 정리


1. 시스템에 동작중인 전체 프로세스를 보는 명령어

ps aux

ps -ef


2. 프로세스에게 신호를 보낼때 쓰는 명령어

kill


3. kill 의 전체 신호 목록을 보는 옵션

kill -l


4. 프로세스를 종료하는 신호

15 : 막을수 있다

9  : 막을수 없다  <-- 이 신호를 받으면 무조건 종료된다 (권한이 있어야 된다)

     - 최소한 동등한 권한이거나 높은 권한이어야 종료할 수 있다

     - 권한이 낮은 사용자가 -> 권한이 높은 사용자의 프로세르를 종료 할수 없다



5. 자식 프로세스를 생성하는 함수

fork()


6.프로세스에서 명령어를 대체하는 함수

exec() 계열의 함수 . man exec


7. ls /proc 했을 때 나오는 번호(디렉토리)는 무엇인가

/proc 디렉토리에서 번호로 된 디렉토리는 하나의 프로세스에 해당한다.

현재 시스템에서 동작중인 프로세스를 의미하고 ps aux 를 이용해서 나오는 번호와 일치된다


ps 명령어에서 STATE CODE

- 자세한 내용은 man ps로 확인이 가능하다

D : HDD를 엑세스하는 프로세스

R : 실행중인 프로세스

S : Sleep 상태의 프로세스

Z : 좀비 프로세스

<  : 우선순위가 높은 프로세스

>  : 우선순위가 낮은 프로세스

Ss : session reader

| : multil thread







데몬

네트워크로 서비스 데몬

- 웹서버 , SSH

- 독립데몬 (standalone 방식의 데몬)

- 인터넷슈퍼데몬 (Xinetd 방식의 데몬)

시스템 서비스 데몬

- crond




데몬 (daemon) 프로세스

- 데몬 프로세스는 백그라운드로 동작하면서 외부의 요청에 응답하는 프로세스이거나

  특정 서비스를 실행시켜주는 프로세스

- 데몬 프로세스는 터미널에 분리가 되는 특징이 있다

  (터미널에 분리된 프로세스는 ps aux 로 확인시 TTY 부분에 ?로 표시가 된다)



- 서비스 데몬 프로그램들의 경로

 주로 /usr/sbin 디렉토리에 위치

- 데몬을 실행시켜주는 스크립트는 대부분 서비스명으로 되어있다

 /usr/sbin/crond    /usr/sbin/httpd...



- 데몬을 실행시키는 스크립트 디렉토리

  /etc/init.d/데몬스크립트명

  /etc/rc.d/init.d/crond      or        /etc/init.d/crond



- 데몬을 실행시키는 예

/etc/init.d 디렉토리가 /etc/rc.d/init.d 에 심볼릭 링크가 걸려있다


crond 데몬을 실행 : /etc/rc.d/init.d/crond start

crond 데몬을 실행 : /etc/init.d/crond strar

crond 중지 : /etc/rc.d/init.d/crond stop

crond 중지 : /etc/init.d/crond stop 


























 


'Linux > Linux (CentOS)' 카테고리의 다른 글

쉘스크립트  (0) 2018.07.04
패키지 관리  (0) 2018.07.04
사용자 그룹  (0) 2018.07.03
디스크 추가 및 관리  (0) 2018.07.03
리눅스 기본설명 & 명령어  (0) 2018.06.19

설정

트랙백

댓글