Linux:進程優先級與命令行參數

目錄

1.進程優先級

1.1 基本概念

1.2 查看系統進程

1.3 修改進程優先級的命令

2.進程間切換

2.1 相關概念

2.2 Linux2.6內核進程調度隊列(了解即可)

3.命令行參數


1.進程優先級

1.1 基本概念

  1. cpu資源分配的先后順序,就是指進程的優先權(priority)。
  2. 優先權高的進程有優先執行權利。配置進程優先權對多任務環境的linux很有用,可以改善系統性能。
  3. 還可以把進程運行到指定的CPU上,這樣一來,把不重要的進程安排到某個CPU,可以大大改善系統整體性能。?

我們知道進程在內存中是需要排隊的,比如運行隊列,等待隊列。那排隊是干什么的:就是在確認優先級,來確定得到某種資源的先后順序。為什么要確認優先級,本質就是資源不足。那么操作系統是怎么做到呢?我們下面講解:

優先級其實就是PCB中的一個 int 字段數值越小,優先級越大,跟我們的考試排名一樣。Linux進程的優先級數值范圍:60~99。Linux中默認進程的優先級都是80。

1.2 查看系統進程

我們先編寫一段代碼

在linux或者unix系統中,用ps -la 命令則會類似輸出以下幾個內容:

我們很容易注意到其中的幾個重要信息,有下:

  • UID : 代表執行者的身份
  • PID : 代表這個進程的代號
  • PPID :代表這個進程是由哪個進程發展衍生而來的,亦即父進程的代號
  • PRI :代表這個進程可被執行的優先級,其值越小越早被執行
  • NI :代表這個進程的nice值

PRI and NI:

PRI也還是比較好理解的,即進程的優先級,或者通俗點說就是程序被CPU執行的先后順序,此值越小進程的優先級別越高

那NI就是我們所要說的nice值了,其表示進程可被執行的優先級的修正數值

PRI值越小越快被執行,那么加入nice值后,將會使得PRI變為PRI(new)=PRI(old)+nice。pri(old)?,都是從80開始的!

這樣,當nice值為負值的時候,那么該程序將會優先級值將變小,即其優先級會變高,則其越快被執行所以,調整進程優先級,在Linux下,就是調整進程nice值

nice其取值范圍是-20至19,一共40個級別。nice調整最小是:-20,超過部分統一當成-20。nice調整最大是:19,超過部分統一當成19。


PRI vs NI:

  • 需要強調一點的是,進程的nice值不是進程的優先級,他們不是一個概念,但是進程nice值會影響到進程的優先級變化。可以理解nice值是進程優先級的修正修正數據

1.3 修改進程優先級的命令

用top命令更改已存在進程的nice:

  • top
  • 進入top后按“r”–>輸入進程PID–>輸入nice值

我們輸入進程號講 nice 改為19

普通用戶是沒有辦法將優先級調大,讓PRI減小的。需要使用su換成root,或使用sudo命令。?

2.進程間切換

2.1 相關概念

  • 競爭性: 系統進程數目眾多,而CPU資源只有少量,甚至1個,所以進程之間是具有競爭屬性的。為了高效完成任務,更合理競爭相關資源,便具有了優先級。
  • 獨立性: 多進程運行,需要獨享各種資源,多進程運行期間互不干擾。
  • 并行: 多個進程在多個CPU下分別,同時進行運行,這稱之為并行。
  • 并發: 多個進程在一個CPU下采用進程切換的方式,在一段時間之內,讓多個進程都得以推進,稱之為并發。

因為要并發,所以必定要考慮進程間切換。

每一個進程不是占有CPU就一直運行,每隔一段時間,會自動被操作系統從cpu上剝離下來。Linux內核是支持進程之間進行cpu資源搶占的!是基于時間片的輪轉式搶占式內核。

為什么我們函數內定義的棧臨時變量,會返回給外部,我們的程序/進程,它怎么知道我們當前運行到哪里里?如何做到函數間跳轉? 因為cpu內存在大量寄存器,比如eip是程序計數器或者叫pc,會自動執行我們要執行的下一行代碼。我們的進程在運行的時候,是會使用這些寄存器的,我們的進程,會產生各種數據,在寄存器中臨時保存。

如果我們有多個進程呢?各個進程在CPU寄存器中形成的臨時數據,都應該是不一樣的!而cpu內寄存器只有一套,我們如何做到讓每個進程使用cpu時能從上次時間片執行到的位置繼續執行?我們可以先簡單的理解為時間片結束后,cpu寄存器中的數據會先保存到進程PCB中,然后下次執行時先讀取PCB中存儲的寄存器的數據,然后繼續執行,本質就是將CPU寄存器的內容,保存到內存中!

2.2 Linux2.6內核進程調度隊列(了解即可)

上圖是Linux2.6內核中進程隊列的數據結構,之間關系也已經給大家畫出來,方便大家理解

一個CPU擁有一個runqueue

  • 如果有多個CPU就要考慮進程個數的負載均衡問題

優先級

  • 普通優先級:100~139(我們都是普通的優先級,想想nice值的取值范圍,可與之對應!)
  • 實時優先級:0~99(我們這里不關心)

活動隊列

  • 時間片還沒有結束的所有進程都按照優先級放在該隊列
  • nr_active: 總共有多少個運行狀態的進程
  • queue[140]: 一個元素就是一個進程隊列,相同優先級的進程按照FIFO規則進行排隊調度,所以,數組下標就是優先級!
  • 從該結構中,選擇一個最合適的進程,過程是怎么的呢?

1. 從0下表開始遍歷queue[140]
2. 找到第一個非空隊列,該隊列必定為優先級最高的隊列
3. 拿到選中隊列的第一個進程,開始運行,調度完成!
4. 遍歷queue[140]時間復雜度是常數!但還是太低效了!

  • bitmap[5]:一共140個優先級,一共140個進程隊列,為了提高查找非空隊列的效率,就可以用 5*32 個比特位表示隊列是否為空,即位段,這樣,便可以大大提高查找效率!

過期隊列

  • 過期隊列和活動隊列結構一模一樣
  • 過期隊列上放置的進程,都是時間片耗盡的進程,或者是剛到運行對列中的進程。
  • 當活動隊列上的進程都被處理完畢之后,對過期隊列的進程進行時間片重新計算

active指針和expired指針

  • active指針永遠指向活動隊列
  • expired指針永遠指向過期隊列
  • 可是活動隊列上的進程會越來越少,過期隊列上的進程會越來越多,因為進程時間片到期時一直都存在的。
  • 沒關系,在合適的時候,只要能夠交換active指針和expired指針的內容,就相當于有具有了一批新的活動進程!

總結

在系統當中查找一個最合適調度的進程的時間復雜度是一個常數,不隨著進程增多而導致時間成本增加,我們稱之為進程調度O(1)算法

3.命令行參數

?命令行參數是什么?

我們看下面一段代碼看下面一段代碼

#include <stdio.h>    
#include <string.h>    
#include <stdlib.h>    
int main(int argc, char *argv[])    
{    int i = 0;for(;i<argc;i++){printf("%d: %s\n",i, argv[i]);}printf("hello world\n");return 0;
}

運行輸出:?

可以發現main函數是可以傳參的,shell 會自動講命令行輸入的一大串字符,按空格分割成小的字串,第一參數argc存命令行字串個數,第二個參數argc是一個指針數組存字串內容。

命令行參數,可以支持各種指令級別的命令行選項的設置!這樣就可以理解之前學的指令,選項是什么關系了。

我們來模擬實現一個計算器

#include <stdio.h>    
#include <string.h>    
#include <stdlib.h>    
int main(int argc, char *argv[])    
{    if(argc != 4)      {      printf("Use error\nUsage: %s op[-add|sub|mul|div] d1 d2\n",argv[0]);      return 1;      }      // 你的程序一定有4個命令行參數,第一個是程序名      int x = atoi(argv[2]);      int y = atoi(argv[3]);      if(strcmp(argv[1],"-add")==0)      {      int result = x+y;      printf("%d+%d=%d\n",x,y,result);      }      else if(strcmp(argv[1],"-sub")==0)      {      int result = x-y;      printf("%d-%d=%d\n",x,y,result);      }      else if(strcmp(argv[1],"-mul")==0)      {      int result = x*y;      printf("%d*%d=%d\n",x,y,result);                                                                                                       }  else if(strcmp(argv[1],"-div")==0)      {      if(0==y)      {printf("%d/%d=error! div zero\n",x,y);}else {int result = x/y;printf("%d/%d=%d\n",x,y,result);}}else {printf("Use error,you should use the right command line\nUsage: %s op[-add|sub|mul|div] d1 d2\n",argv[0]);}return 0;
}

?運行結果:

對于為什么系統命令不用加 ./指定位置?,而我們寫的程序就需要寫 ./?,這就涉及到環境變量了,下一篇文章我們講解環境變量。

本篇結束!

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

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

相關文章

【C++】在類外部定義成員函數時,不應該再次指定默認參數值

2023年12月10日&#xff0c;周日下午 錯誤的代碼 #include<iostream>class A { public:void fun(int a10); };void A::fun(int a10) //<----在這里報錯 {}int main() {} 正確的代碼 代碼目前有一個問題&#xff0c;主要是在類外部定義成員函數時&#xff0c;不應該…

解密QQ號——C語言

題目&#xff1a; 有一串已加密的數字“6 3 1 7 5 8 9 2 4”解密規則&#xff1a;首先將第1個數字刪除&#xff0c;緊接著將第2個數字放到這串數字的末尾&#xff0c;再將第3個數字刪除并將第4個數字放到這串數字的末尾&#xff0c;再將第5個數刪除 代碼實現&#xff1a; #inc…

利用Node.js和cpolar實現遠程訪問,無需公網IP和路由器設置的完美解決方案

文章目錄 前言1.安裝Node.js環境2.創建node.js服務3. 訪問node.js 服務4.內網穿透4.1 安裝配置cpolar內網穿透4.2 創建隧道映射本地端口 5.固定公網地址 前言 Node.js 是能夠在服務器端運行 JavaScript 的開放源代碼、跨平臺運行環境。Node.js 由 OpenJS Foundation&#xff0…

ESP32網絡編程-OTA方式升級固件(基于Web瀏覽器)

OTA方式升級固件(基于Web瀏覽器) 文章目錄 OTA方式升級固件(基于Web瀏覽器)1、ESP32的OTA介紹2、OTA升級固件方式3、軟件準備4、硬件準備5、代碼實現6、一種優雅方式實現Web方式OTA升級6.1 基礎OTA代碼6.2 新固件庫代碼在前面的文章中,我們在Arduino IDE的網絡端口中,實現…

LeetCode 77.組合

題目&#xff1a; 給定兩個整數 n 和 k&#xff0c;返回范圍 [1, n] 中所有可能的 k 個數的組合。 你可以按 任何順序 返回答案。 方法&#xff1a;靈神-組合型回溯 剪枝 class Solution {private int k;private final List<Integer> path new ArrayList<>();…

反序列化 [網鼎杯 2020 朱雀組]phpweb 1

打開題目 我們發現這個頁面一直在不斷的刷新 我們bp抓包一下看看 我們發現index.php用post方式傳了兩個參數上去&#xff0c;func和p 我們需要猜測func和p兩個參數之間的關系&#xff0c;可以用php函數MD5測一下看看 我們在響應處得到了一串密文&#xff0c;md5解密一下看看 發…

Windows11安裝使用Oracle21C詳細步驟<圖文保姆級>新版本

Windows11安裝使用Oracle21C詳細步驟<圖文保姆級>新版本 Database Software Downloads | Oracle 中國 下載完成后解壓縮 雙擊setup.exe 打開安裝頁面 同意下一步 更改自己的路徑點擊下一步 輸入密碼 下一步安裝等待即可 等待加載配置時間有點久 完成即可 使用 搜索…

【Kubernetes】四層代理Service

Service四層代理 一、Service概念原理1.1、為什么要有Service1.2、Service概述1.3、工作原理1.4、三類IP地址【1】Node Network&#xff08;節點網絡&#xff09;【2】Pod network&#xff08;pod 網絡&#xff09;【3】Cluster Network&#xff08;服務網絡&#xff09; 二、S…

C++之異常處理

C語言傳統的處理錯誤的方式 傳統的錯誤處理機制&#xff1a; 1. 終止程序, 如assert. 缺陷: 用戶難以接受, 如發生內存錯誤, 除0錯誤時就會終止程序. 如果assert括號里面的表達式結果為假, 那么assert就會中斷程序并報錯, 所以使用assert可以幫助我們在程序判斷一些可能出錯的…

翻轉二叉樹(圖解、前序遍歷、遞歸與非遞歸)

LCR 144. 翻轉二叉樹 - 力扣&#xff08;LeetCode&#xff09; 給定一棵二叉樹的根節點 root&#xff0c;請左右翻轉這棵二叉樹&#xff0c;并返回其根節點。 示例 1&#xff1a; 輸入&#xff1a;root [5,7,9,8,3,2,4] 輸出&#xff1a;[5,9,7,4,2,3,8] 提示&#xff1a; …

【11】Qt Designer

目錄 VSCode添加外部工具 QtDesigner PyUIC PyRCC 加載UI文件模板代碼 QMainWindow QWidget 常用知識點 1. 修改標題圖標 2. 圖片資源管理 3. 圖片按鈕 4. 加載對話框 5. 動態加載Widget 6. 修改主題 其他注意事項 事件被多次觸發 PyQt5提供了一個可視化圖形工…

【小沐學Python】Python實現WebUI網頁圖表(gradio)

文章目錄 1、簡介2、安裝3、基本測試3.1 入門代碼3.2 組件屬性3.3 多個輸入和輸出組件3.4 圖像示例3.5 聊天機器人3.6 模塊&#xff1a;更靈活、更可控3.7 進度條 結語 1、簡介 https://www.gradio.app/ Gradio是用友好的網絡界面演示機器學習模型的最快方法&#xff0c;因此…

【T+】暢捷通T+軟件安裝過程中停留在:正在配置產品位置或進度80%位置。

【問題描述】 暢捷通T軟件在安裝過程中&#xff0c; 進度條一直停留在【正在配置產品…】位置。 【解決方法】 打開【任務管理器】&#xff0c;想必這個如何打開&#xff0c;大家應該都會。 在【進程】中找到【DBConfig.exe】或者【Ufida.T.Tool.SM.DBConfig.exe】進程并結束…

TS條件類型、斷言及名義類型

文章將討論處理類型的幾個高級模式&#xff0c;包括模擬名義類型的類型烙印、利用條件類型的分配性質在類型層面操作類型&#xff0c;以及安全地擴展原型。 1 函數類型 TS在推導元組的類型時會放寬要求&#xff0c;推導出的結果盡量寬泛&#xff0c;不在乎元組的長度和各位置…

Spring Cloud Gateway使用和配置

Spring Cloud Gateway是Spring官方基于Spring 5.0&#xff0c;Spring Boot 2.0和Project Reactor等技術開發的網關&#xff0c;Spring Cloud Gateway旨在為微服務架構提供一種簡單而有效的統一的API路由管理方式。Spring Cloud Gateway作為Spring Cloud生態系中的網關&#xff…

Linux 基礎IO

文章目錄 前言基礎IO定義系統IO接口文件描述符重定向原理緩沖區刷新 前言 要知道每個函數/接口的全部參數和返回值建議去官網或者直接在Linux的man手冊中查&#xff0c;這不是復制粘貼函數用法的文章。 C語言文件讀寫介紹鏈接 基礎IO定義 IO是Input/Output的縮寫&#xff0c…

optional

參考資料&#xff1a; Java8 Optional用法和最佳實踐 - 掘金 一、背景 根據Oracle文檔&#xff0c;Optional是一個容器對象&#xff0c;可以包含也可以不包含非null值。Optional在Java 8中引入&#xff0c;目的是解決 NullPointerExceptions的問題。本質上&#xff0c;Optio…

2024年網絡安全競賽-網站滲透

網站滲透 (一)拓撲圖 1.使用滲透機對服務器信息收集,并將服務器中網站服務端口號作為flag提交; 使用nmap工具對靶機進行信息收集 2.使用滲透機對服務器信息收集,將網站的名稱作為flag提交; 訪問頁面即可 3.使用滲透機對服務器滲透,將可滲透頁面的名稱作為flag提交…

Python:核心知識點整理大全5-筆記

目錄 2. 使用方法pop()刪除元素 3. 彈出列表中任何位置處的元素 4. 根據值刪除元素 3 章 列表簡介 3.3 組織列表 3.3.1 使用方法 sort()對列表進行永久性排序 3.3.2 使用函數 sorted()對列表進行臨時排序 3.3.3 倒著打印列表 3.3.4 確定列表的長度 3.5 小結 2. 使用方…

軟件測試:測試用例八大要素模板

一、通用測試用例八要素 1、用例編號&#xff1b; 2、測試項目&#xff1b; 3、測試標題&#xff1b; 4、重要級別&#xff1b; 5、預置條件&#xff1b; 6、測試輸入&#xff1b; 7、操作步驟&#xff1b; 8、預期輸出 二、具體分析通用測試用例八要素 1、用例編號 一般是數字…