1.操做系統歷史html
2.進程,IO,同步異步阻塞非阻塞python
手工操做:算法
1946年第一臺計算機誕生--20世紀50年代中期,計算機工做還在採用手工操做方式。此時尚未操做系統的概念。安全
脫機批處理系統:爲克服與緩解:高速主機與慢速外設的矛盾,提升CPU的利用率,又引入了脫機批處理系統,即輸入/輸出脫離主機控制。服務器
多道程序系統(IO到了就切換任務):網絡
#兩個做業之間,若是一個做業遇到了IO操做了,另一個做業就開始使用CPU進行計算 # 多道程序設計技術不只使CPU獲得充分利用,同時改善I/O設備和內存的利用率,從而提升了整個系統的 # 資源利用率和系統吞吐量(單位時間內處理做業(程序)的個數),最終提升了整個系統的效率。 # 單處理機系統中多道程序運行時的特色: # (1)多道:計算機內存中同時存放幾道相互獨立的程序; # ·(2)宏觀上並行:同時進入系統的幾道程序都處於運行過程當中,即它們前後開始了各自的運行,但都未運行完畢; # ·(3)微觀上串行:實際上,各道程序輪流地用CPU,並交替運行。 # 多道程序系統的出現,標誌着操做系統漸趨成熟的階段,前後出現了做業調度管理、處理機管理、存儲器管理、外部設備管理、文件系統管理等功能。 # 因爲多個程序同時在計算機中運行,開始有了空間隔離的概念,只有內存空間的隔離,才能讓數據更加安全、穩定。 # 出了空間隔離以外,多道技術還第一次體現了時空複用的特色,遇到IO操做就切換程序,使得cpu的利用率提升了,計算機的工做效率也隨之提升。
分時系統(時間片到了就切換):session
# 分時技術:把處理機的運行時間分紅很短的時間片,按時間片輪流把處理機分配給各聯機做業使用。 # 若某個做業在分配給它的時間片內不能完成其計算,則該做業暫時中斷,把處理機讓給另外一做業使用,等待 # 下一輪時再繼續其運行。因爲計算機速度很快,做業運行輪轉得很快,給每一個用戶的印象是,好象他獨佔了一臺計算 # 機。而每一個用戶能夠經過本身的終端向系統發出各類操做控制命令,在充分的人機交互狀況下,完成做業的運行。 # 具備上述特徵的計算機系統稱爲分時系統,它容許多個用戶同時聯機使用計算機。 # 特色: # (1)多路性。若干個用戶同時使用一臺計算機。微觀上看是各用戶輪流使用計算機;宏觀上看是各用戶並行工做。 # (2)交互性。用戶可根據系統對請求的響應結果,進一步向系統提出新的請求。這種能使用戶與系統進行人機對話的工做方 # 式,明顯地有別於批處理系統,於是,分時系統又被稱爲交互式系統。 # (3)獨立性。用戶之間能夠相互獨立操做,互不干擾。系統保證各用戶程序運行的完整性,不會發生相互混淆或破壞現象。 # (4)及時性。系統可對用戶的輸入及時做出響應。分時系統性能的主要指標之一是響應時間,它是指:從終端發出命令到系統予以應答所需的時間。 # 分時系統的主要目標:對用戶響應的及時性,即不至於用戶等待每個命令的處理時間過長。 # 分時系統能夠同時接納數十個甚至上百個用戶,因爲內存空間有限,每每採用對換(又稱交換)方式的存儲方法。 # 即將未「輪到」的做業放入磁盤,一旦「輪到」,再將其調入內存;而時間片用完後,又將做業存回磁盤(俗稱「滾進」、「滾出「法),使 # 同一存儲區域輪流爲多個用戶服務。 # 多用戶分時系統是當今計算機操做系統中最廣泛使用的一類操做系統。 # 注意:分時系統的分時間片工做,在沒有遇到IO操做的時候就用完了本身的時間片被切走了,這樣的切換工做其實並無提升cpu的效率, # 而使得計算機的效率下降了。可是咱們犧牲了一點效率,卻實現了多個程序共同執行的效果,這樣你就能夠在計算機上一邊聽音樂一邊聊qq了。 # 分時——如今流行的PC,服務器都是採用這種運行模式,即把CPU的運行分紅若干時間片分別處理不一樣的運算請求 linux系統 # 實時——通常用於單片機上、PLC等,好比電梯的上下控制中,對於按鍵等動做要求進行實時處理
通用操做系統:多線程
# 操做系統的三種基本類型:多道批處理系統、分時系統、實時系統。 # 通用操做系統:具備多種類型操做特徵的操做系統。能夠同時兼有多道批處理、分時、實時處理的功能,或其中兩種以上的功能。 # 例如:實時處理+批處理=實時批處理系統。首先保證優先處理實時任務,插空進行批處理做業。常把實時任務稱爲前臺做業,批做業稱爲後臺做業。 # 再如:分時處理+批處理=分時批處理系統。 # 即:時間要求不強的做業放入「後臺」(批處理)處理,需頻繁交互的做業在「前臺」(分時)處理,處理機優先運行「前臺」做業。 # 從上世紀60年代中期,國際上開始研製一些大型的通用操做系統。這些系統試圖達到功能齊全、可適應各類應用範圍和操做方式變化無窮的環境的目標。 # 可是,這些系統過於複雜和龐大,不只付出了巨大的代價,且在解決其可靠性、可維護性和可理解性方面都遇到很大的困難。 # 相比之下,UNIX操做系統倒是一個例外。這是一個通用的多用戶分時交互型的操做系統。它首先創建的是一個精幹的核心, # 而其功能卻足以與許多大型的操做系統相媲美,在覈心層之外,能夠支持龐大的軟件系統。它很快獲得應用和推廣,並不斷完善,對現代操做系統有着重大的影響。 # 至此,操做系統的基本概念、功能、基本結構和組成都已造成並漸趨完善。
操做系統的進一步發展:我的計算機操做系統,網絡操做系統,分佈式操做系統併發
IO:
# I/O # 即 input output #只要是和內存打交道,可是不涉及到計算的,都是IO #內置函數 inpput time.sleep() 讀文件,寫文件 網絡請求:recv accept都是IO
進程:
1.是運行中的程序;
2.是系統最小的資源分配單位
3.爲多個任務之間的數據安全和內存隔離作約束
進程的三個狀態:就緒態,執行態,阻塞態
# (1)就緒(Ready)狀態 # 當進程已分配到除CPU之外的全部必要的資源,只要得到處理機即可當即執行,這時的進程狀態稱爲就緒狀態。 # (2)執行/運行(Running)狀態當進程已得到處理機,其程序正在處理機上執行,此時的進程狀態稱爲執行狀態。 # (3)阻塞(Blocked)狀態正在執行的進程,因爲等待某個事件發生而沒法執行時,便放棄處理機而處於阻塞狀態。 # 引發進程阻塞的事件可有多種,例如,等待I/O完成、申請緩衝區不能知足、等待信件(信號)等。 #進程建立後,進入就緒狀態,等待操做系統運行 import time print('程序開始運行了') #程序運行狀態 name = input('>>> ') #遇到了阻塞 #用戶輸入後,進入就緒狀態,等待運行 print(name) #運行態 time.sleep(1) #再次進入阻塞態 #再次進入就緒態 print('程序結束運行') #運行態 #結束 #因爲該程序運行十分短暫,沒有遇到沒運行完,可是時間片到了,切換到就緒態,進入等待隊列
#引進進程的概念 每個程序都有它本身存儲的空間,空間上隔離開來 # 第一,進程是一個實體。每個進程都有它本身的地址空間,通常狀況下,包括文本區域(text region)、數據區域(data region)和堆棧(stack region)。 # 文本區域存儲處理器執行的代碼;數據區域存儲變量和進程執行期間使用的動態分配的內存;堆棧區域存儲着活動過程調用的指令和本地變量。 # 第二,進程是一個「執行中的程序」。程序是一個沒有生命的實體,只有處理器賦予程序生命時(操做系統執行之), # 它才能成爲一個活動的實體,咱們稱其爲進程。[3] # 進程是操做系統中最基本、重要的概念。是多道程序系統出現後,爲了刻畫系統內部出現的動態狀況,描述系統內部各道 # 程序的活動規律引進的一個概念,全部多道程序設計操做系統都創建在進程的基礎上。 #進程與程序中的區別 # 程序是指令和數據的有序集合,其自己沒有任何運行的含義,是一個靜態的概念。 # 而進程是程序在處理機上的一次執行過程,它是一個動態的概念。 # 程序能夠做爲一種軟件資料長期存在,而進程是有必定生命期的。 # 程序是永久的,進程是暫時的。 # 注意:同一個程序執行兩次,就會在操做系統中出現兩個進程,因此咱們能夠同時運行兩個軟件,分別作不一樣的事情也不會混亂。
#進程調度 #先來先服務調度算法(FCFS),有利於長做業,不利於短做業 #短做業優先調度算法(SJ/PF),進程的長短被預先估算出來 #時間片 輪轉法:把1秒鐘分紅多份,每一份就是時間片,每一份是CPU調度的時間 # 基本思路是讓每一個進程在就緒隊列中的等待時間與享受服務的時間成比例。 # 在時間片輪轉法中,須要將CPU的處理時間分紅固定大小的時間片,例如,幾十毫秒至幾百毫秒。 # 若是一個進程在被調度選中以後用完了系統規定的時間片,但又未完成要求的任務, # 則它自行釋放本身所佔有的CPU而排到就緒隊列的末尾, # 等待下一次調度。同時,進程調度程序又去調度當前就緒隊列中的第一個進程。 #多級反饋隊列調度—較爲科學的調度方法 # 多級反饋隊列調度算法則沒必要事先知道各類進程所需的執行時間,並且還能夠知足各類類型進程的須要, # 於是它是目前被公認的一種較好的進程調度算法。在採用多級反饋隊列調度算法的系統中,調度算法的實施過程以下所述。 # (1) 應設置多個就緒隊列,併爲各個隊列賦予不一樣的優先級。第一個隊列的優先級最高,第二個隊列次之, # 其他各隊列的優先權逐個下降。該算法賦予各個隊列中進程執行時間片的大小也各不相同, # 在優先權愈高的隊列中,爲每一個進程所規定的執行時間片就愈小。 # 例如,第二個隊列的時間片要比第一個隊列的時間片長一倍,……,第i+1個隊列的時間片要比第i個隊列的時間片長一倍。 # (2) 當一個新進程進入內存後,首先將它放入第一隊列的末尾, # 按FCFS原則排隊等待調度。當輪到該進程執行時,如它能在該時間片內完成,即可準備撤離系統; # 若是它在一個時間片結束時還沒有完成,調度程序便將該進程轉入第二隊列的末尾,再一樣地按FCFS原則等待調度執行; # 若是它在第二隊列中運行一個時間片後仍未完成,再依次將它放入第三隊列,……, # 如此下去,當一個長做業(進程)從第一隊列依次降到第n隊列後,在第n 隊列便採起按時間片輪轉的方式運行。 # # (3) 僅當第一隊列空閒時,調度程序才調度第二隊列中的進程運行; # 僅當第1~(i-1)隊列均空時,纔會調度第i隊列中的進程運行。若是處理機正在第i隊列中爲某進程服務時, # 又有新進程進入優先權較高的隊列(第1~(i-1)中的任何一個隊列),則此時新進程將搶佔正在運行進程的處理機, # 即由調度程序把正在運行的進程放回到第i隊列的末尾,把處理機分配給新到的高優先權進程。
#咱們計算機採用時間片輪轉法和多級反饋隊列調度
並行和併發:
# 並行 : 並行是指二者同時執行,好比賽跑,兩我的都在不停的往前跑;(資源夠用,好比三個線程,四核的CPU ) # (多線程:看起來像一塊兒執行,但因爲cpython中的GIL,使得多個線程同一時間只有一個線程佔用cpu) # 併發 : 併發是指資源有限的狀況下,二者交替輪流使用資源,好比一段路(單核CPU資源)同時只能過一我的 # A走一段後,讓給B,B用完繼續給A ,交替使用,目的是提升效率。 #(多進程:在同一時間能夠佔用多個cpu) # # 區別: # 並行是從微觀上,也就是在一個精確的時間片刻,有不一樣的程序在執行,這就要求必須有多個處理器。 # 併發是從宏觀上,在一個時間段上能夠看出是同時執行的,好比一個服務器同時處理多個session。
同步、異步、阻塞、非阻塞:
#同步:事情是串行的,必須作完這件事,才能繼續往下作 # 相似好幾條馬路,只有一輛車在這些道上跑 #異步:變現出來爲兩個函數,同時運行。在同一時間有兩件事在同時作的事情 #阻塞:inpput time.sleep() 讀文件,寫文件 網絡請求:recv 等 # 非阻塞:程序無論走到哪,都不停下來。可是程序不可避免的就要阻塞 # 非阻塞和阻塞的概念相對應,指在不能馬上獲得結果以前,該函數不會阻塞當前線程,而會馬上返回。 # 簡單點說: # 阻塞就是幹不完不許回來, # 非阻塞就是你先幹,我現看看有其餘事沒有,完了告訴我一聲 # 其它該瞭解的概念: # 1.同步VS異步 # 同步和異步一般用來形容一次方法調用。同步方法調用一開始,調用者必須等待被調用的 # 方法結束後,調用者後面的代碼才能執行。而異步調用,指的是,調用者不用管被調用方法是否 # 完成,都會繼續執行後面的代碼,當被調用的方法完成後會通知調用者。好比,在超時購物,如 # 果一件物品沒了,你得等倉庫人員跟你調貨,直到倉庫人員跟你把貨物送過來,你才能繼續去收銀臺付款,這就 # 相似同步調用。而異步調用了,就像網購,你在網上付款下單後,什麼事就不用管了,該幹嗎就幹嗎去了,當貨 # 物到達後你收到通知去取就好。 # # 2 併發與並行 # 併發和並行是十分容易混淆的概念。併發指的是多個任務交替進行,而並行則是指真正意義上 # 的「同時進行」。實際上,若是系統內只有一個CPU,而使用多線程時,那麼真實系統環境下不能並行,只能經過切換時間片的方式交替進行,而成爲併發執行任務。真正的並行也只能出如今擁有多個CPU的系統中。 # # 3 阻塞和非阻塞 # 阻塞和非阻塞一般用來形容多線程間的相互影響,好比一個線程佔有了臨界區資源,那麼其餘線程 # 須要這個資源就必須進行等待該資源的釋放,會致使等待的線程掛起,這種狀況就是阻塞,而非阻塞就剛好相反,它強調沒有一個線程能夠阻塞其餘線程,全部的線程都會嘗試地往前運行。 # # 4 臨界區 # 臨界區用來表示一種公共資源或者說是共享數據,能夠被多個線程使用。可是每一個線程使用時,一旦臨界區資源被一個線程佔有,那麼其餘線程必須等待。
同步阻塞,異步阻塞,同步非阻塞,異步非阻塞:
#1.同步阻塞形式 效率最低。拿上面的例子來講,就是你專心排隊,什麼別的事都不作。 #2.異步阻塞形式 若是在銀行等待辦理業務的人採用的是異步的方式去等待消息被觸發(通知),也就是領了一張小紙條,假如在這段時間裏他不能離開銀行作其它的事情,那麼很顯然,這我的被阻塞在了這個等待的操做上面; 異步操做是能夠被阻塞住的,只不過它不是在處理消息時阻塞,而是在等待消息通知時被阻塞。 #3.同步非阻塞形式 其實是效率低下的。 想象一下你一邊打着電話一邊還須要擡頭看到底隊伍排到你了沒有,若是把打電話和觀察排隊的位置當作是程序的兩個操做的話,這個程序須要在這兩種不一樣的行爲之間來回的切換,效率可想而知是低下的。 #4.異步非阻塞形式 效率更高, 由於打電話是你(等待者)的事情,而通知你則是櫃檯(消息觸發機制)的事情,程序沒有在兩種不一樣的操做中來回切換。 好比說,這我的忽然發覺本身煙癮犯了,須要出去抽根菸,因而他告訴大堂經理說,排到我這個號碼的時候麻煩到外面通知我一下,那麼他就沒有被阻塞在這個等待的操做上面,天然這個就是異步+非阻塞的方式了。 不少人會把同步和阻塞混淆,是由於不少時候同步操做會以阻塞的形式表現出來,一樣的,不少人也會把異步和非阻塞混淆,由於異步操做通常都不會在真正的IO操做處被阻塞。
摘抄連接:景老師-操做系統介紹