Linux源码阅读笔记05-进程优先级与调度策略-实战分析

基础知识

  1. Linux 内核当中有 3 种调度策略:
    • SCHED_OTHER 分时调度策略;
    • SCHED_FIFO 实时调度策略,先到先服务;
    • SCHED_RR 实时调度策略,时间片轮转。

如果有相同优先级的实时进程(根据优先级计算的调度权值是一样的)已经准备好,FIFO 时必须等待该进程主动放弃之后才可以运行这个优先级相同的任务。而 RR 可以每个任务都执行一段时间。

  1. 获取线程设置的最高和最低优先级函数
    • int sched_get_priority_max(int policy)获取实时优先级的最大值;
    • int sched_get_priority_min(int policy)获取实时优先级的最小值;

SCHED_OTHER它 不 支 持 优 先 级 使 用 , 而SCHED_RR/SCHED_FIFO 支持优先级使用,它们分别为 1-99,数值越大优先级越高。

实时调度策略(SCHED_FIFO/SCHED_RR)优先级最大值为99;普通调度策略
(SCHED_NORMAL/SCHED_BATCH/SCHED_IDLE),始终返回0,即普通任务调度的函数。

  1. 设置和获取优先级的2个主要核心参数

    • int pthread_attr_setschedparam(pthread_attr_t* attr, const struct sched_param* param);设置线程优先级;
    • int pthread_attr_getschedparam(pthread_attr_t* attr, const struct sched_param* param);获取线程优先级;
    struct sched_param {int __sched_priority; // 所有设定的线程优先级
    }param.sched_priority = 11; // 设置优先级
    
  2. 当操作系统创建线程时,默认线程是 SCHED_OTHER,我们也可以通过改变调度策略,使用如下函数:

    • int pthread_attr_setschedpolicy(pthread_attr_t* attr, int policy);设置线程调度策略;

基础案例分析

  1. 操作系统所支持优先级测试程序分析:
#include <stdio.h>
#include <pthread.h>
#include <sched.h>
#include <assert.h>static int GetThreadPolicyFunc(pthread_attr_t *pAttr)
{int iPlicy;int igp=pthread_attr_getschedpolicy(pAttr,&iPlicy);assert(igp==0);switch (iPlicy){case SCHED_FIFO:printf("Policy is --> SCHED_FIFO.\n");break;case SCHED_RR:printf("Policy is --> SCHED_RR.\n");break;case SCHED_OTHER:printf("Policy is --> SCHED_OTHER.\n");break;default:printf("Policy is --> Unknown.\n");break;}return iPlicy;
}static void PrintThreadPriorityFunc(pthread_attr_t *pAttr,int iPolicy)
{int iPriority=sched_get_priority_max(iPolicy); assert(iPriority!=-1);printf("Max_priority is : %d\n",iPriority);iPriority=sched_get_priority_min(iPolicy); assert(iPriority!=-1);printf("Min_priority is : %d\n",iPriority);
}static int GetThreadPriorityFunc(pthread_attr_t *pAttr)
{struct sched_param sParam;int irs=pthread_attr_getschedparam(pAttr,&sParam);assert(irs==0);printf("Priority=%d\n",sParam.__sched_priority);return sParam.__sched_priority;
}static void SetThreadPolicyFunc(pthread_attr_t *pAttr,int iPolicy)
{int irs=pthread_attr_setschedpolicy(pAttr,iPolicy);assert(irs==0);GetThreadPolicyFunc(pAttr);
}int main(int argc,char *argv[])
{pthread_attr_t pAttr;struct sched_param sched;int irs=pthread_attr_init(&pAttr);assert(irs==0);int iPlicy=GetThreadPolicyFunc(&pAttr);printf("\nExport current Configuration of priority.\n");PrintThreadPriorityFunc(&pAttr,iPlicy);printf("\nExport SCHED_FIFO of prioirty.\n");PrintThreadPriorityFunc(&pAttr,SCHED_FIFO);printf("\nExport SCHED_RR of prioirty.\n");PrintThreadPriorityFunc(&pAttr,SCHED_RR);printf("\nExport priority of current thread.\n");int iPriority=GetThreadPriorityFunc(&pAttr);printf("Set thread policy.\n");printf("\nSet SCHED_FIFO policy.\n");SetThreadPolicyFunc(&pAttr,SCHED_FIFO);printf("\nSet SCHED_RR policy.\n");SetThreadPolicyFunc(&pAttr,SCHED_RR);printf("\nRestore current policy.\n");SetThreadPolicyFunc(&pAttr,iPlicy);irs=pthread_attr_destroy(&pAttr);assert(irs==0);return 0;
}

  1. 简单线程调度策略,我们创建三个线程,默认创建的线程它的调度策略为SCHED_OTHER,另外两个线程调度策略为 SCHED_RR/FIFO:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>void ThreadFunc1() {sleep(1);int i, j;int policy;struct sched_param param;pthread_getschedparam(pthread_self(), &policy, &param);switch (policy) {case SCHED_OTHER:printf("SCHED_OTHER\n");break;case SCHED_FIFO:printf("SCHED_FIFO\n");case SCHED_RR:printf("SCHED_RR Thread1\n");default:break;}for(i = 1; i <= 5; i++){for(j = 1; j <= 5000000; j++){}printf("Execute thread function 1.\n");}printf("ThreadFunc1 Exit\n");
}void ThreadFunc2() {sleep(2);int policy;struct sched_param param;pthread_getschedparam(pthread_self(), &policy, &param);switch(policy) {case SCHED_OTHER:printf("SCHED_OTHER\n");break;case SCHED_FIFO:printf("SCHED_FIFO\n");break;case SCHED_RR:printf("SCHED_RR Thread2");break;}for(int i = 1; i <= 6; i++){for(int j = 1; j <= 6000000; j++){}printf("Execute thread function 2.\n");}printf("ThreadFunc2 Exit\n");
}void ThreadFunc3() {sleep(3);int policy;struct sched_param param;pthread_getschedparam(pthread_self(), &policy, &param);switch(policy) {case SCHED_OTHER:printf("SCHED_OTHER\n");break;case SCHED_FIFO:printf("SCHED_FIFO\n");break;case SCHED_RR:printf("SCHED_RR\n");break;}for(int i = 1; i <= 7; i++) {for(int j = 0; j <= 7000000; j++){}printf("Execute thread function 3.\n");}printf("ThreadFunc3 Exit\n");
}int main(int argc, char* argv[]) {int i = 0;i = getuid();if(i == 0) {printf("The current user is root.\n\n");}else {printf("The current user is not root.\n\n");}pthread_t pid1, pid2, pid3;struct sched_param param;pthread_attr_t attr1, attr2, attr3;pthread_attr_init(&attr1);pthread_attr_init(&attr2);pthread_attr_init(&attr3);param.sched_priority = 31;pthread_attr_setschedpolicy(&attr2, SCHED_RR);pthread_attr_setschedparam(&attr2, &param);pthread_attr_setinheritsched(&attr2, PTHREAD_EXPLICIT_SCHED);param.sched_priority = 11;pthread_attr_setschedpolicy(&attr1, SCHED_FIFO);pthread_attr_setschedparam(&attr1, &param);pthread_attr_setinheritsched(&attr1, PTHREAD_EXPLICIT_SCHED);pthread_create(&pid3, &attr3, (void*)ThreadFunc3, NULL);pthread_create(&pid2, &attr2, (void*)ThreadFunc2, NULL);pthread_create(&pid1, &attr1, (void*)ThreadFunc1, NULL);pthread_join(pid3, NULL);pthread_join(pid2, NULL);pthread_join(pid1, NULL);pthread_attr_destroy(&attr3);pthread_attr_destroy(&attr2);pthread_attr_destroy(&attr1);return 0;
}
  • 超级用户运行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/858212.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024 年值得推荐的 10 款 iPhone 数据恢复软件

iPhone 从来都不是一个简单的打电话电话。它就像一台微型电脑&#xff0c;让我们互相联系、拍照、拍视频、发邮件、看文档、看书。然而&#xff0c;随着它成为日常生活的必需品&#xff0c;我们总是容易因各种原因丢失数据&#xff0c;如删除、恢复出厂设置、iOS 错误、文件同步…

云手机在跨平台兼容性方面优势明显?有何应用场景

跨平台设备间无缝切换和数据同步的需求现在是很多人或者企业都需要的&#xff0c;云手机在这些方面似乎有很大优势&#xff1f;下面我们来具体探讨在兼容方面&#xff0c;云手机有何出彩之处&#xff1f;又支持哪些应用场景呢 先来说说云手机跨平台兼容性优势所在&#xff0c;要…

【设计模式深度剖析】【9】【行为型】【访问者模式】| 以博物馆的导览员为例加深理解

&#x1f448;️上一篇:备忘录模式 | 下一篇:状态模式&#x1f449;️ 设计模式-专栏&#x1f448;️ 文章目录 访问者模式定义英文原话直译如何理解呢&#xff1f; 访问者模式的角色类图代码示例 访问者模式的应用优点缺点使用场景 示例解析:博物馆的导览员代码示例 访问…

Mybatis——动态sql

if标签 用于判断条件是否成立。使用test属性进行条件判断&#xff0c;如果条件为true&#xff0c;则拼接sql。 <where>标签用于识别语句是否需要连接词and&#xff0c;识别sql语句。 package com.t0.maybatisc.mapper;import com.t0.maybatisc.pojo.Emp; import org.a…

“序列优化探究:最长上升子序列的算法发现与应用“

最长上升子序列 最长上升子序列是指在一个给定序列中&#xff0c;找到一个最长的子序列&#xff0c;使得子序列中的元素单调递增。例如&#xff0c;序列 [1, 3, 5, 4, 7] 的最长上升子序列是 [1, 3, 5, 7]&#xff0c;长度为4。 这是一个经典的动态规划问题。 假设dp[i]表示…

大学食堂管理系统

摘 要 随着信息技术的飞速发展和高校规模的不断扩大&#xff0c;大学食堂作为高校日常运营的重要组成部分&#xff0c;其管理效率和服务质量直接影响到师生的日常生活和学习。传统的食堂管理方式&#xff0c;如手工记录、纸质菜单、人工结算等&#xff0c;不仅效率低下&#x…

动手学深度学习(Pytorch版)代码实践 -计算机视觉-37微调

37微调 import os import torch import torchvision from torch import nn import liliPytorch as lp import matplotlib.pyplot as plt from d2l import torch as d2l# 获取数据集 d2l.DATA_HUB[hotdog] (d2l.DATA_URL hotdog.zip,fba480ffa8aa7e0febbb511d181409f899b9baa5…

每日一题——Python代码实现PAT乙级1048 数字加密(举一反三+思想解读+逐步优化)五千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 初次尝试 再次尝试 代码点评 代码结构 时间复杂度 空间复杂度 优化建议 我要更强…

Nacos 2.x 系列【15】数据源插件支持达梦、Oracel、PostgreSQL......

文章目录 1. 概述2. 持久层机制2.1 固定语句2.2 数据源插件 3. 案例演示3.1 编译已实现插件3.2 自定义插件3.3 数据库初始化3.4 插件引入3.4.1 方式一&#xff1a;引入到源码3.4.2 方式二&#xff1a;插件加载目录 3.5 修改配置3.6 测试 1. 概述 在实际项目开发中&#xff0c;…

https://curl.trillworks.com不能用的解决方法

gitee源码:https://gitee.com/Project0ne/curlconverter 首先打开上面的链接 然后下载文件 下载文件到本地 然后安装node.js(Node.js official website.)不会的自行百度,这里不做过多赘述。 在curlconverter文件夹下面打开终端(在文件夹下面右键-在终端打开) 输入 npm…

图像反转入门

文章目录 1.实验目的2.需求3.代码4.运行结果图 1.实验目的 熟练掌握图像像素操作API 2.需求 自己构造一个纯黑图像,通过多种方法进行反转,最终生成一个纯白图像 3.代码 """ Time : 2024/6/23 下午3:46 Author : chensong File : 自己创建一个图像并…

Minillama3->dpo训练

GitHub - leeguandong/MiniLLaMA3: llama3的迷你版本,包括了数据,tokenizer,pt的全流程llama3的迷你版本,包括了数据,tokenizer,pt的全流程. Contribute to leeguandong/MiniLLaMA3 development by creating an account on GitHub.https://github.com/leeguandong/MiniLL…

[保姆级教程]uniapp自定义导航栏

文章目录 导文隐藏默认导航栏&#xff1a;全局隐藏当前页面隐藏 添加自定义导航栏视图&#xff1a;手写导航栏组件导航栏 导文 在 UniApp 中&#xff0c;自定义导航栏通常涉及到隐藏默认的导航栏&#xff0c;并在页面顶部添加自定义的视图组件来模拟导航栏的功能。 隐藏默认导航…

C++11 标准库头文件模拟实现

系列文章目录 文章目录 系列文章目录前言● 智能指针模板● Vector1. 简单版本2. X 总结 前言 暂不考虑支持多线程 常用STL的简单实现&#xff0c;主要内容百行左右完成&#xff0c;意在理解STL的原理 ● 智能指针模板 SharedPtr #include <assert.h> #include <ato…

主数据驱动的数据治理:技术解析与实践探索

数字化转型行业小伙伴可以加入我的星球&#xff0c;初衷成为各位数字化转型参考库&#xff0c;星球内容每周更新 个人工作经验资料全部放在这里&#xff0c;包含数据治理、数据要素、数据质量、数据安全、元数据、主数据、企业架构、DCMM、DSMM、CDGA、CDGP等各种数据相关材料 …

抖音多功能全自动引流工具,支持评论关注私信留痕点赞等,让你的抖音粉丝暴涨!

随着短视频行业的火爆&#xff0c;越来越多的人开始关注抖音这个平台。然而&#xff0c;如何在抖音上获得更多的关注和粉丝&#xff0c;成为了许多人面临的难题。为了帮助大家解决这个问题&#xff0c;今天我们将为大家推荐一款抖音多功能全自动引流脚本&#xff0c;这款脚本可…

HarmonyOS SDK助力鸿蒙原生应用“易感知、易理解、易操作”

6月21-23日&#xff0c;华为开发者大会&#xff08;HDC 2024&#xff09;盛大开幕。6月23日上午&#xff0c;《HarmonyOS开放能力&#xff0c;使能应用原生易用体验》分论坛成功举办&#xff0c;大会邀请了多位华为技术专家深度解读如何通过根技术、开放能力、场景化控件等亮点…

vue3 antdv Select 实现输入关键词,通过服务器去查询数据,并显示到表格中的实现思路。

实现思路&#xff1a; 1&#xff09;输入关键词&#xff0c;通过Select的查询事件&#xff08;onSearch&#xff09;来到服务器查询数据。 2&#xff09;根据查询到的数据显示到表格中&#xff0c;然后通过表格的&#xff08;cellClickEvent&#xff09;事件来选择相关的用户…

Python武器库开发-武器库篇之ThinkPHP 5.0.23-RCE 漏洞复现(六十四)

Python武器库开发-武器库篇之ThinkPHP 5.0.23-RCE 漏洞复现&#xff08;六十四&#xff09; 漏洞环境搭建 这里我们使用Kali虚拟机安装docker并搭建vulhub靶场来进行ThinkPHP漏洞环境的安装&#xff0c;我们进入 ThinkPHP漏洞环境&#xff0c;可以 cd ThinkPHP&#xff0c;然…

嵌入式学习——数据结构(队列)——day50

1. 查找二叉树、搜索二叉树、平衡二叉树 2. 哈希表——人的身份证——哈希函数 3. 哈希冲突、哈希矛盾 4. 哈希代码 4.1 创建哈希表 4.2 5. 算法设计 5.1 正确性 5.2 可读性&#xff08;高内聚、低耦合&#xff09; 5.3 健壮性 5.4 高效率&#xff08;时间复杂度&am…