기술 정리/리눅스시스템프로그래밍

리눅스 시스템 프로그래밍 - 5장, 6장

투칼론 2016. 3. 26. 16:13
반응형

CHAPTER 5 프로세스 관리


5.1 프로그램, 프로세스, 스레드


프로그램 - 바이너리는 실행할 수 있는 코드를 말하는데, 흔히 프로그램이라고도 함

프로세스 - 실행 중인 프로그램

스레드 - 프로세스 내 실행 단위. 프로세스는 하나 이상의 스레드를 포함하고 있음


5.2 프로세스 ID


프로세스의 유일한 식별자이고 줄여서 pid라고 함. pid는 특정 시점에서 유일한 값을 보장 함

커널 최대 pid는 기본적으로 32768이지만, /proc/sys/kernel/pid_max 값을 수정하면 더 많은 pid를 가질 수 있음



5.3 새로운 프로세스 실행하기


exec() 함수들 - excecl(), execle(), execlp(), execv(), execvp(), execvpe() 등

fork() 시스템 콜 - copy-on-write(부하를 완하하기 위해 우선 포인터만 넘기고, 리소스를 변경하고자 하는 시점에서 해당 리소스가 복사 됨)

vfork() - BSD에서 fork후 exec 되는 경우를 위해 vfork() 함수를 만들었으나 잘 사용되고 있지 않음


5.4 프로세스 종료하기


exit() - 리눅스에서는 0이 성공이고, 1이나 -1은 실패로 간주

atexit((*function)(void)) - 프로세스 종료 시점에서 호출될 해당 function을 등록시킴

on_exit((*function)(void)) - SunoOS 4에서 atexit()와 동일하게 제공하고 glibc에서도 지원함


5.5 자식 프로세스 종료하기


wait() 

waitpid()는 System V 릴리즈 4에서 유래한 반면 BSD는 wait3()와 wait4()를 지원

system()

좀비 프로세스 - 부모프로세스에서 wait() 시스템 콜을 호출하지 않은 프로세스. 부모프로세스가 자식 프로세스보다 먼저 죽음


5.6 사용자와 그룹


setuid()

setgid()


5.7 세션과 프로세스 그룹


프로세스 그룹은 작업 제어 목적으로 관련된 하나 이상의 프로세스를 모아놓은 집합인 프로세스 그룹의 일원이다. 그룹 내 모든 프로세스에게 시그널을 보낼 수 있다는 점


setsid()

getsid()

setpgid()

getpgid()


5.8 데몬


1) fork()를 호출해서 데몬이 될 새로운 프로세스를 생성함

2) exit()를 호출해서 데몬 프로세스의 부모 프로세스를 종료한다.

3) setsid()를 호출하여 데몬이 새로운 프로세스 그룹과 세션의 리더가 되도록 한다.

4) chdir()을 사용하여 작업 디렉토리를 root 디렉터리로 변경한다.

5) 모든 파일 디스크립터를 닫는다.

6) 0,1,2번 파일 디스크립터를 열고 /dev/null로 리다이렉트 한다.





CHAPTER 6. 고급 프로세스 관리


6.1 프로세스 스케쥴링


리눅스 커널 2.6.23 버전 부터 등장한 CFS 스케줄러라고 한다.


CFS(Completely Fair Scheduler)는 타임 슬라이스를 사용하지 않는 매우 특이한 방법으로 적정 타임 슬라이스의 크기는 얼마인가에 대한 질문에 답한다.


CPU 위주 프로세스 - 과학계산, 수학연산, 이미지 처리 등을 하는 프로세스

입출력 위주 프로세스 - 실행 시간보다 리소스를 사용하기 위해 기다리는 데 시간을 더 많이 사용하는 프로세스

선점형 스케줄링 - 전통적인 유닉스 프로세스 스케줄링에서 모든 실행 가능한 프로세스는 타임 슬라이스를 할당 받음


6.2 CFS 스케줄러


CFS는 N개의 프로세스에 각각 1/N 만큼의 CPU 시간을 할당한다. 그리고, 이를 각 프로세스의 nice 값에 따라 가중치를 준다.


6.3 프로세서 양보하기


sched_yield() - 불확실성과 일반적으로 좀 더 나은 대안이 있으리라는 믿음 때문에 이 시스템 콜을 잘 사용하지 않음


6.4 프로세스 우선순위


nice 값은 -20부터 19까지 쓸수있고 기본값은 0이다. nice 값이 적을수록 우선순위가 높아지며 타임 슬라이스도 커진다.

root가 아닌 프로세스는 nice값을 증가시켜 우선순위를 낮추는 작업만 가능

getpriority(), setpriority() - 우선 순위 제어

ioprio_get(), ioprio_set() - 입출력 우선순위


6.5 프로세서 친화


프로세서 친화도는 프로세스를 꾸준히 같은 CPU에 스케줄링할 가능성을 가리킨다.

sched_getaffinity(), sched_setaffinity() - 친화도를 조회하고 설정하기 위한 시스템 콜


6.6 실시간 시스템


실시간 시스템은 운영 시 지켜야 할 최소한의 응답속도가 보장되어야 한다

종류 - 하드 실시간과 소프트 실시간

하드실시간 - 최소 응답시간을 고수하고, 최소 응답시간을 넘기면 실패로 간주하며 심각한 버그 (예, ABS, 군사무기시스템, 의료장비 등)

소프트실시간 - 치명적인 실패로 간주하지 않음 (예, 영상처리 애플리케이션 등)

레이턴시 - 명령이 내려졌을 때 실행을 시작하지까지의 시간. 레이턴시가 응답시간보다 짧거나 같다면 시스템은 제대로 동작

지터 - 응답간의 시차. 연속적인 이벤트 간의 시간 편차는 레이턴시가 아니라 지터임

지터가 0이고 레이턴시가 최소 응답시간과 같도록 설계한다.

리눅스는 IEEE표준 1009.1b-1993 또는 POSIX.1b에 정의된 시스템 콜 함수군을 통해 소프트 실시간을 지원

리눅스 스케줄링 정책과 우선순위 - FIFO 정책, 라운드로빈 스케줄링 정책, 표준 스케줄링 정책, 배치 스케줄링 정책 등이 있음


6.7 리소스 제한


현재 16가지의 리소스 제한이 있음

RLIMIT_AS - 프로세스 주소 공간의 최대 바이트 크기 제한

RLIMIT_CORE - 최대 코어 파일의 바이트 크기 제한

RLMIT_CPU - 프로세스 하나가 소모할 수 있는 최대 CPU 시간

RLMIT_DATA - 프로세스의 데이터 세그먼트와 힙의 는 최대 크기

RLMIT_FSIZE - 프로세스가 생성할 수 있는 최대 파일 크기

RLMIT_LOCKS - 프로세스가 걸수있는 최대 파일의 락의 개수

RLMIT_MEMLOCK - CAP_SYS_IPC 기능이 없는 프로세스가 락을 걸 수 있는 최대 바이트 수

RLMIT_MSGQUEUE - POSIX 메시지 큐를 사용자가 할당할 수 있는 최대 바이트 크기 수

RLMIT_NICE - nice 값의 최대 값

RLMIT_NOFILE - 프로세스가 열수있는 최대 파일 디스크립터 수

RLMIT_NPROC - 특정 시점에 실행될 수 있는 최대 프로세스 수

RLMIT_RSS - 프로세스가 메모리 상에 머물수있는 RSS 페이지으 최대 개수

RLMIT_RTTIME - 실시간 프로세스가 시스템 콜을 블록하지 않고 소비할 수 있는 CPU 시간을 마이크로 초단위로 명시

RLMIT_PTPRIO - root가 아닌 프로세스가 요청할 수 있는 최대 nice 값

RLIMIT_SIGPENDING - 큐에 입력될 수 있는 시그널의 최대 개수

RLIMIT_STACK - 프로세스 스택의 최대 크기


소프트 제한과 하드 제한이 있는데, 하드 제안은 소프트 제안이 가질 수 있는 최대 값

getrlimit(), setrlimit()