今日學習內容總結3.2
今日學習內容總結
在上週的學習中,我們已經初步完成了服務端與客戶端互動的程式碼操作。也就是對socket模組的一個使用與學習。並且體會到其中的黏包問題,以及解決黏包問題的一個策略以及思路。而今日的學習內容就是對傳輸層的UDP協議進行基本的學習與瞭解。然後就是一些概念性的理論知識內容。
UDP協議的實際應用
UDP協議的使用其實就是socket模組中,自己指定UDP協議。因為socket模組預設使用的協議是TCP協議。例項:
服務端
import socket server = socket.socket(type=socket.SOCK_DGRAM) # 自己指定UDP協議(預設是TCP協議) server.bind(('127.0.0.1', 8080)) msg, addr = server.recvfrom(1024) print('msg>>>:', msg.decode('utf8')) print('addr>>>:', addr) server.sendto(b'hello word', addr)
客戶端
import socket
client = socket.socket(type=socket.SOCK_DGRAM)
server_addr = ('127.0.0.1', 8080) # 查詢通訊錄
client.sendto(b'hello server baby', server_addr)
msg, addr = client.recvfrom(1024)
print('msg>>>:', msg.decode('utf8'))
print('addr>>>:', addr)
作業系統的發展史
其實接下來的學習就是之前提到過的併發程式設計了。而學習併發程式設計其實就是在學習作業系統。所以我們先來了解一下作業系統的發展史。
階段一:手工操作穿孔卡片
1946年第一臺計算機誕生--20世紀50年代中期,計算機工作還在採用手工操作方式。此時還沒有作業系統的概念。程式設計師將對應於程式和資料的已穿孔的紙帶(或卡片)裝入輸入機,然後啟動輸入機把程式和資料輸入計算機記憶體,接著通過控制檯開關啟動程式針對資料執行;計算完畢,印表機輸出計算結果;使用者取走結果並卸下紙帶(或卡片)後,才讓下一個使用者上機。
手工操作的兩個特點:
1.使用者獨佔全機。不會出現因資源已被其他使用者佔用而等待的現象,但資源的利用率低。
2.CPU 等待手工操作。CPU的利用不充分。
階段二:聯機批處理系統
聯機批處理系統,即作業的輸入/輸出由CPU來處理。主機與輸入機之間增加一個儲存裝置——磁帶,在運行於主機上的監督程式的自動控制下,計算機可自動完成:成批地把輸入機上的使用者作業讀入磁帶,依次把磁帶上的使用者作業讀入主機記憶體並執行並把計算結果向輸出機輸出。完成了上一批作業後,監督程式又從輸入機上輸入另一批作業,儲存在磁帶上,並按上述步驟重複處理。監督程式不停地處理各個作業,從而實現了作業到作業的自動轉接,減少了作業建立時間和手工操作時間,有效克服了人機矛盾,提高了計算機的利用率。
簡單來說,聯機批處理系統一次性可以錄入多個使用者指令、縮短了CPU等待的時間、提高了CPU的利用率。但是,在作業輸入和結果輸出時,主機的高速CPU仍處於空閒狀態,等待慢速的輸入/輸出裝置完成工作: 主機處於“忙等”狀態。所以為了克服與緩解高速主機與慢速外設的矛盾,提高CPU的利用率,就引入了我們的第三階段。離線批處理系統
階段三:離線批處理系統
離線批處理系統,即輸入/輸出脫離主機控制。缺點是主機記憶體中每次只能存放一道作業,每當他執行期間發出I/O請求之後,I/O進行執行,這個時候CPU處於空閒狀態。
多道技術
多道技術就時計算機在單核的情況下實現併發的效果。必備知識:
併發:看起來像同時執行的就可以稱之為併發
並行:真正意義上的同時執行(單核計算機肯定不能實現並行,但是可以實現併發。)
多道技術,其實就是時間和空間上的複用。
空間上的複用:多個任務共用一套計算機硬體。
時間上的複用:就是切換+儲存狀態。
1.當一個程式遇到IO操作時候,作業系統會剝奪該程式的CPU執行許可權,作用:提高了CPU的利用率,並且也不影響程式的執行效率。
2.當一個程式長時間佔用CPU的時候,作業系統也會剝奪該程式的CPU執行許可權。作用:降低了程式的執行效率(原本時間+切換時間)。
程序理論
程序和程式的區別:程式就是一堆躺在硬碟上的程式碼,是“死”的。程序則表示程式正執行的過程,是“活”的。而程序就是為了更加精確的描述出程式的實際狀態。
程序的排程:
1.先來先服務排程演算法。缺點是對短作業任務不太友好
2.短作業優先排程演算法。缺點是多長作業任務不太友好
3.時間片輪轉法與多級反饋佇列。
3.1 時間片輪轉法:先公平的將CPU分給每個人執行
3.2 多級反饋佇列:根據作業長短的不同再合理分配CPU執行時間
兩個重要概念
併發與並行
併發
在作業系統中,是指一個時間段中有幾個程式都處於已啟動到執行完畢之間,且這幾個程式都是在同一個處理機上執行,但任一個時刻電商只有一個程式在處理機上執行。簡言之,是隻系統具有處理多個任務的能力。
並行
當系統有一個以上CPU時,則執行緒的操作有可能非併發。當一個CPU執行一個執行緒是,另一個CPU可以執行另一個執行緒,兩個執行緒互不搶佔CPU資源,可以同時進行,這種方式我們稱之為並行(Parallel)。簡言之,是指系統具有用時處理多個任務的能力。
高併發就是,可以同時服務多個使用者。高並行就是計算機擁有多個CPU。
同步與非同步
同步
提交完任務之後原地等待任務的返回結果,期間不做任何事情。
非同步
提交完任務之後不願地等待任務的結果,直接去做其他事情,有結果自動提醒。
阻塞與非阻塞
阻塞
只要有一丁點阻塞,就是阻塞IO。比如一個執行緒佔用了臨界區資源,那麼其它所有需要這個資源的執行緒就必須在這個臨界區中進行等待,等待會導致執行緒掛起。這種情況就是阻塞,此時,如果佔用資源的執行緒一直不願意釋放資源,那麼其它所有阻塞在這個臨界區上的執行緒都不能工作。
非阻塞
非阻塞允許多個執行緒同時進入臨界區。
程序的三狀態:
就緒態:程式之進入執行態之前肯定要處於就緒態
執行態:程式被CPU執行著
阻塞態:程式執行過程中有IO操作
圖解:
同步非同步與阻塞非阻塞結合
阻塞與同步,非阻塞和非同步的定義是不一樣的。同步和非同步的區別是遇到IO請求是否等待。阻塞和非阻塞的區別是資料沒準備好的情況下是否立即返回。同步可能是阻塞的,也可能是非阻塞的,而非阻塞的有可能是同步的,也有可能是非同步的。
簡單來說就是同步與非同步是用來描述任務的提交方式的。阻塞與非阻塞是用來描述任務的執行狀態的。雖然兩者不同概念,但是可以結合。