UDP協議,作業系統發展史,程序
阿新 • • 發佈:2022-04-18
1. UDP協議
UDP 協議具備以下特點:
沒有各種連線:在傳輸資料前不需要建立連線,也避免了後續的斷開連線。
不重新排序:對到達順序混亂的資料包不進行重新排序。
沒有確認:傳送資料包無須等待對方確認。
UDP客戶端程式碼 import socket client = socket.socket(type=socket.SOCK_DGRAM) server_addr = ('127.0.0.1', 8080) # 查詢通訊錄 client.sendto(b'hello server python cat', server_addr) msg, addr = client.recvfrom(1024)print('msg: ', msg.decode('utf8')) print('addr: ', addr)
UDP服務端程式碼 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 client python cat', addr)
2. UDP協議實現簡單的通訊室
import socket client = socket.socket(type=socket.SOCK_DGRAM) server_addr = ('127.0.0.1', 8080) while True: msg = input('請輸入想要聊天的內容>>>:').strip() msg = '來自客戶端1的訊息:%s' % msg client.sendto(msg.encode('utf8'), server_addr) msg, addr = client.recvfrom(1024)print(msg.decode('utf8'), addr)
import socket client = socket.socket(type=socket.SOCK_DGRAM) server_addr = ('127.0.0.1', 8080) while True: msg = input('請輸入想要聊天的內容>>>:').strip() msg = '來自客戶端2的訊息:%s' % msg client.sendto(msg.encode('utf8'), server_addr) msg, addr = client.recvfrom(1024) print(msg.decode('utf8'), addr)
import socket server = socket.socket(type=socket.SOCK_DGRAM) server.bind(('127.0.0.1', 8080)) while True: msg, addr = server.recvfrom(1024) print(addr) print(msg.decode('utf8')) back_msg = input('請回復訊息>>>:').strip() server.sendto(back_msg.encode('utf8'), addr)
3. 作業系統的發展史
1.穿孔卡片
優勢:一個人獨佔電腦
劣勢:CPU利用率極低
2.聯機批處理系統
一次性可以錄入多個使用者指令、縮短了CPU等待的時間、提高了CPU的利用率
3.離線批處理系統
是現代計算機核心部件的雛形、提高CPU的利用率
# 總結:作業系統的發展史其實就是提升CPU利用率的過程 """ 學習併發程式設計其實就是在學習作業系統 理論居多 實戰很少 都是封裝的程式碼 """
4. 多道技術
# 目的:提升CPU利用率 降低程式等待時間 '''強調:目前我們研究併發都是以計算機是單核的情況下:只有一個CPU''' 序列 在A程式計算時,I/O空閒, A程式I/O操作時,CPU空閒(B程式也是同樣);必須A工作完成後,B才能進入記憶體中開始工作,兩者是序列的,全部完成共需時間=T1+T2。 多個任務排隊執行 總耗時就是多個任務完整時間疊加 多道 將A、B兩道程式同時存放在記憶體中,它們在系統的控制下,可相互穿插、交替地在CPU上執行:當A程式因請求I/O操作而放棄CPU時,B程式就可佔用CPU執行,這樣 CPU不再空閒,而正進行A I/O操作的I/O裝置也不空閒,顯然,CPU和I/O裝置都處於“忙”狀態,大大提高了資源的利用率,從而也提高了系統的效率,A、B全部完成所需時間<<T1+T2 利用空閒提前準備 縮短總的執行時間並且還能提高CPU利用率 """ 多道技術 1.空間上的複用 多個任務共用一套計算機硬體 2.時間上的複用 切換+儲存狀態 CPU在兩種情況下會被拿走 1.程式遇到IO操作 CPU自動切走執行其他程式 2.程式長時間佔用CPU 系統發現之後也會強行切走CPU 保證其他程式也可以使用 """ 做飯需要30min 洗衣需要50min 燒水需要20min 序列總共需要耗時:30min + 50min + 20min 多道總共需要耗時:50min 做飯需要30min 洗衣需要50min 燒水需要20min 煮肘子需要60min 序列總共需要耗時:30min + 50min + 20min + 60min 多道總共需要耗時:60min
5.
# 什麼是程式、什麼是程序 程式:一堆沒有被執行的程式碼(死的) 程序:正在執行的程式(活的) # 為什麼有程序的概念 就是為了更加精確的描述出一些實際狀態 # 程序排程演算法發展史 1.先來先服務 對短作業任務不太友好 2.短作業優先 多長作業任務不太友好 3.時間片輪轉法與多級反饋佇列 時間片輪轉法:先公平的將CPU分給每個人執行 多級反饋佇列:根據作業長短的不同再合理分配CPU執行時間 '''目的就是為了能夠讓單核的計算機也能夠做到執行多個程式'''
6. 重要概念01(重要)
# 併發與並行 併發 看上去像同時在執行就可以稱之為是併發 """ 飯店裡面有多桌客人(任務) 但是隻有一個服務員(CPU) 如何讓所有客人都感覺被服務員服務著(CPU執行) 讓服務員在多桌客人之間快速的來回切換並儲存狀態即可 讓CPU在多個程式之間利用多道技術來回切換+儲存狀態 單核肯定能夠實現併發 但是不能實現並行!!! """ 並行 必須同一時間同時執行才可以稱之為並行 """單核計算機肯定不能實現並行!!! 必須要有多個CPU""" # 高併發與高並行 高併發:我們寫的軟體可以支援1個億的併發量 一個億的使用者來了之後都可以感覺到自己被服務著 高並行:我們寫的軟體可以支援1個億的並行量 上述話語的言外之意是計算機有一億個CPU 區別: 並行是從微觀上,也就是在一個精確的時間片刻,有不同的程式在執行,這就要求必須有多個處理器。 併發是從巨集觀上,在一個時間段上可以看出是同時執行的,比如一個伺服器同時處理多個session
7. 重要概念02(重要)
# 同步與非同步 同步 提交完任務之後原地等待任務的返回結果 期間不做任何事情 非同步 提交完任務之後不願地等待任務的結果 直接去做其他事情 有結果自動提醒 # 阻塞與非阻塞 程序三狀態圖 就緒態:程式之進入執行態之前肯定要處於就緒態 執行態:程式被CPU執行著 阻塞態:程式執行過程中有IO操作 ''' 如果想要儘可能的提升程式執行效率 就要想辦法讓我們的程式一直處於就緒態和執行態(不要有IO操作) ''' 阻塞:阻塞態 非阻塞:就緒態、執行態 ps:以後不需要考慮是哪個狀態 知識今天深入學習一下
8.
1. 同步阻塞形式 效率最低。 拿上面的例子來說,就是你專心排隊,什麼別的事都不做。 2. 非同步阻塞形式 非同步操作是可以被阻塞住的,只不過它不是在處理訊息時阻塞,而是在等待訊息通知時被阻塞。 如果在銀行等待辦理業務的人採用的是非同步的方式去等待訊息被觸發(通知),也就是領了一張小紙條,假如在這段時間裡他不能離開銀行做其它的事情,那麼很顯然,這個人被阻塞在了這個等待的操作上面; 3. 同步非阻塞形式 實際上是效率低下的。 想象一下你一邊打著電話一邊還需要抬頭看到底隊伍排到你了沒有,如果把打電話和觀察排隊的位置看成是程式的兩個操作的話,這個程式需要在這兩種不同的行為之間來回的切換,效率可想而知是低下的。 4. 非同步非阻塞形式 效率更高, 因為打電話是你(等待者)的事情,而通知你則是櫃檯(訊息觸發機制)的事情,程式沒有在兩種不同的操作中來回切換。