Linux------进程优先级与进程切换

目录

一、进程优先级

二、优先级与权限的区别

三、优先级的查看

四、进程优先级修改

五、进程切换

六、linux2.6内核调度队列与调度原理


一、进程优先级

首先我们得知道一个进程总是需要排队的,他一会在运行队列中排队等待运行,一会在设备的等待队列中排队,排队的本质就是在确认优先级

cpu资源分配的先后顺序,就是指进程的优先权(priority)

二、优先级与权限的区别

我们很容易把优先级和权限搞混淆。

优先级指得到申请资源的先后。

权限为是否能得到资源。

他们之间是先有权限,再谈优先级。

三、优先级的查看

进程的优先级其实就是PCB中的一个int字段,数值越小,优先级越大。这跟我们生活中买奶茶排号、医院挂号是一个道理,先叫的都是小号,先享受服务,后来的都是大号,晚一点享受服务。

Linux进程的优先级数据范围:60-99   

默认进程优先级:80

我们可以在命令行输入以下指令查看进程的优先级

ps -al

其中我们这里只需要关心 PRI 与 NI 这两项 

  1. PRI(priority):进程优先级
  2. NI(nice):进程优先级的修正数据

这里的NI即nice值,是Linux进程pcb中存放的一个值,他与PRI的公式如下

pri(新) = pri(老) +  nice 

这里的老pri不是指上次,而是值默认的pri,一般都是80

四、进程优先级修改

首先在命令行先输入 top 启动任务管理器,再在任务管理器中输入 r 打开重新调整renice值的任务框,此时需要先输入需要调整的进程的pid值。

 

将我们运行的死循环进程renice值修改为10 

此时nice值变为了10,同时PRI值变成了90。 

这样我们就完成了优先级的修改,数字变大了,也就是将优先级变低了。

这里我们尝试将优先级调低试一试

发现告诉我们修改失败,不能将优先级调低。此时需要使用 sudo 提权,如下

后面重复之前的操作,对优先级-10 ,此时优先级就变成了70。这里优先级不是从之前的90去-10,而是使用的默认的80 -10。

我们再次修改,让进程的优先级的nice值改为-100。发现进程优先级为60,nice值为-20,这是因为优先级的范围在60-99.系统不让你修改超过这个范围,如果超过了,就取最小值。 

小总结:nice值调整的最小为-20,超过部分统一处理为-20

              nice值调整的最大为19,超过部分统一处理为19

这样处理是为了让操作系统进行调度的时候,可以让每一个进程都得到调度否则如果用户随意更改优先级,会导致进程优先级过高,并且还可以一直调,刚运行完如果又调高,会让这个程序一直在运行,致使其他进程无法运行,进而优先级较低的进程长时间得不到CPU的调度,这也叫做进程饥饿。

五、进程切换

在学习进程切换前,我们得先了解以下概念

  • 竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级
  • 独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰
  • 并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行
  • 并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发

小总结一下,进程之间具有竞争性(因为成本控制,导致资源少,需要竞争)独立性 (该进程在运行时,该进程需要的资源只为他服务)

并行是多个CPU分别运行

并发是一个CPU通过进程切换,轮流让进程运行。

一般的用户都是用的单CPU,因此这里我们着重学习并发

首先,我们需知道每一个进程不是占有CPU一直运行的,每个一段时间(时间片),需要从CPU上剥离下来。不然你写一个死循环,一直运行该进程,其他进程还活不活了。Linux内核支持进程之间进行cpu资源抢占的。

同时cpu的速度是非常快的,比如说我们有10个进程,现在的时间片是1微秒,那么在一秒的时间,他可以将这是个进程轮流运行十万次,因此我们人的感知,是几乎感知不到的,就感觉这么多的进程都在同时运行,这样基于时间片的轮转式抢占内核就可以称作并发

并发,必须要考虑进程间的切换

cpu中有很多寄存器,比如eax,ebx,ss,ds,cs等等。通过这些寄存器,可以让数据进行暂时存储,同时寄存器的速度也是非常快的,在cpu内部快速的传递数据。

比如我们写了一个函数,返回类型为int,这时就会使用eax寄存器来保存该临时变量的值,你临时变量销毁就销毁了,无所谓,我寄存器在帮你擦屁股勒,最后给调用该函数的地方。如下代码,我们查看汇编就可以看到使用了eax寄存器。

再一个就是我们的进程内的代码需要不停的在函数之间跳转,此时也会用到pc或者eip来保存下一条指令的地址。

当我们进程在运行的时候,会使用这些寄存器的,我们的进程会产生各种数据,在寄存器中临时保存,如果有多个进程各个进程在cpu寄存器中形成的临时数据(进程硬件上下文),都是不一样的。

cpu寄存器硬件只有一套,而继承上下文数据有很多,是 1 对 n 的关系,因此当时间片到达,该切换下一个进程的时候,该进程的硬件上下文需要被保存到内存中,当我们下次再次运行该进程时,能够接着上次运行到的地方继续运行。

这个操作应该不难理解,这就相当于存档,我们玩幻兽帕鲁的时候,右上角会经常告诉我们存档中,这就是怕我们突然断网或掉线,如果不存档,就无法恢复到之前玩到的地方,我抓到的腾炎龙和阿努比斯没了,游戏体验就会大幅降低。

小总结:进程切换前首先工作要先将进程的硬件上下文保存到内存,进程重新运行前,需要将存放在内存中的进程硬件上下文重新写入到寄存器中,另外需要注意上下文保存的是寄存器的内容,而不是寄存器本身。

六、linux2.6内核调度队列与调度原理

如下是linux的运行队列具体内容

其中我们主要看蓝色框和红色框里的内容,其中queue具体为task struct *queue[140],是优先级指针数组,前面0-99是系统用的我们不关心,后面的100-139,对应了之前我们学习的60-99的优先级,操作系统将优先级相同的进程地址链入了对应的地方。如下所示

  • 上图中有红色和蓝色方框,为什么这里有两个方框呢? 

他们一个是active指针指向的,另一个是expired指针指向的。红色和蓝色方框内容相同。比如现在Linux启动了,目前有了10个进程,这10个进程都在active指向的内容中,他们在轮流运行,如果我现在添加了一些进程进去,被添加的进程不会被active指向,而是被expired指针指向,他要将active这些内容全部运行完了,才会再运行expired的内容。

  • 为什么会这样呢?

还是老样子,因为操作系统需要保证让每一个进程都能够被调度,如果我现在运行到80优先级的进程了,现在添加了一些60优先级的进程,如果只有一个数组,那么我就得返回运行这些优先级更高的进程,如果这些进程有很多,那么后面90优先级或者更低优先级进程会一直无法被调度。

但是这样也不合理啊,如果运行expired指向的进程时,有进程被添加进来,怎么办呢?此时需要往active添加进程呀!由于两个指针指向的内容都是一样的,我们运行完active里的所有进程后,可以通过swap(active,expired)来进行交换,这样就解决问题了。 

方框内不止有数组,还有nr_active与bitmap[5]。

nr_active是一个整形,是否为0来判断指针数组里是否有进程。

bitmap[5]是位图(C++实现位图 ),是int整形数组,一个int整形有32位,5个就有160位,足够140位的优先级访问。比如queue数组中下标120有进程,那么在bitmap中的121位会设置为1,借此来告诉操作系统这里有进程。虽然这样也需要循环遍历,但是我们可以以8位或者16位的速度进行是否为0判断,大大提高效率(毕竟进程有默认优先级,需要调优先级的进程较少)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/661722.shtml

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

相关文章

点云从入门到精通技术详解100篇-基于三维点云花朵特征提取与分割重建(续)

目录 3 花朵点云坐标转换及花朵特征提取 3.1 圆柱坐标系的建立 3.1.1 旋转平移变换

spring-security 默认登录页面

Spring Security是一个强大且高度可定制的身份验证和访问控制框架。天然与Spring整合,易扩展,引入jar包就可以用了,在boot自动装载下,不需要任何配置就可以控制资源访问。那么默认登录页是如何生产的呢? 版本信息 内…

STM32学习笔记(六) —— 配置系统时钟

1.时钟树 从图中可以看出一共有四个时钟来源,分别是内部高速时钟、内部低速时钟、外部高速时钟接口、外部低速时钟接口,这些时钟源经过内部的倍频分频后提供给各外设使用。其中HSE与LSE需要由外部提供,可以是外部时钟直接输入,也可…

C++——输入输出

C——输入输出 1.输入输出 C 中的输入和输出(I/O)主要是通过标准库中的输入输出流来实现的。最常用的是 iostream 库,它提供了用于输入和输出的基本流类,包括 cin 、 cout 、 cerr 和 clog 。 标准输出流(cout) cout 代表标准…

解决Docker AList本地挂载失效的问题。

解决Docker AList本地挂载失效的问题。 AList Docker version: 3.3 services:alist:image: xhofe/alist:latestcontainer_name: alistvolumes:- ./etc/alist:/opt/alist/data# 比如我要挂载/home,如果在docker里先挂载,是没法办法映射到linux系统下的/home的- /ho…

k8s网络详解(一)

目录 网络概述 Pod 网络通信 Overlay网络 原理 在k8s中的作用 VXLAN 网络插件Flanne Flannel UDP 模式的工作原理 ETCD和Flannel之间的关系 VXLAN 模式 Flannel VXLAN模式跨主机工作原理 网络插件 Calico k8s 组网Calico方案与flannel方案区别 Calico 主要组成部分…

防御保护---防火墙双机热备直路部署(上下三层接口)

防御保护---防火墙双机热备直路部署(上下三层接口) 一、根据网段划分配置IP地址和安全区域二、配置动态路由OSPF三、配置双机热备四、测试:4.1 测试一:查看状态和路由器路由表(双机热备)前后对比4.2 测试二…

「数据结构」3.ArrayList

🎇个人主页:Ice_Sugar_7 🎇所属专栏:Java数据结构 🎇**欢迎点赞收藏加关注哦!* ArrayList 🍉ArrayList的构造🍉add方法🍌扩容机制🍌重要结论 🍉其…

SQL Server 函数参考手册(SQL Server 日期函数)

目录 SQL Server CURRENT_TIMESTAMP 函数 SQL Server DATEADD() 函数 SQL Server DATEDIFF() 函数 SQL Server DATEFROMPARTS() 函数 SQL Server DATENAME() 函数 SQL Server DATEPART() 函数 SQL Server DAY() 函数 SQL Server GETDATE() 函数 SQL Server GETUTCDATE…

网络协议与攻击模拟_13缓存DNS与DNS报文

一、缓存DNS服务器 1、引入缓存DNS 缓存域名服务器需要与外网连接 一台windows作为Client 一台Windows server作为缓存DNS 桥接网络 DHCP自动获取IP地址 Client 192.168.183.133 Windows server 192.168.183.138 ipconfig /all查看下Client的DNS,设置让Cl…

Unity | 渡鸦避难所-9 | 角色名字及血条等信息

1 效果预览 游戏中角色的名字和血条是非常重要的元素,它们可以帮助玩家了解角色的身份和状态。在 Unity 中,可以使用 UGUI 来实现这些功能 2 实现方案 1 画布 (Canvas) 画布 (Canvas) 组件表示进行 UI 布局和渲染的抽象空间。所有 UI 元素都必须是附加…

【异常处理】word或ppt打开后没反应或闪退,或者报错由安全模式打开

折腾了2个小时,可算解决了,办法是在【控制面板】中右击,选择【更改】 选择联机修复,然后耐心等待,最后再打开就没问题了。

DevOps落地笔记-08|技术债务:勤借勤还,再借不难

上一讲主要介绍了如何有效管理第三方组件的实际案例,目的是让你意识到依赖组件的质量也会影响到软件的质量。前面几个课时谈论的主要内容都是跟软件质量相关,通过各种方式方法提高软件交付的质量。这时就会遇到一个问题,软件质量固然重要&…

2024年第4届IEEE软件工程与人工智能国际会议(SEAI 2024)

2024年第4届IEEE软件工程与人工智能国际会议(SEAI 2024)将于2024年6月21-23日在中国厦门举办。 SEAI旨在为软件工程与人工智能领域搭建高端前沿的交流平台,推动产业发展。本次会议将汇聚海内外的知名专家、学者和产业界优秀人才,共同围绕国际热点话题、核…

Sql Server之更改跟踪功能

1.更改跟踪(Change Tracking)介绍 更改跟踪是一种轻量型解决方案,它为应用程序提供了一种有效的更改跟踪机制。更改跟踪捕获更改了表行这一事实,但不会捕获更改的数据。 这样,应用程序就可以确定使用从用户表中直接获…

PostGIS空间数据库之空间数据融合实践

目录 前言 一、ST_Union()简介 1、方法说明 2、参数介绍 二、ST_Collect()简介 1、方法说明 2、参数介绍 3、两者区别 三、实际案例实践 1、不重叠融合 2、空间重叠融合 总结 前言 众所周知,熟悉GIS桌面软件的同学一定都知道,想要对空…

Modern C++ idiom6 - 命名返回值优化NRVO

Note: NRVO的应用并不是绝对的,它依赖于编译器的优化能力。现在的编译器真的很厉害,一般写的不好的代码也能给你优化好! 在C中,性能一直是开发者关注的一个核心问题。为了提高程序的效率,各种优化技术应运而生。本文将…

使用goland IDE编写go windows ui

最近突发奇想,想实现一款工作节奏的提示安排小闹钟。那首先解决的就是UI。本人擅长go语言。那go在windows ui的探索肯定有人做过了吧。一查还真有,通过知乎,csdn等查到目前支持最好的就是walk库了。那走起试试。 一、拷贝go代码 将官网例子…

代码随想录算法训练营29期Day36|LeetCode 435,763,56

文档讲解:无重叠区间 划分字母区间 合并区间 435.无重叠区间 题目链接:https://leetcode.cn/problems/non-overlapping-intervals/description/ 思路: 按照右边界排序,从左向右记录非交叉区间的个数。最后用区间总数减去非交叉…

WiFi 7 的核心要点

目录 WiFi 7 是什么? WiFi 7 的主要feature功能: 320Mhz channel 4K QAM Multi-Link Operation (MLO),多链路操作 512 block ACK OFDMA:multiple RUs to single STA. 总结:性能是第一优先级,WiFi 7&#xf…