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

简介: 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; // 设置优先级
  1. 当操作系统创建线程时,默认线程是 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;
}
  • 超级用户运行

相关文章
|
3月前
|
Ubuntu Linux Python
Tkinter错误笔记(一):tkinter.Button在linux下出现乱码
在Linux系统中,使用Tkinter库时可能会遇到中文显示乱码的问题,这通常是由于字体支持问题导致的,可以通过更换支持中文的字体来解决。
231 0
Tkinter错误笔记(一):tkinter.Button在linux下出现乱码
|
3月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
135 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
4月前
|
算法 Linux 调度
探索操作系统的心脏:进程管理与调度策略
【9月更文挑战第17天】在数字世界的复杂迷宫中,操作系统扮演着守护者的角色,确保每一次计算的旅程都顺畅无阻。本文将深入探讨操作系统的核心机制——进程管理与调度,揭示它们如何在微观层面影响宏观的系统性能。从理解进程的本质出发,我们将逐步揭开现代操作系统如何通过精妙的调度策略,平衡多任务处理的效率与公平性。通过深入浅出的语言,即便是技术新手也能领略到这一数字世界奇迹背后的智慧。
|
5月前
|
监控 安全 Linux
在Linux中,如何进行网络资源的优先级管理?
在Linux中,如何进行网络资源的优先级管理?
|
4月前
|
Linux 调度
linux中几种任务的优先级
linux中几种任务的优先级
|
5月前
|
存储 XML Linux
深入理解操作系统:进程管理与调度策略探索安卓应用开发:从零开始构建你的第一个App
【8月更文挑战第28天】在数字世界里航行,操作系统是掌控一切的舵手。本文将带你领略操作系统的精妙设计,特别是进程管理和调度策略这两大核心领域。我们将从基础概念出发,逐步深入到复杂的实现机制,最后通过实际代码示例,揭示操作系统如何高效协调资源,确保多任务顺畅运行的秘密。准备好了吗?让我们启航,探索那些隐藏在日常电脑使用背后的奥秘。 【8月更文挑战第28天】在这个数字时代,拥有一款自己的移动应用程序不仅是技术的展示,也是实现创意和解决问题的一种方式。本文将引导初学者了解安卓开发的基础知识,通过一个简单的待办事项列表App项目,逐步介绍如何利用安卓开发工具和语言来创建、测试并发布一个基本的安卓应用
|
5月前
|
监控 Linux 调度
在Linux中,如何进行系统资源的优先级管理?
在Linux中,如何进行系统资源的优先级管理?
|
5月前
|
Ubuntu Linux Shell
【linux】PetaLinux 2024.1安装笔记
【linux】PetaLinux 2024.1安装笔记
382 0
|
6月前
|
运维 关系型数据库 MySQL
掌握taskset:优化你的Linux进程,提升系统性能
在多核处理器成为现代计算标准的今天,运维人员和性能调优人员面临着如何有效利用这些处理能力的挑战。优化进程运行的位置不仅可以提高性能,还能更好地管理和分配系统资源。 其中,taskset命令是一个强大的工具,它允许管理员将进程绑定到特定的CPU核心,减少上下文切换的开销,从而提升整体效率。
掌握taskset:优化你的Linux进程,提升系统性能
|
6月前
|
弹性计算 Linux 区块链
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
214 4
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)

热门文章

最新文章