Python之網路程式設計程序理論基礎

2022-06-28 21:51:10 字數 3832 閱讀 8122

背景知識

顧名思義,程序即乙個軟體正在進行的過程。程序是對正在執行程式的乙個抽象。

程序的概念起源於作業系統,是作業系統最核心的概念,也是作業系統提供的最古老的也是最重要的抽象概念之一。作業系統的其他所有內容都是圍繞程序的概念展開的。所以想要真正了解程序,必須先了解作業系統。詳見部落格點選進入。

須知的理論基礎:

#一 作業系統的作用:

1:隱藏醜陋複雜的硬體介面,提供良好的抽象介面

2:管理、排程程序,並且將多個程序對硬體的競爭變得有序

#二 多道技術:

1.產生背景:針對單核,實現併發

ps:現在的主機一般是多核,那麼每個核都會利用多道技術,但是核與核之間沒有使用多道技術切換這麼一說;

有4個cpu,執行於cpu1的某個程式遇到io阻塞,會等到io結束再重新排程,會被排程到4個cpu中的任意乙個,具體由作業系統排程演算法決定。

2.時間上的復用(復用乙個cpu的時間片)+空間上的復用(如記憶體中同時有多道程式)

一、什麼是程序

程序:正在進行的乙個過程或是乙個任務。而負責執行任務的是cpu。

舉例:(單核+多道,實現多個程序的併發):

比如說你就是乙個cpu,你下午有幾個活要幹,吃飯,洗衣服,上廁所等。但是就在那一下午要把所有的事幹完(而cpu同一時間只能幹一件事),那麼如何才能讓多個任務實現併發執行的效果呢?那麼,你應該這樣做,你可以先做飯,在等待飯熟的過程中你可以去洗個衣服,洗的差不多飯也就熟了,那麼你在去上個廁所也可以嘛。

二、程序與程式的區別

程式僅僅只是一堆**而已,而程序指的是程式的執行過程

三、併發和並行

併發:單cpu,多程序併發

無論是並行還是併發,在使用者看來都是'同時'執行的,不管是程序還是執行緒,都只是乙個任務而已,真實幹活的是cpu,cpu來做這些任務,而乙個cpu同一時刻只能執行乙個任務

一 併發:是偽並行,即看起來是同時執行。單個cpu+多道技術就可以實現併發,(並行也屬於併發)

1 你是乙個cpu,你同時談了三個女朋友,每乙個都可以是乙個戀愛任務,你被這三個任務共享 2 要玩出併發戀愛的效果, 3 應該是你先跟女友1去看電影,看了一會說:不好,我要拉肚子,然後跑去跟第二個女友吃飯,吃了一會說:那啥,我 4 去趟洗手間,然後跑去跟女友3開了個房 

並行:多cpu(同時執行,只有具有多個cpu才能實現並行)

單核下,可以利用多道技術,多個核,每個核也都可以利用多道技術(多道技術是針對單核而言的

有四個核,六個任務,這樣同一時間有四個任務被執行,假設分別被分配給了cpu1,cpu2,cpu3,cpu4,

一旦任務1遇到i/o就被迫中斷執行,此時任務5就拿到cpu1的時間片去執行,這就是單核下的多道技術

而一旦任務1的i/o結束了,作業系統會重新呼叫它(需知程序的排程、分配給哪個cpu執行,由作業系統說了算),可能被分配給四個cpu中的任意乙個去執行

所有現代計算機經常會在同一時間做很多件事,乙個使用者的pc(無論是單cpu還是多cpu),都可以同時執行多個任務(乙個任務可以理解為乙個程序)。

多道技術:記憶體中同時存入多道(多個)程式,cpu從乙個程序快速切換到另外乙個,使每個程序各自執行幾十或幾百毫秒,這樣,雖然在某乙個瞬間,乙個cpu只能執行乙個任務,但在1秒內,cpu卻可以執行多個程序,這就給人產生了並行的錯覺,即偽併發,以此來區分多處理器作業系統的真正硬體並行(多個cpu共享同乙個物理記憶體)

四、同步和非同步

同步執行:乙個程序在執行某個任務時,另外乙個程序必須等待其執行完畢,才能繼續執行

非同步執行:乙個程序在執行某個任務時,另外乙個程序無需等待其執行完畢,就可以繼續執行,當有訊息返回時,系統會通知後者進行處理,這樣可以提高執行效率

舉個例子,打**時就是同步通訊,發短息時就是非同步通訊。

五、程序的建立

但凡是硬體,都需要有作業系統去管理,只要有作業系統,就有程序的概念,就需要有建立程序的方式,一些作業系統只為乙個應用程式設計,比如微波爐中的控制器,一旦啟動微波爐,所有的程序都已經存在。

而對於通用系統(跑很多應用程式),需要有系統執行過程中建立或撤銷程序的能力,主要分為4中形式建立新的程序

1. 系統初始化(檢視程序linux中用ps命令,windows中用任務管理器,前台程序負責與使用者互動,後台執行的程序與使用者無關,執行在後台並且只在需要時才喚醒的程序,稱為守護程序,如電子郵件、web頁面、新聞、列印)

2. 乙個程序在執行過程中開啟了子程序(如nginx開啟多程序,os.fork,subprocess.popen等)

3. 使用者的互動式請求,而建立乙個新程序(如使用者雙擊暴風影音)

4. 乙個批處理任務的初始化(只在大型機的批處理系統中應用)

無論哪一種,新程序的建立都是由乙個已經存在的程序執行了乙個用於建立程序的系統呼叫而建立的:

1. 在unix中該系統呼叫是:fork,fork會建立乙個與父程序一模一樣的副本,二者有相同的儲存映像、同樣的環境字串和同樣的開啟檔案(在shell直譯器程序中,執行乙個命令就會建立乙個子程序)

2. 在windows中該系統呼叫是:createprocess,createprocess既處理程序的建立,也負責把正確的程式裝入新程序。

關於建立的子程序,unix和windows

1.相同的是:程序建立後,父程序和子程序有各自不同的位址空間(多道技術要求物理層面實現程序之間記憶體的隔離),任何乙個程序的在其位址空間中的修改都不會影響到另外乙個程序。

六、程序的終止

1. 正常退出(自願,如使用者點選互動式頁面的叉號,或程式執行完畢呼叫發起系統呼叫正常退出,在linux中用exit,在windows中用exitprocess)

2. 出錯退出(自願,python a.py中a.py不存在)

3. 嚴重錯誤(非自願,執行非法指令,如引用不存在的記憶體,1/0等,可以捕捉異常,try...except...)

4. 被其他程序殺死(非自願,如kill -9)

七、程序的層次結構

無論unix還是windows,程序只有乙個父程序,不同的是:

1. 在unix中所有的程序,都是以init程序為根,組成樹形結構。父子程序共同組成乙個程序組,這樣,當從鍵盤發出乙個訊號時,該訊號被送給當前與鍵盤相關的程序組中的所有成員。

2. 在windows中,沒有程序層次的概念,所有的程序都是地位相同的,唯一類似於程序層次的暗示,是在建立程序時,父程序得到乙個特別的令牌(稱為控制代碼),該控制代碼可以用來控制子程序,但是父程序有權把該控制代碼傳給其他子程序,這樣就沒有層次了。

八、程序的狀態

tail -f access.log |grep '404'

執行程式tail,開啟乙個子程序,執行程式grep,開啟另外乙個子程序,兩個程序之間基於管道'|'通訊,將tail的結果作為grep的輸入。

程序grep在等待輸入(即i/o)時的狀態稱為阻塞,此時grep命令都無法執行

其實在兩種情況下會導致乙個程序在邏輯上不能執行,

1. 程序掛起是自身原因,遇到i/o阻塞,便要讓出cpu讓其他程序去執行,這樣保證cpu一直在工作

2. 與程序無關,是作業系統層面,可能會因為乙個程序占用時間過多,或者優先順序等原因,而呼叫其他的程序去使用cpu。

因而乙個程序由三種狀態

九、程序併發的現象

程序併發的實現在於,硬體中斷乙個正在執行的程序,把此時程序執行的所有狀態儲存下來,為此,作業系統維護一張**,即程序表(process table),每個程序占用乙個程序表項(這些表項也稱為程序控制塊)

Python學習筆記之 網路程式設計(理論部分)

計算機網路功能主要包括實現資源共享,實現資料資訊的快速傳遞 制定組織 iso 國際標準化組織 作用 使網路通訊工作流程標準化 應用層 提供使用者服務,具體功能由應用程式實現表示層 資料的壓縮優化加密會話層 建立使用者級的連線,選擇適當的傳輸服務傳輸層 提供傳輸服務 網路層 路由選擇,網路互聯 鏈路層...

網路程式設計理論

tcp ip協議族 是很多協議的總稱 四層協議 2.傳輸層 tcp udp 3.網路層 ip 4.介面層 mac 應用層 tcp ip mac 電子裝置在網路上的唯一標識 255.255.255.255 1111 1111.1111 1111.1111 1111.1111 1111 32位 4g 2...

網路程式設計理論

client 客戶端 sever 伺服器 優點 軟體使用穩定 節省網路資源 缺點 安裝麻煩,使用者體驗差 browser 瀏覽器 本質上也是乙個客戶端 sever 伺服器 優點 軟體使用方便 缺點 如果網路不穩定,軟體的使用就不穩定 ps b s架構比較流行,因為使用者體驗高 服務端 24小時不間斷...