udp是傳輸層的協議,功能即為在ip的資料報服務之上增加了最基本的服務:復用和分用以及差錯檢測。
udp提供不可靠服務,具有tcp所沒有的優勢:
import socket
udp_sk = socket.socket(type=socket.sock_dgram) # udp協議
udp_sk.bind(('127.0.0.1',9000)) # 繫結位址
msg,addr = udp_sk.recvfrom(1024)
udp_sk.sendto(b'hi',addr)
udp_sk.close()
import socket
ip_port=('127.0.0.1',9000)
udp_sk=socket.socket(type=socket.sock_dgram)
udp_sk.sendto(b'hello',ip_port)
back_msg,addr=udp_sk.recvfrom(1024)
print(back_msg.decode('utf-8'),addr)
"""時間伺服器的實現原理
1.內部小電容供電
2.遠端時間同步
"""例子:簡易qq程式
作業系統發展史就是圍繞著提高cpu利用率發展的,每次技術的進步,cpu的利用率就大大提高
"""學習併發程式設計其實就是在學習作業系統的發展史(底層邏輯)"""
cpu利用率極低
使用計算機的人要拿著自己的程式(穿孔卡片)在門外等候,輸入時間非常長,cpu利用時間就少
將多個程式設計師的程式一次性錄入磁帶中 之後交由輸入機輸入並由cpu執行
現代計算機的雛形(遠端輸入 高速磁帶 主機)
工作人員只需要買一台輸入裝置在家,就可以把程式傳輸到高速磁帶中(記憶體),然後再用cpu執行
前提是單核cpu
切換:cpu在執行程序**時,如果遇到進行io操作會立刻停止當前程序的執行,切換到其它程序的執行中去
儲存狀態:在切換之前,會保留當前程序的執行狀態,以便切換回來時可以在斷開處繼續
'''
cpu工作機制:
1、當某個程式進入io操作狀態時,作業系統會強行剝奪該程式的cpu執行許可權
2、當某個程式長時間占用cpu時,作業系統也會強行剝奪該程式的cpu執行許可權
'''並行與併發:
並行:多個程式同時執行(每個程式執行都需要乙個cpu)
併發:多個程式只要看起來像是同時執行的就可以
# 問:單核cpu能否實現並行
肯定不能,但是可以實現併發
# 問:12306可以同一時間支援幾個億的使用者買票 問是並行還是併發
肯定是併發(高併發)
星軌:微博能夠支援八個星軌
程式:實現功能的程式設計**,存在硬碟中(是死的)
程序:執行中的應用程式,存在記憶體中(是活的)
對短作業不友好
對長作業不友好
1、先給所有要執行的程序分配相同的時間片(cpu執行時間)
2、然後根據每個程序消耗的時間片多少進行分級,需要執行時間長的進入下一級
3、優先執行第一級需要時間片少的程序
同步cpu 提交任務之後原地等待返回資訊,再去執行其它任務
非同步提交任務之後不會等待,先去執行其它任務,接收到返回資訊後再回來執行,有反饋機制
阻塞阻塞態:io操作、異常斷開
非阻塞就緒態與執行態
直接建立程序物件(主要的)
from multiprocessing import process
import time
import os
def run(name):
print(os.getpid()) # 獲取程序號
print(os.getppid()) # 獲取父程序號
print('%s is running ' % name)
time.sleep(3)
print('%s is over' % name)
if __name__ == '__main__':
p = process(target=run, arg=('elijah', )) # 生成乙個程序物件
p.start() # 告訴作業系統要啟動這個子程序,然後繼續執行主程序 非同步提交
print(os.getpid())
print('主程序')
'''在windows中開設程序類似於匯入模組
**自上而下執行
一定要在__main__判斷語句內執行開設程序的**
否則,被匯入模組也會執行開設程序的**,這樣會陷入死迴圈
''''''
在linux中是直接將**完整地複製乙份執行
不用在__main__判斷語句中執行
'''
用類建立程序物件
class myprocess(process):
def __init__(self, name):
super().__init__()
self.name = name
def run(self):
print('%s正在執行' % self.name)
time.sleep(3)
print('%s已經結束' % self.name)
if __name__ == '__main__':
p = myprocess('jason')
p.start()
print('主')
主程序開設子程序之後,等待子程序執行完成之後再往下執行
from multiprocessing import process
import time
def run(name, n):
print('%s is running' % name)
time.sleep(n)
print('%s is over' % name)
if __name__ == '__main__':
start_time = time.time()
process_list =
for i in range(1, 4):
p = process(target=run, args=(i, i))
p.start()
for p in process_list:
p.join()
print(time.time() - start_time)
print('主程序')
# 執行結果
1 is running
2 is running
3 is running
1 is over
2 is over
3 is over
3.309438943862915 # 執行時間
主程序'''當第乙個 p.join() 執行時,只有主程序會在原地等待它執行結束
其它兩個子程序並不受影響,會繼續執行
所以總的時間是最長的那個子程序執行時間
'''
主程式開設子程式,相當於再開闢了一塊記憶體重新執行一遍**(以被匯入模組執行,__main__判斷語句內的**不會執行),那它執行修改資料操作不會影響到主程序的資料,因為程序之間預設無法進行互動
from multiprocessing import process
money = 100
def test():
global money
money = 90
if __name__ == '__main__':
p = process(target=test)
p.start()
p.join()
print(money)
# 執行結果
100
1.current_process檢視程序號
2.os.getpid() 檢視程序號 os.getppid() 檢視父程序程序號
3.程序的名字,p.name直接預設就有,也可以在例項化程序物件的時候通過關鍵字形式傳入name=''
3.p.terminate() 殺死子程序
4.p.is_alive() 判斷程序是否存活 3,4結合看不出結果,因為作業系統需要反應時間。主程序睡0.1即可看出效果
作業系統發展史
程序指的就是乙個正在執行的程式,或者說是程式的執行過程,即程序是乙個抽象的概念 程序是起源於作業系統的,是作業系統最核心的概念,作業系統所有其他的概念都是圍繞程序展開的1 作業系統 現代作業系統 作業系統是位於計算機硬體於軟體之間的控制程式 作用 1 將硬體的複雜操作封裝成簡單的介面,給使用者或者應...
作業系統發展史
步驟簡介 先把程式紙帶 或卡片 裝上計算機,然後啟動輸入機把程式和送入計算機,接著通過控制台開關啟動程式執行。計算完畢,印表機輸出計算結果,使用者卸下並取走紙帶 或卡片 第二個使用者上機,重複同樣的步驟。特點 使用者獨佔機器,cpu等待手工操作,cpu利用不充分。缺點 由於手工操作的速度和計算機的高...
作業系統發展史
計算機硬體和軟體共同構成計算機系統。計算機硬體的每一次革新都伴隨著作業系統的發展。作業系統的發展大致分為4個階段,如圖5 6所示。第一代的電子管計算機誕生於20世紀40年代,當時作業系統尚未出現,程式設計師直接與硬體打交道 第二代的電晶體計算機始於20世紀50年代,為了提高計算資源的使用效率,減少空...