深入了解Linux系统—— 进程优先级

前言

我们现在了解了进程是什么,进程状态表示什么 ,我们现在继续来了解进程的属性 —— 进程优先级

进程执行者

在了解进程优先级之前,先来思考一个问题:在我们进行文件访问操作时,操作系统是如何直到我们是谁(拥有者所属者或者other)的?

我们知道指令它其实就是进程,所以我们进行文件访问操作,本质上就是进程进行访问,那操作系统是如何知道进程它是谁呢?

在进程的task_struct中,存在一个UID,它表示user id就是用户的id

我们可以使用ps -l命令来查看:

在这里插入图片描述

通过上图我们可以发现进程属性UIDPIDPPIDPRINI

PID是进程的idPPID是进程的父进程的id

UID:表示user id,执行者的id

PRINI:和进程的优先级相关,本篇文章后面详细讲解。

我们使用ls -l时,它会显示出来文件的拥有者、所属组,但都是以用户名的形式显示出来的;

我们可以通过ls -ln,查看文件时将用户名以数字形式显示出来;

在这里插入图片描述

进程优先级

首先,优先级是什么?

  • CPU资源分配的先后顺序,就指进程的优先权
  • 优先权高的进程具有优先执行的权利

简单来说,进程优先级就是进程等到CPU资源的先后顺序。

这里我们要理解一下优先级和权限

优先级:是决定得到某种资源的先后顺序。

权限:是决定是否能够得到某种资源。

为什么要存在优先级呢?

简单来说就是,目标资源短缺,我们要通过优先级来确定先后顺序。

那在Linux中,我们如何查看进程的优先级呢?

查看进程优先级

在上述中提到了ps -l,我们可以通过ps -l指令来查看进程的优先级:

在这里插入图片描述

但是,在Linux中优先级是如何表示的呢?

PRINI

这里感觉怪怪的,进程优先级为什么要使用两个值来表示呢?

  • PRI:表示进程的优先级,默认是80
  • NI:表示进程优先级的修正数值;也称为进程的nice值。

我们进程实际的优先级 = PRI(默认) + NI

PRI

PRI表示进程当前的优先级,它的默认值是80

这个非常好理解,就不过多描述了。

NI

  • NI:nice值表示进程可被执行的优先级的修正数值。

nice值为负数时,该进程的优先级值就会变小,优先级就变高,更快的被执行

Linux下,我们调整优先级就是调整nice值。

nice的取值范围是[-20 , 19]

这里进程的PRINI都不是进程真实的优先级,进程真实的优先级P = PRI + NI

这里我们可以通过修改NI值进而影响进程的优先级。

修改进程优先级

我们修改进程优先级,并不是直接修改进程的优先级值,而是通过修改nice值来改变进程的优先级

我们可以通过top来修改已经存在进程的优先级:

在这里插入图片描述

这里,我们修改过一次进程的NI值之后,再次修改会发现,无法进行修改了;

这是因为操作系统为了防止恶意修改进程优先级,只允许普通用户对进程修改一次优先级;

root可以多次修改进程优先级。

这里我们还需要注意:

我们每次修改NI值之后,进程优先级都是等于 PRI的默认值(也就是80)加上NI值。

在这里插入图片描述

nicerenice

除了使用top来修改进程的NI值之外,我们还可以使用nicerenice来修改

nice

nice指令,在程序启动时,修改程序进程的NI值。

nice -n 10 ./code

这个指令就是在./code程序运行时,将nice修改为10

在这里插入图片描述

renice

nice指令是在程序启动时(创建进程时),就给定NI值;而renice指令则是修改已有进程的NI值,从而修改进程优先级。

在这里插入图片描述

这里我们除了通过topnicerenice指令来查看和修改进程优先级之外,我们还可以通过系统调用,在代码中查看和修改进程的优先级

getpriority:获取当前进程的优先级;

setpriority:修改当前进程的优先级。

在这里插入图片描述

可以看到这两个函数都是系统调用,这里就不过多描述了;

在后续内容中遇到了再详细讲解。

这里,普通用户只能修改一次进程的优先级!!!

进程优先级的范围

我们可以修改Ni,从而影响进程的优先级,但是我们不能把NI修改的非常大或者非常小吧;

NI值的取值范围: [-20,19](一共40个数据)
进程优先级的范围:[60 , 99](一共40个优先级)

在这里插入图片描述
可以看到进程NI值的范围的确是[-20 , 19];进程优先级的范围的确是[60 , 99]

理解竞争、独立、并发、并行

进程具有竞争性、独立性、并行、并发;

  • 竞争性:系统中的进程非常多,而CPU资源只有很少的一部分,所以进程之间是具有竞争属性的;为了使效率更高,更好的完成认为,更合理的竞争资源,就有了优先级这一概念。
  • 独立性:多进行运行,需要独自享有各种资源,多进程运行之间互不影响。
  • 并行:多个进程在多个CPU下分别,同时运行,称为并行
  • 并发:多个进程在一个CPU下采用进程切换的方式,在这一段时间内,多个进程都得以推进,称为进程的并发。

到这里,本篇文章的内容就结束了
简单总结:

  • 了解了进程的优先级
  • 进程PRINI
  • 查看和修改进程的优先级(NI值)
  • 进程的特性(竞争性、独立性、并行、并发)
### 如何在 UniApp Vue3 小程序中实现锚点效果 #### 使用 `scrollIntoView` 方法实现锚点定位 为了实现在页面内通过点击链接或按钮使页面滚动至特定位置的功能,在 UniAppVue3 中可以利用 JavaScript 的原生方法 `document.querySelector(&#39;#id名&#39;).scrollIntoView()` 来完成。此方法允许开发者指定一个 DOM 节点作为目标,浏览器会自动调整视窗使得该节点可见[^1]。 对于 Vue 组件而言,通常会在模板部分定义好各个区块对应的 ID 或者 class 名称,之后借助于事件处理函数来触发滚动行为: ```html <template> <view> <!-- 锚点导航 --> <navigator hover-class="none" @click="toAnchor(&#39;section-one&#39;)">前往第一节</navigator> <navigator hover-class="none" @click="toAnchor(&#39;section-two&#39;)">前往第二节</navigator> <!-- 页面内容区 --> <view id="section-one">...内容...</view> <view id="section-two">...更多内容...</view> </view> </template> ``` ```javascript <script setup> import { ref } from &#39;vue&#39;; const toAnchor = (anchorId) => { const el = document.getElementById(anchorId); if (el) { el.scrollIntoView({ behavior: &#39;smooth&#39; }); } }; </script> ``` 上述代码片段展示了如何创建简单的锚点菜单以及相应的跳转逻辑。当用户点击某项时,JavaScript 函数 `toAnchor` 接收参数并查找对应 ID 的元素,调用其 `.scrollIntoView()` 方法以平滑的方式滚动到相应区域。 值得注意的是,在实际项目里可能还需要考虑一些额外的因素,比如兼容性问题或是更复杂的布局情况下的精确控制等。此外,考虑到不同平台间的差异(H5 vs 微信小程序),有时也需要针对具体环境做适当优化[^2]。
评论 52
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迟来的grown

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值