清華大學《操作系統》(九):進程和線程

進程

定義:

進程是指一個具有一定獨立功能的程序在一個數據集合上的一次動態執行的過程。

組成:

  • 代碼
  • 數據
  • 狀態寄存器(正在運行的一個程序的所有狀態信息):CPU狀態CP0、指令指針IP
  • 通用寄存器:AX、BX、CX
  • 進程占用系統資源:打開文件、已分配內存

特點:

  • 動態性:客動態地創建、結束進程
  • 并發性:進程既可以被獨立調度并占用處理機運行
  • 獨立性:不同的進程的工作不相互影響
  • 制約性:因訪問共享數據/資源或進程間同步而產生制約

進程與程序的聯系:

  1. 進程是操作系統處于執行狀態程序的抽象。程序 = 文件(靜態的可執行文件);進程 = 執行中的程序 = 程序 + 執行狀態
  2. 同一個程序的多次至干性過程對應為不同進程。如命令“ls”的多次執行對應多個進程
  3. 進程執行需要的資源。內存:保存代碼和數據;CPU:執行指令

進程與程序的區別:

  1. 進程是動態的,程序是靜態的。程序是有序代碼的集合;進程是程序的執行,進程有內核態/用戶態
  2. 進程是暫時的,程序是永久的。進程是一個狀態變化的過程;程序可長久保存
  3. 進程與程序的組成不同。進程的組成包括程序、數據和進程控制塊

進程控制塊(Process Control Block, PCB):

定義:操作系統管理控制進程運行所用的信息集合。

操作系統用PCB來描述進程的基本情況以及運行變化的過程。

PCB是進程存在的唯一標志,每個進程都在操作系統中有一個對應的PCB

使用:

  1. 進程創建時生成該進程的PCB
  2. 進程終止時回收它的PCB
  3. 通過對PCB的組織管理來實現對進程的組織管理

內容:

  1. 進程標識信息。PID:進程號,UID等 哪個程序在執行,執行了幾次,用戶標識
  2. 處理機現場保存,主要就是寄存器,保存進程的運行現場信息:堆棧指針:記錄堆棧現場;指令指針:記錄進程運行到哪
  3. 進程控制信息:
  • 調度和狀態信息:進程和處理機使用情況調度
  • 進程間通信信息:進程間通信相關的各種標識
  • 存儲管理信息:指向進程映像存儲空間數據結構
  • 進程所用資源:進程使用的系統資源,如打開文件等
  • 有關數據結構連接信息:通過與PCB相關的進程隊列實現

組織

  1. 鏈表(便于插刪,用于通用的OS):同一狀態的進程PCB為一鏈表,多個狀態對應更多個不同的鏈表,就緒鏈表,阻塞鏈表
  2. 索引表(數組,不利于插刪,使用于固定數目的進程,相對創建更快捷):同一狀態的歸入一個index表(每一個index指向PCB),就緒/阻塞索引表

進程狀態

劃分在不同操作系統中可能不同,但是大致可以分為:

  1. 系統初始化時,創建INIT進程,INIT再負責創建其他進程;用戶請求創建一個NEW PROCESS;正在運行的進程執行了創建進程的系統調用。
  2. 進程就緒:進程獲取了除處理機之外的資源,得到了處理機即可運行
  3. 進程運行:內核選擇一個就緒的進程,讓它占用處理機(cpu)并執行
  4. 進程阻塞(等待)的三種情況:請求并等待系統服務,無法馬上完成;啟動某種操作(和其他進程協調工作),無法馬上完成;需要的數據沒有到達。進程自己觸發阻塞,因為只有自己才知道何時需要等待某事件
  5. 進程搶占:進程會被搶占情況:高優先級進程就緒;進程執行當前時間用完。
  6. 進程喚醒的情況:需要的資源可被滿足;等待的事件到達。因為自身沒有占用cpu執行,所以只能被OS或其他進程喚醒
  7. 進程結束的情形:自愿(正常退出,錯誤退出),強制性的(致命錯誤,被其他進程所殺)

進程切換

三狀態進程模型:

創建與退出只是兩個短暫的狀態,除此之外簡化為三個狀態:就緒、運行、等待。裝填變遷如下圖。

  • 運行狀態:進程正在處理機上運行
  • 就緒狀態:進程獲取了除處理機之外的資源,得到了處理機即可運行
  • 阻塞狀態:進程正在等待某一事件出現而暫停運行
  • 創建狀態:進程正在被創建,還沒轉到就緒狀態之前的狀態
  • 退出狀態:進程正在從系統中消失時的狀態,這是因為進程結束或由于其他原因所導致

掛起進程模型:

處在掛起狀態的進程映像在磁盤上,目的是減少進程占用內存。也就是說掛起就是把一個處于就緒或者等待狀態的進程從內存轉存到外存,通常選擇低優先級進程進行掛起。

1、進程掛起

不同于進程阻塞。掛起時沒有占用該內存空間,而是映像在磁盤上。類似虛存中,有的程序段被放到了硬盤上。?可以合理、充分地利用系統資源。Suspend:把一個進程從內存轉到外存。?

2、掛起狀態

  1. 堵塞掛起狀態:進程再外存并等待某事件的出現
  2. 就緒掛起狀態:進程再外存,但只要進入內存即可運行

3、狀態轉換

內存中被掛起:

①堵塞到堵塞掛起:沒有進程處于就緒狀態或就緒進程要求更多內存資源

②就緒到就緒掛起:當高優先級等待進程和低優先級就緒進程

③運行到就緒掛起:對搶占式分時系統,當有高優先級等待掛起進程因事件出現而進入就緒掛起

外存中激活:

①阻塞掛起到就緒掛起: 相關事件出現時,轉變為就緒掛起但還在硬盤上。

②解掛/激活 activate:外存到內存,需要運行該進程時

就緒掛起到就緒態: 沒有就緒進程或掛起就緒優先進程優先級高于當前就緒進程時

堵塞掛起到堵塞態:當一個進程釋放了足夠內存時,OS把高優先級阻塞掛起(認為很快出現等待的事件)轉換為阻塞進程

狀態隊列

  • 由操作系統來維護一組隊列,表示系統中所有進程的當前狀態。
  • 不同隊列表示不同狀態。根據進程狀態不同,進程PCB進入對應的隊列。

線程

引入原因:一個進程內部可能有多種事件可以并發地執行,比如播放音樂時,可以拆分為磁盤讀取、解碼和播放三個子流程,讀取主要是I/O操作,解碼主要是CPU工作,這兩者是可以并發執行的。因此很多時候需要在進程內部增加一類實體,滿足以下特性:實體之間可以并發執行、實體之間共享相同的地址空間。在這種需求之下,出現了線程。

定義:線程是進程的一部分,描述指令流執行狀態,它是進程的指令執行流的最小單元,是CPU調度的基本單位。

  • 進程的資源分配角色:進程由一組相關資源構成,包括地址空間(代碼段、數據段)、打開的文件等各種資源。
  • 線程的處理機調度角色:線程描述在進程資源環境中的指令流的執行狀態。每個線程有自己獨立的指令指針等。

線程的優點:

  • 一個進程中可以同時存在多個線程
  • 線程之間可以并發地進行
  • 線程之間可以共享地址空間和文件等資源

線程的缺點:

  • 在進程空間內有多個控制流且執行流程不一樣,有各自獨立的寄存器和堆棧,但共享代碼段,數據段,資源。?如果一個線程寫錯了,崩潰,如破壞了數據,會導致這個進程的所有線程都崩潰。

線程與進程的比較

  1. 進程是資源分配單元(內存,打開的文件,訪問的網絡),線程是CPU調度單位,CPU也是一種特殊的資源,要執行控制流需要的相關信息
  2. 進程擁有一個完整資源平臺,而線程只獨享必不可少的資源如寄存器和棧
  3. 線程同樣具有就緒、阻塞和執行三種基本狀態和轉換關系
  4. 線程能減少并發執行的時空開銷:
    線程的創建時間比進程短
    線程的終止時間比進程短
    同一進程內的線程切換時間比進程短
    由于統一進程的各線程間共享內存和文件資源,可不通過內核進行直接通信。線程的終止時間比進程短

線程三種實現方式:

  1. 用戶線程:在用戶空間實現,OS看不到,由應用程序的用戶線程庫來管理;POSIX Pthreads, Mach C-threads
  2. 內核線程:在內核中實現,OS管理的;Windows
  3. 輕量級進程lightweight process:內核中實現,支持用戶線程。Solaris, Linux
  4. 用戶線程與內核線程間,可以是多對一,一對一,多對多

用戶線程:

由一組用戶級的線程庫函數來完成線程的管理。如POSIX Pthreads等。

優點:

  • 不依賴于操作系統內核,可以用于不支持線程的多進程操作系統
  • 在用戶空間實現的線程機制
  • 同一進程內的用戶線程切換速度快,無需在用戶態與核心態之間切換
  • 允許每個進程擁有自己的線程調度算法

缺點:

  • 線程發起系統調用而阻塞時,整個進程進入等待
  • 不支持基于線程的處理機搶占,除非當前運行線程主動放棄,它所在的線程的其他線程無法搶占CPU
  • 只能按進程分配CPU時間,多個線程進程中,每個線程的時間片較少。

內核線程:

由內核通過系統調用實現的線程機制,由內核完成線程的創建、終止和管理。如Windows、Linux等

特點:

  • 由內核維護PCB和TCB
  • 線程執行系統調用而被阻塞不影響其他線程
  • 線程的創建、終止和切換開銷相對較大,因為通過系統調用/內核函數,在內核空間實現
  • 以線程為單位進行CPU時間分配,多線程的進程可以獲得更多CPU時間。

輕量級進程:

內核支持的用戶線程,一個進程可以有一個或多個輕量級進程,每個輕權進程由一個單獨的內核線程來支持。如Solaris。最后這個被證實優點沒有被很好地體現出來。

用戶線程與內核線程的對應關系:

可以有如下圖多種方式,最后證明一對一是最優的。

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

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

相關文章

開始Flask項目

1.新建Flask項目。2.設置調試模式。3.理解Flask項目主程序。4.使用裝飾器,設置路徑與函數之間的關系。5.使用Flask中render_template,用不同的路徑,返回首頁、登錄員、注冊頁。6.用視圖函數反轉得到URL,{{url_for(‘login’)}}&am…

gcc交叉編譯的實現

gcc支持多種不同的語言,也支持多種不同的CPU架構。在它的實現上,不同語言編譯的實現是通過conststruct lang_hooks lang_hooks LANG_HOOKS_INITIALIZER;這個結構體的不同定義來實現的。比如c語言的編譯器就通過gcc/c-lang.c指定了lang_hooks這個結構體的…

爛泥:mysql數據庫使用的基本命令

1、連接數據庫的格式 mysql -h IP -u用戶名 -p密碼; 1.1連接遠程數據庫 mysql -h 192.168.1.214 -uroot -p123456 也可寫成: mysql -h 192.168.1.214 -u root -p 123456 1.2連接本地數據庫 mysql -uroot -p123456 也可寫成: mysql -u root -p 123456 2、…

mse均方誤差計算公式_PCA的兩種解讀:方差最大與均方誤差最小的推導

這張圖片很關鍵,來自統計學習方法的PCA插圖又要考試了,推導一下方差最大化與均方差最小化,老師上課講了一些均方差最小化,推導的過程很詳細不過自己沒有記下來,復習的時候再推一遍加深印象。感謝 耳東陳 老師的精彩課件…

《操作系統》OS學習(十):進程控制

進程切換(上下文切換): 定義:暫停當前運行進程,從運行狀態變成其他狀態,調度另一個進程從就緒狀態變成運行狀態要求:切換前,保存進程上下文;切換后,恢復進程…

日志管理

1、錯誤日志配置 錯誤日志屬于核心功能模塊的參數 worker_processes 1; error_log /data/logs/nginx/error.log error; #一般配置這一行即可 events {worker_connections 1024; }語法規則:error_log file level 錯誤的日志級別有[debug|info|notice|warn|err…

GCC 命令選項使用詳解

GCC 命令行詳解[轉帖] 1、gcc包含的c/c編譯器 gcc、cc、c、g gcc和cc是一樣的,c和g是一樣的,一般c程序就用gcc編譯,c程序就用g編譯 2、gcc的基本用法 gcc test.c這樣將編譯出一個名為a.out的程序 gcc test.c -o test這樣將編譯出一個名為t…

mvn 打包_Spark源碼打包編譯的過程

前言上篇文章介紹了下 安裝sbt環境 啟動scala項目安裝SBT環境運行Scala項目為什么要弄這個 因為我本來是想對spark源碼編譯部署spark是用scala語言編譯的spark源碼https://gitee.com/pingfanrenbiji/sparkspark提供的編譯方式編譯的前提是將所有的依賴包都下載下來而資源包管理…

審計日志功能監控

背景:公司的審計日志經常出現不記錄命令的情況,但是又無法監控到審計功能是否正常。所以我們思路是,每天從CMDB服務器 ssh登錄到每一臺主機。如果審計功能正常,則一定會在auditlog.info文件中有登錄的記錄。如果24小時內這個文件沒…

清華大學《操作系統》(十一):處理機調度

一、處理機調度概念 進程切換(上下文切換):切換CPU的當前任務,從一個進程/線程到另一個,保存當前在PCB/TCB中的執行上下文,讀取下一個的上下文 CPU調度:從就緒隊列中挑選一個進程/線程作為CPU…

通過純css實現圖片居中的多種實現方式

html結構&#xff1a; 1 <div class"demo" style"width: 800px;height: 600px; border:1px solid #ddd"> 2 <img src"default.jpg" width"400" height"300"/> 3 </div> 實現img位于外層div的居中顯示…

GCC 命令行詳解

作者&#xff1a; www.linuxfans.org mozilla 1。gcc包含的c/c編譯器 gcc,cc,c,g,gcc和cc是一樣的&#xff0c;c和g是一樣的&#xff0c;(沒有看太明白前面這半句是什 么意思:))一般c程序就用gcc編譯&#xff0c;c程序就用g編譯 2。gcc的基本用法 gcc test.c這樣將編譯出一個…

Java網絡編程從入門到精通(5):使用InetAddress類的getHostName方法獲得域名

該方法可以得到遠程主機的域名&#xff0c;也可以得到本機名。getHostName方法的定義如下&#xff1a; publicString getHostName() 下面是三種創建InetAddress對象的方式&#xff0c;在這三種方式中&#xff0c;getHostName返回的值是不同的。 1&#xff0e;使用getLocalHost方…

猿輔導python面試_猿輔導面試經歷—個人感受

今天參加了猿輔導的二面&#xff0c;無數槽點&#xff0c;不知道是不是很多公司都是這樣&#xff0c;但是我還是忍不住要逼逼叨。6月10號&#xff0c;我向猿輔導投了簡歷&#xff0c;想做招聘邀約專員這個崗位&#xff0c;然后hr加了我的微信&#xff0c;要了一份簡歷之后通知我…

對稱加密與非對稱加密

&#xff08;一&#xff09;對稱加密&#xff08;Symmetric Cryptography&#xff09; 對稱加密是最快速、最簡單的一種加密方式&#xff0c;加密&#xff08;encryption&#xff09;與解密&#xff08;decryption&#xff09;用的是同樣的密鑰&#xff08;secret key&#xff…

清華大學《操作系統》(十二):臨界區與鎖

多進程并發運行&#xff0c;導致多個進程間有資源共享&#xff0c;比如CPU、內存&#xff0c;因此存在不確定性和不可重現&#xff0c;可能導致多次運行結果不一致。因此操作系統需要利用同步機制在并發執行的同時&#xff0c;保證一些操作是原子操作。 互斥是指一個進程占用了…

gcc生成靜態庫和動態庫

gcc生成靜態庫和動態庫一、庫文件簡介簡單地說&#xff0c;庫&#xff08;Library&#xff09;就是一組已經寫好了的函數和變量、經過編譯代碼&#xff0c;是為了能夠提高開發效率和運行效率而設計的。庫分為靜態庫&#xff08;Static Library&#xff09;和共享庫&#xff08;…

python 流式計算框架_流式計算的三種框架:Storm、Spark和Flink

我們知道&#xff0c;大數據的計算模式主要分為批量計算(batch computing)、流式計算(stream computing)、交互計算(interactive computing)、圖計算(graph computing)等。其中&#xff0c;流式計算和批量計算是兩種主要的大數據計算模式&#xff0c;分別適用于不同的大數據應用…

清華大學《操作系統》(十八):管程于信號量

信號量與管程也是進程間通信的方式。信號量是與鎖在同一層級實現的&#xff0c;是操作系統提供的一種協調共享資源訪問的方法。信號量由操作系統管理&#xff0c;操作系統作為管理者地位是高于進程的。 一、信號量 1、信號量&#xff08;semaphore&#xff09;&#xff1a;是操…

Iptalbes自動封殺暴力破解(Qmail郵件系統)者的IP地址

今天發現Qmail郵件系統的maillog里面有大量的“user not found”信息&#xff0c;通過下面的日志不難發現&#xff0c;是來自同一IP的很多不同的用戶連接Qmail郵件系統認證失敗的信息。黑客試圖通過這種方式來破解Qmail郵件系統的用戶名和密碼&#xff0c;從而來發送大量的垃圾…