当前位置: 首页 > 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.jsqmd.com/news/164841/

相关文章:

  • Aurora博客系统:5分钟快速搭建个人技术博客
  • Monaco Editor智能提示性能调优全攻略
  • PyTorch张量运算测试:验证Miniconda环境正常
  • Dense_Haze浓雾去雾数据集:计算机视觉研究的专业基准
  • 使用Miniconda管理PyTorch Lightning项目依赖
  • 2025年求推荐托福培训机构、信誉好的托福培训专业公司年度排名 - 工业设备
  • 基于SpringBoot的闲置物品交易系统的设计与实现
  • 斐讯N1双系统实战手册:OpenWrt与Android TV深度集成方案
  • SuiteCRM完全指南:如何免费获得企业级客户关系管理系统
  • 2025最新中国嵌壤式品形筋聚乙烯增强缠绕管公司排行榜揭晓! - 朴素的承诺
  • 用HTML Canvas动态绘制PyTorch训练曲线
  • AI+3D视觉机器⼈智能平台核心步骤
  • Instabot配置完全指南:5个关键步骤优化Instagram自动化
  • Anaconda Navigator卡顿?改用Miniconda命令行更流畅
  • 2025年超细硫酸钡供应商与天然硫酸钡厂家年度排名,沉淀硫酸钡推荐指南 - mypinpai
  • ESP32摄像头开发实战指南:从零搭建高清视觉系统
  • 终极指南:用图形化界面轻松管理GitHub代码仓库
  • 2025年评价高的纬编网眼布厂家口碑热榜(用户推荐) - 品牌宣传支持者
  • 蛋白质结构预测中的侧链构象优化新方法:从技术挑战到创新解决方案
  • 终极Zotero Linux安装指南:从零开始的完整配置教程
  • rust语言安全算术方法
  • Screen Time Guard Kit 开放,让番茄ToDo更好地帮助⽤户管理时间
  • 计算机毕业设计springboot网络相册设计与实现 基于Spring Boot框架的在线相册管理系统开发与应用 Spring Boot驱动的网络影集设计与实践
  • 3大核心问题诊断:你的whisper.cpp语音识别为何效果不佳?
  • 2025土工膜厂家推荐排行榜:德州正宇产能领先+专利护航+服务全面 - 爱采购寻源宝典
  • Miniconda中更换conda默认源为清华镜像
  • ETASOLUTIONS钰泰 ETA3485S2F SOT23-5 DC-DC电源芯片
  • 当AI遇见实验:蛋白质结构预测的真相与迷思
  • 2025防草布厂家推荐排行榜:德州正宇产能领先、专利护航、服务优质 - 爱采购寻源宝典
  • 企业级AI工程实践:从概念验证到生产部署的完整指南