개인/리눅스

[리눅스] /proc 와 프로세스 우선순위 (nice,renice)

OmeGa2 2020. 2. 9. 15:26

프로세스에게 부여되는 우선순위

프로세스는 실행중인 프로그램을 말한다.

 

프로그램은 최초 하드디스크에 저장되며 프로그램을 실행하면 하드디스크 → RAM (주기억장치)로 옮겨져 상주한다. 이 때 프로세스에게 PID라는 번호가 할당되어 관리된다.

 

하나의 시스템은 여러개의 프로그램을 동시에 실행할 수 있다. 하지만 여러 프로그램을 시스템이 동시에 처리하기에는 무리가 있다. 따라서 RAM에 상주한 프로세스들은 우선순위가 부여되서 관리된다.

 

프로세스의 우선순위

리눅스에서는 ps -l 명령을 통해 우선순위를 확인할 수 있다.

 

ps 명령에서는 프로세스에게 보여되는 PID와 부모프로세스를 말하는 PPID 및 해당 프로세스를 실행시킨 사용자의 UID나 CMD (명령어) 모두 확인할 수 있다.

 

이 화면에서 우선순위와 관련된 항목은 PRI와 NI 번호이다. 

PRI 번호는 프로세스를 처리하는 운영체제가 참고하는 항목으로 사용자가 인위적으로 조작할 수 없다. 시스템의 상황에 따라 적절하게 부여되며 낮은 값일수록 우선순위가 높다.

 

NI 번호관리자와 사용자가 조작할 수 있는 우선순위 값이다. PRI와 마찬가지로 낮은 값일수록 우선순위가 높으며 -20부터 19 까지 설정이 가능하다.

 

운영체제는 NI 값을 참고해서 PRI값을 조정해가며 우선순위를 움직인다. NI를 조작할 수 있는 관련 명령어로는 nice나 renice 가 있다.

 

 

nice 명령어

]# nice [프로세스명]

]# nice -n [숫자] [프로세스명]

]# nice -[-숫자] [프로세스명]

 

▷ NI값 증감

▷ 새로운 프로세스 추가

프로세스에 부여된 NI 값을 조정해 우선순위를 변경할 수 있는 명령어다.

지정하고싶은 NI값과 프로세스를 동시에 입력하며 새로운 프로세스를 추가한다.

 

보통 기본적으로 설정된 NI값은 0번이고 [-20 ~ 19] 사이의 번호를 지정할 수 있으며 낮은 값일수록 우선순위가 높아진다. nice는 기본적으로 설정된 값을 증감 (+,-) 하는 형식으로 사용된다.

일반사용자는 NI값의 (+)만 설정할 수 있으며, 관리자는 (+,-) 모두 가능하다.

 

 

1. 프로세스 NI값 -10 적용

 

NI 값 -10

bash 쉘을 하나 더 실행하면서 NI 값을 -10 지정해보았다.

 

기본 NI값은 0이지만, -10으로 지정된 bash가 하나 더 실행되며 PRI값도 기존값 (80)보다 떨어지면서 우선순위가 높아진걸 확인할 수 있다.

 

 

2. 프로세스 NI값 +10 (기본값)적용

 

NI값 +10

nice값의 기본 옵션은 +10이다.

아무런 옵션없이 [프로세스명]만 입력할 경우, NI값이 기본값(0)이 아닌 10이 지정된다.

 

 

 

renice 명령어

]# renice [NI값] [PID]

-u : 다른 사용자 지정

-g : 그룹 지정

 

▷ NI 값 지정

▷ 기존 프로세스와 교체해서 적용

nice 명령과 마찬가지로 프로세스의 NI 값을 변경할 수 있는 명령어다.

 

nice에서는 NI값을 기본값 0 에서 조정했다면, renice에서는 [-20 ~ 19] 사이의 값을 하나 지정할 수 있다.

 

또한 nice에서는 새로운 프로세스를 만들어 NI값을 적용했지만, renice는 기존 프로세스에 NI값을 변경하는 형식이다. 

 

 

1. 해당 PID의 NI값 바꾸기

PID 번호가 2251인 프로세스의 NI값 -15 적용

PID 번호가 2251인 bash 라는 프로세스의 NI값이 기존에는 기본값 (0)을 가지고 있었다.

 

이후 renice 명령어를 통해 NI 값을 -15로 변경했다.

 

성공적으로 NI값이 바뀌었으며 동시에 PRI값도 줄어들었다.

 

 

2. 다른 사용자의 NI 값 바꾸기

 

kang 이라는 계정을 만들어 renice 명령어를 사용해 보았다.

 

kang 계정의 UID 값은 500이다. -u 옵션을 이용해 kang 계정의 NI값을 모두 10으로 지정했다.

 

UID값이 500을 가진 프로세스의 우선순위가 모두 10으로 변경되었다는메시지가 출력된다.

(500 : old priority 0, new priority 10)

 

이후 kang 계정으로 들어가 확인해보니 NI값이 모두 10으로 변경되었다.

 

 

프로세스와 관련된 /proc 디렉터리

/proc 디렉터리는 가상 파일시스템의 일종이다.

 

ps 명령어는 /proc 디렉터리를 참조한다. 여기서는 시스템에 동작중인 프로세스의 상태정보나, 기타 시스템 및 하드웨어 정보 등을 확인할 수 있는 곳이다.

 

/proc 디렉터리는 프로세스와 커널의 내부정보 제공을 위해 만들어진 공간이다.

새로운 프로세스가 생성되면 /proc 디렉터리 안에 프로세스와 동일한 PID를 가진 디렉터리가 생성되고 그 안에 해당 프로세스에 관련된 정보가 저장된다.

 

 

# /proc/PID 디렉토리 내부

 

bash 프로세스의 PID번호는 2251이다. 이 역시 /proc 디렉토리에 들어있다.

 

여기서 bash 프로세스와 관련된 세부정보들을 확인할 수 있다.

주요 구성요소는 아래와 같다.

comdline : 명령행 옵션 정보

cwd       : 작업 디렉터리

environ   : 프로세스 환경 정보

exe        : 해당 프로세스를 실행시킨 명령어

fd          : 파일지정자에 대한 정보

maps      : 실행 명령과 관련 라이브러리 파일의 메모리 맵 정보

mounts   : 시스템의 마운트 정보

root       : 해당 프로세스의 루트 디렉터리

stat        : 해당 프로세스의 상태 -> ps명령을 통해 사용된다.

statm     : 프로세스의 메모리상태에 대한 정보

status     : 프로세스의 상태정보를 담고있는 파일

 

1. /proc/PID 내부 심볼릭링크 파일

 

bash 프로세스의 PID 번호인 2251 디렉토리 내부로 들어왔다.

여기서 심볼릭 링크가 걸려있는 파일은 총 세 가지 있다.

 

cwd는 작업중인 디렉토리를 의미하며 현재위치를 가지고 있다.

exe에서는 프로세스를 실행시킨 명령어, 즉 bash 명령어의 위치를 가리킨다.

root 파일은 작업자의 루트디렉토리, 지금은 관리자계정이라서 루트(/)를 가리킨다.

 

 

2. 프로세스의 환경정보

 

 

environ 파일에서는 프로세스 자체의 환경정보를 가지고 있다.

지금 실행되는 bash 프로세스는 putty를 이용해 VMware에 설치된 CentOS에 접속한 상태이다.

 

SSH 를 사용해서 접속했기 때문에 접속한 클라이언트의 이더넷어뎁터 IP주소 (192.168.202.1) 과 SSH를 통해 원격접속한 호스트의 IP주소 (192.168.202.128) 및 사용자의 PATH 정보 등이 나타난다.