当前位置: 首页 > news >正文

Linux线程调度实验

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
在这里插入图片描述

http://www.lryc.cn/news/15313.html

相关文章:

  • 洛谷P5735 【深基7.例1】距离函数 C语言/C++
  • 企业什么要建设自有即时通讯软件系统
  • LocalDNS
  • 线程池种类和拒绝策略
  • Python制作9行最简单音乐播放器?不,我不满足
  • 零基础小白如何学会数据分析?
  • 【Linux】vim的使用及常用快捷键(不会使用vim?有这篇文章就够了)
  • 刷完这19道leetcode二分查找算法,不信进不了大厂
  • 四、Plugin Request and Sometimes pads
  • 唤醒手腕 Java 后端 Springboot 结合 Redis 数据库学习笔记(更新中)
  • robotiq 2f 140安装在UR3机械臂后面在gazebo仿真中散架、抖动
  • 坐标系概念 四元数 欧拉角
  • 从0开始写Vue项目-SpringBoot整合Mybatis-plus实现登录、注册功能
  • K8s中gRpc通信负载均衡失效
  • 第三届区块链服务网络(BSN)全球合作伙伴大会在杭州成功举办
  • 人工智能基础部分13-LSTM网络:预测上证指数走势
  • 内网穿透/组网/设备上云平台EasyNTS上云网关的安装操作指南
  • 易点天下基于 StarRocks 全面构建实时离线一体的湖仓方案
  • Tomcat的类加载机制
  • 【shell 编程大全】数组,逻辑判断以及循环
  • Android13 Bluetooth更新
  • 手工测试混了5年,年底接到了被裁员的消息....
  • Umi框架
  • 教你学git
  • 【工作笔记】syslog,kern.log大量写入invalid cookie错误信息问题
  • 【C++】多线程
  • 0202插入删除-算法第四版红黑树-红黑树-数据结构和算法(Java)
  • vue 生成二维码插件 vue-qr使用方法
  • 网络工程课(二)
  • Pytorch并行计算(三): 梯度累加