深入了解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值)
  • 進程的特性(競爭性、獨立性、并行、并發)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/79333.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/79333.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/79333.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Expected SARSA算法詳解:python 從零實現

🧠 向所有學習者致敬! “學習不是裝滿一桶水,而是點燃一把火。” —— 葉芝 我的博客主頁: https://lizheng.blog.csdn.net 🌐 歡迎點擊加入AI人工智能社區! 🚀 讓我們一起努力,共創…

1penl配置

好的,根據您提供的 1pctl 命令輸出信息,我們來重新依次回答您的所有問題: 第一:1Panel 怎么設置 IP 地址? 根據您提供的 user-info 輸出: 面板地址: http://$LOCAL_IP:34523/93d8d2d705 這里的 $LOCAL_I…

鏈表的回文結構題解

首先閱讀題目: 1.要保證是回文結構 2.他的時間復雜度為O(n)、空間復雜度為O(1) 給出思路: 1.首先利用一個函數找到中間節點 2.利用一個函數逆置中間節點往后的所有節點 3.現在有兩個鏈表,第一個鏈表取頭節點一直到中間節點、第二個鏈表取頭結點到尾…

【LLaMA-Factory實戰】1.3命令行深度操作:YAML配置與多GPU訓練全解析

一、引言 在大模型微調場景中,命令行操作是實現自動化、規模化訓練的核心手段。LLaMA-Factory通過YAML配置文件和多GPU分布式訓練技術,支持開發者高效管理復雜訓練參數,突破單機算力限制。本文將結合結構圖、實戰代碼和生產級部署經驗&#…

C++負載均衡遠程調用學習之 Dns-Route關系構建

目錄 1.LARS-DNS-MYSQL環境搭建 2.LARSDNS-系統整體模塊的簡單說明 3.Lars-Dns-功能說明 4.Lars-Dns-數據表的創建 5.Lars-Dns-整體功能說明 6.Lars-DnsV0.1-Route類的單例實現 7.Lars-DnsV0.1-Route類的鏈接數據庫方法實現 8.Lars-DnsV0.1-定義存放RouteData關系的map數…

fastapi+vue中的用戶權限管理設計

數據庫設計:RBAC數據模型 這是一個典型的基于SQLAlchemy的RBAC權限系統數據模型實現,各模型分工明確,共同構成完整的權限管理系統。 圖解說明: 實體關系: 用戶(USER)和角色(ROLE)通過 USER_ROLE 中間表實現多對多關系…

【Python實戰】飛機大戰

開發一個飛機大戰游戲是Python學習的經典實戰項目,尤其適合結合面向對象編程和游戲框架(如Pygame)進行實踐。以下是游戲設計的核心考慮因素和模塊劃分建議: 一、游戲設計核心考慮因素 性能優化 Python游戲需注意幀率控制&#xff…

Flowable7.x學習筆記(十八)拾取我的待辦

前言 本文從解讀源碼到實現功能,完整的學習Flowable的【TaskService】-【claim】方法實現的任務拾取功能。 一、概述 當調用 TaskService.claim(taskId, userId) 時,Flowable 會先加載并校驗任務實體,再判斷該任務是否已被認領;若…

SQL經典實例

第1章 檢索記錄 1.1 檢索所有行和列 知識點:使用SELECT *快速檢索表中所有列;顯式列出列名(如SELECT col1, col2)提高可讀性和可控性,尤其在編程場景中更清晰。 1.2 篩選行 知識點:通過WHERE子句過濾符合條…

HTTPcookie與session實現

1.HTTP Cookie 定義 HTTP Cookie (也稱為 Web Cookie 、瀏覽器 Cookie 或簡稱 Cookie )是服務器發送到 用戶瀏覽器并保存在瀏覽器上的一小塊數據,它會在瀏覽器之后向同一服務器再次發 起請求時被攜帶并發送到服務器上。通常&#xff0…

【算法基礎】冒泡排序算法 - JAVA

一、算法基礎 1.1 什么是冒泡排序 冒泡排序是一種簡單直觀的比較排序算法。它重復地走訪待排序的數列,依次比較相鄰兩個元素,如果順序錯誤就交換它們,直到沒有元素需要交換為止。 1.2 基本思想 比較相鄰元素:從頭開始&#xf…

0902Redux_狀態管理-react-仿低代碼平臺項目

文章目錄 1 Redux 概述1.1 核心概念1.2 基本組成1.3 工作流程1.4 中間件(Middleware)1.5 適用場景1.6 優缺點1.7 Redux Toolkit(現代推薦)1.8 與其他工具的對比1.9 總結 2 todoList 待辦事項案例3 Redux開發者工具3.1 核心功能3.2…

《ATPL地面培訓教材13:飛行原理》——第6章:阻力

翻譯:Leweslyh;工具:Cursor & Claude 3.7;過程稿 第6章:阻力 目錄 引言寄生阻力誘導阻力減少誘導阻力的方法升力對寄生阻力的影響飛機總阻力飛機總重量對總阻力的影響高度對總阻力的影響構型對總阻力的影響速度穩…

C++總結01-類型相關

一、數據存儲 1.程序數據段 ? 靜態(全局)數據區:全局變量、靜態變量 ? 堆內存:程序員手動分配、手動釋放 ? 棧內存:編譯器自動分配、自動釋放 ? 常量區:編譯時大小、值確定不可修改 2.程序代碼段 ?…

【Hot 100】94. 二叉樹的中序遍歷

目錄 引言二叉樹的中序遍歷我的解題代碼優化更清晰的表述建議: 🙋?♂? 作者:海碼007📜 專欄:算法專欄💥 標題:【Hot 100】94. 二叉樹的中序遍歷?? 寄語:書到用時方恨少&#xff…

大語言模型(LLMs)微調技術總結

文章目錄 全面總結當前大語言模型(LLM)微調技術1. 引言2. 為什么需要微調?3. 微調技術分類概覽4. 各種微調技術詳細介紹4.1 基礎微調方法4.1.1 有監督微調(Supervised Fine-Tuning, SFT)4.1.2 全參數微調(F…

解決Maven項目中報錯“java不支持版本6即更高的版本 7”

錯誤背景 當Maven項目編譯或運行時出現錯誤提示 Java不支持版本6即更高的版本7,通常是由于項目配置的JDK版本與當前環境或編譯器設置不一致導致的。例如: 項目配置的Java版本為6或7,但實際使用的是JDK 17。Maven或IDE的編譯器未正確指定目標…

C++筆記-多態(包含虛函數,純虛函數和虛函數表等)

1.多態的概念 多態(polymorphism)的概念:通俗來說,就是多種形態。多態分為編譯時多態(靜態多態)和運行時多態(動態多態),這里我們重點講運行時多態,編譯時多態(靜態多態)和運行時多態(動態多態)。編譯時多態(靜態多態)主要就是我們前面講的函…

【Unity】MVP框架的使用例子

在提到MVP之前,可以先看看這篇MVC的帖子: 【Unity】MVC的簡單分享以及一個在UI中使用的例子 MVC的不足之處: 在MVC的使用中,會發現View層直接調用了Model層的引用,即這兩個層之間存在著一定的耦合性,而MV…

前端js學算法-實踐

1、兩數之和 const twoSum (nums, target) > {const obj {}for (let m 0; m < nums.length; m) {const cur nums[m]const diff target - curif(obj.hasOwnProperty(diff)){ // 查詢對象中是否存在目標值-當前值鍵值對console.log([obj[diff], m]) // 存在則直接獲取…