操做系統,進程理論

一 爲何要有操做系統

兩本書:現代操做系統、操做系統原理)python

  現代的計算機系統主要是由一個或者多個處理器,主存,硬盤,鍵盤,鼠標,顯示器,打印機,網絡接口及其餘輸入輸出設備組成。linux

  通常而言,現代計算機系統是一個複雜的系統。nginx

  其一:若是每位應用程序員都必須掌握該系統全部的細節,那就不可能再編寫代碼了(嚴重影響了程序員的開發效率.)程序員

  其二:而且管理這些部件並加以優化使用,是一件極富挑戰性的工做,因而,計算安裝了一層軟件(系統軟件),稱爲操做系統。它的任務就是爲用戶程序提供一個更好、更簡單、更清晰的計算機模型,並管理剛纔提到的全部設備。web

總結:算法

  程序員沒法把全部的硬件操做細節都瞭解到,管理這些硬件而且加以優化使用是很是繁瑣的工做,這個繁瑣的工做就是操做系統來乾的,有了他,程序員就從這些繁瑣的工做中解脫了出來,只須要考慮本身的應用軟件的編寫就能夠了,應用軟件直接使用操做系統提供的功能來間接使用硬件。shell

二 什麼是操做系統

  精簡的說的話,操做系統就是一個協調、管理和控制計算機硬件資源和軟件資源的控制程序。操做系統所處的位置如圖1編程

#操做系統位於計算機硬件與應用軟件之間,本質也是一個軟件。操做系統由操做系統的內核(運行於內核態,管理硬件資源)以及系統調用(運行於用戶態,爲應用程序員寫的應用程序提供系統調用接口)兩部分組成,因此,單純的說操做系統是運行於內核態的,是不許確的。

img

​ 圖1windows

  細說的話,操做系統應該分紅兩部分功能:安全

#一:隱藏了醜陋的硬件調用接口(鍵盤、鼠標、音箱等等怎麼實現的,就不須要你管了),爲應用程序員提供調用硬件資源的更好,更簡單,更清晰的模型(系統調用接口)。應用程序員有了這些接口後,就不用再考慮操做硬件的細節,專心開發本身的應用程序便可。
例如:操做系統提供了文件這個抽象概念,對文件的操做就是對磁盤的操做,有了文件咱們無需再去考慮關於磁盤的讀寫控制(好比控制磁盤轉動,移動磁頭讀寫數據等細節),

#二:將應用程序對硬件資源的競態請求變得有序化
例如:不少應用軟件實際上是共享一套計算機硬件,比方說有可能有三個應用程序同時須要申請打印機來輸出內容,那麼a程序競爭到了打印機資源就打印,而後多是b競爭到打印機資源,也多是c,這就致使了無序,打印機可能打印一段a的內容而後又去打印c...,操做系統的一個功能就是將這種無序變得有序。
#做用一:爲應用程序提供如何使用硬件資源的抽象
例如:操做系統提供了文件這個抽象概念,對文件的操做就是對磁盤的操做,有了文件咱們無需再去考慮關於磁盤的讀寫控制

注意:
    操做系統提供給應用程序的該抽象是簡單,清晰,優雅的。爲什麼要提供該抽象呢?
    硬件廠商須要爲操做系統提供本身硬件的驅動程序(設備驅動,這也是爲什麼咱們要使用聲卡,就必須安裝聲卡驅動。。。),廠商爲了節省成本或者兼容舊的硬件,它們的驅動程序是複雜且醜陋的
    操做系統就是爲了隱藏這些醜陋的信息,從而爲用戶提供更好的接口
    這樣用戶使用的shell,Gnome,KDE看到的是不一樣的界面,但其實都使用了同一套由linux系統提供的抽象接口

#做用二:管理硬件資源
    現代的操做系統運行同時運行多道程序,操做系統的任務是在相互競爭的程序之間有序地控制對處理器、存儲器以及其餘I/O接口設備的分配。
例如:
    同一臺計算機上同時運行三個程序,它們三個想在同一時刻在同一臺計算機上輸出結果,那麼開始的幾行多是程序1的輸出,接着幾行是程序2的輸出,而後又是程序3的輸出,最終將是一團糟(程序之間是一種互相競爭資源的過程)
    操做系統將打印機的結果送到磁盤的緩衝區,在一個程序徹底結束後,纔將暫存在磁盤上的文件送到打印機輸出,同時其餘的程序能夠繼續產生更多的輸出結果(這些程序的輸出沒有真正的送到打印機),這樣,操做系統就將由競爭產生的無序變得有序化。

詳解

img

​ 圖 2

三 操做系統與普通軟件的區別

  1.主要區別是:你不想用暴風影音了你能夠選擇用迅雷播放器或者乾脆本身寫一個,可是你沒法寫一個屬於操做系統一部分的程序(時鐘中斷處理程序),操做系統由硬件保護,不能被用戶修改。

  2.操做系統與用戶程序的差別並不在於兩者所處的地位。特別地,操做系統是一個大型、複雜、長壽的軟件,

  • 大型:linux或windows的源代碼有五百萬行數量級。按照每頁50行共1000行的書來算,五百萬行要有100卷,要用一整個書架子來擺置,這還僅僅是內核部分。用戶程序,如GUI,庫以及基本應用軟件(如windows Explorer等),很容易就能達到這個數量的10倍或者20倍之多。
  • 長壽:操做系統很難編寫,如此大的代碼量,一旦完成,操做系統全部者便不會輕易扔掉,再寫一個。而是在原有的基礎上進行改進。(基本上能夠把windows95/98/Me看出一個操做系統,而windows NT/2000/XP/Vista則是兩位一個操做系統,對於用戶來講它們十分類似。還有UNIX以及它的變體和克隆版本也演化了多年,如System V版,Solaris以及FreeBSD等都是Unix的原始版,不過儘管linux很是依照UNIX模式而仿製,而且與UNIX高度兼容,可是linux具備全新的代碼基礎)

四 操做系統發展史

第一代(1940~1955) 手工操做----穿孔卡片

第一代計算機的產生背景:

第一代以前人類是想用機械取代人力,第一代計算機的產生是計算機由機械時代進入電子時代的標誌,從Babbage失敗以後一直到第二次世界大戰,數字計算機的建造幾乎沒有什麼進展,第二次世界大戰刺激了有關計算機研究的爆炸性進展。

lowa州立大學的john Atanasoff教授和他的學生Clifford Berry建造了據認爲是第一臺可工做的數字計算機。該機器使用300個真空管。大約在同時,Konrad Zuse在柏林用繼電器構建了Z3計算機,英格蘭布萊切利園的一個小組在1944年構建了Colossus,Howard Aiken在哈佛大學建造了Mark 1,賓夕法尼亞大學的William Mauchley和他的學生J.Presper Eckert建造了ENIAC。這些機器有的是二進制的,有的使用真空管,有的是可編程的,但都很是原始,設置須要花費數秒鐘時間才能完成最簡單的運算。

在這個時期,同一個小組裏的工程師們,設計、建造、編程、操做及維護同一臺機器,全部的程序設計是用純粹的機器語言編寫的,甚至更糟糕,須要經過成千上萬根電纜接到插件板上連成電路來控制機器的基本功能。沒有程序設計語言(彙編也沒有),操做系統則是歷來都沒據說過。使用機器的過程更加原始,詳見下‘工做過程’

img

特色:
沒有操做系統的概念
全部的程序設計都是直接操控硬件

工做過程:
程序員在牆上的機時表預定一段時間,而後程序員拿着他的插件版到機房裏,將本身的插件板街道計算機裏,這幾個小時內他獨享整個計算機資源,後面的一批人都得等着(兩萬多個真空管常常會有被燒壞的狀況出現)。

後來出現了穿孔卡片,能夠將程序寫在卡片上,而後讀入機而不用插件板

img

優勢:

程序員在申請的時間段內獨享整個資源,能夠即時地調試本身的程序(有bug能夠馬上處理)

缺點:

浪費計算機資源,一個時間段內只有一我的用。
注意:同一時刻只有一個程序在內存中,被cpu調用執行,比方說10個程序的執行,是串行的

穿孔卡帶的過程:程序員將對應於程序和數據的已穿孔的紙帶(或卡片)裝入輸入機,而後啓動輸入機把程序和數據輸入計算機內存,接着經過控制檯開關啓動程序針對數據運行;計算完畢,打印機輸出計算結果;用戶取走結果並卸下紙帶(或卡片)後,才讓下一個用戶上機。

第二代(1955~1965) 磁帶存儲---批處理系統

第二代計算機的產生背景:

因爲當時的計算機很是昂貴,自認很天然的想辦法較少機時的浪費。一般採用的方法就是批處理系統。

特色:
設計人員、生產人員、操做人員、程序人員和維護人員直接有了明確的分工,計算機被鎖在專用空調房間中,由專業操做人員運行,這即是‘大型機’。

有了操做系統的概念

有了程序設計語言:FORTRAN語言或彙編語言,寫到紙上,而後穿孔打成卡片,再講卡片盒帶到輸入室,交給操做員,而後喝着咖啡等待輸出接口

工做過程:插圖

img

img

第二代如何解決第一代的問題/缺點:
1.把一堆人的輸入攢成一大波輸入,
2.而後順序計算(這是有問題的,可是第二代計算也沒有解決)
3.把一堆人的輸出攢成一大波輸出

現代操做系統的前身:(見圖)

優勢:批處理,節省了機時

缺點:1.整個流程須要人蔘與控制,將磁帶搬來搬去(中間倆小人)

2.計算的過程仍然是順序計算- 串行

3.程序員原來獨享一段時間的計算機,如今必須被統一規劃到一批做業中,等待結果和從新調試的過程都須要等同批次的其餘程序都運做完才能夠(這極大的影響了程序的開發效率,沒法及時調試程序)

第三代(1955~1965)集成電路,多道程序系統

第三代計算機的產生背景:

20世紀60年代初期,大多數計算機廠商都有兩條徹底不兼容的生產線。

一條是面向字的:大型的科學計算機,如IBM 7094,見上圖,主要用於科學計算和工程計算

另一條是面向字符的:商用計算機,如IBM 1401,見上圖,主要用於銀行和保險公司從事磁帶歸檔和打印服務

開發和維護徹底不一樣的產品是昂貴的,同時不一樣的用戶對計算機的用途不一樣。

IBM公司試圖經過引入system/360系列來同時知足科學計算和商業計算,360系列低檔機與1401至關,高檔機比7094功能強不少,不一樣的性能賣不一樣的價格

360是第一個採用了(小規模)芯片(集成電路)的主流機型,與採用晶體管的第二代計算機相比,性價比有了很大的提升。這些計算機的後代仍在大型的計算機中內心使用,此乃如今服務器的前身,這些服務器每秒處理不小於千次的請求。

如何解決第二代計算機的問題1:
卡片被拿到機房後可以很快的將做業從卡片讀入磁盤,因而任什麼時候刻當一個做業結束時,操做系統就能將一個做業從磁帶讀出,裝進空出來的內存區域運行,這種技術叫作
同時的外部設備聯機操做:SPOOLING,該技術同時用於輸出。當採用了這種技術後,就不在須要IBM1401機了,也沒必要將磁帶搬來搬去了(中間倆小人再也不須要)

如何解決第二代計算機的問題2:

第三代計算機的操做系統普遍應用了第二代計算機的操做系統沒有的關鍵技術:多道技術

cpu在執行一個任務的過程當中,若須要操做硬盤,則發送操做硬盤的指令,指令一旦發出,硬盤上的機械手臂滑動讀取數據到內存中,這一段時間,cpu須要等待,時間可能很短,但對於cpu來講已經很長很長,長到可讓cpu作不少其餘的任務,若是咱們讓cpu在這段時間內切換到去作其餘的任務,這樣cpu不就充分利用了嗎。這正是多道技術產生的技術背景

多道技術:

多道技術中的多道指的是多個程序,多道技術的實現是爲了解決多個程序競爭或者說共享同一個資源(好比cpu)的有序調度問題,解決方式即多路複用,多路複用分爲時間上的複用和空間上的複用。

空間上的複用:將內存分爲幾部分,每一個部分放入一個程序,這樣,同一時間內存中就有了多道程序。

img

時間上的複用:當一個程序在等待I/O時,另外一個程序可使用cpu,若是內存中能夠同時存放足夠多的做業,則cpu的利用率能夠接近100%,相似於咱們小學數學所學的統籌方法。(操做系統採用了多道技術後,能夠控制進程的切換,或者說進程之間去爭搶cpu的執行權限。這種切換不只會在一個進程遇到io時進行,一個進程佔用cpu時間過長也會切換,或者說被操做系統奪走cpu的執行權限)

空間上的複用最大的問題是:程序之間的內存必須分割,這種分割須要在硬件層面實現,由操做系統控制。若是內存彼此不分割,則一個程序能夠訪問另一個程序的內存,

首先喪失的是安全性,好比你的qq程序能夠訪問操做系統的內存,這意味着你的qq能夠拿到操做系統的全部權限。

其次喪失的是穩定性,某個程序崩潰時有可能把別的程序的內存也給回收了,比方說把操做系統的內存給回收了,則操做系統崩潰。

第三代計算機的操做系統仍然是批處理

許多程序員懷念第一代獨享的計算機,能夠即時調試本身的程序。爲了知足程序員們很快能夠獲得響應,出現了分時操做系統

如何解決第二代計算機的問題3:

分時操做系統:
多個聯機終端+多道技術

20個客戶端同時加載到內存,有17在思考,3個在運行,cpu就採用多道的方式處理內存中的這3個程序,因爲客戶提交的通常都是簡短的指令並且不多有耗時長的,索引計算機可以爲許多用戶提供快速的交互式服務,全部的用戶都覺得本身獨享了計算機資源

CTTS:麻省理工(MIT)在一臺改裝過的7094機上開發成功的,CTSS兼容分時系統,第三代計算機普遍採用了必須的保護硬件(程序之間的內存彼此隔離)以後,分時系統纔開始流行

MIT,貝爾實驗室和通用電氣在CTTS成功研製後決定開發可以同時支持上百終端的MULTICS(其設計者着眼於建造知足波士頓地區全部用戶計算需求的一臺機器),很明顯真是要上天啊,最後摔死了。

後來一位參加過MULTICS研製的貝爾實驗室計算機科學家Ken Thompson開發了一個簡易的,單用戶版本的MULTICS,這就是後來的UNIX系統。基於它衍生了不少其餘的Unix版本,爲了使程序能在任何版本的unix上運行,IEEE提出了一個unix標準,即posix(可移植的操做系統接口Portable Operating System Interface)

後來,在1987年,出現了一個UNIX的小型克隆,即minix,用於教學使用。芬蘭學生Linus Torvalds基於它編寫了Linux

第四代(1980~至今)現代計算機

  進入20世紀80年代,大規模集成電路工藝技術的飛躍發展,微處理機的出現和發展,掀起了計算機大發展大普及的浪潮。一方面迎來了我的計算機的時代,同時又向計算機網絡、分佈式處理、巨型計算機和智能化方向發展。因而,操做系統有了進一步的發展,如:我的計算機操做系統、網絡操做系統、分佈式操做系統等。

  1.我的計算機操做系統

    我的計算機上的操做系統是聯機交互的單用戶操做系統,它提供的聯機交互功能與通用分時系統提供的功能很類似。

    因爲是我的專用,所以一些功能會簡單得多。然而,因爲我的計算機的應用普及,對於提供更方便友好的用戶接口和豐富功能的文件系統的要求會越來越迫切。

  2.網絡操做系統

    計算機網絡:經過通訊設施,將地理上分散的、具備自治功能的多個計算機系統互連起來,實現信息交換、資源共享、互操做和協做處理的系統。

    網絡操做系統:在原來各自計算機操做系統上,按照網絡體系結構的各個協議標準增長網絡管理模塊,其中包括:通訊、資源共享、系統安全和各類網絡應用服務。

    就是添加了一些網絡方面的功能。

  3.分佈式操做系統

    表面上看,分佈式系統與計算機網絡系統沒有多大區別。分佈式操做系統也是經過通訊網絡,將地理上分散的具備自治功能的數據處理系統或計算機系統互連起來,實現信息交換和資源共享,協做完成任務。——硬件鏈接相同。

    分佈式:將一個大的任務拆分紅幾個小的任務,分配給不一樣的任務處理機制,具體怎麼分配是由系統中的算法決定的,你們同時來運行本身的任務,而後各自將人物的返回結果再返回給你這個大的任務。

    但有以下一些明顯的區別:

      (1)分佈式系統要求一個統一的操做系統,實現系統操做的統一性。

      (2)分佈式操做系統管理分佈式系統中的全部資源,它負責全系統的資源分配和調度、任務劃分、信息傳輸和控制協調工做,併爲用戶提供一個統一的界面。

      (3)用戶經過這一界面,實現所須要的操做和使用系統資源,至於操做定在哪一臺計算機上執行,或使用哪臺計算機的資源,則是操做系統完成的,用戶沒必要知道,此謂:系統的透明性。

      (4)分佈式系統更強調分佈式計算和處理,所以對於多機合做和系統重構、堅強性和容錯能力有更高的要求,但願系統有:更短的響應時間、高吞吐量和高可靠性。

    分佈式系統已經很廣泛了,通常我的用不到,企業在處理比較大的任務的時候纔會使用。

5、操做系統原理

1. 操做系統的資源管理技術

  資源管理解決物理資源數量不足和合理分配資源這兩個問題。
  操做系統虛擬機爲用戶提供了一種簡單、清晰、易用、高效的計算機模型。虛擬機的每種資源都是物力資源經過複用、虛擬和抽象而獲得的產物。
  虛擬機提供進程運行的邏輯計算環境。從概念上來講,一個進程運行在一臺虛擬機上,能夠認爲一個進程就是一臺虛擬機,一臺虛擬機就是一個進程。

  • 複用:空分複用共享時分複用共享。 a. 空分複用共享(space-multiplexed sharing): 將資源從「空間」上分割成更小的單位供不一樣進程使用。在計算機系統中,內存和外存(磁盤)等是空分複用共享的。

    b. 時分複用共享(time-multiplexed sharing): 將資源從「時間」上分割成更小的單位供不一樣進程使用。在計算機系統中,處理器和磁盤機等是時分複用共享的。

  • 虛擬:對資源進行轉化、模擬或整合,把一個物理資源轉變成多個邏輯上的對應物,也能夠把多個物理資源變成單個邏輯上的對應物,即建立無須共享獨佔資源的假象,或建立易用且多於實際物理資源的虛擬資源假象,以達到多用戶共享一套計算機物理資源的目的。虛擬技術可用於外部設備(外部設備同時聯機操做(SPOOLing)),存儲資源(虛擬內存)和文件系統(虛擬文件系統(Virtual File System, VFS))中。

    複用和虛擬相比較,複用所分割的是實際存在的物理資源,而虛擬則實現假想的同類資源。虛擬技術解決某類物理資源不足的問題,提供易用的虛擬資源和更好的運行環境。

  • 抽象:經過建立軟件來屏蔽硬件資源的物理特性和實現細節,簡化對硬件資源的操做、控制和使用。

    複用和虛擬的主要目標是解決物理資源數量不足的問題,抽象則用於處理系統複雜性,重點解決資源易用性。

2. 系統調用

  • 系統調用: 爲給應用程序的運行提供良好環境,內核提供了一系列具備預約功能的服務例程,經過一組稱爲系統調用(System Call)的接口呈現給用戶,系統調用把應用程序的請求傳送至內核,調用相應的服務例程完成所需處理,將處理結果返回給應用程序。

注:系統調用的編號稱爲功能號

  • 系統調用的執行過程: 當CPU執行程序中編寫的由訪管指令(supervisor, 也稱自陷指令(trap)或中斷指令(interrupt), 指引發處理器中斷的機器指令)實現的系統調用時會產生異常信號,經過陷阱機制(也稱異常處理機制,當異常或中斷髮生時,處理器捕捉到一個執行線程,而且將控制權轉移到操做系統中某一個固定地址的機制),處理器的狀態由用戶態(user mode, 又稱目態或普通態)轉變爲核心態(kerbel mode, 又稱管態或內核態),進入操做系統並執行相應服務例程,以得到操做系統服務。當系統調用執行完畢時,處理器再次切換狀態,控制返回至發出系統調用的程序。

  • 系統調用是應用程序得到操做系統服務的惟一途徑。

系統調用的做用:
\1. 內核能夠基於權限和規則對資源訪問進行裁決,保證系統的安全性。
\2. 系統調用對資源進行抽象,提供一致性接口,避免用戶在使用資源時發生錯誤,且編程效率大大提升。

系統調用與函數調用的區別:
\1. 調用形式和實現方式不一樣。功能號 VS 地址; 用戶態轉換到內核態 VS 用戶態。
\2. 被調用代碼的位置不一樣。 動態調用 + 操做系統 VS 靜態調用 + 用戶級程序。
\3. 提供方式不一樣。 操做系統 VS 編程語言。

3. 操做系統內核

  • 內核: 是一組程序模塊,做爲可信軟件來提供支持進程併發執行的基本功能和基本操做,一般駐留在內核空間,運行於內核態,具備直接訪問硬件設備和全部內存空間的權限,是僅有的可以執行特權指令的程序。
  • 內核的功能: a. 中斷處理。中斷處理是內核中最基本的功能,也是操做系統賴以活動的基礎。 b. 時鐘管理。時鐘管理是內核的基本功能。 c. 短程調度。短程調度的職責是分配處理器,按照必定的策略管理處理器的轉讓,以及完成保護和恢復現場工做。 d. 原語管理。 原語是內核中實現特定功能的不可中斷過程。

內核是操做系統對裸機的第一次改造,內核和裸機組成了第一層虛擬機,進程在虛擬機上運行。

4. 處理器狀態: 內核態和用戶態

  • 僅在內核態下才能使用的指令稱爲特權指令,執行這些指令不只影響運行程序自身,並且還會干擾其餘程序及操做系統。 非特權指令在內核態和和用戶態下都能工做。

現代計算機爲處理器創建硬件標誌位,稱處理器狀態位,一般是程序狀態字(Program Status Word, PSW)中的一位,來將處理器的狀態設置爲內核態或用戶態。

  • 用戶態向內核態轉換的狀況: a. 程序請求操做系統服務, 執行系統調用。 b. 在程序運行時產生中斷事件(如I/O操做完成),運行程序被中斷,轉向中斷處理程序處理。 c. 在程序運行時產生異常事件(如在目態下執行特權指令),運行程序被打斷,轉向異常處理程序工做。

以上三種狀況都是經過中斷機制發生,能夠說中斷和異常是用戶態到內核態轉換的僅有途徑。

  • 用戶棧和核心棧 a. 用戶棧是用戶進程空間中的一塊區域。用於保存應用程序的子程序(函數)間相互調用的參數,返回值,返回點和子程序的局部變量。 b. 核心棧是內存中操做系統空間的一塊區域。用於保存中斷現場和保存操做系統程序(函數)間相互調用的參數,返回值,返回點和程序的局部變量。

5. 中斷(Interupt)

  • 中斷:程序執行過程當中遇到急需處理的事件時,暫時終止現行程序在CPU上的運行,轉而執行相應的事件處理程序,待處理完成後再返回斷點或調度其餘程序的執行過程。
  • 中斷的分類: a. 外中斷(又稱中斷或異步中斷): 來自處理器以外的中斷信號,如,時鐘中斷、鍵盤中斷等。外中斷可分爲可屏蔽中斷和非可屏蔽中斷。 b. 內中斷(又稱異常或同步中斷),來自處理器內部的中斷信號,如,訪管中斷,硬件故障中斷,程序性中斷等。內中斷不能被屏蔽。
  • 中斷和異常的響應: 發現中斷源 → 保護現場 → 轉向中斷/異常事件處理程序執行 → 恢復現場

6. 進程

  • 進程:具備獨立功能的程序在某個數據集合上的一次運行活動,也是操做系統進行資源分配和保護的基本單位。 a. 從原理角度看,進程是支持程序執行的一種系統機制,它對處理器上運行程序的活動進行抽象。

    b. 從實現角度看,進程是一種數據結構,用來準確地刻畫運行程序的狀態和系統動態變化情況。

  • 進程狀態的七態模型

    a. 新建態(new): 進程被建立,還沒有進入就緒隊列。 b. 就緒態(ready): 進程具有運行條件,等待系統分配處理器。 c. 掛起就緒態(ready suspend):進程具有運行條件,但目前在外存中。 d. 運行態(running): 進程佔有處理器正在運行。 e. 終止態(exit): 進程達到正常結束點或被其餘緣由所終止,下一步將被撤銷。 f. 等待態(wait): 又稱阻塞態或休眠態。進程正在等待某個事件完成,目前不具有運行條件。

    g. 掛起等待態(blocked suspend): 進程正在等待某個事件完成,而且在外存中。

  • 程序和數據刻畫進程的靜態特徵,稱爲進程控制塊的一種數據結構刻畫進程的動態特徵。進程映像(process image)包括進程控制塊、進程程序塊、進程核心塊、進程數據塊等要素。

  • 進程控制塊(Process Control Block, PCB):進程存在的惟一標識,操做系統掌握進程的惟一資料結構和管理進程的主要依據。包括標識信息、現場信息和控制信息等信息。

  • 進程隊列(process queue):處於同一狀態的全部進程的PCB連接在一塊兒的數據結構。 有兩種隊列組織方式:連接方式和索引方式。

  • 進程切換一定在內核態而非用戶態發生。

  • 進程能夠分爲兩部分,資源集合和線程集合。進程要支撐線程運行,爲線程提供虛擬地址空間和各類資源。進程封裝管理信息,線程封裝執行信息。

7. 處理器調度

  • 處理器調度層次: a. 高級調度: 又稱做業調度、長程調度。從輸入系統的一批做業(job, 用戶提交給操做系統計算的一個獨立任務)中按照預約的調度策略挑選若干做業進入內存,爲其分配所需資源並建立對應做業的用戶進程。 b. 中級調度: 又稱平衡調度,中程調度。根據內存資源狀況決定內存所能容納的進程數目,並完成外存和內存中進程對換工做。

    c. 低級調度:又稱進程調度/線程調度,短程調度。根據某種原則決定就緒隊列中那個進程/線程先得到處理器,並將處理器出讓給它使用。

  • 低級調度算法: a. 先來先服務(First Come First Server, FCFS)算法。 b. 最短做業優先(Shortest Job First, SJF)算法。 c. 最短剩餘時間優先(Shortest Remaining Time First, SRTF)算法: 假設當前某進程/線程正在運行,若是有新進程/線程移入就緒隊列,若它所需的CPU運行時間比當前運行的進程/線程所需的剩餘CPU時間還短,搶佔式最短做業優先算法強行剝奪當前執行者的控制權,調度新進程/線程執行。 d. 最高響應比優先(Highest Response Ratio First, HRRF)算法:非剝奪式算法。其中,響應比 = (做業已等待時間 + 做業處理時間) / 做業處理時間。 e. 優先級調度算法:優先級高的選擇進程/線程優先選擇。 f. 輪轉調度(Round-Robin, RR)算法: 也稱時間片調度。就緒隊列的進程輪流運行一個時間片。

    g. 多級反饋隊列(Multi-Level Feedback Queue, MLFQ)算法。

    衡量調度算法的性能指標: a. 資源利用率: CPU利用率 = CPU有效工做時間/(CPU有效工做時間 + CPU空閒等待時間) b. 吞吐率: 單位時間內CPU處理做業的個數。 c. 公平性: 確保每一個進程都能得到合理的CPU份額和其餘資源份額,不會出現飢餓現象。 d. 響應時間: 從交互式進程提交一個請求(命令)直到得到響應之間的時間間隔。

    e. 週轉時間: 批處理用戶從向系統提交做業開始到做業完成爲止的時間間隔。
    平均週轉時間:T = (∑ni=1ti∑i=1nti ) / n , 其中 titi 表示做業i的週轉時間。
    平均帶權做業週轉時間: T = (∑ni=1wi∑i=1nwi) / n, 其中 wi=ti/tkwi=ti/tk , titi 表示做業i的週轉時間。 tktk 表示做業i的運行時間。

8. 進程的交互

  • 進程互斥(Mutual Exclusion): 若干進程因相互搶奪獨佔型資源而產生的競爭制約關係。

  • 進程同步(Synchronization): 爲完成共同任務的併發進程基於某個條件來協調其活動,由於須要在某些位置上排定執行的前後次序而等待、傳遞信息或消息所產生的協做制約關係。

    資源競爭會引起兩個控制問題: a. 死鎖: 一組進程因爭奪資源陷入永遠等待的狀態。

    b. 飢餓: 一個可運行進程因爲因爲其餘進程老是優先於它,而被調度程序無限期地拖延而不能被執行。

9. 臨界區管理

  • 併發進程中與共享變量有關的程序段稱爲臨界區(Critical Section)。共享變量所表明的資源稱爲臨界資源(Critical Resource),即一次僅能供一個進程使用的資源。

  • 臨界區調度原則: a. 擇一而入。 一次之多隻有一個進程進入臨界區內執行。 b. 忙則要等。 若是已有進程在臨界區中, 試圖進入此臨界區的其餘進程應等待。

    c. 有限等待。 進入臨界區內的進程應在有限時間內退出。

  • 臨界區管理的軟件算法:Peterson算法。
    爲每一個進程設置標誌,當標誌值爲 true 時表示該進程要求進入臨界區,另外再設置一個指示器 turn 以指示能夠由哪一個進程進入臨界區,當 turn = i 時則可由 Pi 進入臨界區。

    1 /* Peterson 算法 */
     2 
     3 bool inside[2];
     4 inside[0] = false;
     5 inside[1] = false;
     6 enum { 0, 1 } turn;
     7 
     8 /* 進程0 */
     9 process P0(){
    10     inside[0] = true;               //請求...
    11     turn = 1;
    12     while(inside[1] && turn == 1) ; //等待...
    13 
    14     /*臨界區 */
    15 
    16     inside[0] = false;              //歸還...
    17 }
    18 
    19 /* 進程1 */
    20 process P1(){
    21     inside[1] = true;               //請求...
    22     turn = 0;
    23     while(inside[0] && turn == 0) ; //等待...
    24 
    25     /*臨界區 */
    26 
    27     inside[1] = false;              //歸還...
    28 }
  • Peterson算法知足臨界區管理的三個原則。

  • 臨界區管理的硬件設施: a. 關中斷。 在進程進入臨界區時關中斷,進程退出臨界區時開中斷。 b. 測試並設置指令。 利用機器指令TS(Test and Set)實現臨界區的上鎖和開鎖原語操做。

    c. 對換指令。 利用對換指令實現臨界區的上鎖和開鎖原語操做。

10. 信號量(samaphore)和PV操做

PV操做都是原語操做, 不可中斷。

  • 信號量和PV操做

    1 // 信號量
     2 typedef struct semaphore {
     3     int value;                 // 信號量值
     4     struct pcb* list;          // 指向「等待該信號量的進程隊列」的指針
     5 };  
     6 
     7 // P操做
     8 void P(semaphore s){
     9     s.value--;                 // 信號量值減一
    10 
    11     // 若是信號量值小於0, 執行P操做的進程調用sleep(s.list)阻塞本身,
    12     // 被置成「等待信號量s」狀態,並移入s信號量隊列,轉向進程調度程序。
    13     if(s.value < 0) sleep(s.list);
    14 }
    15 
    16 // V操做
    17 void V(semaphore s){
    18     s.value++;                 // 信號量值加一
    19 
    20     // 若是信號量小於等於0, 則調用wakeup(s.list)釋放一個等待信號量s的進程,
    21     // 並轉換成就緒態, 進程則繼續執行。
    22     if(s.value <= 0) wakeup(s.list);
    23 }
  • a. 若信號量值 s.value 爲正值, 此值等於在封鎖進程以前對信號量 s 可施行P操做的次數,即,s所表明的實際可用的資源數。 b. 若信號量值 s.value 爲負值, 其絕對值等於登記在 s 信號量隊列中的等待進程的數目。

    c. 一般P操做意味着請求一個資源,V操做意味着釋放一個資源。在必定條件下,P操做也可表示掛起進程的操做,V操做表明喚醒被掛起進程的操做。

  • 信號量實現互斥

    1 semaphore mutex;
     2 mutex = 1;
     3 
     4 //進程Pi, i = 1, 2 ..., n
     5 process Pi(){
     6     P(mutex);
     7 
     8     /* 臨界區 */
     9 
    10     V(mutex);
    11 }

11. 管程

  • 管程(monitor):表明共享資源的數據結構及併發進程在其上執行的一組構成就構成管程,管程被請求和釋放資源的進程鎖調用。

    a. 條件變量。 管程內的一種數據結構。只有在管程中才能被訪問,進程能夠在條件變量上等待或被喚醒。只能經過 wait()signal() 原語操做來控制。 b. wait() 原語。 掛起調用進程並釋放管程,直至另外一個進程在條件變量上執行 signal()

    c. signal() 原語。若是有其餘的進程因對條件變量執行 wait() 而被掛起,便釋放之。 若是沒有進程在等待,那麼至關於空操做,信號不被保存。

12. 死鎖

  • 死鎖的主要解決方法: 死鎖防止、死鎖避免、死鎖檢測和恢復。

  • 死鎖產生的必要條件: a. 互斥條件。 臨界資源是獨佔資源,進程應互斥且排他地使用這些資源。 b. 佔有和等待條件。 進程在請求資源得不到知足而等待時,不釋放已佔有的資源。 c. 不剝奪條件。已獲資源只能由進程資源釋放,不容許被其餘程序剝奪。

    d. 循環等待條件。 存在循環等待鏈,其中每一個進程都在等待下一個進程所持有的資源。

    死鎖的防止就是去破壞死鎖產生的必要條件。 如,使資源可同時使用(破壞互斥條件)、靜態分配資源(破壞佔有和等待條件)、剝奪調度(破壞不剝奪條件)、層次分配策略(循環等待條件)等。

  • 死鎖避免: 銀行家算法 (額…本身百度去吧。 = =!)

  • 死鎖檢測和恢復: 進程-資源分配圖(額…仍是去百度吧。) a. 若是進程-資源分配圖中無環路,此時系統沒有死鎖。 b. 若是進程-資源分配圖中有環路,且每一個資源類中只有一個資源,則系統發生死鎖。

    c. 若是進程-資源分配圖中有環路,且所涉及的資源類有多個資源,則不必定會發生死鎖。

13. 可變分區存儲管理

  • 可變分區存儲分配算法: a. 最早適應分配算法。從未分配區的開始位置開始掃描,在找到的第一個能知足長度要求的空閒區上分配存儲空間。 b. 下次適應分配算法。從未分配區上次掃描結束處開始順序查找,在找到的第一個能知足長度要求的空閒區上分配存儲空間。 c. 最優適應分配算法。掃描整個未分配區,選擇能知足用戶進程要求的最小分區分配存儲空間。 d. 最壞適應分配算法。掃描整個未分配區,選擇能知足用戶進程要求的最大分區分配存儲空間。 e. 快速適應分配算法。爲常常用到的長度的空閒區設立單獨的空閒區鏈表。

14. 分頁存儲管理

  • 基本概念: a. 頁面。 進程邏輯地址空間分紅大小相等的區,每一個區稱爲頁面或頁。(注: 頁面的本質是邏輯地址空間) b. 頁框(kuàng, 0.0)。 又稱頁幀。內存物理地址空間分紅大小相等的區,其大小和頁面大小相等,每一個區就是一個頁框。(注: 頁框的本質是物理地址空間) c. 邏輯地址。分頁存儲器的邏輯地址由頁號和頁內偏移兩部分組成。 d. 內存頁框表。頁框表的表項給出物理塊使用狀況:0爲空閒,1爲佔用。

    e. 頁表。頁表是操做系統爲進程創建的,是程序頁面和內存頁框的對照表,頁表的每一欄指明程序中的某一頁面和分得的頁框之間的關係。

  • 分頁存儲管理的地址轉換

  • 翻譯快表:也稱轉換後援緩衝(Translation Look_aside Buffer, TLB)。用來存放進程最近訪問的部分頁表項。(注: 翻譯快表之於頁表相似於Cache之於存儲器)

  • 二級頁表:把整個頁表分割成許多小頁表,每一個稱爲頁表頁,每一個頁表頁含有若干個頁表表項。頁表頁容許分散對應不連續的頁框。爲了找到頁表頁,應創建地址索引,稱爲頁目錄表,其表項指出頁表頁起始地址。

  • 二級頁表實現邏輯地址到物理地址轉換的過程: 由硬件「頁目錄表基址寄存器」指出當前運行進程的頁目錄表的內存起始地址,加上「頁目錄位移」做爲索引,可找到頁表頁在內存的起始地址,再以「頁目錄位移」做爲索引,找到頁表頁在內存的起始位置,再以「頁表頁位移」做爲索引,找到頁表頁的表項,此表項中包含一個頁面對應的頁框號,由頁框號和頁內偏移即可生成物理地址。

    注: 類比於書的目錄,找某一段內容的時候,先在目錄上找到對應的章節,再在對應的章節下面找具體的知識點。好比,我要在《操做系統原理》中查「多級頁表」。首先我知道它是在存儲管理一章的,因而就找到了「第四章 存儲管理」(相似於找到了頁目錄表)。 而後在第四章下面找「多級頁表」(相似於在頁目錄表下面找具體的頁表頁)。最後找到「多級頁表」對應的頁碼(相似於在頁表頁中找到其對應的頁框)。最後查閱對應的章節頁碼(相似於讀取對應頁框的數據)。

15. 分段存儲管理

分段和分頁的比較:

a. 分段是信息的邏輯單位,由源程序的邏輯結構及含義所決定,是用戶可見的,段長由用戶根據須要來肯定,段起始地址能夠從任何內存地址開始。引入的目的是知足用戶模塊化程序設計的須要

b. 分頁是信息的物理單位,與源程序的邏輯無關,是用戶不可見的,頁長由系統(硬件)決定,頁面只能從頁大小的整數倍地址開始。引入目的是實現離散分配並提升內存利用率

16. 虛擬存儲管理

  • 虛擬存儲管理的基本思路:

    把磁盤空間當作內存的一部分,進程的程序和數據部分放在內存中,部分放在磁盤上。程序運行時,它執行的指令或訪問的數據在哪裏由存儲管理負責判斷,並針對狀況採起響應的措施。

  • 請求分頁虛存管理: 將進程信息副本存放在外存中,當它被調度投入運行時,程序和數據沒有所有裝進內存,僅裝入當前使用頁面,進程執行過程當中訪問到不在內存的頁面時,產生缺頁異常,再由系統自動調入。

  • 全局頁面替換策略(頁面替換算法的做用範圍是整個系統,不考慮進程的屬主): a. 最佳頁面替換算法(Optimal Replacement, OPT)。 淘汰再也不訪問的頁或者距如今最長時間後才訪問的頁。 b. 先進先出頁面替換算法(First in First Out Replacement, FIFO)。淘汰在內存中駐留時間最長的頁。 c. 最近最少使用頁面替換算法(Least Recently Used Replacement, LRU)。 淘汰最近一段時間內最久未被使用的頁面。 d. 第二次機會頁面替換算法(Second Chance Replacement, SCR)。 首先檢查FIFO頁面隊列中的隊首,這是最先進入內存的頁面,若是其「引用位」爲0,那麼它最先進入且未被引用,此頁被淘汰。若是其「引用位」爲1,說明雖然它最先進內存,但最近仍在使用,因而將「引用位」清零,並把這個頁面移到隊尾,把它看作新調入的頁面,再給它一次機會。

    e. 時鐘頁面替換算法(Clock Policy Replacement, Clock)。與SCR算法思路一致。只是用循環隊列來構造頁面隊列,隊列指針指向可能被淘汰的頁面。若是隊列指針指向的頁的「引用位」爲1,則將其置爲0,同時隊列指針指向下一個頁。

  • 局部頁面替換算法(頁面替換算法的做用侷限於進程自身,要爲進程維護稱爲工做集的一組頁面): a. 局部最佳頁面替換算法(Local Minimum Replacement, MIN)。 在t時刻時,若頁面P在將來(t, t+delta)時間段內未被引用,則它被淘汰。 b. 工做集置換算法。 在t時刻時,若頁面P在將來(t-delta, t)時間段內未被引用,則它被淘汰。 c. 模擬工做集替換算法。

    d. 缺頁頻率替換算法。

17. 請求段頁式虛擬內存管理

  • 虛地址以程序的邏輯結構劃分爲段。
  • 實地址劃分爲位置固定、大小相等的頁框(塊)。
  • 邏輯地址分爲三個部分:段號s、段內頁號p、頁內位移d。對於用戶而言,段式虛擬地址應該由段號s和段內位移d’組成,操做系統內部自動把d’解釋成段內頁號p和頁內位移號d。

18. I/O硬件原理:I/O控制方式

  • 輪詢方式: 又稱程序直接控制方式。使用查詢指令測試設備控制器的忙閒狀態位,肯定內存和設備是否能能交換數據。(注:所謂輪詢,就比如,老溼依次問每個童鞋:「有問題沒?」, 若是沒問題,就繼續問下一個童鞋。若是這個童鞋有問題,這個老溼就停下了解決這個問題。而後又繼續詢問下一個童鞋。)
  • 中斷方式: 要求CPU和設備控制器及設備之間存在中斷請求線,設備控制器的狀態寄存器有相應的中斷容許位。 a. 進程發出啓動I/O指令。 b. 設備控制器檢查狀態寄存器的內容,執行相應的I/O操做,一旦傳輸完成,設備控制器經過中斷請求線發出I/O中斷信號。 c. CPU收到並響應I/O中斷後,轉向設備的I/O中斷處理程序執行。 d. 中斷處理程序執行數據讀取操做,將I/O緩衝寄存器的內容寫入內存。操做結束後退出中斷程序恢復以前的狀態。 e. 執行中斷前以前運行的進程。
    (注: 相似於老溼在上面講課,有童鞋問問題時,老溼就記錄下本身講到的位置,而後取回答童鞋的問題,回答完以後,又回到剛剛講課的地方繼續講課)
  • DMA(Direct Memory Access, 直接存儲器存取)方式: 內存和設備之間有一條數據通路成塊的傳輸數據,無須CPU幹9預,實際數據傳輸操做由DMA直接完成。
  • 通道方式: CPU在執行主程序時遇到I/O請求,啓動在指定通道上選址的設備,一旦啓動成功,通道開始控制設備進行操做,這時CPU就能夠執行其餘任務並與通道並行工做,直到I/O操做完成;當通道發出I/O操做結束中斷時,處理器才響應並中止當前工做,轉而處理I/O操做結束時間。

19. I/O軟件原理

  • I/O中斷處理程序: 一般是設備驅動程序的組成部分之一。檢查設備狀態寄存器內容,判斷產生中斷緣由,根據I/O操做的完成狀況進行相應處理。若數據傳輸有錯,應向上層軟件報告設備出錯信息,實施從新執行;若正常結束,應喚醒等待傳輸的進程,使其轉換爲就緒態;如有等待傳輸的I/O命令,應通知相關軟件啓動下一個I/O請求。
  • I/O設備驅動程序:設備驅動程序是設備專有的。把用戶提交的邏輯I/O請求轉化爲物理I/O的啓動和執行。同時監督設備是否正確執行,管理數據緩衝區,進行必要的糾錯處理。
  • 獨立於設備的I/O軟件
  • 用戶空間的I/O軟件

20. 緩衝技術

  • 緩衝技術的基本思想: 當進程執行寫操做輸出數據時,先向系統申請一個輸出緩衝區,而後將數據送至緩衝區,如果順序寫請求,則不斷地把數據填入緩衝區,直至裝滿爲止,此後進程能夠繼續計算,同時,系統將緩衝區的內容寫在設備上。當進程執行讀操做輸入數據時,先向系統申請一個輸入緩衝區,系統將設備上的一條物理記錄讀至緩衝區,根據要求把當前所須要的邏輯記錄從緩衝區中選出並傳送給進程。

  • 單緩衝: 是最簡單的緩衝技術,每當有I/O請求時,操做系統就在內存的系統區中開設一個緩衝區。不容許多個進程同時對一個緩衝器操做。

  • 雙緩衝: CPU可把輸出到設備的數據放入其中一個緩衝器(區)、讓設備慢慢處理;而後,它又能夠從另外一個爲終端設置的緩衝器(區)中讀取所須要的輸入數據。

  • 多緩衝: 是把多個緩衝區鏈接起來組成兩部分,一部分專門用於輸入,另外一部分專門用於輸出的緩衝結構。

21. 驅動調度技術

  • 磁盤的物理結構:
    磁盤包括多個盤面,每一個盤面有一個讀寫磁頭,全部的磁頭都固定在惟一的移動臂上同時移動。一個盤面上的讀寫磁頭的軌跡稱爲磁道,讀寫磁頭下的全部磁道造成柱面,一個磁道又能夠劃分爲多個扇區。在磁盤上定位某個物理記錄須要知道其柱面號、磁頭號以及扇區號。定位物理記錄時,磁頭到達指定扇區的時間稱爲查找時間, 選擇磁頭號並旋轉至指定扇區的時間稱爲搜索延遲。
  • 磁道(柱面)的搜索定位算法: a. 先來先服務算法(First Come First Server algorithm, FCFS)。 b. 最短查找時間優先算法: 老是執行查找時間最短的請求。 c. 掃描算法: 移動臂來回的掃過全部柱面,掃描處遇到I/O請求便進行處理。 d. 分步掃描算法: 將I/O請求分爲長度爲N的子隊列,按FIFO算法依次處理每一個隊列,而每一個子隊列採用掃描算法,處理完一個後再服務下一個隊列。 e. 電梯調度算法: 又稱LOOK算法。
    磁頭號由外向內遞增。 f. 循環掃描算法: 移動臂老是從0號柱面至最大號柱面順序掃描,而後直接返回0號柱面重復進行,歸途中不提供服務(而掃描算法歸途是要提供服務的)。

22. 設備獨立性

  • 設備獨立性: 用戶一般不指定物理設備,而是指定邏輯設備,使得用戶做業和物理設備分離開來,再經過其餘途徑創建邏輯設備和物理設備之間的映射,設備的這種特性稱爲設備獨立性。

23. 虛擬設備

  • 外部設備同時聯機操做(Simultaneous Peripheral Operations On Line, SPPPLing):

    a. 預輸入程序。 控制信息從輸入設備至輸入井,填寫預輸入表以便在做業執行過程當中要求輸入信息時能夠隨時找到其存放位置。 b. 井管理程序。 做業執行過程當中要求啓動某臺設備進程I/O操做時,做業控制程序截獲這個要求並調用井管理程序控制從相應輸入井讀取信息,或將信息送至輸出井。

    c. 緩輸出程序。 當處理器空閒時,操做系統調用緩輸出程序執行緩輸出,它查看緩輸出表是否有輸出打印的文件,文件打印前還可能組織做業或文件標題,也可能對從輸出井中讀出的信息進行格式加工。

24. 文件邏輯結構

  • 文件的邏輯結構的兩種形式: a. 流式文件。 一種無結構的文件,文件內的數據再也不組成記錄,只是一串順序的信息集合,稱爲字節流文件。 b. 記錄式文件。 一種有結構的文件,包含若干邏輯記錄,邏輯記錄是文件中按信息在邏輯上獨立含義所劃分的信息單位。

25. 文件物理結構

  • 文件物理結構: 文件的物理結構和組織是指邏輯文件在物理存儲空間中的存放方法和組織關係。
  • 常見組織方式:順序文件、鏈接文件、直接文件和索引文件。

2、Q&A

1. 什麼是操做系統?操做系統在計算機系統中的主要做用是什麼?

  • 定義: 操做系統尚無嚴格的定義。 通常可把操做系統定義爲: 管理系統資源、控制程序執行、改善人機界面、提供各類服務,併合理組織計算機工做流程和爲用戶方便有效地使用計算機提供良好的運行環境的一種軟件系統。
  • 做用: a. 服務用戶。 操做系統做爲用戶接口和公共服務程序。 b. 進程交互。 操做系統做爲進程執行的控制者和協調者。 c. 系統實現。 操做系統做爲擴展機或虛擬機。 d. 資源管理。 操做系統做爲資源的管理者和控制者。

2. 什麼是多道程序設計?多道程序設計有什麼特色?

  • 多道程序設計(multiprogramming): 容許多個做業(程序)同時進入計算機系統的內存並啓動交替計算的方法。
  • 多道程序設計的特色: 從宏觀上看是並行的,從微觀上看是串行的。

3. 計算機操做系統爲何引入進程?

  • 刻畫程序的併發性。
  • 解決資源的共享性。

4. 在分時系統中,什麼是響應時間?它與哪些因素有關?

  • 從交互式進程提交一個請求(命令)直到得到響應之間的時間間隔稱爲響應時間。
  • 影響分時操做系統的響應時間的因素不少,如,CPU的處理速度、聯機終端的數目、所用時間片的大小、系統調度開銷和對換信息量的多少等。

5. 解釋併發性與並行性

  • 計算機操做系統中把並行性和併發性明顯區分開,主要是從微觀的角度來講的,具體是指進程的並行性(多處理機的狀況下,多個進程同時運行)和併發性(單處理機的狀況下,多個進程在同一時間間隔運行的)。
  • 並行性是指硬件的並行性,兩個或多個事件在同一時刻發生。
  • 併發性是指進程的併發性,兩個或多個事件在同一時間段內發生。

6. 試述存儲管理的基本功能。

  • 存儲分配。
  • 地址映射。
  • 存儲保護。
  • 存儲共享。
  • 存儲擴充。

7. 何謂地址轉換(重定向)?哪些方法能夠實現地址轉換?

  • 地址重定位: 又稱地址轉換,地址映射。 可執行程序邏輯地址轉換(綁定)爲物理地址的過程。

  • 實現方法: a. 靜態地址重定位。 由裝載程序實現裝載代碼模塊的加載和地址轉換,把它裝入分配給進程的內存指定區域,其中的全部邏輯地址修改爲內存物理地址。

    b. 動態地址重定位。

    由裝載程序實現裝載代碼模塊的加載和地址轉換,把它裝入分配給進程的內存指定區域,但對連接程序處理過的應用程序的邏輯地址則不作任何修改,程序內存起始地址被置於硬件專用寄存器 —— 重定位寄存器。程序執行過程當中,每當CPU引用內存地址(訪問程序和數據)時,由硬件截取此邏輯地址,並在它被髮送到內存以前加上重定位寄存器的值,以便實現地址轉換。

    c. 運行時連接地址重定位

    程序連接的三種方式: a. 靜態連接。在程序裝載到內存和運行前,就已將它的全部目標模塊及所須要的庫函數進行連接和裝配成一個完整的可執行程序且此後不可拆分。 b. 動態連接。在程序裝入內存前 並未事先進行程序各目標模塊的連接,而是在程序裝載時一邊裝載一邊連接,生成一個可執行文件。

    c. 運行時連接。 將某些目標模塊或庫函數的連接 推遲到執行時才進行。

8. 什麼是文件的共享?介紹文件共享的分類和實現思想。

文件共享: 不一樣進程共同使用同一個文件。
文件共享的分類:

a. 靜態共享。 兩個或多個進程經過文件連接(一個文件同時屬於多個目錄,但實際上僅有一處物理存儲)達到共享同一個文件的目的,不管進程是否運行,其文件的連接關係都是存在的,所以稱爲靜態共享。

b. 動態共享。 系統不一樣的應用程序或同一用戶的不一樣進程併發地訪問同一文件,這種共享關係只有當進程存在時纔可能出現,一旦進程消亡,其共享關係也就隨之消失。

c. 符號連接共享

什麼是進程

​ 進程:正在進行的一個過程或者說一個任務。而負責執行任務則是cpu。

二 進程與程序的區別

程序僅僅只是一堆代碼而已,而進程指的是程序的運行過程。

須要強調的是:同一個程序執行兩次,那也是兩個進程。

三 併發與並行

不管是並行仍是併發,在用戶看來都是'同時'運行的,無論是進程仍是線程,都只是一個任務而已,真是幹活的是cpu,cpu來作這些任務,而一個cpu同一時刻只能執行一個任務

​ 一 併發:是僞並行,即看起來是同時運行。單個cpu+多道技術就能夠實現併發,(並行也屬於併發)

​ 二 並行:同時運行,只有具有多個cpu才能實現並行

​ 單核下,能夠利用多道技術,多個核,每一個核也均可以利用多道技術(多道技術是針對單核而言的

​ 有四個核,六個任務,這樣同一時間有四個任務被執行,假設分別被分配給了cpu1,cpu2,cpu3,cpu4,

​ 一旦任務1遇到I/O就被迫中斷執行,此時任務5就拿到cpu1的時間片去執行,這就是單核下的多道技術

​ 而一旦任務1的I/O結束了,操做系統會從新調用它(需知進程的調度、分配給哪一個cpu運行,由操做系統說了算),可能被分配給四個cpu中的任意一個去執行

img

全部現代計算機常常會在同一時間作不少件事,一個用戶的PC(不管是單cpu仍是多cpu),均可以同時運行多個任務(一個任務能夠理解爲一個進程)。

    啓動一個進程來殺毒(360軟件)

    啓動一個進程來看電影(暴風影音)

    啓動一個進程來聊天(騰訊QQ)

全部的這些進程都需被管理,因而一個支持多進程的多道程序系統是相當重要的

多道技術概念回顧:內存中同時存入多道(多個)程序,cpu從一個進程快速切換到另一個,使每一個進程各自運行幾十或幾百毫秒,這樣,雖然在某一個瞬間,一個cpu只能執行一個任務,但在1秒內,cpu卻能夠運行多個進程,這就給人產生了並行的錯覺,即僞併發,以此來區分多處理器操做系統的真正硬件並行(多個cpu共享同一個物理內存)

四 同步\異步and阻塞\非阻塞(重點)

同步:

#所謂同步,就是在發出一個功能調用時,在沒有獲得結果以前,該調用就不會返回。按照這個定義,其實絕大多數函數都是同步調用。可是通常而言,咱們在說同步、異步的時候,特指那些須要其餘部件協做或者須要必定時間完成的任務。
#舉例:
#1. multiprocessing.Pool下的apply #發起同步調用後,就在原地等着任務結束,根本不考慮任務是在計算仍是在io阻塞,總之就是一股腦地等任務結束
#2. concurrent.futures.ProcessPoolExecutor().submit(func,).result()
#3. concurrent.futures.ThreadPoolExecutor().submit(func,).result()

異步:

#異步的概念和同步相對。當一個異步功能調用發出後,調用者不能馬上獲得結果。當該異步功能完成後,經過狀態、通知或回調來通知調用者。若是異步功能用狀態來通知,那麼調用者就須要每隔必定時間檢查一次,效率就很低(有些初學多線程編程的人,總喜歡用一個循環去檢查某個變量的值,這實際上是一 種很嚴重的錯誤)。若是是使用通知的方式,效率則很高,由於異步功能幾乎不須要作額外的操做。至於回調函數,其實和通知沒太多區別。
#舉例:
#1. multiprocessing.Pool().apply_async() #發起異步調用後,並不會等待任務結束才返回,相反,會當即獲取一個臨時結果(並非最終的結果,多是封裝好的一個對象)。
#2. concurrent.futures.ProcessPoolExecutor(3).submit(func,)
#3. concurrent.futures.ThreadPoolExecutor(3).submit(func,)

阻塞:

#阻塞調用是指調用結果返回以前,當前線程會被掛起(如遇到io操做)。函數只有在獲得結果以後纔會將阻塞的線程激活。有人也許會把阻塞調用和同步調用等同起來,實際上他是不一樣的。對於同步調用來講,不少時候當前線程仍是激活的,只是從邏輯上當前函數沒有返回而已。
#舉例:
#1. 同步調用:apply一個累計1億次的任務,該調用會一直等待,直到任務返回結果爲止,但並未阻塞住(即使是被搶走cpu的執行權限,那也是處於就緒態);
#2. 阻塞調用:當socket工做在阻塞模式的時候,若是沒有數據的狀況下調用recv函數,則當前線程就會被掛起,直到有數據爲止。

非阻塞:

#非阻塞和阻塞的概念相對應,指在不能馬上獲得結果以前也會馬上返回,同時該函數不會阻塞當前線程。

小結:

#1. 同步與異步針對的是函數/任務的調用方式:同步就是當一個進程發起一個函數(任務)調用的時候,一直等到函數(任務)完成,而進程繼續處於激活狀態。而異步狀況下是當一個進程發起一個函數(任務)調用的時候,不會等函數返回,而是繼續往下執行當,函數返回的時候經過狀態、通知、事件等方式通知進程任務完成。

#2. 阻塞與非阻塞針對的是進程或線程:阻塞是當請求不能知足的時候就將進程掛起,而非阻塞則不會阻塞當前進程

五 進程的建立(瞭解)

  但凡是硬件,都須要有操做系統去管理,只要有操做系統,就有進程的概念,就須要有建立進程的方式,一些操做系統只爲一個應用程序設計,好比微波爐中的控制器,一旦啓動微波爐,全部的進程都已經存在。

  而對於通用系統(跑不少應用程序),須要有系統運行過程當中建立或撤銷進程的能力,主要分爲4中形式建立新的進程

  1. 系統初始化(查看進程linux中用ps命令,windows中用任務管理器,前臺進程負責與用戶交互,後臺運行的進程與用戶無關,運行在後臺而且只在須要時才喚醒的進程,稱爲守護進程,如電子郵件、web頁面、新聞、打印)
  2. 一個進程在運行過程當中開啓了子進程(如nginx開啓多進程,os.fork,subprocess.Popen等)
  3. 用戶的交互式請求,而建立一個新進程(如用戶雙擊暴風影音)
  4. 一個批處理做業的初始化(只在大型機的批處理系統中應用)

  不管哪種,新進程的建立都是由一個已經存在的進程執行了一個用於建立進程的系統調用而建立的:

  1. 在UNIX中該系統調用是:fork,fork會建立一個與父進程如出一轍的副本,兩者有相同的存儲映像、一樣的環境字符串和一樣的打開文件(在shell解釋器進程中,執行一個命令就會建立一個子進程)
  2. 在windows中該系統調用是:CreateProcess,CreateProcess既處理進程的建立,也負責把正確的程序裝入新進程。

關於建立的子進程,UNIX和windows

  1.相同的是:進程建立後,父進程和子進程有各自不一樣的地址空間(多道技術要求物理層面實現進程之間內存的隔離),任何一個進程的在其地址空間中的修改都不會影響到另一個進程。

  2.不一樣的是:在UNIX中,子進程的初始地址空間是父進程的一個副本,提示:子進程和父進程是能夠有隻讀的共享內存區的。可是對於windows系統來講,從一開始父進程與子進程的地址空間就是不一樣的。

六 進程的終止(瞭解)

  1. 正常退出(自願,如用戶點擊交互式頁面的叉號,或程序執行完畢調用發起系統調用正常退出,在linux中用exit,在windows中用ExitProcess)
  2. 出錯退出(自願,python a.py中a.py不存在)
  3. 嚴重錯誤(非自願,執行非法指令,如引用不存在的內存,1/0等,能夠捕捉異常,try...except...)
  4. 被其餘進程殺死(非自願,如kill -9)

七 進程的層次結構

  不管UNIX仍是windows,進程只有一個父進程,不一樣的是:

  1. 在UNIX中全部的進程,都是以init進程爲根,組成樹形結構。父子進程共同組成一個進程組,這樣,當從鍵盤發出一個信號時,該信號被送給當前與鍵盤相關的進程組中的全部成員。
  2. 在windows中,沒有進程層次的概念,全部的進程都是地位相同的,惟一相似於進程層次的暗示,是在建立進程時,父進程獲得一個特別的令牌(稱爲句柄),該句柄能夠用來控制子進程,可是父進程有權把該句柄傳給其餘子進程,這樣就沒有層次了。

八 進程的狀態

  tail -f access.log |grep '404'

  執行程序tail,開啓一個子進程,執行程序grep,開啓另一個子進程,兩個進程之間基於管道'|'通信,將tail的結果做爲grep的輸入。

  進程grep在等待輸入(即I/O)時的狀態稱爲阻塞,此時grep命令都沒法運行

  其實在兩種狀況下會致使一個進程在邏輯上不能運行,

  1. 進程掛起是自身緣由,遇到I/O阻塞,便要讓出CPU讓其餘進程去執行,這樣保證CPU一直在工做
  2. 與進程無關,是操做系統層面,可能會由於一個進程佔用時間過多,或者優先級等緣由,而調用其餘的進程去使用CPU。

  於是一個進程由三種狀態

img

九 進程併發的實現(瞭解)

  進程併發的實如今於,硬件中斷一個正在運行的進程,把此時進程運行的全部狀態保存下來,爲此,操做系統維護一張表格,即進程表(process table),每一個進程佔用一個進程表項(這些表項也稱爲進程控制塊)

img

  該表存放了進程狀態的重要信息:程序計數器、堆棧指針、內存分配情況、全部打開文件的狀態、賬號和調度信息,以及其餘在進程由運行態轉爲就緒態或阻塞態時,必須保存的信息,從而保證該進程在再次啓動時,就像從未被中斷過同樣。

相關文章
相關標籤/搜索