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

news2024/12/31 7:26:49

基础知识

  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.coloradmin.cn/o/1865421.html

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

相关文章

centos上快速搭建zfile文件网站

什么是zfile&#xff1f; zfile文件网站是最方便快捷的在线目录展示程序&#xff0c;支持将本地文件、FTP、SFTP、S3、OneDrive 等存储在网站上展示并浏览&#xff01; 本教程参考&#xff1a; https://docs.zfile.vip/install/os-linux复现 今天的搭建环境是centos7.9 第一…

vscode中的字符缩进问题

问题描述&#xff1a; 如图当一行代码中出现不同类型的字符时&#xff0c;使用tab缩只是插入了固定数量&#xff08;默认4&#xff09;的空格或制表符&#xff0c;仍然无法对齐。 解决方法&#xff1a; vscode找到设置&#xff0c;搜索fontFamily&#xff0c;对应输入框写入mon…

Linux下安装搜狗拼音不能显示中文?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

这5款国内可用的宝藏AI视频工具,不允许有人还不知道!(建议收藏)

文章首发于公众号&#xff1a;X小鹿AI副业 大家好&#xff0c;我是程序员X小鹿&#xff0c;前互联网大厂程序员&#xff0c;自由职业2年&#xff0c;也一名 AIGC 爱好者&#xff0c;持续分享更多前沿的「AI 工具」和「AI副业玩法」&#xff0c;欢迎一起交流~ 前几天一位粉丝说给…

海外短剧系统:一扇窥探多元文化的奇妙之窗

随着全球化的推进&#xff0c;文化交流的壁垒逐渐消融&#xff0c;我们得以更加便捷地领略到世界各地的独特风情。在这一背景下&#xff0c;海外短剧系统应运而生&#xff0c;它如同一扇扇虚拟的窗户&#xff0c;将我们带入不同国家、不同民族、不同文化的世界&#xff0c;让我…

Navicat Premium Lite绿色免费版

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Navicat Premium Lite概述 Navicat 最近推出了一款名为 Navicat Premium Lite 的免费数据库管理开发工具&#xff0c;专为入门级用户设计。这款工具虽然在功能上与 Navicat…

内网安全【4】SSH隧道技术

1.四大隧道协议 (1)SMB协议 判断&#xff1a;445端口是否开放 (2)ICMP协议 判断&#xff1a;ping命令能通说明使用icmp协议 (3)DNS协议 判断&#xff1a;nslookup www.baidu.com 属于UDP iodine工作原理是 &#xff0c;通过TAP虚拟网卡&#xff0c;在服…

北方银行 - HDFS 现代化快速案例研究

故事很重要&#xff0c;客户故事是最好的。他们提供令人瞠目结舌的统计数据或克服巨大障碍的那些是获得最佳头条新闻的那些。它们也是最难发表的。我们知道&#xff0c;因为我们将与您分享一些我们正在孜孜不倦地努力出版的内容 - 但现在它们将保持匿名。话虽如此&#xff0c;如…

Java:从嵌入式到云时代的编程语言传奇

Java&#xff0c;自1995年面世以来&#xff0c;已成为全球最受欢迎的编程语言之一。起初&#xff0c;Sun Microsystems公司为了解决嵌入式设备编程的难题&#xff0c;开发了Oak语言&#xff0c;这便是Java的前身。随着互联网的兴起&#xff0c;Oak更名为Java&#xff0c;并迅速…

11.异常(java版)

异常的概念 在日常开发时 代码在程序运行过程中 难免会出现一些其奇奇怪怪的问题 有时通过代码很难去控制 比如&#xff1a;数据格式不对、网络不流畅、内存报警等 在Java中 将程序执行过程中发生的不正常行为称为异常 比如我们之前写代码时经常会遇到的&#xff1a; 1.算术…

tldraw白板组件

tldraw 是一个开源的白板组件&#xff0c;10行代码就可以将其接入到 React 项目中&#xff1a; import { Tldraw } from tldraw import tldraw/tldraw.cssexport default function App() {return (<div style{{ position: fixed, inset: 0 }}><Tldraw /></div&…

C#与工业自动化结合还有搞头吗?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「c#的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“666”之后私信回复“666”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;当然有搞头&#xff01;C#是一…

自动化软件运行手机脚本需要用上的源代码!

在现今这个科技高速发展的时代&#xff0c;自动化软件运行手机脚本已经成为许多开发者、测试人员乃至普通用户提高工作效率的利器。 通过编写和执行手机脚本&#xff0c;我们可以实现自动化测试、数据抓取、任务批量处理等多种功能&#xff0c;本文将分享五段用于不同场景的自…

【LLM】一分钟带你了解Agent工作流四范式

文章目录 1. 大模型直接生成-generation2. 大模型充当工具使用-tool3. 大模型执行思维链-Planning4. 多大模型Agent合作-multiagent collaboration 1. 大模型直接生成-generation 通过提示词&#xff0c;大模型直接生成想要的结果&#xff1a; 2. 大模型充当工具使用-tool …

如何寻找暴利产品并通过整合产品资源变现

互联网上很多人都喜欢做暴利产品&#xff0c;这是人之常情&#xff0c;赚钱嘛&#xff0c;谁不希望一次多赚点。 说到暴利产品&#xff0c;那就不得不提微商&#xff0c;微商运营的本质是基于代理商进行用户的裂变&#xff0c;也就是说代理商越多&#xff0c;自然也就收割越多&…

24年了 直播带货的未来如何?

32 个国家在取消电商&#xff0c; 那我国的电商呢&#xff0c;首先电商是不会被取缔的。直播电商会被严格的控制&#xff0c;比如有一家饼店&#xff0c;它线下的销售是 3000 万&#xff0c;线上抖音的销售是 5, 000 万。 这一类型小而精又专业的品牌企业&#xff0c;未来在抖…

Excel 将某个序列随机重排 N 次

A 列是个随机序列&#xff0c;B2 格是参数&#xff0c;表示重排的次数。 AB1ItemsReplicates2A23B4C5D 要求将 A 列重拍 N 次 D1Result2C3D4B5A6D7A8B9C 使用 SPL XLL&#xff0c;输入公式&#xff1a; spl("?2.conj(?1.sort(rand()))",A2:A5,B2)"整数.()…

在数字化转型中,数字孪生技术的作用和价值几何?

引言&#xff1a;随着全球化和市场竞争的加剧&#xff0c;企业需要通过数字化转型来提高生产效率、优化产品质量、降低成本&#xff0c;以增强自身竞争力。企业需要通过数字化转型更好地理解客户需求&#xff0c;提供个性化、定制化的产品和服务&#xff0c;从而满足客户的多样…

java对word文档预设参数填值并生成

目录 &#xff08;1&#xff09;定义word文档模板 &#xff08;2&#xff09;模板二次处理 处理模板图片&#xff0c;不涉及图片可以跳过 处理模板内容 &#xff08;3&#xff09;java对word模板填值 &#xff08;4&#xff09;Notepad的XML Tools插件安装 工作上要搞一个…

75101A 1553B总线测试模块

75101A 1553B总线测试模块 75101A 1553B总线测试模块是单通道多功能&#xff0c;符合CPCI/PXI总线的标准3U尺寸模块&#xff0c;可同时用作BC、RTs和BM&#xff0c;其中BM具有比特误码、highbit、lowbit、highword、lowword、校验错误、消息错误检测以及最大256M字节的数据捕…