Linux实时调度策略(SCHED_RR)和CFS(SCHED_OTHER)之间的区别

本文对比了Linux系统中SCHED_RR实时调度策略和CFS(SCHED_OTHER)的区别。在满负荷运行时,CFS调度策略保持系统响应,而SCHED_RR导致严重卡顿。通过调整实时线程占用处理器的比例,可以缓解实时调度策略的影响。nice和renice命令用于调整进程优先级和友善度。
摘要由CSDN通过智能技术生成

本文试图从直观角度,说明SCHED_RR调度策略和SCHED_OTHER调度策略之间的区别。

在Linux上,SCHED_OTHER和SCHED_NORMAL的意思相同,它们都是指的CFS调度策略,只不过,在内核中,CFS定义为SCHED_NORMAL,在用户态,CFS定义为SCHED_OTHER.

可参照内核头文件和musl libc头文件:

测试代码如下:

#include <string.h>
#include <pthread.h>
#include <sched.h>
#include <stdio.h>

void *child_thread(void *arg)
{
	int policy = 0;
	int max_priority = 0,min_priority = 0;
	struct sched_param param;
	pthread_attr_t attr;
	struct sched_param sp;
	bzero((void*)&sp, sizeof(sp));
	 
	pthread_attr_init(&attr);
	pthread_attr_setinheritsched(&attr,PTHREAD_EXPLICIT_SCHED);
	pthread_attr_getinheritsched(&attr,&policy);

	if(policy == PTHREAD_EXPLICIT_SCHED){
		printf("Inheritsched:PTHREAD_EXPLICIT_SCHED\n");
	}

	if(policy == PTHREAD_INHERIT_SCHED){
		printf("Inheritsched:PTHREAD_INHERIT_SCHED\n");
	}
	 
	//pthread_attr_setschedpolicy(&attr,SCHED_RR);
	pthread_attr_setschedpolicy(&attr,SCHED_OTHER);
	pthread_attr_getschedpolicy(&attr,&policy);

	if(policy == SCHED_FIFO){
		printf("Schedpolicy:SCHED_FIFO\n");
	}
	if(policy == SCHED_RR){
		printf("Schedpolicy:SCHED_RR\n");
	}
	if(policy == SCHED_OTHER){
		printf("Schedpolicy:SCHED_OTHER\n");
	}

	max_priority = sched_get_priority_max(policy);
	min_priority = sched_get_priority_min(policy);
	printf("Maxpriority:%u\n",max_priority);
	printf("Minpriority:%u\n",min_priority);
	 
	param.sched_priority = max_priority;
	pthread_attr_setschedparam(&attr,&param);

	sp.sched_priority = 1;
	// Actually set the sched params for the current thread.
	if (0 == pthread_setschedparam(pthread_self(), policy, &sp)) {
		printf("IO Thread #%ld using high-priority scheduler!", pthread_self());
	}

	printf("sched_priority:%u\n",param.sched_priority);
	while(1);
	pthread_attr_destroy(&attr);
}
 
int main(int argc,char *argv[ ])
{
	pthread_t child_thread_id; 
	pthread_create(&child_thread_id,NULL,child_thread,NULL);
	pthread_join(child_thread_id,NULL);

	return 0;
} 

代码执行流前首先设置了调度策略为SCHED_OTHER, pthread_attr_setschedpolicy(&attr,SCHED_OTHER);之后执行while(1);循环占住CPU。

执行前通过nice命令设置线程的优先级,由于PC处理器是四核,所以执行四次,让每个

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

papaofdoudou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值