進程和線程(1)

前言:

在計算機中cpu就像一座工廠,這個工廠里面有許多的車間,但是假如工廠的電力有限,一次只能供給一個車間使用,也就是說當一個車間在進行工作的時候,其他車間是不能工作的(單個cpu只能運行一個任務),進程就想是車間,它代表一個cpu所能處理的單個任務。任一時刻,cpu總是運行一個進程,其他進程處于非運行狀態。同時在一個車間里面,還有很多工人,他們協同去完成一個任務。線程就好比一個車間里面的工人。一個進程中可以有多個線程。車間的空間是共享的,比如許多房間允許工人進出,這象征了一個進程的內存空間是共享的,每個線程都可以使用這些共享內存。

但是因為不同的房間大小不一樣,有些地方只能容納一個人,比如廁所,里面有人其他人就不能進出,只能等前面人出來了,后面的人才能進去,解決辦法就是,在門口上加一把鎖,前面的人在使用廁所的時候,把門鎖上,不允許其他的人來使用,后面的人看到了上鎖就自動排隊,當使用完了之后,把鎖打開,后門的人才能進去這叫“互斥鎖”(后面會詳細說明),防止多個線程同時讀取同一塊內存區域。

但是又有些地方能容納n個人(n>1),比如廚房,這時候的解決辦法就是在門口掛n把鎖,每進去一個人,就拿鑰匙關閉一把鎖,出來時,就把鑰匙放回原處,當鑰匙空了,后面的人就排隊等。這種做法叫“信號量”,用來保證多個線程之間不會互相沖突。

進程:

1.進程的含義:

操作系統中的重要概念:一個運行起來的程序。

定義:進程是一個具有一定獨立功能的程序在一個數據集合依次動態執行的過程。進程是一個正在執行的程序實例,其中涉及到程序計數器,寄存器和程序變量的參與(在cpu上)。

2.進程的特征:

1.進程是依賴于程序運行而存在的,進程是動態的,而程序是靜態的。

2.進程是操作系統進行資源分配和調度的一個獨立單位。

3.每個進程都有獨立的地址空間,包括代碼區,數據區,堆棧區。進程之間的地址空間隔離的,互不影響

3.在操作系統的視角里,如何管理這么多的進程呢?

1.對進程進行描述:

我們可以用結構體,描述出進程的核心屬性(進程的狀態,進程的優先級,進程的上下文,進程的記賬信息)

進程控制塊(PCB):非常大的結構體,有很多的屬性。

2.將多個進程組織起來:

比如:可以使用鏈表一樣的形式(不一定是鏈表),把多個PCB串到一起。

1)創建一個新的進程

1.創建一個PCB,初始化PCB中的各個屬性。

2.再把PCB加到鏈表上

2)銷毀一個進程:

把這個進程的PCB在鏈表中找到,并從鏈表中刪除。

3)查看進程列表:

遍歷鏈表,取出鏈表中的每一個元素,把里面的關鍵元素顯示到屏

單任務和多任務:

在早期的計算機中,是“單任務”操作系統:

同一時刻,只允許一個進程,要想運行下一個進程,就要結束上一個進程。

多任務系統:(在多核處理器前,多任務系統就有了)

即使cpu只有一個核心,也能“同時”運行多個進程。這里有一個新的概念:分時復用。

*分時復用:

分時復用:把一個單位時間,分成很多份

第一份時間運行進程1的指令

第二份時間運行進程2的指令

這里的指令是前面提到的PCB中的內存指針(需要知道進程執行到哪了)

因為cpu運行速度足夠快,上述的切換過程,也會很快,會超出我們人類的反應時間,所以我們看起來這些進程是“同時執行”的(但是如果進程也很多,就會增大cpu的消耗資源,就會出現卡頓的情況)

并發執行:

我們把單個cpu核心,按照分時復用,執行多個進程,這樣的方式,稱為“并發執行”。

人看起來是同時執行的,微觀上,其實是一個cpu在串行執行,切換很快。

但是如今cpu中,并不只有一個核心,而是有多個核心,所以不同的核心,在不用分時復用的情況下,也能同時執行多個不同的進程

我們把多個cpu核心,同時執行多個不同進程的這樣方式,稱為“并行執行”也是“同時執行”。

但在cpu中,執行進程的時候,并發和并行是同時進行的。既有并發執行也有并行執行,統稱為“并發

1.PCB中的一些關鍵要點:

1.Pid(進程id):進程的身份標識符。

2.內存指針:進程就需要知道執行的指令在哪,指令依賴的數據在哪。

3.文件描述符表:進程運行過程中,很多時候,需要和一個硬盤這個硬件設備進行交互,硬盤上的數據就是以文件形式來組織的。(進程每一次打開一個文件,就會把這個文件的信息保存到文件描述符表中)

2.PCB進一步屬性:

4.進程的狀態

5.進程的優先級

6.進程的上下文

7.進程的記賬信息

4.進程的狀態:

進程狀態有兩種:1.就緒狀態,2.阻塞狀態

1.就緒狀態:隨叫隨到,此時進程隨時都能到cpu上進行執行(不區分就緒和執行,都是就緒)

2.阻塞狀態:進程當前不適合當cpu去執行

5.進程的優先級:

在很多進程中,它們能夠到cpu上面執行的機會并不是均等的。有的進程優先級會更高一些,吃的資源就會更多。

6.進程的上下文:

因為進程在cpu執行的時候是“并發執行”。所以進程在調度的時候,一個進程執行一會,會失去cpu資源,過一段時間該進程還會回到cpu上去執行。

但是有了進程的上下文,就會沿著上次執行到的狀態,繼續往下執行(非重頭開始執行)

進程在cpu中運行的過程中:

cpu上的各種寄存器,就表示了當前進程運行的“中間狀態”

保存上下文:將cpu中的這些寄存器中的值保存在內存中(PCB對應的屬性中)

恢復上下文:把PCB剛才保存的屬性,填回到對應的cpu寄存器中。

7.進程的記賬信息:

進程的記賬信息(統計功能):統計每個進程都在cpu中運行了多久。

當發現一個進程很長時間沒有吃到cpu資源了,就會給這個進程傾斜一些資源。

進程調度:

1.進程調度主要是決定將CPU資源分配給哪個進程使用。當系統中有多個進程處于就緒狀態情況下(已經準備好運行,只是等待CPU資源),進程調度器會按照一定算法,來選擇一個進程在CPU上運行。

2.每個進程在創建時都會生成對應一個PCB,PCB是進程調度器的基礎,通過管理和控制進程的PCB,操作系統能夠對進程進程調度,合理利用CPU資源,提高系統性能。

3.后面即將提到的線程調度也是如此。

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

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

相關文章

入門-C編程基礎部分:16、 預處理器

飛書文檔https://x509p6c8to.feishu.cn/wiki/DzSJwsGiTiXkeCkyEYUcuXbKnbf C 預處理是編譯過程中一個單獨的步驟,是一個文本替換工具而已。所有的預處理命令都是以井號(#)開頭。 指令描述#define定義宏#ifdef如果宏已經定義,則返…

Ubuntu下安裝和卸載MySQL

Ubuntu下安裝和卸載MySQL 下面的演示系統版本:Ubuntu 24.04 更新系統軟件包 在開始安裝之前,建議先更新系統的軟件包列表,以確保所有依賴項是最新的。 sudo apt update && sudo apt upgrade -y安裝MySQL服務器 Ubuntu的官方軟件…

【Python爬蟲實戰篇】--爬取豆瓣電影信息(靜態網頁)

網站,:豆瓣電影 Top 250 爬取豆瓣前250電影的信息, F12打開網頁控制臺,查看網頁元素, 發現網頁數據直接可以查看到,為靜態網頁數據,較為簡單 目錄 1.第一步使用urllib庫獲取網頁 2.第二步使…

【Unity知識點詳解】Unity中泛型單例的使用,兼容WebGL

今天來講下Unity中泛型單例的使用,包含普通單例和繼承MonoBehaviour的單例。重點是需要兩種泛型單例兼容WebGL平臺,話不多說直接開始。 泛型單例的設計目標 作為泛型單例,需要實現以下幾個目標: 全局唯一,在程序的整個…

Python進程與線程的深度對比

一、核心概念對比 1. 進程(Process) 操作系統級獨立單元:每個進程擁有獨立的內存空間(堆、棧、代碼段) 資源隔離性:崩潰不影響其他進程 多核并行:可充分利用多核CPU資源 2. 線程&#xff0…

Django 入門指南:構建強大的 Web 應用程序

什么是 Django? Django 是一個開源的高層次 Python Web 框架,旨在快速開發安全且可維護的網站。它通過簡化常見的 Web 開發任務,幫助開發者專注于開發應用的核心功能。Django 實現了“快速開發”和“盡量少的重復”的理念,提供了…

ESP-ADF外設子系統深度解析:esp_peripherals組件架構與核心設計(顯示輸出類外設之IS31FL3216)

目錄 ESP-ADF外設子系統深度解析:esp_peripherals組件架構與核心設計(顯示輸出類外設之IS31FL3216)簡介模塊概述功能定義架構位置核心特性 IS31FL3216外設分析IS31FL3216外設概述IS31FL3216外設層次架構圖 IS31FL3216外設API和數據結構外設層…

【計算機網絡 | 第三篇】常見的網絡協議(二)

沒有看過我寫的關于網絡協議的第一篇博客可以看【計算機網絡 | 第二篇】常見的通信協議(一)-CSDN博客 TCP的三次握手和四次揮手 TCP三次握手 三次握手是TCP協議建立可靠連接的過程,目的是確保客戶端和服務端雙方的雙向通信能力正常&#x…

HAL庫(STM32CubeMX)——高級ADC學習、HRTIM(STM32G474RBT6)

系列文章目錄 文章目錄 系列文章目錄前言存在的問題HRTIMcubemx配置前言 對cubemx的ADC的設置進行補充 ADCs_Common_Settings Mode:ADC 模式 Independent mod 獨立 ADC 模式,當使用一個 ADC 時是獨立模式,使用兩個 ADC 時是雙模式,在雙模式下還有很多細分模式可選 ADC_Se…

Unity接入安卓SDK(3)厘清Gradle的版本

接入過程中,很多人遇到gradle的各種錯誤,由于對各種gradle版本的概念不甚了了,模模糊糊一頓操作猛如虎,糊弄的能編譯通過就萬事大吉,下次再遇到又是一臉懵逼。所以我們還是一起先厘清gradle的版本概念。 1 明晰概念 …

python-67-基于plotly的繪圖可視化和智能推薦圖表

文章目錄 1 各種圖表的適用場景1.1 面積圖1.2 餅圖1.3 散點圖1.3.1 散點1.3.2 散點加線1.4 折線圖1.5 箱線圖1.5.1 不同類別的箱線圖1.5.2 一個變量的箱線圖1.5.3 多個變量的箱線圖1.6 小提琴圖1.6.1 不同類別的小提琴圖1.6.2 一個變量的小提琴圖1.7 直方圖1.7.1 直方圖1.7.2 分…

Spring AI MCP

MCP是什么 MCP是模型上下文協議(Model Context Protocol)的簡稱,是一個開源協議,由Anthropic(Claude開發公司)開發,旨在讓大型語言模型(LLM)能夠以標準化的方式連接到外…

c++_csp-j算法 (3)

弗洛伊德算法(Floyd) Floyd算法又稱為插點法,是一種利用動態規劃的思想尋找給定的加權圖中多源點之間最短路徑的算法,與Dijkstra算法類似。該算法名稱以創始人之一、1978年圖靈獎獲得者、斯坦福大學計算機科學系教授羅伯特弗洛伊…

QT常見輸入類控件及其屬性

Line Edit QLineEdit用來表示單行輸入框,可以輸入一段文本,但是不能換行 核心屬性: 核心信號 信號 說明 void cursorPositionChanged(int old,int new) 當鼠標移動時發出此型號,old為先前位置,new為新位置 void …

【k8s系列1】一主兩從結構的環境準備

環境準備 虛擬機軟件準備及安裝,這里就不詳細展開了,可以看文章:【一、虛擬機vmware安裝】 linux環境準備及下載,下載鏡像centOS7.9,以前也有寫過這個步驟的文章,可以看:【二、安裝centOS】 開始進入正題…

【C++類和數據抽象】類的作用域

目錄 一、類的作用域基本概念 1.1 什么是類的作用域 1.2 作用域層次體系 1.3 類作用域的特點 1.4 基本訪問規則 二、訪問控制三劍客 2.1 public:開放接口 2.2 private:數據封裝 2.3 protected:繼承通道 2.4 跨作用域訪問示例 三…

opencv圖片顏色識別,顏色的替換

圖片顏色識別 1. RGB顏色空間2. 顏色加法2.1使用numpy對圖像進行加法2.2使用opencv加法(cv2.add) 3 顏色加權加法(cv2.addWeighted())4. HSV顏色空間5. 制作掩膜4. 與運算(cv2.bitwise_and)5.顏色的替換7 R…

ADC數據不穩定的解決方案

問題如圖: 解決方案:上圖第一個通道后來接入GND,就穩定了 上圖第一個通道后來接入VCC,就穩定了

Spark(18)Yarn-概述

Hadoop三大核心組件:HDFS、MapReduce和YARN 一)Yarn的概念 YARN(Yet Another Resource Negotiator,另一種資源協調者)是一個通用資源管理系統和調度平臺,可為上層應用提供統一的資源管理和調度。它的引入為集群在利用率,資源統一管…

Flowith AI,解鎖下一代「知識交易市場」

前言 最近幾周自媒體號都在瘋狂推Manus,看了幾篇測評后,突然在某個時間節點,在特工的文章下,發現了很小眾的Flowith。 被這段評論給心動到,于是先去注冊了下賬號。一翻探索過后,發現比我想象中要有趣的多&…