1. 程式人生 > 其它 >UDP協議 、 UDP協議實戰 、 作業系統的發展史 、 多道技術、 程序理論

UDP協議 、 UDP協議實戰 、 作業系統的發展史 、 多道技術、 程序理論

UDP協議

# udp是無連結的,先啟動哪一端都不會報錯
# 服務端
import socket

# 需要自己指定udp協議(預設是TCP協議)
server = socket.socket(type=socket.SOCK_DGRAM)
server.bind(('127.0.0.1', 8080))
msg, addr = server.recvfrom(1024)
print('msg>>>>:', msg.decode('utf8'))
print('addr>>>:', addr)
server.sendto(b'hai hai hai', addr)


# 客戶端
import socket

client = socket.socket(type=socket.SOCK_DGRAM)
server_addr = ('127.0.0.1', 8080)  # 往哪發,類似於通訊錄
client.sendto(b'hello server', server_addr)
msg, addr = client.recvfrom(1024)
print('msg>>>:', msg.decode('utf8'))
print('addr>>>:', addr)

基於UDP實現簡易版本的qq

# 伺服器
import socket

server = socket.socket(type=socket.SOCK_DGRAM)
server.bind(('127.0.0.1', 8080))
while True:
    msg, addr = server.recvfrom(1024)
    print(msg.decode('utf8'))
    back_msg = input('回覆訊息: ').strip()
    server.sendto(back_msg.encode('utf8'), addr)

# 客戶端1
import socket

client = socket.socket(type=socket.SOCK_DGRAM)
server_addr = ('127.0.0.1', 8080)
while True:
    msg = input('回覆訊息: ').strip()
    msg = f'來自客戶端1的訊息:{msg}'
    client.sendto(msg.encode('utf-8'), server_addr)
    msg, addr = client.recvfrom(1024)
    print(msg.decode('utf8'),addr
# 客戶端2
import socket

client = socket.socket(type=socket.SOCK_DGRAM)
server_addr = ('127.0.0.1', 8080)
while True:
    msg = input('回覆訊息: ').strip()
    msg = f'來自客戶端2的訊息:{msg}'
    client.sendto(msg.encode('utf-8'), server_addr)
    msg, addr = client.recvfrom(1024)
    print(msg.decode('utf8'),addr)

作業系統的發展史

穿孔卡片機

1946年第一臺計算機誕生--20世紀50年代中期,計算機工作還在採用手工操作方式。此時還沒有作業系統的概念。
優勢:一個人獨佔一臺電腦,機房內,只能夠進入一個人
劣勢:cpu利用極低,全是手工在操作

聯機批處理系統

一次性可以錄入多個使用者指令、縮短了CPU等待的時間、提高了CPU的利用率,計算機處理資料之後再輸出給使用者看

離線批處理系統

為克服與緩解:高速主機與慢速外設的矛盾,提高CPU的利用率,又引入了離線批處理系統,即輸入/輸出脫離主機控制。 
'''
使用者可以遠端傳入指令,將指令傳入高速磁帶,交給主機來處理,目的也是為了提高CPU的利用率
'''
也是現在計算機的雛形
# 總結:作業系統的系統發展史其實就是提升CPU利用率的過程

多道技術

# 針對單核,來進行研究
# 目的:提高CPU的執行效率

'''
序列:多個任務排隊執行,總耗時就是多個人物完成時間疊加
空間上的複用:多個人物排隊執行,總耗時就是多個任務完整時間疊加
'''

# 多道:利用空閒的時間提前準備,縮短總執行時間並且還能提高cpu利用率
'''
時間上的複用:切換+儲存狀態
cpu在兩種情況下會被拿走:
1.程式遇到IO操作,CPU自動切走執行其他程式
2.程式長時間佔用CPU 系統發現之後也會強行切走CPU保證其他程式可以使用
'''

程序理論

什麼是程式、什麼是程序

程式:沒有被再執行的程式碼(死的)
程序:正在執行的程式(活的)

為什麼有程序的概念

為了更加精確的描述出一些實際狀態
'在描述的時候用程序比較方便'

程序的排程演算法發展史

1.先來先服務
	缺陷:如果所有的程序都要排隊進行, 正在執行的程式如果需要10小時,而它後面的程式只需要一兩秒需要等它執行完才可以,不合理'對短作業不友好'
2.短作業優先
	缺陷:'對長作業不友好',如果短作業程式太多了,很難輪到長作業
3.時間片輪轉法與多級反饋佇列:
時間片輪轉法:先公平的將CPU分給每個人執行
多級反饋佇列:根據作業長短的不同再合理分配CPU執行時間
'''目的就是為了能夠讓單核的計算機也能夠做到執行多個程式'''

併發與並行

併發

看上去像同時在執行就可以稱之為是併發
eg:
'''
飯店裡面有多桌客人(任務) 
但是隻有一個服務員(CPU) 
如何讓所有客人都感覺被服務員服務著(CPU執行)
讓服務員在多桌客人之間快速的來回切換並儲存狀態即可
讓CPU在多個程式之間利用多道技術來回切換+儲存狀態
單核肯定能夠實現併發 但是不能實現並行!!!  
'''

並行

必須同一時間同時執行才可以稱之為並行
"""單核計算機肯定不能實現並行 必須要有多個CPU"""

高併發與高並行

高併發:我們寫的軟體可以支援1個億的併發量
	一個億的使用者來了之後都可以感覺到自己被服務著
高並行:我們寫的軟體可以支援1個億的並行量
    上述話語的言外之意是計算機有一億個CPU

同步與非同步:

同步

提交完任務之後原地等待任務的返回結果 期間不做任何事情
'''
喊了一個人吃飯,中途就什麼也不做,然後等他一起去吃飯
'''

非同步

提交完任務之後不願地等待任務的結果,直接去做其他事情,有結果自動提醒
'''
喊了一個人吃飯,中途去做自己的事,然後他完事了一起去吃飯
'''

阻塞與阻塞

阻塞與非阻塞

程序分為三個狀態,如下圖
'''就緒態:程式進入執行態之後肯定處於就緒態
執行態:程式被CPU執行時
阻塞態:程式執行過程中的IO操作 '''

阻塞:阻塞態
非阻塞:就緒態\執行態

同步非同步與阻塞非阻塞結合

同步非同步:用來描述人物的提交方式
阻塞非阻塞:用來描述人物的執行狀態

可以結合為四種狀態:
同步阻塞:排隊期間不做任何事
同步非阻塞:排隊期間喝水吃東西,但人還在佇列中
非同步阻塞:在椅子上坐著,但是不做任何事
非同步非阻塞:在椅子上坐著,期間喝水吃東西(程式執行的極致)