- 论坛徽章:
- 0
|
回复 18# wth0722
恩,是可以互相转换的,我已经验证过了。
总结如下:
1. 可以相互转换。
设置调度策略的函数为:
int sched_setscheduler (pid_t pid, int policy, const struct sched_param *sp);
注意:
1)如果优先级设置的值和调度策略不符合,会返回失败。
policy: SCHED_OTHER(0), SCHED_FIFO(1), SCHED_RR(2) sp->sched_priority的值: 0 (普通进程), [1,99] (实时进程)
2)创建实时进程需要root权限。
2.验证源码如下:
#include <sched.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
int main(){
int rc,old_scheduler_policy;
struct sched_param my_params;
// 1. 普通进程转换为实时进程
old_scheduler_policy=sched_getscheduler(getpid());
my_params.sched_priority=1; // 设置转化后的实时进程的优先级
printf("the current scheduler = %d \n",old_scheduler_policy);
printf("press any key to change the current scheduler and priority to SCHED_RR\n");
getchar();
rc=sched_setscheduler(getpid(),SCHED_RR,&my_params); // 将普通进程转换为实时进程
if(rc<0) {
perror("sched_setscheduler to SCHED_RR error");
exit(0);
}
// 2. 实时进程内部调度策略相互转化,由SCHED_RR -> SCHED_FIFO
old_scheduler_policy=sched_getscheduler(getpid());
printf("the current scheduler = %d \n",old_scheduler_policy);
printf("press any key to change the current scheduler and priority to SCHED_FIFO\n");
getchar();
rc=sched_setscheduler(getpid(),SCHED_FIFO,&my_params); // 由SCHED_RR转换为SCHED_FIFO
if(rc<0) {
perror("sched_setscheduler to SCHED_FIFO error");
exit(0);
}
// 3. 实时进程转化为普通进程
old_scheduler_policy=sched_getscheduler(getpid());
my_params.sched_priority=0; // 设置转化后的普通进程的优先级
printf("the current scheduler = %d \n",old_scheduler_policy);
printf("press any key to change the current scheduler and priority to SCHED_OTHER.\n");
getchar();
rc=sched_setscheduler(getpid(),SCHED_OTHER,&my_params); // 将实时进程转换为普通进程
if(rc<0){
perror("sched_setscheduler to SCHED_OTHER error");
exit(0);
}
old_scheduler_policy=sched_getscheduler(getpid());
printf("the current scheduler = %d \n",old_scheduler_policy);
printf("press any key to exit\n");
getchar();
return 0;
}
3. 这个问题自己也琢磨了一段时间,把验证过程贴上,期望疑问的人可以少走弯路。 |
|