標籤:儲存 狀態轉化 作業系統 方便 隱藏 style processor 計算 程式
進程
一個檔案的正在執行、運行過程就成為一個進程。
執行多個程式,把程式檔案都載入到記憶體,並且多個程式的記憶體空間隔離--空間上的複用。 遇到IO等待,切CPU到別的程式,提升效率。沒有IO,一個程式佔用CPU過久也要切換,效率變低--時間上的複用。
為了讓所有程式員都覺得自己獨佔電腦資源,多個終端聯機讓他看起來沒問題,並且採用多道技術,所有的終端很小機率會同事都在執行指令,。
###分時作業系統。
為了提高效率,寫程式時盡量減少IO。
儲存狀態+切換
進程基本特徵:動態性、並發性、獨立性、非同步性和結構特徵。
進程結構上包括:程式段、資料區段、進程式控制制塊PCB(Process Control Block)組成。PCB是進程存在的唯一標識。系統通過PCB對進程進行控制和管理。
為了方便進程的調度和管理,需將各進程的PCB以適當方法組織起來。常見的有連結方式和索引方式。
連結方式就是形成隊列,如就緒隊列、阻塞隊列。
索引就是將同一狀態的進程組織在一個索引表中,如就緒索引表、阻塞索引表。
進程基本狀態:阻塞、就緒、運行。引起狀態轉化的事件有:IO操作和佔用CPU時間時間過久。
進程的阻塞與喚醒:
阻塞:執行轉阻塞,喚醒:阻塞轉就緒。阻塞是進程自己主動的,喚醒是被動由其他進程喚醒的。
並發編程
下載好的程式就是一堆檔案。
一個作業系統上跑多個軟體,共用硬體。軟體對硬體資源的競爭歸系統管,把競爭變得有序化。
並發與並行
無論是並行還是並發,在使用者看來都是‘同時‘啟動並執行,不管是進程還是線程,都只是一個任務而已,真是幹活的是cpu,cpu來做這些任務,而一個cpu同一時刻只能執行一個任務
一 並發:是偽並行,即看起來是同時運行。單個cpu+多道技術就可以實現並發,(並行也屬於並發)
二 並行:同時運行,只有具備多個cpu才能實現並行
單核下,可以利用多道技術,多個核,每個核也都可以利用多道技術(多道技術是針對單核而言的)
有四個核,六個任務,這樣同一時間有四個任務被執行,假設分別被分配給了cpu1,cpu2,cpu3,cpu4,
一旦任務1遇到I/O就被迫中斷執行,此時任務5就拿到cpu1的時間片去執行,這就是單核下的多道技術
而一旦任務1的I/O結束了,作業系統會重新調用它(需知進程的調度、分配給哪個cpu運行,由作業系統說了算),可能被分配給四個cpu中的任意一個去執行
作業系統的作用:
- 隱藏硬體介面,提供好的抽象介面
- 管理、調度進程,並且將多個進程對硬體的競爭變得有序。
多道技術
- 空間複用:多個程式的檔案同時讀入記憶體並且做到隔離
- 時間複用:把CPU的時間平均分配給每一個進程,或者 在進程IO時利用這一段IO等待時間運行別的進程
並發與並行
- 並發、一個CPU利用多道技術實現看起來多個同時運行
- 並行、多核心的CPU同時運行多個程式,一個核心對應一個程式
同步
提交一個任務後,在原地等著,等到該任務運行完畢,拿到結果以後,再執行下一行代碼。--會導致程式變為串列執行(.result())
非同步
提交一個任務後,不會等著,直接執行下一行代碼。,--並行的提交任務,容器儲存每個任務的狀態,等進程池完畢後,再取結果。
阻塞
#阻塞調用是指調用結果返回之前,當前線程會被掛起(如遇到io操作)。函數只有在得到結果之後才會將阻塞的線程啟用。有人也許會把阻塞調用和同步調用等同起來,實際上他是不同的。對於同步調用來說,很多時候當前線程還是啟用的,只是從邏輯上當前函數沒有返回而已。#舉例:#1. 同步調用:apply一個累計1億次的任務,該調用會一直等待,直到任務返回結果為止,但並未阻塞住(即便是被搶走cpu的執行許可權,那也是處於就緒態);#2. 阻塞調用:當socket工作在阻塞模式的時候,如果沒有資料的情況下調用recv函數,則當前線程就會被掛起,直到有資料為止。
非阻塞
非阻塞和阻塞的概念相對應,指在不能立刻得到結果之前也會立刻返回,同時該函數不會阻塞當前線程。
總結
1. 同步與非同步針對的是函數/任務的調用方式:同步就是當一個進程發起一個函數(任務)調用的時候,一直等到函數(任務)完成,而進程繼續處於啟用狀態。而非同步情況下是當一個進程發起一個函數(任務)調用的時候,不會等函數返回,而是繼續往下執行當,函數返回的時候通過狀態、通知、事件等方式通知進程任務完成。2. 阻塞與非阻塞針對的是進程或線程:阻塞是當請求不能滿足的時候就將進程掛起,而非阻塞則不會阻塞當前進程
必會知識:#作業系統:為了方便操作、管理硬體#所有一切都是為瞭解放人力。電腦群組成原理、作業系統原理、一門語言、網路(協議知識)、資料結構。
python--9、進程及並發知識