數據結構基本概念html
- 數據:數據即信息的載體,是可以輸入到計算機中而且能被計算機識別,存儲和處理的符號總稱
- 數據元素:數據元素是數據的基本單位,又稱之爲記錄。通常,數據元素由若干基本項(字段,域,屬性)組成。
- 數據結構:數據結構指的是數據元素及數據元素之間的相互關係,或組織數據的形式
數據之間的結構關係java
- 邏輯結構
- 表示數據之間的抽象關係(鄰接關係,從屬關係),按每一個元素可能具備的直接前驅數和直接後繼數將邏輯結構分爲‘線性結構’和‘非線性結構’兩大類
- 特色:
- 只是描述數據結構中數據元素直接的練習規律
- 是從具體問題中抽象出來的數學模型,是獨立於計算機存儲器的(與機器無關)
- 分類
- 線性結構:線性結構是N個數據元素的有序集合
- 樹形結構:數據元素之間存在着」一對多「的樹形關係的數據結構
- 圖狀結構:一種多對多的關係
- 其餘結構
- 存儲結構
- 邏輯結構再計算機中的具體實現方式,分爲順序存儲方法,連接存儲方法,索引存儲方法,散列存儲方法
- 特色
- 是數據的邏輯結構在計算機存儲器中的映象
- 存儲結構是經過計算機程序來實現的,於是是依賴於具體的計算機語言的
- 分類
- 順序存儲:將數據結構中各元素按照其邏輯順序存放於存儲器一片連續的存儲空間中
- 鏈式存儲:將數據結構中各元素分佈到存儲器的不一樣點,用記錄下一個結點位置的方式創建他們之間的聯繫,由此獲得的存儲結構爲鏈式存儲結構
- 索引存儲:在存儲數據的同時,創建一個附加的索引表,即索引存儲結構=數據文件+索引表
- 散列存儲:根據數據元素的特殊字段(稱爲關鍵字key),計算數據元素的存放地址,而後數據元素按地段存放,所獲得的存儲結構爲散列存儲結構
線性表python
- 線性表的順序存儲
- 定義:若將線性表中的各元素一次存儲於計算機一片連續的存儲空間,這種進製表示爲線性的順序存儲結構
- 特色
- 邏輯上相鄰的元素ai,ai+1,其存儲位置也是相鄰的
- 存儲密度高,方便對數據的遍歷查找
- 對錶的插入和刪除等運算的效率較差
- 線性表的鏈式存儲
- 定義:將線性表中各元素分佈再存儲器的不一樣存儲塊,稱爲結點,每一個結點(尾結點除外)中都持有一個指向下一個節點的引用,這樣所獲得的存儲結構爲鏈表結構
- 特色:
- 邏輯上相鄰的元素,其存儲位置也不必定相鄰
- 存儲稀疏,沒必要開闢整塊存儲空間
- 對錶的插入和刪除等運算的效率較高
- 邏輯結構複雜,不利於遍歷
棧和隊列編程
- 棧
- 定義:棧是限制再一段進行插入操做和刪除操做的線性表,容許進行操做的一端稱爲棧頂,另外固定一段爲棧底,當棧中沒有元素時成爲空棧
- 特色
- 棧只能在一端進行數據操做
- 棧模型具備後進先出的規律
- 隊列
- 定義:隊列是如今再兩端進行插操做和刪除操做的線性表,容許進行存入操做的一段稱爲隊尾,容許進行刪除操做的一段稱爲隊頭
- 特色
- 隊列只能在隊頭和隊尾進行數據操做
- 線模型具備先進先出的規律
樹形結構瀏覽器
基礎概念:有且只有一個根,其他結點分爲互不相交的有限集合,並稱爲其根的子樹服務器
二叉樹的遍歷:沿着條搜索路徑周遊二叉樹,再樹中的每個節點訪問一次且僅訪問一次網絡
-
- 先序遍歷:先訪問樹根,再訪問左子樹,最後訪問右子樹(根,左,右)
- 中序遍歷:先訪問左子樹,再訪問根,最後右子樹(左,根,右)
- 後序遍歷:先訪問左子樹,再訪問右子樹,最後訪問根(左,右,根)
- 層次遍歷:從根節點開始,組層從左向右進行遍歷
遞歸思想和實踐數據結構
遞歸函數是指一個函數的函數體中直接調用或間接調用了該函數自身的函數多線程
遞歸函數調用的執行過程的兩個階段併發
-
- 遞推階段:從原問題出發,按遞歸公式遞推從未知到已知,最終大刀遞歸終止條件
- 迴歸階段:按遞歸終止條件求出結果,逆向逐步帶入遞歸公式,迴歸到原問題求解
優缺點
-
- 優勢:遞歸能夠吧問題簡單化,讓思路更爲清晰,代碼更簡潔
- 缺點:遞歸因系統環境影響大,當遞歸深度太大時,可能會獲得不可預知的結果
排序和查找
排序:將無序的記錄序列調整成有序的序列
常見的排序方法:
查找:是在給定信息集上尋找特色信息元素的過程
二分查找:當數據量很大適宜採用該方法,採用二分法查找時,數據須要是排好序的
網絡編程基礎
計算機網絡功能主要是包括實現資源共享,實現數據信息的快速傳遞
OSI七層模型
做用:使網絡通訊工做流程標準化
優勢:
- 創建了統一的工做流程
- 分部清晰,各司其職,每一個步驟分工明確
- 下降了各個模塊直接的耦合度,便於開發
- 應用層:提供用戶服務,具體功能有應用程序實現
- 表示層:數據的壓縮優化加密
- 會話層:創建用戶級的鏈接,選擇適當的傳輸服務
- 傳輸層:提供傳輸服務
- 網絡層:路由選擇,網絡互聯
- 鏈路層:進行數據交換,控制具體數據的發送
- 物理層:提供數據傳輸的硬件保證,網卡接口,傳輸介質
四層模型(TCP/IP模型)
背景:實際工做中工程師沒法徹底按照七層模型要求操做,逐漸演化爲更符合實際狀況的四層
- 應用層對應協議:TFTP,FTP,NPS,WAIS | Telnet ,Rlogin,SNMP,Gopher | SMTP,DNS
- 傳輸層對應協議:TCP,UDP
- 網際層對應協議:IP ,ICMP,RARP,AKP,UUCP
- 網絡接口對應協議:PDDI,PDN.......
數據傳輸過程
- 發送端由應用層程序發送消息,逐層添加首部信息,最終在物理層發送消息包
- 發送的消息通過對個節點(交換機,路由器)傳輸,最終到達目標主機
- 目標主機由物理層逐層解析首部消息包,最終到應用程序呈現消息
網路協議
在網路數據傳輸中,都遵循的規定,包括創建聲明樣的數據結構,什麼樣的特殊標誌等
網路基礎概念
- 網路主機(host):標識一臺主機再網絡中的位置
- IP地址:肯定一臺主機的網絡路由位置
- 域名:給網絡服務器地址起的名字,方便記憶,表達必定含義
- 端口號(port):端口是網絡地址的一部分,用於區分主機上不一樣的網絡應用程序
傳輸層服務
- 面向鏈接的傳輸服務(基於tcp協議)
- 傳輸特徵:提供了可靠的數據傳輸,可靠性指數據傳輸過程當中無丟失,無失序,無差錯,無重複
- 實現手段:在通信前須要創建數據鏈接,通信結束要正常斷開鏈接
- 三次握手(創建鏈接)
- 客戶端向服務器發送消息報文請求鏈接
- 服務器收到請求後,回覆報文肯定能夠鏈接
- 客戶端收到回覆,發送最終報文鏈接創建
- 四次揮手(斷開鏈接)
- 主動方發送報文請求斷開鏈接
- 被動方收到請求後,當即回覆,表示準備斷開
- 被動方準備就緒,再次發送報文表示能夠斷開
- 主動方收到肯定,發送最終報文完成斷開
- 面向無鏈接的傳輸服務(基於UDP協議)
- 傳輸特色:不保證傳輸的可靠性,傳輸過程沒有鏈接和斷開,數據收發自由隨意
- 適用狀況:網絡較差,對傳輸可靠性要求不高
socket套接字編程
套接字:實現網絡編程進行數據傳輸的一種技術手段
套接字分類:
-
- 流式套接字:以字節流方式傳輸數據,實現tcp網絡傳輸方案(面向鏈接--tcp協議--可靠的--流式套接字)
- tcp套接字服務端流程
- 建立套接字:sockfd=socket.socket(socket_family=AF_INET,socket_type=SOCK_STREAM,proto=0)
- 綁定地址:sockfd.bind(addr)
- 設置監聽:sockfd.listen(n)
- 等待處理客戶端鏈接請求:connfd,addr = sockfd.accept()
- 消息收發:data = connfd.recv(buffersize),n = connfd.send(data)
- 關閉套接字:sockfd.close()
- 客戶端流程
- 建立套接字:注意:只有相同類型的套接字才能進行通訊
- 請求鏈接:sockfd.connect(server_addr)
- 收發消息:注意: 防止兩端都阻塞,recv send要配合
- 關閉套接字
- tcp套接字數據傳輸特色
- tcp鏈接中當一端退出,另外一端若是阻塞在recv,此時recv會當即返回一個空字串。
- tcp鏈接中若是一端已經不存在,讓然試圖經過send發送則會產生BrokenPipeError
- 一個監聽套接字能夠同時鏈接多個客戶端,也可以重複被鏈接
- 網絡收發緩衝區
- 網絡緩衝區有效的協調了消息的收發速度
- send和recv實際是向緩衝區發送接收消息,當緩衝區不爲空recv就不會阻塞。
- tcp粘包
- 緣由:tcp以字節流方式傳輸,沒有消息邊界。屢次發送的消息被一次接收,此時就會造成粘包。
- 影響:若是每次發送內容是一個獨立的含義,須要接收端獨立解析此時粘包會有影響。
- 處理方法:1.人爲的添加消息邊界 2.控制發送速度
- 數據報套接字:以數據報方式傳輸數據,實現UDP網絡傳輸方案
- UDP套接字服務端流程:
- 建立數據報套接字:sockfd = socket(AF_INET,SOCK_DGRAM)
- 綁定地址:sockfd.bind(addr)
- 消息收發:data,addr = sockfd.recvfrom(buffersize),n = sockfd.sendto(data,addr)
- 關閉套接字:sockfd.close()
- 客戶端流程:
- 建立套接字
- 收發消息
- 關閉套接字
- tcp套接字和udp套接字編程區別
-
- 流式套接字是以字節流方式傳輸數據,數據報套接字以數據報形式傳輸
- tcp套接字會有粘包,udp套接字有消息邊界不會粘包
- tcp套接字保證消息的完整性,udp套接字則不能
- tcp套接字依賴listen accept創建鏈接才能收發消息,udp套接字則不須要
- tcp套接字使用send,recv收發消息,udp套接字使用sendto,recvfrom
TCP套接字之HTTP傳輸
HTTP協議(超文本傳輸協議)
- 用途:網頁獲取,數據傳輸
- 特色:
- 應用層協議,傳輸層使用tcp傳輸
- 簡單,靈活,不少語言都有HTTP專門接口
- 無狀態,協議不記錄傳輸內容
- http1.1支持持久鏈接,豐富了請求類型網頁請求過程
- 網頁請求過程
- 客戶端(瀏覽器)經過tcp傳輸,發送http請求給服務端
- 服務端接收到http請求後進行解析
- 服務端處理請求內容,組織響應內容
- 服務端將響應內容以http響應格式發送給瀏覽器
- 瀏覽器接收到響應內容,解析展現
HTTP請求
請求行:具體的請求類別和請求內容 GET (請求類別) /(請求內容) HTTP/1.1(協議版本)
請求類別:每一個請求內別表示要作不一樣的事情
-
- GET:獲取網絡資源
- POST:提交必定的信息,獲得反饋
- HEAD:只獲取網絡資源的響應頭
- PUT:更新服務器資源
- DELETE:刪除服務器資源
- CONNECT
- TRACE:測試
- OPTIONS:獲取服務器性能信息
請求頭:對請求的進一步解釋和描述
空行
請求體:請求參數或者提交內容
HTTP響應
響應格式:響應行,響應頭,空行,響應體
響應行:反饋基本響應狀況 HTTP/1.1(版本信息) 200(響應碼) OK(附加信息)
響應碼:
-
- 1xx:提示信息,表示請求被接收
- 2xx:響應成功
- 3xx:響應須要進一步操做,重定向
- 4xx:客戶端錯誤
- 5xx:服務器錯誤
響應頭:對響應內容的描述 Content-Type:text/html
響應體:響應的主體內容信息
多任務編程
意義:充分利用計算機多核資源,提升程序的容許效率
實現方案:多線程,多進程
並行與併發
- 併發:同時處理多個任務,內核再任務間不斷的切換達到好像多個任務被同事執行的效果,實際每一個時刻只有一個任務佔有內核
- 並行:多個任務利用計算機多核資源在同時執行,此時多個任務間爲並行關係
進程
定義:程序在計算機中的一次運行
-
- 程序是一個可執行的文件,是靜態的佔有磁盤
- 進程是一個動態的過程描述,佔有計算機運行資源,有必定的生命週期
進程的基本概念:
-
- CPU時間片:若是一個進程佔有cpu內核則稱這個進程在cpu時間片上
- PCB(進程控制塊):在內存中開闢的一塊空間,用於存放進程的基本信息,也用於系統查找識別進程
- 進程ID(PID):系統爲每一個進程分配的一個大於0的整數,做爲進程ID,每一個進程ID不重複。Linux查看進程ID:ps-aux
- 父子進程:系統中每個進程(除了系統初始化進程)都有惟一的父進程,能夠有0個或多個子進程,父子進程關係便於進程管理
- 進程狀態(三態)
- 就緒態:進程具有執行條件,等待分配cpu資源
- 運行態:進程佔有cpu時間片正在運行
- 等待態:進程暫時中止運行,讓出cpu
- 五態(在三態基礎上增長新建和終止)
- 新建:建立一個進程,獲取資源的過程
- 終止:進程接收,釋放資源的過程
- 進程的運行特徵:
- 進程可使用計算機多核資源
- 進程是計算機分配資源的最小單位
- 進程之間的容許狀態互不影響,各自獨立
- 每一個進程擁有獨立的空間,各自使用本身空間資源
- 基於fork的多進程編程
- 孤兒和殭屍
- 孤兒進程:父進程先於子進程退出,此時子進程成爲孤兒進程
- 特色:孤兒進程會被系統進程收養,此時系統進程就會成爲孤兒進程新的父進程,孤兒進程退出該進程會自動處理
- 殭屍進程:子進程先於父進程退出,父進程又沒有處理子進程的退出狀態,此時子進程就會成爲殭屍進程
- 特色:殭屍進程雖然結束,可是會存留部分PCB再內存中,大量的殭屍進程會浪費系統的內存資源
- 如何避免殭屍進程產生
- 使用wait函數處理子進程退出
- 建立二級子進程處理殭屍
- 經過信號處理子進程退出
- multiprocessing模塊建立進程
- 將須要子進程執行的事件封裝爲函數
- 經過模塊的Process類建立進程對象,關聯函數
- 能夠經過進程對象設置進程信息及屬性
- 經過進程對象調用start啓動進程
- 經過進程對象調用join回收進程
- 進程池實現
- 進程的建立和銷燬過程消耗的資源較多
- 當任務量衆多,每一個任務在很短期內完成時,須要頻繁的建立和銷燬進程。此時對計算機壓力較大
- 進程池技術很好的解決了以上問題
- 原理:
- 建立一個數量的進程來處理事件,事件處理完進程不退出而是繼續處理其餘事件,直到全部事件全都處理完畢統一銷燬,增長進程的重複利用,下降資源消耗
- 建立進程池的步驟
- 建立進程池對象,放入適當的進程
- 將事件加入進程池隊列執行
- 關閉進程池
- 回收進程池中進程
- 進程間通信(IPC)
- 必要性:進程間空間獨立,資源不共享,此時在須要進程間數據傳輸時就須要特定的手段進行數據通訊
- 常見進程鍵通訊方法
- 管道(Pipe):在內存中開闢管道空間,生成管道操做對象,多個進程使用同一個管道對象進行讀寫便可實現通訊
- 消息隊列:在內存中創建隊列模型,進程經過隊列將消息存入,或者從隊列取出完成進程間通訊
- 共享內存:在內存中開闢一塊空間,進程能夠寫入內容和讀取內容完成通訊,單是每次寫入內容會覆蓋以前內容
- 本地套接字:用於本地兩個程序之間進行數據的收發
- 套接字文件:用於本地套接字之間通訊時,進行數據傳輸的介質
- 建立流程
- 建立本地套接字:sockfd = socket(AF_UNIX,SOCK_STREAM)
- 綁定本地套接字文件:sockfd.bind(file)
- 監聽,接收客戶端鏈接,消息收發:isten()-->accept()-->recv(),send()
- 信號量:給定一個數量對多個進程可見,多個進程均可以操做該數量增減,並根據數量值決定本身的行爲
線程(Thread)
線程基本概念
-
- 線程被成爲輕量級的進程
- 線程也可使用計算機多核資源,是多任務編程方式
- 線程是系統分配內核的最小單元
- 線程能夠理解爲進程的分鐘任務
- 一個進程中能夠包含多個線程
- 線程也是一個運行行爲,消耗計算級內存
- 一個進程中的全部線程共享這個進程的資源
- 多個線程之間的運行互不影響各自運行
- 線程的建立和銷燬消耗資源小於進程
- 各個線程也有本身的ID特徵
- 建立線程對象:t = Thread()
- 啓動線程:t.start()
- 回收線程:t.join([timeout])
同步互斥
-
- 線程間通訊方法:線程間使用全局變量進行通訊
- 共享資源爭奪
- 共享資源:多個進程或者線程均可以操做的資源成爲共享資源,對貢獻資源的操做代碼段成爲臨界區
- 影響:對共享資源的無序操做可能會帶來數據的混亂,或者操做錯誤,此時每每須要同步互斥機制協調操做順序
- 同步互斥機制
- 同步:同步是一種協做關係,爲完成操做,多進程或者線程間造成一種協調,按照必要的步驟有序執行操做
- 互斥:互斥是一組制約關係,當一個進程或者線程佔有資源時會進行加鎖處理,此時其餘進程線程就沒法操做該資源,直到解鎖後才能操做
- 線程同步互斥方法
- 死鎖
- 定義:死鎖是指兩個或兩個以上的線程在執行過程當中,因爲競爭資源或者因爲彼此通訊而形成的一組阻塞的現象,若無外力做用,它們都將沒法推動下去。此時稱系統處於死鎖狀態或系統產生了死鎖
- 死鎖產生的緣由
- 當前線程擁有其餘線程須要的資源
- 當前線程等待其餘線程已擁有的資源
- 都不放棄本身擁有的資源
- 如何避免死鎖
- 使用定時鎖
- 使用重入鎖RLock(),用法同Lock,RLock內部維護着一個Lock和一個counter變量,counter記錄了acquire的次數,從而使得資源能夠被屢次require。直到一個線程全部的acquire都被release,其它的線程才能得到資源
- python線程GIL
- python線程的GIL問題(全局解釋器鎖)
- 什麼是GIL:因爲python解釋器設計中加入瞭解釋器鎖,致使python解釋器同一時刻只能解釋執行一個線程,大大下降了線程的執行效率
- 致使後果:由於遇到阻塞時線程會主動讓出解釋器,去接收其餘線程,因此python多線程在執行多阻塞高延遲IO時能夠提高程序效率,其餘狀況並不能對效率有所提高
- GIL問題建議
- 儘可能使用進程完成無阻塞的併發行爲
- 不適用c做爲解釋器(java C#)
- 結論:在無阻塞狀態下,多線程程序和單線程程序執行效率幾乎差很少,甚至還不如單線程效率。可是多進程運行相同內容卻能夠有明顯的效率提高
進程和線程的區別聯繫
- 二者都是多任務編程方式,都能使用計算機多核資源
- 進程的建立刪除消耗的計算機資源比線程多
- 進程空間單獨,數據互不干擾,有專門通訊方法,線程使用全局變量通訊
- 一個進程能夠有多個分支線程,二者有包含關係
- 多個線程共享進程資源,在共享資源操做時每每須要同步互斥處理
- 進程線程再系統中都有本身的特有屬性標誌,如ID,代碼段,命令集
協程技術
- 定義:纖程,微線程。是爲非搶佔式多任務產生子程序的計算機組件,協程容許不一樣入口點再不一樣位置暫停或開始,簡單來講,協程就是能夠暫停執行的函數
- 協程原理:記錄一個函數的上下文棧幀,協程調度切換時會將記錄的上下文保存,再切換回來時進行調取,恢復原有的執行內容,以便從上一次執行位置繼續執行
- 協程優缺點
- 協程完成多任務佔用計算資源不多
- 因爲協程的多任務切換再應用層完成,所以切換開銷少
- 協程爲單線程程序,無需進行共享資源同步互斥處理
- 缺點:協程的本質是一個單線程,沒法利用計算機多核資源