Linux线程调度实验

2023-05-16

Linux线程调度实验

1.获取线程属性

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <pthread.h>
#include <time.h>
#include <stdlib.h>
#include <errno.h>
#define _GNU_SOURCE

#define handle_error_en(en, msg) \
               do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0)

static void display_pthread_attr(pthread_attr_t *attr, char *prefix){
    int s, i;
    size_t v;
    void *stkaddr;
    struct  sched_param sp;

    s = pthread_attr_getdetachstate(attr, &i);
    if (s != 0) 
        handle_error_en(s, "pthread_attr_getdetachstate");
    
    printf("%sDetach state        = %s\n", prefix,
            (i == PTHREAD_CREATE_DETACHED) ? "PTHREAD_CREATE_DETACHED" :
            (i == PTHREAD_CREATE_JOINABLE) ? "PTHREAD_CREATE_JOINABLE" :
            "???");

    s = pthread_attr_getscope(attr, &i);
    if (s != 0)
        handle_error_en(s, "pthread_attr_getscope");
    printf("%sScope               = %s\n", prefix,
            (i == PTHREAD_SCOPE_SYSTEM)  ? "PTHREAD_SCOPE_SYSTEM" :
            (i == PTHREAD_SCOPE_PROCESS) ? "PTHREAD_SCOPE_PROCESS" :
            "???");

    s = pthread_attr_getinheritsched(attr, &i);
    if (s != 0)
        handle_error_en(s, "pthread_attr_getinheritsched");
    printf("%sInherit scheduler   = %s\n", prefix,
            (i == PTHREAD_INHERIT_SCHED)  ? "PTHREAD_INHERIT_SCHED" :
            (i == PTHREAD_EXPLICIT_SCHED) ? "PTHREAD_EXPLICIT_SCHED" :
            "???");
  
    s = pthread_attr_getschedpolicy(attr, &i);  
    if (s != 0)  
        handle_error_en(s, "pthread_attr_getschedpolicy");  
    printf("%sScheduling policy   = %s\n", prefix,  
        (i == SCHED_OTHER) ? "SCHED_OTHER" :  
        (i == SCHED_FIFO)  ? "SCHED_FIFO" :  
        (i == SCHED_RR)    ? "SCHED_RR" :  
        "???");  
  
    s = pthread_attr_getschedparam(attr, &sp);  
    if (s != 0)  
        handle_error_en(s, "pthread_attr_getschedparam");  
    printf("%sScheduling priority = %d\n", prefix, sp.sched_priority);  
  
    s = pthread_attr_getguardsize(attr, &v);  
    if (s != 0)  
        handle_error_en(s, "pthread_attr_getguardsize");  
    printf("%sGuard size          = %zu bytes\n", prefix, v);  
  
    s = pthread_attr_getstack(attr, &stkaddr, &v);  
    if (s != 0)  
        handle_error_en(s, "pthread_attr_getstack");  
    printf("%sStack address       = %p\n", prefix, stkaddr);  
    printf("%sStack size          = 0x%zx bytes\n", prefix, v);  
    
}

void* computing(void* arg){
    int s;
    pthread_attr_t gattr;

    s = pthread_getattr_np(pthread_self(), &gattr);
    if (s != 0)
        handle_error_en(s, "pthread_getattr_np");

    printf("Thread attributes:\n");
    display_pthread_attr(&gattr, "\t");

    pause();

    pthread_exit(0);

}


int main(){

    pthread_t tid;
    pthread_attr_t attr;

    pthread_attr_init(&attr);

    // 线程创建函数
    pthread_create(&tid, &attr, computing, NULL);

    // 等待指定的线程结束
    pthread_join(tid,NULL);

    return 0;
}

这个库函数报错不用管
在这里插入图片描述我们可以看到当前进程:
datach state:这个进程是一个joinable,也就是一个可进入等待状态的进程
scope:有两种状态
在这里插入图片描述这两个的区别
一个是系统范围,一个是进程范围,如果我有多个线程,那么他们的竞争区间是在自己的进程内,还是整个系统的进程内
在这里插入图片描述系统范围竞争
在这里插入图片描述进程内竞争
在这里插入图片描述我们linux系统的线程是系统范围竞争,我们前面学了用户模型和系统模型1对1模型,其实linux就是1
在这里插入图片描述
inherit schedule:调度器是谁
在这里插入图片描述

这里可以看出是继承调度,调度器的参数和属性会被这个进程所继承。

在这里插入图片描述
执行策略是:SCHED_OTHER
在这里插入图片描述

下面两个fifo和RR一个是先进先出,一个是时间片
Linux线程调度策略总共有两种:

  1. Normal Scheduling(正常调度):总共有三种,分别为SCHED_OTHER,SCHED_IDLE,SCHED_BATCH, 它的优先级数值priority_value需要设置成0,但这里并不一定意味着这个进程优先级很高,因为这个0是默认值。

  2. Real_time Schedulig(实时调度):总共有两种:一种是SCHED_FIFO(先来先服务),SCHED_RR(时间片轮转),实时调度的进程总是比正常调度的进程优先级要高,它的优先级数值priority_value∈[1,99],这里和前面我们学的系统优先级不同,1是低优先级,99是高优先级

实时调度需要延迟非常低才可以实现,所以现在用户模式的进程基本都是一般都是正常调度的。
这里SCHED_OTHER是RR,现在默认的状态是这个。
linux中优先级越低,进程或线程的优先级越高
PR值越高优先级越低
一般nice值默认为0

在这里插入图片描述
SCHED_IDLE:一般是周期性计划任务,清理磁盘等,优先级不是很高。

可以使用 ps -eLl来查看当前线程
在这里插入图片描述在这里插入图片描述LWP, light weight process 这里是4544和4545是用户模式产生的线程id
NLWP,Number of Light-Weight Processes

我们再用top看下
PR值为rt(实时进程)、负数(实时进程)、0(优先级极高),默认值20。
NI(nice)值:默认为0
在这里插入图片描述top -p 4544
在这里插入图片描述

单看下当前进程的调度策略
在这里插入图片描述看一个real time的进程
在这里插入图片描述在这里插入图片描述

nice值仅在用户模式下有用
Real_time Scheduling【包含FIFO和RR】:
它的PR值计算公式为:PR = -1 - priority_value
所以PR∈[-100,-2]
在这里插入图片描述

可以看出左轴从-1开始都是rt的进程
所以我们可以通过PR值来判断一个进程/线程是Noraml Thread还是Real-time thread,是正数就
是Noraml Thread,是负数就是Real-time thread。
PR值=100
在这里插入图片描述在这里插入图片描述在这里插入图片描述-r转化成RR策略的rt进程
-f转化成Fifo策略的rt进程
value 1~99 , 99代表优先级最高
在这里插入图片描述我们把我们执行的这个进程转为fifo策略的real time 进程
在这里插入图片描述

sudo chrt -f -p 11 4544
在这里插入图片描述

-1-value
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux线程调度实验 的相关文章

  • 基于STM32的光敏传感器数据采集系统-嵌入式系统与设计课程设计

    目录 1 项目概述1 1 项目介绍1 2 项目开发环境1 3 小组人员及分工 2 需求分析2 1 系统需求分析2 2 可行性分析2 3 项目实施安排 3 系统硬件设计3 1 系统整体硬件电路设计3 2 STM32 最小系统电路设计3 3 传
  • QX-A51智能小车实现-物联网应用系统设计项目开发

    目录 介绍说明展示 介绍 STC89C52系列单片机是STC推出的新一代高速 低功耗 超强抗干扰 超低价的单片机 xff0c 指令代码完全兼容传统8051单片机 xff0c 12时钟每机器周期和6时钟每机器周期可以任意选择 QX A51智能
  • 11:跨域访问-Java Spring

    目录 11 1 跨域访问11 2 同源策略11 3 跨域解决方案 11 1 跨域访问 跨域指的是浏览器不能执行其他网站的脚本 xff0c 当一个请求url的协议 域名 端口三者有任意一个不同即为跨域 无法跨域是由浏览器的同源策略造成的 xf
  • 10:@Validated和@Valid-Java Spring

    目录 10 1 64 Valid10 2 64 Validated10 2 区别10 2 Controller参数校验 10 1 64 Valid 64 Valid 是 Hibernate validation 提供的注解 xff0c 表示
  • 12:CORS跨域设置-Java Spring

    目录 12 1 CORS介绍12 2 CORS原理12 3 CORS实现 12 1 CORS介绍 CORS跨域资源共享 xff08 Cross origin resource sharing xff09 是指在服务器端定义跨域请求规则 xf
  • Ubuntu虚拟机可以上网,可以ping网络,但是无法update和install,显示不能连接或者无网络

    此方法为我找遍了网上全部解决方案之后还没有解决掉 xff0c 自己琢磨出来的其中一种方法 错误情况 xff1a 可以上浏览器看视频 xff0c 但是不能apt install vim或者gcc 解决方案 1 打开文件夹 2 输入 或者进入
  • 13:SpringBoot跨域解决方案-Java Spring

    目录 13 1 CorsFilter13 2 64 CrossOrigin13 3 WebMvcConfigurer 13 1 CorsFilter SpringBoot设置CORS的的本质都是通过设置响应头信息来告诉前端该请求是否支持跨域
  • 14:Servlet并发机制-Java Spring

    目录 14 1 并发14 2 Servlet并发机制14 3 Tomcat并发特点14 4 Tomcat线程模型 14 1 并发 并发 xff08 Concurrent xff09 是指多个任务交替执行的现象 xff0c 把CPU运行时间划
  • 手写字体识别实验-Python课程设计

    安装python 打开手写识别文件夹中的安装包文件夹 xff0c 双击python3 7 1可执行文件 xff0c 进行安装 弹出窗口 第一步 xff0c 勾选第二个复选框 Add Python 3 7 to PATH xff0c 然后点击
  • 生产企业原材料订购与运输的研究-数据处理课程设计

    目录 摘要1 引言2 规划问题说明3 问题重述3 1 问题分析3 2 数据说明3 3 模型假设3 4 符号说明 4 实验及分析4 1 问题一模型的建立与求解4 2 问题二模型的建立与求解 5 总结5 1 模型的优点5 2 模型的缺点 参考文
  • 信号发生器-电路与电子技术课程设计

    目录 1 设计任务与要求1 1 设计任务1 2 设计要求 2 方案设计与论证2 1 方案设计2 2 论证 3 信号发生器设计与计算3 1 信号发生器设计3 2 方波振荡电路图3 3 三角波振荡电路图3 4 参数计算 4 总原理图及元器件清单
  • 增益可控放大电路-电路与电子技术课程设计

    目录 1 设计任务与要求1 1 设计任务1 2 设计要求 2 方案设计与论证2 1 方案设计2 2 论证 3 放大电路设计与计算3 1 放大电路设计3 2 电子开关切换电路设计3 3 六档控制电路3 4 参数计算 4 总原理图及元器件清单4
  • 超声波测距实验-传感器原理及应用实验

    目录 一 实验实训主要内容二 实验实训方法 过程步骤三 实验实训结果与分析四 讨论小结 一 实验实训主要内容 学习超声波测距传感器的使用方法 xff0c 了解超声波测距传感器的原理和电路及实际应用 xff0c 了解超声波测距传感器的基本操作
  • 光敏传感器实验-传感器原理及应用实验

    目录 一 实验实训主要内容二 实验实训方法 过程步骤三 实验实训结果与分析四 讨论小结 一 实验实训主要内容 学习光敏传感器的使用方法 xff0c 了解光敏传感器的基本实验原理和实际应用 xff0c 熟练掌握光敏传感器实验的操作步骤 xff
  • 红外反射传感器实验-传感器原理及应用实验

    目录 一 实验实训主要内容二 实验实训方法 过程步骤三 实验实训结果与分析四 讨论小结 一 实验实训主要内容 学习红外反射传感器的使用方式 xff0c 了解红外反射传感器的实验原理和实际应用 xff0c 学习并理解Modbus数据格式所代表
  • 酒精传感器实验-传感器原理及应用实验

    目录 一 实验实训主要内容二 实验实训方法 过程步骤三 实验实训结果与分析四 讨论小结 一 实验实训主要内容 学习酒精传感器MQ 3的使用方法 xff0c 了解酒精传感器的实验原理和实际应用 xff0c 了解酒精传感器的基本操作模式 xff
  • hdoj 1575 Tr A (矩阵快速幂)

    Tr A Time Limit 1000 1000 MS Java Others Memory Limit 32768 32768 K Java Others Total Submission s 4549 Accepted Submiss
  • MapReduce排序过程

    排序是MapReduce框架中最重要的操作之一 MapTask和ReduceTask均会对数据按照key 进行排序 该操作属于Hadoop 的默认行为 xff0c 任何应用程序中的数据均会被排序 xff0c 而不管逻辑上是否需要 默认排序是
  • 温湿度传感器实验-传感器原理及应用实验

    目录 一 实验实训主要内容二 实验实训方法 过程步骤三 实验实训结果与分析四 讨论小结 一 实验实训主要内容 学习温湿度传感器的使用方法 xff0c 了解温湿度传感器的基本实验原理和实际应用 xff0c 熟练掌握温湿度传感器的基本步骤 xf
  • 烟雾检测传感器实验-传感器原理及应用实验

    目录 一 实验实训主要内容二 实验实训方法 过程步骤三 实验实训结果与分析四 讨论小结 一 实验实训主要内容 学习烟雾检测传感器的原理及检测方式 xff0c 了解烟雾检测传感器的实验原理和技术指标 xff0c 熟练掌握烟雾检测传感器的工作步

随机推荐