프로그래밍

실시간 리눅스

지니아부지 2011. 10. 10. 20:44

http://flytospace.tistory.com/

실시간 리눅스

리눅스는 각 태스크들을 스케줄링 하기위해 SCHED_FIFO와 SCHED_RR, 그리고 SCHED_OTHER를 지원한다. 이 중 SCHED_FIFO와 SCHED_RR은 선점형 실시간 태스크로 동작하며 SCHED_OTHER는 일반 프로세스로 동작한다.

일반적으로 SCHED_FIFO와 SCHED_RR의 우선순위는 1-99이며 SCHED_OTHER는 0이다.
이 우선순위는 숫자가 클수록 높은 우선순위를 의미한다.
리눅스를 사용해 실시간 시스템을 작성하려는 응용프로그램 개발자는 리눅스의 이러한 특성을 이용해 설계및 개발하여야 한다. 다음은 FIFO 프로세스를 생성하여 사용하는 예제이다.

#include<sched.h>

int main()
{
struct sched_param param, new_param;
printf("start policy = %d \n", sched_getscheduler(0));


param.sched_priority = (sched_get_priority_min(SCHED_FIFO) +
sched_get_priority_max(SCHED_FIFO)) /2;
printf("max priority = %d, min priority = %d, my priority = %d \n", sched_get_priority_max(SCHED_FIFO), sched_get_priority_min(SCHED_FIFO),
param.sched_priority);

if(sched_setscheduler(0, SCHED_FIFO, &param) != 0){
perror("sched_setscheduler failed \n");
return;
}

/* 이 부분에 타임 크리티컬한 연산을 넣는다. */




sched_yield(); /*다른 실시간 쓰레드, 프로세스가 수행될 수 있도록 CPU를 양도한다.
이것이 필요한 이유는 이 프로세스가 실시간 선점형 프로세스이기때문에
다른 일반 프로세스, 쓰레드들을 항상 선점하기 때문이다.(기아현상 방지)*/

param.sched_priority = sched_get_priority_max(SCHED_FIFO);
if(sched_setparam(0, &param) != 0){
perror("sched_setparam failed \n");
return ;
}

sched_getparam(0, &new_param);

printf("I am running at priority %d \n",
new_param.sched_priority);

return;
}

'프로그래밍' 카테고리의 다른 글

리눅스커널 - 프로세스 스케줄링  (0) 2011.10.10
스케줄링  (0) 2011.10.10
[C] printf 다중매크로.....  (0) 2011.10.07
Reliable udp  (0) 2011.08.18
1차원 배열 다수를 2차원 배열로  (0) 2011.08.18