軟件開發架構
c/s client/server
b/s broswer/server
ps:b/s本質上也是c/s架構
OSI七層協議
應用層
表示層
會話層
傳輸層
網絡層
數據鏈路層
物理鏈接層
物理鏈接層
傳輸二進制的數據
數據鏈路層(以太網協議)
1.規定了二進制數據的分組依據
2.規定了每臺計算機都必須有一塊網卡
ps:網卡上刻有12位16進制的編號
前6位廠商編號
後6位流水線編號
編號:mac地址 惟一標識一臺計算機
1+2=以太網協議
基於以太網協議通訊
通訊基本靠吼
廣播
單播
廣播風暴
交換機
讓鏈接了交換機的計算機實現彼此之間互聯
局域網
構成互聯網的基本單位
ps:以太網協議不能跨局域網傳輸
路由器
鏈接不一樣局域網
網關
網絡層
IP協議
規定了任何接入互聯網的計算機都必須有一個IP地址
ip地址:點分十進制
版本:IPV4 IPV6
最小:0.0.0.0
最大:255.255.255.255
ip地址是動態分配的 不是一成不變的
arp協議
根據ip地址解析對方的mac地址
傳輸層
TCP UDP
基於端口工做的協議
端口(port):惟一標識一臺計算機上的某一個應用程序,port號是動態分配的而且是有限
端口號的範圍:0~65535
0~1024一般是操做系統須要使用的端口號
建議你使用8000以後的端口
django默認端口 8000
flask默認端口 5000
redis 6379
Mysql 3306
應用層
HTTP協議 FTP協議
IP+PORT可以惟一標識一臺計算機上的某一個應用程序
TCP協議
三次握手
四次揮手
TCP之因此可靠的緣由在於:反饋機制
發送消息後必須等到對方迴應 纔會將內存中的數據清除
UDP協議
數據報協議
無需雙向通道
數據是不安全的
TCP相似於打電話
UDP相似於發短信
如何解決TCP的粘包問題
基於TCP實現大文件的上傳
客戶端:
1.先生成一個字典
2.製做字典的報頭
3.發送字典的報頭
4.發送字典數據
5.發送真實數據
服務端
1.接收固定長度的報頭
2.解析獲取字典的長度
3.接收字典數據
4.解析獲取真實數據信息
5.接收真實數據
socketserver
可以實現併發的效果
併發:看上去像同時運行的
並行:真正意義上的同時執行
ps:單核的計算機絕對不可能實現並行 可是能夠實現併發
併發編程
操做系統發展史
基於單核研究
多道技術
1.空間上的複用
多個程序公用一套計算機硬件
2.時間上的複用
切換+保存狀態
例子:洗衣 燒水 作飯
切換
1.程序遇到IO操做系統會馬上剝奪走CPU的執行權限
IO:input,sleep,accept,recv...阻塞 平常生活中使用軟件一般都是IO密集型
2.當你的程序長時間佔用CPU的時候也會被操做系統剝奪走cpu的執行權限
進程理論
進程調度
時間片輪轉法+多級反饋隊列
進程三狀態圖
ps:程序不會馬上進入運行態 都會如今就緒態等待cpu的執行
同步異步:指的是任務的提交方式
同步:提交任務以後原地等待任務的返回結果 期間不作任何事
異步:提交任務以後馬上執行下一行代碼 不等待任務的返回結果 >>> 結果的獲取使用異步回調機制
阻塞非阻塞:指的是程序的運行狀態
阻塞:阻塞態
非阻塞:就緒態或者是運行態
建立進程的兩種方式
使用使用Process實例化
繼承Process類重寫run方法
ps:windows在開啓進程的時候必須在__main__代碼塊內,由於windows是以模塊導入的方式從上執行代碼
什麼是進程:
正在運行的程序
一個進程對應到內存中就是一塊獨立的內存空間
join方法
主進程等待某個指定的子進程運行結束,不影響其餘子進程的運行
進程對象及其餘方法
current_process().pid
os.getpid
os.getppid
terminate()
is_alive()
守護進程
daemon
這一句化必須在start以前使用
進程間數據是隔離的
互斥鎖
多個程序操做用一份數據的時候會出現數據錯亂的現象
如何避免:
將操做數據的部分加鎖處理
會將併發變成串行犧牲了效率可是保證了數據的安全
搶鎖
acquire()
釋放鎖
release()
例子:搶廁所
搶票實例
redis