操作系統思考 第二章 進程

第二章 進程

作者:Allen B. Downey

原文:Chapter 2 Processes

譯者:飛龍

協議:CC BY-NC-SA 4.0

2.1 抽象和虛擬化

在我們談論進程之前,我打算先定義幾個東西:

  • 抽象(Abstraction):抽象是復雜事物的簡單表示。例如,如果你開車的話,應該知道車輪向左轉的時候車也會向左行駛,反之亦然。當然,方向盤由一系列機械和傳動系統所連接,用于使輪子轉向,并且輪子和路面的相互作用方式也很復雜。但是作為一個司機,你通常不需要考慮這些細節。你可以僅僅建立方向盤的心智模型,這種心智模型就是一個抽象。

    軟件工程的很大一部分就是設計類似這樣的抽象,允許用戶和其它程序員使用強大而復雜的系統,而不必知道其實現的細節。
    
  • 虛擬化(Virtualization):一類非常重要的抽象就是虛擬化,它是創建可取的幻像的過程。例如,許多公共圖書館都參與了館際合作,允許它們互相借閱圖書。當我需要一本書時,有時它在我的本地圖書館的架子上,但更多情況下它會被運到其它的館藏中。無論是哪一種,我都會收到它可借閱的提醒。我并不需要知道它來自哪里,我也不需要知道我的圖書館擁有哪一本書。一般來說,這個系統創建了一個幻象,好像我的圖書館擁有全世界的每一本書。

    在物理上,我的圖書館的館藏可能很小,但是虛擬上我能獲得的館藏包含了館際合作的每一本書。另外一個例子,大多數電腦都只連接到一個網絡中,而這個網絡又鏈接到其它網絡,等等。我們所談論的“互聯網”,是一系列網絡和協議的合集,它將數據包從一個網絡傳送到另一個網絡。從用戶和程序員的角度來看,整個系統的行為就像是互聯網的每臺計算機都互相連接。物理連接的數量十分少,但是虛擬連接的數量十分龐大。
    

“虛擬”這個詞通常用于虛擬機的語境中,它是一種軟件,可以創建運行特定系統的專用計算機的幻象。實際上,虛擬機可能和其它虛擬機一起運行在不同的操作系統上。

在虛擬化的語境中,我們通常把真實發生的事情叫做“物理的”,而把虛擬上發生的事情叫做“邏輯的”或者“抽象的”。

2.2 隔離

工程最重要的原則之一就是隔離(Isolation):當你設計一個帶有多個組件的系統時,將它彼此隔離是個很好的方法,這樣某個組件中的改變就不會對其它組件造成不良影響。

操作系統最重要的目標之一,就是將每個進程和其它進程隔離,使程序員不必考慮每個可能的交互情況。提供這種隔離的軟件對象叫做進程(Process)。

進程是表示運行中程序的軟件對象。我按照面向對象編程把它稱之為“軟件對象”。工程一個對象包含數據,并且提供用于操作數據的方法。進程正是包含以下數據的對象:

  • 程序文本,通常是機器語言的指令序列。

  • 程序相關的數據,包括靜態數據(編譯時分配)和動態數據,后者包括運行時的棧和堆。

  • 任何等待中的IO狀態。例如,如果進程正在等待從磁盤中讀取的數據,或者從網絡到達的數據包,這些操作的狀態也是進程的一部分。

  • 程序的硬件狀態,這包括儲存在寄存器中的數據,狀態信息,以及程序計數器,它表示當前執行了哪個指令。

通常一個進程運行一個程序,但是對于進程來說,加載并運行新的程序也是可能的。

也可以在多于一個進程中運行相同的程序,這非常常見。這種情況下,各個進程共享程序文本,但是擁有不同的數據和硬件狀態。

大多數操作系統提供了隔離進程的基本功能:

  • 多任務:大多數操作系統有能力在幾乎任何時候中斷一個進程,保存它的硬件狀態,并且在以后恢復它。通常,程序員不需要考慮這些中斷。程序的行為就像在一個專用的處理器上持續運行,除了兩條指令之間的時間是不可預測的。

  • 虛擬內存:大多數操作系統會創建幻象,每個進程看似擁有獨立內存片并且孤立于其他進程。同樣,程序員通常也不需要考慮虛擬內存如何工作,他們可以當做每個程序都擁有專用的內存片來處理。

  • 設備抽象:運行于同一臺計算機的進程共享磁盤、網絡接口、顯卡和其它硬件。如果進程直接和這些硬件交互而不加協調,就一定會產生混亂。例如,一個進程預期的網絡數據可能會被另一個進程讀取。或者多個進程可能嘗試在磁盤的相同位置儲存數據。操作系統負責通過提供合適的抽象來維持秩序。

作為程序員,你不需要知道太多關于這些功能如何實現的事情。但是如果你很好奇,你可以在這個屏蔽層的后面發現一大堆有趣的事情。而且,如果你知道其中所發生的事情,你會成為更好的程序員。

2.3 Unix 進程

當我寫這本書的時候,我最關注的進程就是我的文本編輯器,Emacs。偶爾我也會切換到終端窗口,它是一個運行Unix shell并提供命令行接口的窗口。

當我移動鼠標時,窗口的管理器會被喚醒,看到鼠標在終端窗口上方,并且喚醒終端。終端又喚醒shell。如果我在shell中鍵入make,它就會創建一個新的進程來運行Make。Make會創建另一個進程來運行LaTeX,之后另一個進程會顯示結果。

如果我需要查詢一些東西,我會切換到另一個桌面,這會再次喚醒窗口管理器。如果我點擊Web瀏覽器的圖標,窗口管理器會創建進行來運行Web瀏覽器。許多瀏覽器,類似Chrome,會為每個窗口和每個選項卡創建新的進程。

并且這些只是我所了解的進程,同時還有許多其它進程“在后臺”運行。它們中許多都在執行操作系統相關的工作。

Unix命令ps能打印出運行中進程的信息。如果你在終端里運行它,可能會看到這些:

  PID TTY          TIME CMD2687 pts/1    00:00:00 bash2801 pts/1    00:01:24 emacs
24762 pts/1    00:00:00 ps

第一列是唯一的進程ID。第二列是創建進程的終端,“TTY”代表“電傳打字機”(Teletypewriter),它是原始的機械終端。

第三行是用于該進程的處理器時間總計,依次為時、分、秒。最后一行是所運行進程的名稱。這個例子中,bash是shell的名稱,用于解釋我鍵入到終端中的命令。Emacs是我的文本編輯器,而ps是生成這份輸出的程序。

通常,ps只會列出有關當前終端的進程。如果你使用-e選項,你會得到所有進程(也包括屬于其他用戶的進程,我認為這是個安全缺陷)。

在我的系統上有233個進程,下面是它們的一部分:

  PID TTY          TIME CMD1 ?        00:00:17 init2 ?        00:00:00 kthreadd3 ?        00:00:02 ksoftirqd/04 ?        00:00:00 kworker/0:08 ?        00:00:00 migration/09 ?        00:00:00 rcu_bh10 ?        00:00:16 rcu_sched47 ?        00:00:00 cpuset48 ?        00:00:00 khelper49 ?        00:00:00 kdevtmpfs50 ?        00:00:00 netns51 ?        00:00:00 bdi-default52 ?        00:00:00 kintegrityd53 ?        00:00:00 kblockd54 ?        00:00:00 ata_sff55 ?        00:00:00 khubd56 ?        00:00:00 md57 ?        00:00:00 devfreq_wq

init是操作系統啟動時首先創建的進程。它又會創建許多其它進程,之后會閑置,直到它創建的進程運行完畢。

kthreadd是操作系統用于創建新的“線程”的進程。之后我們將會談論更多關于線程的東西,但是你暫時你可以認為線程是一種進程。

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

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

相關文章

1 句代碼,搞定 ASP.NET Core 綁定多個源到同一個類

問題有群友希望將路由中的信息綁定到一個Dto對象中:public class DDDDDto {[FromRoute(Name "collectionId")]public Guid collectionId { get; set; }[BindProperty(Name "relativeUrl")]public string relativeUrl { get; set; } }這樣就不用…

redux中間件的用法

1.定義 中間件就是一個函數,對store.dispatch方法進行了改造,在發出 Action 和執行 Reducer 這兩步之間,添加了其他功能。 2.舉例 日志中間件 import { applyMiddleware, createStore } from redux; import createLogger from redux-logger; …

設置git自動補全功能(windows版本)

目錄 下載 Git 的源代碼 在目錄中 git/contrib/completion/ 中找到 git-completion.bash 文件 將 git-completion.bash 文件改名為 .git-completion.bash 找到本機git安裝目錄 將.git-completion.bash文件復制到git安裝目錄下的etc文件夾 打開同目錄下的 bash.bashrc 文件&…

用Vue搭建一個應用盒子(二):datetime-picker

接著上次的進度,我們已經實現了一個todo-list。它已經具備了基本的功能,可以新建、編輯、刪除任務。但是美中不足的是,它的時間設定上只能通過輸入一段字符串來設定,很不社會。我們應該完成的效果是一個time-picker,日…

ArcGIS實驗教程——實驗四十八:ArcGIS制圖表達入門及案例教程

文章目錄 1. 制圖表達的概念1.1 什么是地圖表達1.2 使用制圖表達改善要素外觀1.3 制圖表達的優點2. 使用制圖表達2.1 創建制圖表達2.2 使用制圖表達來符號化圖層2.3 使用制圖表達規則3. 地圖表達實戰案例1.創建制圖表達2.添加幾何效果3.使用制圖規則4.使用制圖表達屬性覆蓋1. 制…

PAT (Advanced Level) 1070. Mooncake (25)

簡單貪心。先買性價比高的。 #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<map> #include<stack> #include<queue> #include<string> #include<algorithm> using namespace std;doub…

[轉]Java 18 還未用上,Java 19 最新兩大特性曝光

鐵打的 Java&#xff0c;流水的版本。 不久前&#xff0c;Java 18 才正式發布&#xff0c;遵循 Oracle 六個月發一版本的頻率&#xff0c;Java 19 將在今年 9 月出爐。這不&#xff0c;還沒等眾多開發者用上 Java 18&#xff0c;關于 Java 19 最新的兩個目標功能就被披露了出…

文本生成器(bzoj 1030)

Description JSOI交給隊員ZYX一個任務&#xff0c;編制一個稱之為“文本生成器”的電腦軟件&#xff1a;該軟件的使用者是一些低幼人群&#xff0c;他們現在使用的是GW文本生成器v6版。該軟件可以隨機生成一些文章―――總是生成一篇長度固定且完全隨機的文章—— 也就是說&…

C# 值類型和引用類型講解

要了解值類型和引用類型&#xff0c;我們首先要知道堆和棧的區別&#xff1a;① 棧是編譯期間就分配好的內存空間&#xff0c;因此你的代碼中必須就棧的大小有明確的定義&#xff1b;堆是程序運行期間動態分配的內存空間&#xff0c;你可以根據程序的運行情況確定要分配的堆內存…

【ArcGIS微課1000例】0048:制圖表達(3)---水立方效果實現

本文講解ArcGIS中水立方效果的實現過程(制圖表達案例)。 文章目錄 一、效果展示二、制作步驟1. 創建數據庫及要素數據集2. 創建范圍3. 創建隨機點4. 創建泰森多邊形5. 創建制圖表達一、效果展示 基于制圖表達的思想,可以容易實現多種形式的水立方效果,例如: 怎么實現的呢…

Java中this與super的區別

2019獨角獸企業重金招聘Python工程師標準>>> this與super關鍵字在java中構造函數中的應用&#xff1a; ** super()函數 ** super()函數在子類構造函數中調用父類的構造函數時使用&#xff0c;而且必須要在構造函數的第一行&#xff0c;例如&#xff1a; class Ani…

EF選擇Mysql數據源

EF添加ADO.NET實體模型處直接選擇Mysql數據源 最近想到EF是連接多數據庫的orm框架&#xff0c;于是就想測試下。查了一堆網上資料后&#xff0c;測試連接mysql成功。步驟如下&#xff1a; 1、在你項目Model層中nuget安裝MySql.Data.Entity 如果沒安裝這個provider 就進行下面的…

JIRA簡介及基本概念

目錄 第一章 JIRA簡介 1.1 什么是JIRA 1.2 JIRA的主要功能 1.3 JIRA的主要特點 1.3.1 JIRA的優點 1.3.2 JIRA的缺點 1.4 相關版本 第二章 JIRA的基本概念 2.1 JIRA 中涉及的角色 2.1.1 管理人員 2.1.2 項目管理者 2.1.3 開發人員 2.1.4 測試人員 2.2 問題 2.2.1…

CodeChef Chef and Churu [分塊]

題意&#xff1a; 單點修改$a$ 詢問$a$的區間和$f$的區間和 原來普通計算機是這道題改編的吧... 對$f$分塊&#xff0c;預處理$c[i][j]$為塊i中$a_j$出現幾次&#xff0c;$O(NH(N))$&#xff0c;只要每個塊差分加上然后掃一遍就行了不用樹狀數組之類的 修改&#xff0c;整塊直接…

SkiaSharp 之 WPF 自繪 拖曳小球(案例版)

感謝各位大佬和粉絲的厚愛和關心( 催更)&#xff0c;我會再接再厲的&#xff0c;其實這也是督促自己的一種方式&#xff0c;非常感謝。剛寫了一篇萬字長文&#xff0c;自己也休養生息(低調發育)了一段時間&#xff0c;接下來來幾個小案例。拖曳小球WPF的拖曳效果&#xff0c;基…

Nodejs Guides(四)

EVENTS events模塊API實例 const EventEmitter require(events);class MyEmitter extends EventEmitter { } //EventListener 會按照監聽器注冊的順序同步地調用所有監聽器。 //所以需要確保事件的正確排序且避免競爭條件或邏輯錯誤。 //監聽器函數可以使用 setImmediate() 或…

[轉]常用自動化測試工具

1、Appium 官網&#xff1a;http://appium.io AppUI自動化測試 Appium 是一個移動端自動化測試開源工具&#xff0c;支持iOS 和Android 平臺&#xff0c;支持Python、Java 等語言&#xff0c;即同一套Java 或Python 腳本可以同時運行在iOS 和Android平臺&#xff0c;Appium 是…

ABP學習資源整理

不同的編程語言都有構建Web Application的框架&#xff0c;比如C#中的ASP.NET Core和ABP&#xff0c;Java中的Spring Boot和Spring Cloud&#xff0c;Python中的Django和Flask&#xff0c;Node.js中的Express和Koa2&#xff0c;Go中的Beego和Gin等。今天要介紹的主角是ABP框架&…

【ArcGIS微課1000例】0049:制圖表達(4)---自由式制圖表達

文章目錄 一、轉換為自由表達并編輯二、將效果轉換為幾何當編輯地圖時,可能會遇到一個獨特的或顯著的特征,需要專門的符號的情況,可以使用覆蓋的制圖表達來實現,但是往往不夠。可能需要簡單地繪制一個圖形以達到要求的外觀,這時可以嘗試使用自由式制圖表達。 自由式制圖表…

基于FPGA的異步FIFO設計

今天要介紹的異步FIFO&#xff0c;可以有不同的讀寫時鐘&#xff0c;即不同的時鐘域。由于異步FIFO沒有外部地址端口&#xff0c;因此內部采用讀寫指針并順序讀寫&#xff0c;即先寫進FIFO的數據先讀取&#xff08;簡稱先進先出&#xff09;。這里的讀寫指針是異步的&#xff0…