当前位置: 首页 > news >正文

Linux调度分析(2)调度用户态API介绍

Linux调度的实现在内核中,但用户态可以通过调度相关的systemcall可以进行调度相关的设置。这些设置包括:

  1. 设置调度策略
    设置调度策略通过系统调用函数sched_setscheduler()实现,它的函数定义如下:
    SYSCALL_DEFINE3(sched_setscheduler, pid_t, pid, int, policy, struct sched_param __user *, param)
    pid为需要设置的线程pid,policy为需要设置的调度策略,param为设置参数
    Linux调度policy包括:
  • SCHED_NORMAL:普通调度
  • SCHED_FIFO:先进先出调度
  • SCHED_RR:Round-robin调度
  • SCHED_BATCH: ?
  • SCHED_IDLE:idle调度
  • SCHED_DEADLINE: DL调度
  • SCHED_EXT:EBPF调度
  1. 获取调度策略
    获取调度策略通过系统调用函数sched_getscheduler()实现,它的函数定义如下:
    SYSCALL_DEFINE1(sched_getscheduler, pid_t, pid)

  2. 设置亲和性
    设置线程的亲和性,可以让线程运行在指定的CPU上,它是通过系统调用sched_setaffinity()实现,它的函数定义如下:
    SYSCALL_DEFINE3(sched_setaffinity, pid_t, pid, unsigned int, len, unsigned long __user *, user_mask_ptr)

  3. 获取亲和性
    获取线程的亲和性可以通过系统调用sched_getaffinity()实现,它的函数定义如下:
    SYSCALL_DEFINE3(sched_getaffinity, pid_t, pid, unsigned int, len, unsigned long __user *, user_mask_ptr)

  4. 放弃当前CPU运行
    系统调用sched_yield()可以让当前运行的线程放弃在当前CPU的运行,切换其他线程运行
    SYSCALL_DEFINE0(sched_yield)

  5. 其他的系统调用
    除了上述系统调用外,还有其他系统调用如:

  • sched_get_priority_max()获取某个调度策略的最大priority值
  • sched_get_priority_min()获取某个调度策略的最小priority值
  • nice()修改当前线程的priority值
  • sched_setparam()/sched_getparam设置/获取线程的priority
  • sched_setattr()/sched_getattr()设置/获取线程的扩展属性
  • sched_rr_get_interval()返回线程默认的slice即调度时间片
  1. 隐式的调度相关的操作
    上述系统调用明确调用了调度相关的系统调用,其实在用户态调用sleep()等函数时隐含着schedule()让当前线程主动让出CPU的调度操作。

下面代码是设置pid为10000的线程调度相关的设置:将其设置为SCHED_FIFO调度策略,获取SCHED_FIFO的最大和最小优先级,设置线程的亲和性(将其绑定到CPU 0),在做了一些循环操作后放弃当前CPU。

`...

static void die(const char *msg)
{
perror(msg);
exit(EXIT_FAILURE);
}

int main(void)
{
int ret;
pid_t pid = 100000; // 100000 means "this process"

/* -----------------------------* 1. Set scheduling policy* ----------------------------- */struct sched_param sp;
memset(&sp, 0, sizeof(sp));// Choose a real-time policy, e.g., SCHED_FIFO or SCHED_RR.
// NOTE: This usually requires root privileges.
int policy = SCHED_FIFO;// Get allowed priority range for this policy
int max_prio = sched_get_priority_max(policy);
int min_prio = sched_get_priority_min(policy);if (max_prio == -1 || min_prio == -1) {die("sched_get_priority_*");
}// Use some priority in the valid range; here we just pick the max.
sp.sched_priority = max_prio;ret = sched_setscheduler(pid, policy, &sp);
if (ret == -1) {// If you see EPERM, you likely need to run as root.fprintf(stderr,"sched_setscheduler failed: %s (need CAP_SYS_NICE/root for RT)\n",strerror(errno));// Not fatal for demonstration, continue with default policy.
} else {printf("Scheduler set to policy %d, priority %d\n", policy,sp.sched_priority);
}/* -----------------------------* 2. Set CPU affinity (pin to CPU 0)* ----------------------------- */cpu_set_t set;
CPU_ZERO(&set);
CPU_SET(0, &set);  // bind to CPU 0ret = sched_setaffinity(pid, sizeof(set), &set);
if (ret == -1) {die("sched_setaffinity");
} else {printf("Affinity set to CPU 0\n");
}/* -----------------------------* 3. Do some work and yield* ----------------------------- */for (int i = 0; i < 5; ++i) {printf("Iteration %d on CPU %d\n", i, sched_getcpu());// Do some dummy workfor (volatile long j = 0; j < 100000000L; ++j);  // busy loopprintf("Yielding CPU...\n");ret = sched_yield();  // Let other runnable tasks runif (ret == -1) {die("sched_yield");}
}printf("Done.\n");
return 0;

}`

http://www.zskr.cn/news/180333.html

相关文章:

  • Files文件管理器革命性性能调优:从系统底层到用户体验的深度优化方案
  • PyTorch张量运算测试:验证Miniconda环境正常
  • Instabot配置完全指南:5个关键步骤优化Instagram自动化
  • Screen Time Guard Kit 开放,让番茄ToDo更好地帮助⽤户管理时间
  • 终极Zotero Linux安装指南:从零开始的完整配置教程
  • 3大核心问题诊断:你的whisper.cpp语音识别为何效果不佳?
  • MindSpore开发之路:数据处理——精通数据增强与高阶应用
  • 2025涂层测厚仪厂家推荐排行榜:产能与专利双维度对比 - 爱采购寻源宝典
  • DeepSeek-V2-Lite:16B参数仅激活2.4B,重新定义轻量级大模型经济边界
  • U-2-Net深度学习模型:重新定义显著对象检测的技术革命
  • GitHub Training Kit完整指南:开源Git和GitHub学习资源的终极解决方案
  • 终极指南:在Linux系统上简单安装Zotero参考管理软件
  • 波函数坍缩存档系统完整解析:从状态快照到无限世界持久化
  • Miniconda-Python3.9镜像适合初学者吗?
  • Miniconda环境下使用pytest替代unittest
  • Make-A-Video-Pytorch完整指南:从文本到视频的AI生成技术
  • Material-UI实战指南:3个技巧让React开发效率翻倍
  • PCA9685 PWM控制器终极使用指南:从入门到精通
  • VC++运行库合集:2005-2022全版本一键解决部署难题
  • Miniconda配置完成后测试网络连通性
  • KUKA.OfficeLite 终极指南:高效实现库卡机器人离线编程
  • 好写作AI|当Z世代遇上AI写作:一份新型学术习惯的养成说明书
  • 找到当前目录下._开头的文件并删除
  • 这正是一条 “关山”
  • 在数字中国建设大潮中,高校院所技转中心如何借助自学习的AI赋能科技治理系统解决服务响应滞后,递进激活技术转移撮合效率,最终激活完善价值评估体系?
  • CKAN终极指南:10个模组管理技巧让你轻松玩转坎巴拉太空计划
  • Nextcloud文件管理终极指南:5个实用技巧让云端存储更高效
  • 2025 年 12 月风阀厂家权威推荐榜:PP/电动/手动/气动/调节/VAV/防火风阀,匠心智造与高效通风解决方案深度解析 - 品牌企业推荐师(官方)
  • 分布式事务终极指南:从业务痛点到技术落地的深度实战
  • AutoAgent零代码AI代理框架快速上手指南