sched_get_priority_min/max() 시스템콜은 policy 인자에서 명시한 스케줄링 정책과 관련된 최소/최대 우선순위 반환
호출 실패시 -1 반환, errno는 EINVAL
sched_rr_get_interval()
1
2
3
4
5
6
7
8
#include<sched.h>structtimespec{time_ttv_sec;/* 나노 초 */longtv_nsec;/* 나노 초 */};intsched_rr_get_interval(pid_tpid,structtimespec*tp);
sched_rr_get_interval()은 호출이 성공하면 pid 프로세스에 할당된 타임 슬라이스의 길이를 tp 포인터가 가리키고 있는 timespec 구조체에 저장
호출 성공 시 0, 실패 시 -1 반환 및 errno 설정(EFAULT, EINVAL, ESRCH)
POSIX 표준에 따르면 이 함수는 SCHED_RR 프로세스에 대해서만 사용해야 하지만 리눅스에서는 어떤 프로세스의 타임 슬라이스 길이도 반환
실시간 프로세스의 주의점
CPU를 계속 사용하는 루프가 인터럽트나 더 높은 우선순위 실시간 프로세스가 없어도 무한히 실행되지 않도록(시스템 hang 방지)
실시간 프로세스는 시스템에서 가장 비싼 비용으로 실행, 시스템의 다른 부분이 CPU시간을 얻지 못하는 일이 없도록
busy waiting 사용 시 주의(ex. 우선순위 낮은 프로세스의 리소스를 실시간 프로세스가 대기 시)
실시간 프로세스를 개발할 때 그 실시간 프로세스보다 우선순위가 높은 터미널을 하나 열어놓을 것(비상 탈출)
util-linux 패키지의 chrt 유틸리티는 쉽게 다른 프로세스의 실시간 속성을 가져오거나 설정할 수 있다.
결정론
실시간 컴퓨팅 환경에서 결정론적 : 주어진 입력이 같다면 항상 같은 결과를 같은 시간안에 도출
최신의 컴퓨터는 여러 계층에 걸친 캐시, 멀티 프로세서, 페이징 스와핑, 멀티태스킹으로 인해 결정론적이지 않음
실시간 어플리케이션은 예측할 수 없는 부분과 최악의 지연을 제한하기 위해 선행폴트 데이터와 메모리락, CPU친화도를 이용
선행폴트 데이터와 메모리 락
페이징과 스와핑은 실시간 프로세스를 망가트릴 수 있는 비결정적인 동작 야기
선행폴트를 일으켜 스와핑된 데이터를 메모리에 올린 다음, 주소공간 내 모든 페이지를 실제 물리 메모리에 락을 걸거나 고정 배선 해버림
페이지가 담겨 있는 모든 메모리를 락 걸고 나면 커널은 절대 이 페이지를 디스크로 스왑하지 않음
4장에서는 데이터를 메모리에 선행 폴트하는 인터페이스(readahead)를, 9장에서는 물리 메모리에 있는 데이터를 락거는 방법 설명
CPU 친화도와 실시간 프로세스
멀티태스킹에서 (비록 선점형이라도) 스케줄러는 항상 특정 프로세스를 위해 다른 프로세스를 즉시 스케줄링 할 수 없다. (다른 프로세스가 크리티컬 섹션에서 동작할 경우 등)
멀티태스킹은 페이징에 관련된 예측 불가능성에 따른 비결정성을 유발
만약 멀트 프로세스 시스템이라면 그 중 하나를 실시간 프로세스에만 할당하면 됨
이를 간단하게 구현하는 것은 init프로그램 수정(책에 코드 설명 있음)
리소스 제한
리눅스 커널은 프로세스에 대해 파일개수, 메모리 페이지, 대기중 시그널 같은 커널 리소스 제한을 도입
커널은 이 제한을 초과하는 리소스 소비를 허용하지 않음(허용 수치를 초과하면 해당 호출 실패)
리소스 제한을 설정할 수 있는 두가지 시스템콜을 제공(getrlimit, setrlimit)
소프트제한은 프로세스 생성 시 기본으로 적용되는 한도, 하드제한은 소프트제한이 최대한 늘릴 수 있는 제한
프로세스는 소프트제한값을 0~하드제한값까지 자유롭게 변경가능, CAP_SYS_RESOURCE 기능이 제한된 프로세스(non-root)는 하드제한보다 낮은 값만을 설정 가능
리소스 제한의 특수 값 0: 리소스 사용 금지, -1 : 무한값
제한
리눅스에는 16가지 리소스 제한이 존재 (책에 설명 있음)
기본제한
프로세스에 적용 가능한 기본 제한은 최초의 소프트제한, 최초의 하드제한, 시스템 관리자라는 세가지 변수에 의존(책에 기본값 표 있음)
실제제한은 일반적으로 시스템 관리자가 여러가지 제한을 설정해둔 사용자의 쉘에 의해 결정
관리자는 이값을 낮출 필요가 없음.
제한 설정과 조회
1
2
3
4
5
6
7
8
9
10
#include<sys/time.h>#include<sys/resource.h>structrlimit{rlim_trlim_curr;/* 소프트 제한 */rlim_trlim_max;/* 하드 제한 */}intgetrlimit(intresource,structrlimit*rlim);intsetrlimit(intresource,conststructrlimit*rlim);
getrlimit()는 resource인자가 나타내는 리소스의 하드제한과 소프트제한을 rlim포인터가 기리키고 있는 구조체에 저장
setrlimit()는 resource인자로 지정한 리소스의 제한을 rlim 포인터가 가리키는 값으로 설정
호출이 성공시 0반환, 실패시 -1반환 및 errno를 설정 (EFAULT, EINVAL, EPERM)