聊城網(wǎng)站建設(shè)lcbywlb2b外鏈

一、什么是進(jìn)程
1.1 操作系統(tǒng)
學(xué)習(xí)進(jìn)程之前首先要了解我們的操作系統(tǒng)(OS),我們的操作系統(tǒng)實(shí)際上也是一款軟件,屬于系統(tǒng)軟件的范疇,操作系統(tǒng)早期采用命令提示框與用戶交互,我們啟動(dòng)某個(gè)軟件,打開某個(gè)文件夾等等,都是需要輸入命令來進(jìn)行操作的 典型的就是 Linux 操作系統(tǒng),也是職場(chǎng)中常用的一款操作系統(tǒng),我們現(xiàn)在常用的 Windows 系列的操作系統(tǒng),是一款圖形化操作界面的操作系統(tǒng),用戶使用鼠標(biāo)點(diǎn)一點(diǎn),劃一劃就執(zhí)行對(duì)應(yīng)的操作,所以對(duì)于大眾來講是一款好用的操作系統(tǒng),但是對(duì)應(yīng)的存儲(chǔ)空間(內(nèi)存)的占用是遠(yuǎn)遠(yuǎn)大于命令提示的操作系統(tǒng)。

Windows 啟動(dòng)應(yīng)用是雙擊應(yīng)用的快捷方式圖標(biāo),以qq 為例:
我們桌面的快捷方式可以理解為是 .exe 文件的“超鏈接”,鼠標(biāo)選中快捷方式,右擊,選擇屬性,打開文件所在位置,我們就來到了當(dāng)初我們安裝qq 應(yīng)用時(shí)目錄,鏈接對(duì)應(yīng)了一個(gè) .exe 文件的,我們直接雙擊 .exe 文件也是可以直接啟動(dòng)qq 的。 那么 . exe 是什么文件呢。

EXE可執(zhí)行文件,就是在 WINDOWS環(huán)境下,你雙擊直接就能打開的文件,EXE File英文全名executable file ,譯作可執(zhí)行文件,可移植可執(zhí)行 (PE) 文件格式的文件,它可以加載到內(nèi)存中,并由操作系統(tǒng)加載程序執(zhí)行,是可在操作系統(tǒng)存儲(chǔ)空間中浮動(dòng)定位的可執(zhí)行程序。
操作系統(tǒng)有什么用呢?我覺得是:控制計(jì)算機(jī)各部件協(xié)調(diào)一致的運(yùn)行,
在硬件層面需要管理好各種硬件設(shè)備,比如說,鍵盤,鼠標(biāo),硬盤,當(dāng)時(shí)適配這方面主要是靠主板支持,操作系統(tǒng)能夠適配支持并管理硬件。
在軟件層次,操作系統(tǒng)需要給軟件提供穩(wěn)定的運(yùn)行環(huán)境,當(dāng)然軟件在這個(gè)方面是需要去適配操作系統(tǒng)的,如果操作系統(tǒng)不支持你這軟件運(yùn)行,那也是白給。
可以理解為:操作系統(tǒng)是軟件和硬件之間的橋梁,是計(jì)算機(jī)的靈魂。
有了操作系統(tǒng)之后呢,軟件就可以通過操作系統(tǒng)來間接的操作某個(gè)硬件設(shè)備。
1.2 進(jìn)程的概念 (process)
上面提到我們 windows 中支持的一種 .exe 的運(yùn)行文件,當(dāng)我們雙擊啟動(dòng)這個(gè)文件時(shí),這個(gè)程序就跑起來了,那么在系統(tǒng)中就會(huì)形成一個(gè)進(jìn)程。
不知道有沒有學(xué)習(xí)過C語言的朋友,一個(gè) ".c" 文件到 ".exe "文件需要經(jīng)過:預(yù)編譯、編譯、匯編、鏈接,中間會(huì)涉及到3個(gè)文件。
在C語言中,源程序(.c文件)經(jīng)過編譯程序編譯之后,會(huì)生成一個(gè)后綴為“.obj”的二進(jìn)制文件(稱為目標(biāo)文件);最后還要由稱為“連接程序”(Link)的軟件,把此“.obj”文件與c語言提供的各種庫(kù)函數(shù)連接在一起,生成一個(gè)后綴“.exe”的可執(zhí)行文件。”


.exe 文件也可以理解為里面包含了許多二進(jìn)制的指令,可以在 Windows 系統(tǒng)上運(yùn)行,. exe 文件的啟動(dòng)加載在內(nèi)存中運(yùn)行后,其中指令的處理是交給 CUP (中央處理器)來處理的。
對(duì)于 Java 代碼來說,我們會(huì)創(chuàng)建 “.java”文件,java 文件經(jīng)過我們的JDK (javac命令)編譯后,會(huì)生成 “.class”文件,也叫字節(jié)碼文件,里面也是二進(jìn)制指令,只是 .class 文件需要在 JVM(java虛擬機(jī)) 中才可以運(yùn)行,這也是 java 只要生成了.class 文件, 就可以到處運(yùn)行,只要用戶安裝了 JDK 即可

無論是哪一種語言,計(jì)算機(jī)之所以可以運(yùn)行的最主要的原因是,它最終會(huì)生成 二進(jìn)制文件,然后被 CPU 處理。
上面說到當(dāng)我們運(yùn)行某個(gè)應(yīng)用程序的時(shí)候,就相當(dāng)于生成了一個(gè)進(jìn)程,當(dāng)然每生成一個(gè)進(jìn)程,操作系統(tǒng)就會(huì)為其分配內(nèi)存空間,由CPU 處理其中的數(shù)據(jù),我們可以通過任務(wù)管理器來查看 我們電腦目前進(jìn)程運(yùn)行的狀態(tài)。

我們通過任務(wù)管理器就可以發(fā)現(xiàn),原來電腦有許多進(jìn)程在運(yùn)行呢。
操作系統(tǒng)對(duì)進(jìn)程的管理有兩步:
1. 使用一個(gè)構(gòu)架來描述這個(gè)進(jìn)程,(C 語言的結(jié)構(gòu)體,Java 的類),把進(jìn)程基本信息表示出來。
2. 底層使用一種數(shù)據(jù)結(jié)構(gòu)來將這些進(jìn)程組織起來,放在一起,想象鏈表 每個(gè)value 值是一個(gè)進(jìn)程
CPU 就可以遍歷這種數(shù)據(jù)結(jié)構(gòu),從而達(dá)到處理數(shù)據(jù)的目的。
此時(shí)我們對(duì)進(jìn)程是什么東西應(yīng)該是有了一個(gè)大概的理解:
總結(jié):
進(jìn)程(Process)是計(jì)算機(jī)中的程序關(guān)于某數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),可以把進(jìn)程看做程序的一次運(yùn)行過程。
進(jìn)程在運(yùn)行的是會(huì)消耗資源的,比如:運(yùn)行消耗內(nèi)存,會(huì)涉及到數(shù)據(jù)的訪問——硬盤,數(shù)據(jù)的處理——CPU等一系列操作
進(jìn)程是操作系統(tǒng)分配資源的基本單位
1.3 進(jìn)程的基本屬性
上文我們初步認(rèn)識(shí)到了進(jìn)程個(gè)什么東西:進(jìn)程看做程序的一次運(yùn)行過程。
現(xiàn)在我們認(rèn)識(shí)進(jìn)程的幾個(gè)重要的基本屬性:
進(jìn)程的ID(PID)
每一個(gè)進(jìn)程都有一個(gè)非負(fù)整型表示的唯一進(jìn)程ID(PID),好比方我們的身份證一樣,每一個(gè)人的身份證號(hào)是唯一的。
內(nèi)存指針
看名字大致也能理解是啥意思,就是起一個(gè)標(biāo)識(shí)的作用,當(dāng)前進(jìn)程在內(nèi)存的那一部分運(yùn)行。
文件的描述表
“文件”是硬盤存儲(chǔ)數(shù)據(jù)、整理數(shù)據(jù)的基本單位,可以看到我們的下載某個(gè)軟件的安裝包在安裝的時(shí)候會(huì)生成一個(gè)文件夾進(jìn)行管理,那么進(jìn)程在運(yùn)行的過程當(dāng)中難免會(huì)打開一些文件來訪問數(shù)據(jù),此時(shí),進(jìn)程每打開一個(gè)文件就會(huì)產(chǎn)生一個(gè)“文件描述符”(標(biāo)識(shí)被打開的文件,文件相關(guān)信息),然后創(chuàng)建對(duì)應(yīng)的一個(gè)順序結(jié)構(gòu),用于存放這些文件標(biāo)識(shí)符,那么這個(gè)順序結(jié)構(gòu)就被我們稱之為“文件描述符表”,我們?cè)趯?duì)文件的讀寫操作的時(shí)候就會(huì)使用到“文件描述符“的信息。
進(jìn)程的調(diào)度
接下來這組屬性是進(jìn)程學(xué)習(xí)中非常重要的一個(gè)知識(shí)點(diǎn)。
1.4進(jìn)程的調(diào)度
在軟件層次,操作系統(tǒng)給軟件提供的穩(wěn)定的運(yùn)行環(huán)境,進(jìn)程是操作系統(tǒng)分配資源的基本單位,當(dāng)一個(gè)進(jìn)程運(yùn)行時(shí),操作系統(tǒng)會(huì)為其開辟內(nèi)存空間,提供硬盤上的訪問權(quán)限,以及CPU ……
CPU (中央處理器) 主要是負(fù)責(zé) 處理指令、執(zhí)行操作、控制時(shí)間、處理數(shù)據(jù)四大作用, 咱們的程序能運(yùn)行,靠的就是CPU , 每個(gè)程序就相當(dāng)于一組“二進(jìn)制指令”的集合,.exe 文件, . class 文件都是二進(jìn)制文件。
我們先來簡(jiǎn)單的了解一下CPU :
CPU 的字長(zhǎng):
字長(zhǎng)是指CPU在同一單位時(shí)間內(nèi)—次能夠處理的二進(jìn)制位數(shù)。CPU的字長(zhǎng)主要根據(jù)運(yùn)算器和寄存器的位數(shù)確定。比如,一個(gè)CPU有32位的寄存器,并且一次處理32個(gè)二進(jìn)制位,字長(zhǎng)值越大,一次可處理的數(shù)據(jù)二進(jìn)制位數(shù)越多,運(yùn)算能力就越強(qiáng)。目前CPU大多是32位或64位。
CPU 的主頻:
CPU的主頻是指CPU的時(shí)鐘頻率,它是決定執(zhí)行指令速度的計(jì)時(shí)器,通常用MHz(兆赫茲)和GHz(千兆赫茲)來度量。1MHz相當(dāng)于1秒內(nèi)有1百萬個(gè)時(shí)鐘周期,1GHz相當(dāng)于1秒內(nèi)有10億個(gè)時(shí)鐘周期(10億條指令)。
CPU 的核心數(shù):
常見的CPU核數(shù)有雙核、四核、六核、八核、十二核等。在內(nèi)核頻率、緩存大小等條件相同的情況下,CPU內(nèi)核數(shù)量越多,CPU的整體性能越強(qiáng)。比如3.8GHz的6核CPU就比3.8GHz的雙核CPU性能要強(qiáng)。有些CPU的單核就非常強(qiáng)大(inter 系列的CPU 的每個(gè)單核心是比較強(qiáng)大的,即使核心線程數(shù)量不是很多,也不比普通的多核心的CPU 差),對(duì)于 AMD 系列的 CPU 來講,多核心多進(jìn)程在這方面是可以的(在同等價(jià)格上)。
我們也經(jīng)常聽說 CPU 是幾核 多少線程, 例如 :8核 16 線程,每個(gè)核心就相當(dāng)于有一個(gè)人干活,八個(gè)核心就是八個(gè)人干活, 16 線程啥意思嘞,一個(gè)CPU 核心,可以同時(shí)、并行的運(yùn)行兩個(gè)線程。就是說一個(gè)CPU核心一個(gè)人頂倆人干活(一個(gè) CPU 的物理核心內(nèi)部有兩個(gè)邏輯的處理單元), 8 核 16線程, 8個(gè)人可以同時(shí)干16 個(gè)人的活,我啟動(dòng)qq,啟動(dòng)微信,啟動(dòng) qq 音樂,騰訊視頻,我一口氣啟動(dòng)18 款應(yīng)用, 8核16 線程的CPU 可以運(yùn)行吧。

博主電腦的CPU是 4 核 8 線程的,基準(zhǔn)速度就是CPU的主頻率 3.11 GHz (一秒鐘 31億條指令),但是我們可以看到,現(xiàn)在博主電腦有220 個(gè)進(jìn)程同時(shí)在運(yùn)行,我的 CPU 只有區(qū)區(qū)的四核,那豈不是妥妥的狼多肉少。
1.4.1 CPU 處理進(jìn)程的方式
并行:
例如:在同一時(shí)刻,兩個(gè)核心,同時(shí)執(zhí)行兩個(gè)進(jìn)程,此時(shí)我們可以認(rèn)為這兩個(gè)進(jìn)程是并行執(zhí)行的。
博主的CUP 4 核 8 線程,能同時(shí)執(zhí)行 8 個(gè)進(jìn)程,這些進(jìn)程每個(gè)都有一個(gè)獨(dú)立的核心處理數(shù)據(jù),這就是并行處理的方式。
并發(fā):
一個(gè)核心,先執(zhí)行 進(jìn)程1,執(zhí)行一定的時(shí)間后,再執(zhí)行進(jìn)程2,執(zhí)行一定的時(shí)間后,再執(zhí)行進(jìn)程3……最后又執(zhí)行進(jìn)程1,如此以往,只要核心切換的速度足夠快,那么這些進(jìn)程之間就相當(dāng)于“同時(shí)”執(zhí)行的,我們講這種操作成稱之為“并發(fā)"。
所以即使博主 CPU 只有8 個(gè)邏輯處理核心,采用并發(fā)的方式也是可以“同時(shí)”執(zhí)行 200+ 的進(jìn)程的,CPU 處理數(shù)據(jù)的速度是非常快的,所以進(jìn)程之間來回切換人眼是無法感受到的,宏觀上是同時(shí)執(zhí)行的。
對(duì)于多進(jìn)程之間的處理,具體那個(gè) 核心并發(fā)處理那些進(jìn)程,是由操作系統(tǒng)分配的,也就是說如果操作系統(tǒng)不支持并發(fā)的處理數(shù)據(jù),你的CPU 核心數(shù)再多也白搭。也不是說系統(tǒng)中不存在 并行操作,我們很多的時(shí)候把 “并行” 和 "并發(fā)" 統(tǒng)稱為并發(fā)。
當(dāng)一個(gè)核心并發(fā)的處理特別多的任務(wù)(比如說:一萬個(gè)任務(wù))的時(shí)候,我們就可以稱之為”高并發(fā)“。
1.4.2 并發(fā)執(zhí)行的基本屬性
上文,講述了處理 多進(jìn)程多任務(wù)的兩種方式,接下來給大家講講進(jìn)程在并發(fā)的過程中,涉及到的基本的知識(shí)點(diǎn)。
進(jìn)程的狀態(tài)
運(yùn)行態(tài):進(jìn)程占有處理器正在運(yùn)行。
就緒態(tài):一個(gè)進(jìn)程已經(jīng)準(zhǔn)備好隨時(shí)被CPU 執(zhí)行。
阻塞態(tài):指進(jìn)程不具備運(yùn)行條件,暫時(shí)無法執(zhí)行。
通常,一個(gè)進(jìn)程在創(chuàng)建后將處于就緒狀態(tài)。每個(gè)進(jìn)程在執(zhí)行過程中,只能是上述三種狀態(tài)之一。
同時(shí),在一個(gè)進(jìn)程執(zhí)行過程中,它的狀態(tài)將會(huì)發(fā)生改變。引起進(jìn)程狀態(tài)轉(zhuǎn)換的具體原因如下:
(1)運(yùn)行態(tài)一一等待態(tài):等待使用資源或某事件發(fā)生,如等待外設(shè)傳輸;等待人工干預(yù)。
(2)等待態(tài)一一就緒態(tài):資源得到滿足或某事件己經(jīng)發(fā)生,如外設(shè)傳輸結(jié)束;人工干預(yù)完成。
(3)運(yùn)行態(tài)一一就緒態(tài):運(yùn)行時(shí)間片到,或出現(xiàn)有更高優(yōu)先權(quán)進(jìn)程。
(4)就緒態(tài)一一運(yùn)行態(tài):CPU空閑時(shí)被調(diào)度選中一個(gè)就緒進(jìn)程執(zhí)行。
進(jìn)程的優(yōu)先級(jí)
進(jìn)程之間的調(diào)度時(shí)間上的分配不一定是公平的,有的需要優(yōu)先調(diào)度,比如操作系統(tǒng)的進(jìn)程……
進(jìn)程的上下文
進(jìn)程在并發(fā)處理的狀態(tài)下,處理器會(huì)循環(huán)在各進(jìn)程之間進(jìn)行切換處理,上下文就是描述當(dāng)前進(jìn)程執(zhí)行到哪里的(執(zhí)行到了那條指令)“存檔記錄”,進(jìn)程在“暫時(shí)" 離開CPU 的時(shí)候就會(huì)將運(yùn)行時(shí)的中間結(jié)果存檔,等 CPU 下次再執(zhí)行該進(jìn)程的時(shí)候,根據(jù)“存檔記錄”恢復(fù)到上次執(zhí)行的狀態(tài),然后繼續(xù)對(duì)該進(jìn)程往后執(zhí)行。
其中的處理過程會(huì)涉及到 CPU 其中的寄存器,CPU 的寄存器會(huì)動(dòng)態(tài)的維護(hù)操作系統(tǒng)為進(jìn)程分配的空間包括“存檔記錄”,當(dāng)進(jìn)程離開CPU 的時(shí)候,就需要把這些寄存器的值保存在PCB 的上下的字段中,當(dāng)CPU 下次繼續(xù)執(zhí)行該進(jìn)程的時(shí)候,CPU 的寄存器會(huì)重新維護(hù)我們的進(jìn)程(把PCB 中的值給恢復(fù)到上下文的字段中),所謂的上下文具體指的就是進(jìn)程運(yùn)行過程中,CPU 內(nèi)部的一系列存儲(chǔ)器維護(hù)的值。
秒懂百科對(duì) PCB 的解釋:
為了描述控制進(jìn)程的運(yùn)行,系統(tǒng)中存放進(jìn)程的管理和控制信息的數(shù)據(jù)結(jié)構(gòu)稱為進(jìn)程控制塊(PCB Process Control Block),它是進(jìn)程實(shí)體的一部分,是操作系統(tǒng)中最重要的記錄性數(shù)據(jù)結(jié)構(gòu)。它是進(jìn)程管理和控制的最重要的數(shù)據(jù)結(jié)構(gòu),每一個(gè)進(jìn)程均有一個(gè)PCB,在創(chuàng)建進(jìn)程時(shí),建立PCB,伴隨進(jìn)程運(yùn)行的全過程,直到進(jìn)程撤消而撤消。
進(jìn)程的記賬信息
為了統(tǒng)計(jì)每個(gè)進(jìn)程在 CPU 上執(zhí)行的時(shí)間,可以作為進(jìn)程調(diào)度的參考依據(jù),當(dāng)某個(gè)進(jìn)程執(zhí)行的時(shí)間相對(duì)較長(zhǎng),或者是相對(duì)較短,操作系統(tǒng)就可以根據(jù)進(jìn)程的記賬信息,對(duì)進(jìn)程做出相應(yīng)的處理。
進(jìn)程的組織
操作系統(tǒng)會(huì)使用雙向鏈表這樣的結(jié)構(gòu)來組織進(jìn)程
創(chuàng)建一個(gè)進(jìn)程,就是創(chuàng)建一個(gè)鏈表的節(jié)點(diǎn)
銷毀一個(gè)進(jìn)程就是把鏈表的節(jié)點(diǎn)刪除了
遍歷進(jìn)程列表,就是在遍歷鏈表

1.5 內(nèi)存的分配
每個(gè)進(jìn)制在執(zhí)行的時(shí)候,操作系統(tǒng)會(huì)給進(jìn)程分配內(nèi)存,用于執(zhí)行,不同的進(jìn)程使用的是不同的區(qū)域,進(jìn)程之前互相之間不會(huì)干擾。
那么操作系統(tǒng)是怎么保證各進(jìn)程之間不會(huì)相互干擾呢?
操作系統(tǒng)給進(jìn)程分配的內(nèi)存空間,是以“虛擬地址空間”的形式進(jìn)行分配的。

站在這兩個(gè)進(jìn)程的角度來講,他們操作的是頁(yè)表生成的虛擬地址,進(jìn)程對(duì)內(nèi)存的訪問會(huì)受到頁(yè)表的檢查,如果該進(jìn)程訪問的虛擬內(nèi)存的地址(越界等)不在頁(yè)表的記錄中,頁(yè)表就無法映射出真實(shí)的內(nèi)存地址,不會(huì)去執(zhí)行操作,也就無法真正的修改真實(shí)的內(nèi)存的值。
這樣就避免了進(jìn)程之間的相互影響,最大的目的就是為了方便校驗(yàn)當(dāng)前地址是否有效,也提升了操作系統(tǒng)的穩(wěn)定性。
一個(gè)進(jìn)程無法直接干涉另一個(gè)進(jìn)程的內(nèi)存數(shù)據(jù)。
進(jìn)程具有獨(dú)立性,每個(gè)進(jìn)程有自己獨(dú)立的地址空間
1.6 進(jìn)程的通信
進(jìn)程具有獨(dú)立性,但是有些時(shí)候進(jìn)程之間需要進(jìn)行交互,進(jìn)程通信是指在進(jìn)程間傳輸數(shù)據(jù)(交換信息)。例如:啟動(dòng)騰訊視頻,如果你qq在線,就可以直接點(diǎn)擊qq登錄,也就不需要再輸入賬號(hào)密碼驗(yàn)證了,驗(yàn)證操作已經(jīng)在 qq 執(zhí)行過了,就會(huì)很方便,檢索的信息也是來自qq 提供的賬號(hào)密碼信息。
進(jìn)程之間的通信就是在進(jìn)程相互獨(dú)立的情況下,找一個(gè)公共區(qū)域,然后進(jìn)程之間通過這個(gè)公共區(qū)域進(jìn)行數(shù)據(jù)交換。
并發(fā)進(jìn)程之間的相互通信是實(shí)現(xiàn)多進(jìn)程間協(xié)作和同步的常用工具.具有很強(qiáng)的實(shí)用性,進(jìn)程通信是操作系統(tǒng)中極為重要的部分。
至此,進(jìn)程的基本認(rèn)識(shí)博主已經(jīng)分享完了,希望對(duì)大家有所幫助,如有不妥之處歡迎批評(píng)指正。

本期收錄于博主的專欄——JavaEE,適用于編程初學(xué)者,感興趣的朋友們可以訂閱,查看其它“JavaEE基礎(chǔ)知識(shí)”。
下期預(yù)告:線程的概念
感謝每一個(gè)觀看本篇文章的朋友,更多精彩敬請(qǐng)期待:保護(hù)小周? *★,°*:.☆( ̄▽ ̄)/$:*.°★* ‘