首页 > 系统相关 >Linux获取线程调度策略pthread_attr_getschedpolicy

Linux获取线程调度策略pthread_attr_getschedpolicy

时间:2024-07-24 16:24:48浏览次数:16  
标签:SCHED RR Linux 调度 FIFO 线程 pthread 优先级

thread_attr_getschedpolicy 函数是 POSIX 线程(pthread)库中用于获取线程属性对象中的调度策略的函数。在实时系统中,调度策略决定了线程如何被调度器选择来执行。pthread_attr_getschedpolicy 函数允许你查询一个已创建的线程属性对象(pthread_attr_t 类型)中设置的调度策略

在Linux系统中,线程(或更一般地说,进程)的调度策略决定了系统如何分配CPU时间给不同的任务。Linux提供了多种调度策略,其中两种实时调度策略是SCHED_FIFO(先进先出)和SCHED_RR(轮转,Round-Robin)。这两种策略主要用于需要严格时间保证的应用程序,如实时控制系统、音频和视频处理等。

SCHED_FIFO

SCHED_FIFO是一种非抢占式的实时调度策略。一旦一个SCHED_FIFO调度的线程开始运行,它将一直运行直到:

  1. 它自愿放弃CPU(通过调用sched_yield()或者阻塞等待某些资源,如I/O操作)。
  2. 被更高优先级的线程抢占(注意,这里说的是“更高优先级”,而不是“其他”SCHED_FIFOSCHED_RR线程)。

SCHED_FIFO策略不会因时间片到期而抢占线程,这意味着只要线程不自愿放弃CPU,它将持续运行。这种特性使得SCHED_FIFO非常适合那些需要连续执行而不被打断的任务。

SCHED_RR

SCHED_RR(Round-Robin)调度策略是SCHED_FIFO的一个变种,它在SCHED_FIFO的基础上增加了一个时间片(timeslice)的概念。当一个SCHED_RR调度的线程开始运行时,它将运行直到其时间片用完或者它自愿放弃CPU。一旦时间片用完,该线程将被置于队列的末尾,等待再次运行。如果有其他相同优先级的SCHED_RR线程等待运行,它们将按照轮转的方式依次获得CPU时间。

SCHED_RR策略通过引入时间片机制,实现了在相同优先级的线程之间的公平调度。它确保了即使某个线程持续占用CPU,其他同优先级的线程也有机会运行。

优先级

对于SCHED_FIFOSCHED_RR策略,线程(或进程)的优先级是非常重要的。在Linux中,实时线程的优先级范围从1(最低)到99(最高)。实时线程的优先级高于普通(非实时)线程,因此实时线程总是能够抢占非实时线程。

使用场景

  • SCHED_FIFO:适用于那些需要连续执行,不希望被其他任务打断的场景。
  • SCHED_RR:适用于那些需要公平共享CPU时间,但又要保证实时性的场景。

在编写需要实时性能的应用程序时,正确选择调度策略和设置优先级是非常重要的。

代码:获取调度策略

static int get_thread_policy( pthread_attr_t *attr)
{
    int policy;

    int res = pthread_attr_getschedpolicy( attr, &policy);
    if(res) {
        return -1;
    }

    switch ( policy )
    {
        case SCHED_FIFO:
            break;

        case SCHED_RR:
            break;

        default:
            return -1;
    }

    return policy;
}

 

标签:SCHED,RR,Linux,调度,FIFO,线程,pthread,优先级
From: https://blog.csdn.net/qq_30531921/article/details/140641950

相关文章

  • 【lamda表达式】在多线程开发中的lamda表达书简化参数
    创建线程后传Runnable参数并实现run方法,可以采用下面两种方式,效果是一样的Threadt1=newThread(newRunnable(){@Overridepublicvoidrun(){//这里是线程应该执行的代码System.out.println("Hello,World!");......
  • c#写一个WINFORM的多线程操作
    以下是一个简单的示例,展示了如何在C#WinForms中创建一个按钮的异步事件,并使用Label控件来显示事件执行的时长。首先,确保你已经在你的项目中添加了一个Button和一个Label控件。假设按钮的名称是btnAsync,标签的名称是lblDuration。然后,在你的Form类中,添加以下代码:csha......
  • Linux 文本文件编辑相关命令简介【Linux 常用命令系列二】
    〇、前言本文介绍了如何通过vim命令,对文本文件进行打开、编辑、保存等相关操作,并通过简单的示例演示了常用用法。一、关于文本文件的操作1.1打开,查看(cat)、编辑(vim)打开文本文件,有查看和编辑两种状态。1.1.1仅查看cat可以使用cat命令,加上文件的绝对路径或者进入目标路......
  • linux top命令中各个值的含义
    top:这是 top 命令显示的标题行,通常包含系统的当前时间、已运行时间、当前登录用户数、系统负载等信息。Tasks:这部分显示了进程相关的统计信息:总进程数(Tasks):当前系统中运行的进程总数。正在运行的进程数(Running):当前正在执行的进程数。睡眠中的进程数(Sleeping):当前......
  • 如何在 Linux 主机和 KVM 中的 Windows 客户机之间共享文件夹
    原文https://linux.cn/article-16023-1.html在本指南中,你将了解如何在Linux主机(例如使用KVM的Fedora、Ubuntu或LinuxMint)下运行的Windows客户机之间共享文件夹。virt-manager 应用(带有 libvirt)和软件包提供了一组灵活的工具来管理Linux中的虚拟机。它是自由开......
  • 微软正式推出适用于WSL Linux的D3D12 GPU视频加速技术
    今天,微软正式向WindowsSubsystemforLinux(WSL)用户发布了Direct3D12GPU视频加速支持。在微软通过WSL允许在Linux下使用OpenGL、OpenCL和VulkanAPI进行GPU加速的工程工作之后,他们现在已经准备好提供官方视频加速支持。这项工作是在Mesa中建立起来的,......
  • python_进程与线程_多线程
    一、程序与进程的概念1、进程:指启动后的程序,系统会为进程分配内存空间二、创建进程的方式1、第一种创建进程的方式process(group=None,target,name,args,kwargs)group:表示分组,实际上不使用,默认为None即可target:表示子进程要执行的任务,支持函数名name:表示子进程的......
  • 多重处理会导致 Python 崩溃,并给出一个错误:调用 fork() 时可能已在另一个线程中进行
    我对Python比较陌生,并试图为我的for循环实现一个多处理模块。我在img_urls中存储了一个图像url数组,我需要下载并应用一些Google视觉。if__name__=='__main__':img_urls=[ALL_MY_Image_URLS]runAll(img_urls)print("---%sseconds---"%(......
  • 1.Linux环境下Anaconda搭建及常用命令
    1.简介pip是Python的包管理工具,可以安装和卸载软件包,但是无法管理python的版本等功能conda是一个开源的包管理工具和环境管理系统,可以管理不同版本的Python以及非Python包,适用于多种语言,如Python,Java,C/C++等等,可以创建和管理独立的环境Anaconda是一个包含大量科学包及......
  • Airflow 2.7.2 触发badld编写的代码块 Triggerer的异步线程
    我正在运行Airflow版本2.7.2,并且我不断地在触发器日志中看到该问题。Triggerer'sasyncthreadwasblockedfor0.50seconds,likelybyabadly-writtentrigger.SetPYTHONASYNCIODEBUG=1togetmoreinformationonoverrunningcoroutines.我的触发器运行函数是......