併發程式設計(一)
阿新 • • 發佈:2022-04-18
併發程式設計(一)
UDP協議實現
import socket # 獲取連線物件 server = socket.socket(type=socket.SOCK_DGRAM) # type=socket.SOCK_DGRAM,使用UDP方式,預設為TCP server.bind(('127.0.0.1',8082)) conn, addr = server.recvfrom(1024) print(addr) # ('127.0.0.1', 57467) print(conn.decode('utf8')) # 你好啊! server.sendto('hello'.encode('utf8'),addr) import socket client = socket.socket(type=socket.SOCK_DGRAM) server_addr = ('127.0.0.1',8082) # 服務端地址 client.sendto('你好啊!'.encode('utf8'),server_addr) data,addr = client.recvfrom(1024) # ('127.0.0.1', 57467) print(addr) # ('127.0.0.1', 8082) print(data.decode('utf8')) # hello
作業系統的發展史
"""
學習併發程式設計其實就是在學習作業系統 理論居多 實戰很少 都是封裝的程式碼
"""
1.穿孔卡片
優勢:一個人獨佔電腦
劣勢:CPU利用率極低
2.聯機批處理系統
一次性可以錄入多個使用者指令、縮短了CPU等待的時間、提高了CPU的利用率
3.離線批處理系統
是現代計算機核心部件的雛形、提高CPU的利用率
# 總結:作業系統的發展史其實就是提升CPU利用率的過程
多道技術
# 目的:提升CPU利用率 降低程式等待時間 '''強調:目前我們研究併發都是以計算機是單核的情況下:只有一個CPU''' 序列 多個任務排隊執行 總耗時就是多個任務完整時間疊加 多道 利用空閒提前準備 縮短總的執行時間並且還能提高CPU利用率 """ 多道技術 1.空間上的複用 多個任務共用一套計算機硬體 2.時間上的複用 切換+儲存狀態 CPU在兩種情況下會被拿走 1.程式遇到IO操作 CPU自動切走執行其他程式 2.程式長時間佔用CPU 系統發現之後也會強行切走CPU 保證其他程式也可以使用 """
程序理論
# 什麼是程式、什麼是程序 程式:一堆沒有被執行的程式碼(死的) 程序:正在執行的程式(活的) # 為什麼有程序的概念 就是為了更加精確的描述出一些實際狀態 # 程序排程演算法發展史 1.先來先服務 對短作業任務不太友好 '長作業被服務後,後面的哪怕只有0.01秒的作業也到等' 2.短作業優先 對長作業任務不太友好 '假如有一萬個短作業,一個長作業,那一萬個短作業執行完了也要很長時間了' 3.時間片輪轉法與多級反饋佇列 時間片輪轉法:先公平的將CPU分給每個人執行 多級反饋佇列:根據作業長短的不同再合理分配CPU執行時間 '''目的就是為了能夠讓單核的計算機也能夠做到執行多個程式'''
重要概念01(重要)
# 併發與並行
併發
看上去像同時在執行就可以稱之為是併發
"""
類似於看上去很多功能在一起實現,實際上只運行了一個程式
燒烤攤,只有一個燒烤師傅,但是每一位顧客要吃的東西他都能滿足,每位顧客都能被服務到
單核肯定能夠實現併發 但是不能實現並行!!!
"""
並行
必須同一時間同時執行才可以稱之為並行
"""單核計算機肯定不能實現並行!!! 必須要有多個CPU"""
# 高併發與高並行
高併發:我們寫的軟體可以支援1個億的併發量
一個億的使用者來了之後都可以感覺到自己被服務著
高並行:我們寫的軟體可以支援1個億的並行量
上述話語的言外之意是計算機有一億個CPU
重要概念02(重要)
# 同步與非同步
同步
提交完任務之後原地等待任務的返回結果 期間不做任何事情
非同步
提交完任務之後不願地等待任務的結果 直接去做其他事情 有結果自動提醒
# 阻塞與非阻塞
程序三狀態圖
就緒態:程式之進入執行態之前肯定要處於就緒態
執行態:程式被CPU執行著
阻塞態:程式執行過程中有IO操作
'''
如果想要儘可能的提升程式執行效率
就要想辦法讓我們的程式一直處於就緒態和執行態(不要有IO操作)
'''
阻塞:阻塞態
非阻塞:就緒態、執行態
同步非同步與阻塞非阻塞結合
同步非同步:用來描述任務的提交方式
阻塞非阻塞:用來描述任務的執行狀態
# 上述兩組屬於兩個不同概念 但是可以結合
同步阻塞:銀行排隊辦理業務 期間不做任何事
同步非阻塞:銀行排隊辦理業務 期間喝水吃東西 但是人還在佇列中
非同步阻塞:在椅子上坐著 但是不做任何事
非同步非阻塞:在椅子上坐著 期間喝水吃東西辦公 (程式執行的極致)