1. 程式人生 > 實用技巧 >計算機考研複試經典考題彙總(一次重新整理世界觀)

計算機考研複試經典考題彙總(一次重新整理世界觀)

作業系統

作業系統的特點?

– 共享:資源可被多個併發執行的程序使用
– 併發:可以在同一時間間隔處理多個程序,需要硬體支援
– 虛擬:將物理實體對映成為多個虛擬裝置
– 非同步:程序執行走走停停,每次程序執行速度可能不同,但OS需保證程序每次執行結果相同

程序的三個組成部分?

程式段、資料段、PCB(Process Control Block)

併發與並行區別?

併發:同一間隔 並行:同一時刻

程序切換的過程?

保持處理機上下文 -> 更新PCB -> 把PCB移入相應佇列(就緒、阻塞) -> 選擇另一個程序並更新其PCB -> 更新記憶體管理的資料結構 -> 恢復處理機上下文

程序通訊

1、低階通訊方式
PV操作(訊號量機制)。
– P:wait(S)原語,申請S資源
– V:signal(S)原語,釋放S資源
2、高階通訊方式:以較高效率傳輸大量資料的通訊方式
– 共享儲存(使用同步互斥工具操作共享空間)
– 訊息傳遞(程序間以格式化的訊息進行資料交換,有中間實體,分為直接和間接兩種,底層通過傳送訊息和接收訊息兩個原語實現)
– 管道通訊(兩個程序中間存在一個特殊的管道檔案,程序的輸入輸出都通過管道,半雙工通訊)

管程是什麼?

由一組資料及對這組資料操作的定義組成的模組。同一時間只能有一個程序使用管程,即管程是互斥使用的,程序釋放管程後需喚醒申請管程資源的等待佇列上的程序。程序只有通過進入管程並使用管程內部的操作才能訪問其中資料。

死鎖的必要條件?

– 互斥條件:資源在某一時刻只能被一個程序佔有
– 不剝奪條件:程序所持有的資源在主動釋放前不能被其他程序強行奪走
– 請求和佔用條件:死鎖程序必然是既持有資源又在申請資源的
– 迴圈等待條件:存在等待鏈,互相申請,互不釋放
避免死鎖:不讓迴圈等待條件發生。使用銀行家演算法。

死鎖與飢餓的區別?

– 都是資源分配問題
– 死鎖是等待永遠不會釋放的資源,而飢餓申請的資源會被釋放,只是永遠不會分配給自己
– 一旦產生死鎖,則死鎖程序必然是多個,而飢餓程序可以只有一個
– 飢餓的程序可能處於就緒狀態,而死鎖程序一定是阻塞程序

程序和執行緒的區別?

執行緒被稱作輕量級程序,在程序中包含執行緒。程序有獨立的記憶體空間,不同程序間不能直接共享其他程序資源,而同一個程序內的執行緒共享程序記憶體空間;相比程序,執行緒切換對系統開銷更小一些;程序是資源分配的最小單位,執行緒是程式執行的最小單位。

FCB包含什麼?

檔案指標:上次讀寫位置。
檔案開啟數:多少個程序打開了此檔案。
檔案磁碟位置。
檔案的訪問許可權:建立、只讀、讀寫等。

頁面置換演算法?

最佳置換演算法OPT

所選擇的被淘汰頁面將是以後永不使用的,或者是在最長時間內不再被訪問的頁面,這樣可以保證獲得最低的缺頁率。但由於人們目前無法預知程序在記憶體下的若千頁面中哪個是未來最長時間內不再被訪問的,因而該演算法無法實現。

先進先出置換演算法FIFO

優先淘汰最早進入記憶體的頁面,亦即在記憶體中駐留時間最久的頁面。該演算法實現簡單,只需把調入記憶體的頁面根據先後次序連結成佇列,設定一個指標總指向最早的頁面。但該演算法與程序實際執行時的規律不適應,因為在程序中,有的頁面經常被訪問。

最近最久未使用演算法LRU

最近最長時間未訪問過的頁面予以淘汰,它認為過去一段時間內未訪問過的頁面,在最近的將來可能也不會被訪問。該演算法為每個頁面設定一個訪問欄位,來記錄頁面自上次被訪問以來所經歷的時間,淘汰頁面時選擇現有頁面中值最大的予以淘汰。

時鐘演算法LOCK

LRU演算法的效能接近於OPT,但是實現起來比較困難,且開銷大;FIFO演算法實現簡單,但效能差。所以作業系統的設計者嘗試了很多演算法,試圖用比較小的開銷接近LRU的效能,這類演算法都是CLOCK演算法的變體。
簡單的CLOCK演算法是給每一幀關聯一個附加位,稱為使用位。當某一頁首次裝入主存時,該幀的使用位設定為1;當該頁隨後再被訪問到時,它的使用位也被置為1。對於頁替換演算法,用於替換的候選幀集合看做一個迴圈緩衝區,並且有一個指標與之相關聯。當某一頁被替換時,該指標被設定成指向緩衝區中的下一幀。當需要替換一頁時,作業系統掃描緩衝區,以查詢使用位被置為0的一幀。每當遇到一個使用位為1的幀時,作業系統就將該位重新置為0;如果在這個過程開始時,緩衝區中所有幀的使用位均為0,則選擇遇到的第一個幀替換;如果所有幀的使用位均為1,則指標在緩衝區中完整地迴圈一週,把所有使用位都置為0,並且停留在最初的位置上,替換該幀中的頁。由於該演算法迴圈地檢查各頁面的情況,故稱為CLOCK演算法,又稱為最近未用(Not Recently Used, NRU)演算法。

改進型時鐘演算法

改進型的CLOCK演算法優於簡單CLOCK演算法之處在於替換時首選沒有變化的頁。由於修改過的頁在被替換之前必須寫回,因而這樣做會節省時間。

批處理作業排程演算法?

先來先服務FCFS

就是按照各個作業進入系統的自然次序來排程作業。這種排程演算法的優點是實現簡單,公平。其缺點是沒有考慮到系統中各種資源的綜合使用情況,往往使短作業的使用者不滿意,因為短作業等待處理的時間可能比實際執行時間長得多。

最短作業優先SJF

就是優先排程並處理短作業,所謂短是指作業的執行時間短。而在作業未投入執行時,並不能知道它實際的執行時間的長短,因此需要使用者在提交作業時同時提交作業執行時間的估計值。

最高響應比優先HRN

FCFS可能造成短作業使用者不滿,SPF可能使得長作業使用者不滿,於是提出HRN,選擇響應比最高的作業執行。響應比=1+作業等待時間/作業處理時間。

多級佇列排程演算法

每一個作業規定一個表示該作業優先級別的整數,當需要將新的作業由輸入井調入記憶體處理時,優先選擇優先數最高的作業。

程序排程演算法?

程序有三種狀態阻塞就緒,執行。

先進先出FIFO

按照程序進入就緒佇列的先後次序來選擇。即每當進入程序排程,總是把就緒佇列的隊首程序投入執行。

時間片輪轉演算法RR

分時系統的一種排程演算法。輪轉的基本思想是,將CPU的處理時間劃分成一個個的時間片,就緒佇列中的程序輪流執行一個時間片。當時間片結束時,就強迫程序讓出CPU,該程序進入就緒佇列,等待下一次排程,同時,程序排程又去選擇就緒佇列中的一個程序,分配給它一個時間片,以投入執行。

最高優先順序演算法HPF

程序排程每次將處理機分配給具有最高優先順序的就緒程序。最高優先順序演算法可與不同的CPU方式結合形成可搶佔式最高優先順序演算法和不可搶佔式最高優先順序演算法。

多級佇列反饋演算法

幾種排程演算法的結合形式多級佇列方式。

磁碟排程演算法?

先來先服務FCFS

最短尋道時間優先SSTF

讓離當前磁軌最近的請求訪問者啟動磁碟驅動器,即是讓查詢時間最短的那個作業先執行,而不考慮請求訪問者到來的先後次序,這樣就克服了先來先服務排程演算法中磁臂移動過大的問題

掃描演算法SCAN

總是從磁臂當前位置開始,沿磁臂的移動方向去選擇離當前磁臂最近的那個柱面的訪問者。如果沿磁臂的方向無請求訪問時,就改變磁臂的移動方向。在這種排程方法下磁臂的移動類似於電梯的排程,所以它也稱為電梯排程演算法。

迴圈掃描演算法C-SCAN

迴圈掃描排程演算法是在掃描演算法的基礎上改進的。磁臂改為單項移動,由外向裡。當前位置開始沿磁臂的移動方向去選擇離當前磁臂最近的哪個柱面的訪問者。如果沿磁臂的方向無請求訪問時,再回到最外,訪問柱面號最小的作業請求。

FAT(File Allocation Table)?分配

分配給檔案的所有盤塊號都放在FAT中,用以記錄了檔案的物理位置。

中斷和系統呼叫區別?

中斷是怎麼操作的?
中斷請求-中斷響應-斷點保護---執行中斷服務程式---斷點恢復---中斷返回

中斷:解決處理器速度和硬體速度不匹配,是多道程式設計的必要條件。每個中斷都有自己的數字標識,當中斷髮生時,指令計數器PC和處理機狀態字PSW中的內容自動壓入處理器堆疊,同時新的PC和PSW的中斷向量也裝入各自的暫存器中。這時,PC中包含的是該中斷的中斷處理程式的入口地址,它控制程式轉向相應的處理,當中斷處理程式執行完畢,該程式的最後一條iret(中斷返回),它控制著恢復呼叫程式的環境。 中斷和系統呼叫的區別: 中斷是由外設產生, 無意的, 被動的 系統呼叫是由應用程式請求作業系統提供服務產生, 有意的, 主動的。要從使用者態通過中斷進入核心態。(聯絡) 中斷過程:中斷請求 中斷響應 斷點保護 執行中斷服務程式 斷點恢復 中斷返回 系統呼叫過程:應用程式在使用者態執行時請求系統呼叫,中斷,從使用者態進入核心態,在核心態執行相應的核心程式碼。

虛擬儲存的意義和方法?

根據程式執行的互斥性和空間與時間局域性兩個特點,允許作業裝入時候只裝入一部分,另一部分存放在磁碟上,呼叫時候將常用的放入記憶體,其他暫時不用的放入外存中。這樣一個小的主存空間也可以執行一個比它大的作業。常用的虛擬儲存技術有分頁分段儲存管理。

windows和linux使用的檔案系統?

window:fat32.linux:ext2,fat32.

計算機組成原理

什麼是馮諾伊曼結構?

是一種將程式指令儲存器和資料儲存器合併在一起的儲存器結構。
五個組成部分是:輸入輸出,計算單元,控制單元,儲存單元。
輸入資料和程式的輸入裝置;
記憶程式和資料的儲存器;
完成資料加工處理的運算器;
控制程式執行的控制器;
輸出處理結果的輸出裝置。

快取記憶體的作用

連線CPU和記憶體。

cache和暫存器區別?

暫存器是暫時儲存的CPU組成部分,cache用來做高度CPU和低速的主存之間加速帶。

指令系統

CISC(Complex Instruction Set Computer)複雜指令系統計算器,是一種執行較多型別計算機指令的微處理器。RISC(Reduced Instruction Set Computer)是精簡指令系統計算器,是一種執行較少型別計算機指令的微處理器。

流水線

將重複性的過程分為若干個子過程來完成。

匯流排和I/O

匯流排是指資料通訊的連線線,有地址,資料,控制指令。
I/O輸入/輸出(Input/Output),分為IO裝置和IO介面兩個部分.
I/O的方式有:DIO(Direct I/O),AIO(Asynchronous I/O,非同步I/O),Memory-Mapped I/O(記憶體對映I/O)等,不同的I/O方式有不同的實現方式和效能,在不同的應用中可以按情況選擇不同的I/O方式。

DMA

DMA(Direct Memory Access,直接儲存器訪問) 是所有現代電腦的重要特色,它允許不同速度的硬體裝置互相溝通,而不需要依賴於 CPU 的大量中斷負載。否則,CPU 需要從來源把每一片段的資料複製到暫存器,然後把它們再次寫回到新的地方。在這個時間中,CPU 對於其他的工作來說就無法使用。

Java

java的特點?

一次編譯到處執行,沒有指標,完全物件化,面向物件(封裝、繼承、多型)。

java常用術語

JavaEE:Java Platform Enterprise Edition,是Sun公司為企業級應用推出的標準平臺。
J2EE:Java 2 Platform,Enterprise Edition,是JavaEE以前的叫法。
JDBC:Java DataBase Connectivity,Java資料庫連線。
JNDI:Java Naming and Directory Interface,提供一個目錄系統,使得開發人員可以通過名稱來訪問資源。
EJB:Enterprise JavaBean,用來構建一個可以管理的伺服器元件。
Servlet:Java編寫的服務端程式,可以動態修改web內容。
JSP:Java Server Pages,Sun主導的一種動態網頁技術標準,JSP部署於網路伺服器上,可以響應客戶端請求,並返回相應內容。
RMI:Remote Method Invocation,使得客戶端可以像呼叫本地物件一樣呼叫遠端伺服器上的方法。和RPC(Remote Procedure Call Protocol)不同,RMI只適用於Java,返回結果也有區別。RML在檔案傳輸時,需要進行序列化serial,轉換為二進位制才能被servlet傳輸
XML:Extensible Markup Language,用於傳輸和儲存資料
JMS:Java Message Service,Java平臺面向訊息中介軟體的一個服務,用於在分散式系統或應用程式間傳遞服務。
JTA:Java Transaction API,事務管理元件。
Weblogic:Oracle公司推出的商業化JavaEE伺服器

java怎麼處理物件分配和釋放的?

java把記憶體分為堆疊空間儲存,在堆中new的空間不用自己收回,自動垃圾收回。

JVM

不同於C++需要程式設計人員手動釋放記憶體,Java有虛擬機器,因此Java不需要程式設計師主動去釋放記憶體,而是通過虛擬機器自身的垃圾回收器(Garbage Collector-GC)來進行物件的回收。Java語言由於有虛擬機器的存在,實現了平臺無關性,在任意平臺都是通過將程式碼轉換為位元組碼檔案,從而在平臺下的虛擬機器中執行程式碼的。

名詞解釋:

記憶體區域分佈
虛擬機器棧:存放每個方法執行時的棧幀,一個方法呼叫到完成就對應棧幀在虛擬機器棧中入棧和出棧的過程。

本地方法棧:和虛擬機器棧類似,不過是為Java中native方法服務的。平時所說的“棧記憶體”指的就是虛擬機器棧和本地方法棧的合稱。

程式計數器:當前執行緒執行位元組碼的行號指示器,位元組碼直譯器工作依賴於它。佔用較小的記憶體空間,不會出現OOM。

堆:即所謂的“堆記憶體”。JVM所管理最大的一塊記憶體,被所有執行緒共享。唯一作用就是給物件例項分配記憶體空間,在分代回收演算法中的新生代老年代就在於堆中。

方法區(也稱為永久代):不在堆中,被各個執行緒共享,儲存已被JVM載入的類資訊、常量、靜態變數、即時編譯器編譯後的程式碼等資料。其中包括常量池。

另:直接記憶體,不屬於JVM記憶體區域,與NIO聯絡緊密,不受JVM記憶體大小限制。

JVM垃圾回收機制

何時進行垃圾回收?

GC本質上是一道守護程序(Daemon Thread),不停的檢測堆中是否有不可達物件並釋放記憶體,因此GC在何時發生其實我們是無法預測的。GC通過呼叫物件的finalize()方法來摧毀物件。

不可達物件的判定:根搜尋演算法。JVM中有一系列設定的GC Roots,當一個物件到任意一個GC Root都沒有引用鏈時,則說明此物件不可達。

JVM中的垃圾回收演算法

1、標記-清除演算法

最基礎的演算法,GC會判斷堆中物件是否不可達,如果滿足清理條件(檢視該物件是否有必要執行finalize()方法,有無必要的標準是該物件有沒有被呼叫過finalize方法或該物件有沒有覆蓋finalize()方法,因為finalize()只能被呼叫一次),則給這個物件進行標記,將物件放在F-queue佇列。此時除非物件在finalize()方法中重新獲得了引用,否則它就會被清除掉。

2、複製演算法

將記憶體分為大小相等的兩塊,當物件不可達後並不是及時清理,而是等待正在使用的記憶體滿了之後,將該記憶體內還存活的物件整體複製到另一塊記憶體中,複製結束後再清理掉原記憶體塊中的所有內容。這種方法的優點是快速,但犧牲了一半的記憶體。方法的改進版(事實上也是虛擬機器的做法)是隻在新生代空間使用複製演算法,並且由於新生代物件生命週期往往很短,因此又將新生代區域分為Eden和Survivor空間。其中Eden分配的空間又比Survivor大出很多,從而節省記憶體空間。如果存活物件過多,使得Survivor區也滿,那麼就會轉移Survivor區物件到老年代。

3、標記-整理演算法

標記過程與1一樣,將1中的清除過程換成了整理,即將記憶體中存活的物件歸攏到一邊,使得記憶體更“緊湊”一些,整理之後將邊界之外的物件清理掉。這種演算法是為了防止2演算法中出現存活率100%的極端情況,那麼複製就沒有止境了。

4、分代演算法

新生代採用2演算法,老年代採用1或3演算法。這是由他們的特點決定的,新生代註定了其中很多物件生命週期轉瞬即逝,因此複製演算法移動的存貨物件並不是很多。而老年代存活率較高,只能採用1、3來執行,提高效率。

JVM引數相關

可以調整堆內新生代老年代比例
可以調整物件移入老年代的年齡
可以調整堆記憶體大小
可以設定每個棧大小
可以設定堆內分割槽大小
可選擇垃圾回收方式

JVM類載入機制

雙親委派模型。

類載入器(ClassLoader)用來實現類的載入動作。JVM中只存在兩種不同的類載入器:啟動類載入器和其他類載入器。

啟動類載入器:即Bootstrap ClassLoader。由C++編寫,在JVM內部。其他類載入器都由Java編寫,在JVM外部,全部繼承於抽象類java.lang.ClassLoader。

類載入器之間的層次關係,稱為雙親委派模型。

頂層為啟動類載入器,下邊為擴充套件類載入器,再下為應用程式類載入器,其中包含多種自定義類載入器。

如果一個類載入器收到了載入類的請求,它首先不會自己去載入,而是委派給它的父載入器去執行。層層委派之後,到了頂層由啟動類載入器載入,只有當父載入器反饋無法載入此請求,才會讓子載入器去載入。這種結構使得Java型別體系中的載入機制清晰準確,不易造成混亂。

有一種雙親委派模型的異常情況,即類似啟動類載入器這種基礎的類載入器,本應預設為所有類適用的載入器,但由於一些環境下呼叫SPI(Service Provider Interface),繞過雙親委派模型的層次結構使得父載入器委派子載入器去完成類載入動作。

還有一種情況,即為了實現模組的動態性、熱部署,不再使用雙親委派模型,而是使用更加複雜的網狀結構。OSGi技術即是類載入器網狀結構的一個最佳實踐。

如何判斷當前系統內是否存在死鎖?

可以列印當前的記憶體快照,可以看到快照中有deadLock物件,所在的方法,請求被鎖的資源,從而進一步分析死鎖原因。

ThreadLocal

ThreadLocal,很多地方叫做執行緒本地變數,也有些地方叫做執行緒本地儲存,其實意思差不多。可能很多朋友都知道ThreadLocal為變數在每個執行緒中都建立了一個副本,那麼每個執行緒可以訪問自己內部的副本變數。示例:

class ConnectionManager {  
   
 private static Connection connect = null;  
   
 public static Connection openConnection() {  
 if(connect == null){  
 connect = DriverManager.getConnection();  
 }  
 return connect;  
 }  
   
 public static void closeConnection() {  
 if(connect!=null)  
 connect.close();  
 }  
}  

假設有這樣一個數據庫連結管理類,這段程式碼在單執行緒中使用是沒有任何問題的,但是如果在多執行緒中使用呢?很顯然,在多執行緒中使用會存線上程安全問題:第一,這裡面的2個方法都沒有進行同步,很可能在openConnection方法中會多次建立connect;第二,由於connect是共享變數,那麼必然在呼叫connect的地方需要使用到同步來保障執行緒安全,因為很可能一個執行緒在使用connect進行資料庫操作,而另外一個執行緒呼叫closeConnection關閉連結。

ThreadLocal的應用場景

最常見的ThreadLocal使用場景為 用來解決資料庫連線、Session管理等。 

C++

c++和c中字串區別?

c++是類,c中是基本型別函式。

C++的特點是什麼?

封裝,繼承,多型。支援面向物件和麵向過程的開發。

C++的異常處理機制?

丟擲異常和捕捉異常進行處理。(實際開發)

c和c++,java的區別?

c是純過程,c++是物件加過程,java是純面向物件的

純虛擬函式?

被virtual修飾的成員函式,再基類不能實現,而他的實現放到派生類中實現。

什麼是記憶體洩漏?

記憶體洩漏(Memory Leak)是指程式中己動態分配的堆記憶體由於某種原因程式未釋放或無法釋放,造成系統記憶體的浪費,導致程式執行速度減慢甚至系統崩潰等嚴重後果。

指標和引用的區別?

指標是一個儲存地址的變數,該地址為記憶體的一個儲存單元;引用是原變數的一個別名;
指標可以為空,而引用不能為空;
指標可以有多級,而引用只能有一級;
指標可以重新賦值,而引用只能初始化一次
sizeof引用得到的是變數大小,而sizeof指標得到的是指標本身大小
將引用作為函式返回值的好處是?
在記憶體中不會產生被返回值的副本,同時不能返回區域性變數的引用,因為隨著呼叫結束區域性變數會被銷燬。

三種傳參方式?

值傳遞
傳遞的是實參的一個拷貝,修改形參不會改變實參值。
地址傳遞
傳遞的是實參地址的一個拷貝,修改形參會改變實參值。
引用傳遞
傳遞的是實參的一個別名,修改形參會導致改變實參。
被呼叫函式的形參只有在被呼叫時才會臨時分配儲存單元,一旦呼叫結束則釋放記憶體。

const作用?

被const修飾符修飾的變數不能被修改。const x表明x資料是常量,不能修改;const x表明指標本身是常量,x的指標不能指向其他記憶體地址,x本身可被修改;*const *x表明x本身資料和地址都不能被修改。

static作用?

被static修飾符修飾的變數在整個檔案中都是可見的,而在檔案外是不可見的。該變數在全域性資料區分配記憶體。C++中由程式執行new出的動態資料存放在堆區,而函式內部區域性變數存放在棧區。
靜態區域性變數:在函式內部定義static變數,第一次執行到這裡初始化,儲存到全域性資料區,下一次執行到這裡不會再重新初始化。
static變數如果沒有顯式初始化,預設初始值為0。
靜態函式不能被其他函式所呼叫。

面向物件的三個要素(基本特徵)?

1、封裝:將客觀事物封裝成類,隱藏實現細節,模組化程式碼。
2、多型:實現多型的兩種方式——覆蓋(重寫)和過載。
覆蓋是子類重新定義父類的虛擬函式,與多型真正相關。當子類重新定義了父類的虛擬函式後,父類指標根據賦給它的不同的子類指標,動態的呼叫屬於子類的該函式,這樣的函式呼叫在編譯期間是無法確定的(呼叫的子類的虛擬函式的地址無法給出)。因此,這樣的函式地址是在執行期繫結的(晚繫結)。
過載是存在多個同名函式,但是函式的引數個數不同。這些函式實際上成為了不同的函式,對它們的呼叫在編譯期間就已經確定,屬於早繫結,與多型無關。
3、繼承:子類繼承父類功能,對父類功能進行擴充套件。

結構體和聯合有什麼區別?

  1. 結構和聯合都是由多個不同的資料型別成員組成, 但在任何同一時刻, 聯合中只存放了一個被選中的成員(所有成員共用一塊地址空間), 而結構的所有成員都存在(不同成員的存放地址不同)。
  2. 對於聯合的不同成員賦值, 將會對其它成員重寫, 原來成員的值就不存在了, 而對於結構的不同成員賦值是互不影響的。

C++是不是型別安全的語言?

不是。不同型別間指標可以強制互轉。

const與#define區別?

const修飾常量受到強制保護,程式更健壯,而且const修飾的常量有資料型別,有型別安全檢查。

基類的解構函式為什麼是虛擬函式?

為了防止派生類解構函式未執行,造成資源洩露。

#include尖括號和雙引號區別?

<>是標準標頭檔案,“”是非系統標頭檔案

為什麼有了指標,還要使用引用?

為了支援運算子的過載。更加方便。

如何避免野指標?

宣告指標記得初始化,暫時不用就指向NULL;使用malloc分配記憶體,必須經過顯式釋放(free),避免記憶體洩漏。

計算機網路

談談對TCP/IP協議的理解

有5層結構,分層處理。

五個分層。

1、應用層:應用層是TCP/IP協議的第一層,是直接為應用程序提供服務的。
(1)對不同種類的應用程式它們會根據自己的需要來使用應用層的不同協議,郵件傳輸應用使用了SMTP協議、全球資訊網應用使用了HTTP協議、遠端登入服務應用使用了有TELNET協議。 [1]
(2)應用層還能加密、解密、格式化資料。 [1]
(3)應用層可以建立或解除與其他節點的聯絡,這樣可以充分節省網路資源。

2、運輸層:解決的是計算機程式到計算機程式之間的通訊問題,即所謂的“端”到 “端”的通訊。引入傳輸層的原因: 增加複用和分用的功能、 消除網路層的不可靠性、 提供從源端主機到目的端主機的可靠的、與實際使用的網路無關的資訊傳輸。運輸層是ISO/OSI的第四層,處於通訊子網和資源子網之間,是整個協議層次中最核心的一層。作為TCP/IP協議的第二層,運輸層在整個TCP/IP協議中起到了中流砥柱的作用。且在運輸層中,TCP和UDP也同樣起到了中流砥柱的作用。

3、網路層:網路層在TCP/IP協議中的位於第三層。在TCP/IP協議中網路層可以進行網路連線的建立和終止以及IP地址的尋找等功能。

4、網路介面層:網路介面層實際上並不是因特網協議組中的一部分,但是它是資料包從一個裝置的網路層傳輸到另外一個裝置的網路層的方法。這個過程能夠在網絡卡的軟體驅動程式中控制,也可以在韌體或者專用晶片中控制。這將完成如新增報頭準備傳送、通過物理媒介實際傳送這樣一些資料鏈路功能。另一端,鏈路層將完成資料幀接收、去除報頭並且將接收到的包傳到網路層,在TCP/IP協議中,網路介面層位於第四層。由於網路介面層兼併了物理層和資料鏈路層所以,網路介面層既是傳輸資料的物理媒介,也可以為網路層提供一條準確無誤的線路。

5、網際層:提供獨立於硬體的邏輯定址,從而讓資料能夠在具有不同物理結構的子網之間傳遞。提供路由功能來降低資料流量,支援Intemet 上的資料傳遞(網際網路絡是指多個區域網互相連線而形成的網路,比如大公司裡的網路或是Intemet)。

TCP/UDP的區別?

TCP是可靠的面向連線的傳輸控制協議,UDP是不可靠的無連線傳輸資料報文協議。

IP和mac的區別?

IP是網路層,MAC是資料鏈路層且地址是全球唯一的。

登陸baidu.com,簡述協議過程

ARRP(獲得閘道器地址) - DNS(獲得IP地址) - TCP

簡述ARRP的作用

hub,switch,router屬於OSI哪一層?

hub是集線器屬於物理層,交換機是資料鏈路層,router是路由器網路層的,負責不同網路結合。

子網掩碼和IP地址怎麼理解?

在國際網際網路(Internet)上有成千百萬臺主機(host),為了區分這些主機,人們給每臺主機都分配了一個專門的“地址”作為標識,稱為IP地址。子網掩碼的作用是用來區分網路上的主機是否在同一網路段內。子網掩碼不能單獨存在,它必須結合IP地址一起使用。子網掩碼只有一個作用,就是將某個IP地址劃分成網路地址和主機地址兩部分。

ipv4,ipv6的區別?

IPV6更安全,更大的儲存空間。

XML和HTML區別?

跨平臺的標記語言,重在儲存資料。HTML重在儲存介面顯示內容

OSI模型全稱?

Opening System Interconnection - Reference Model
七層模型: 應用層▪ 表示層▪ 會話層▪ 傳輸層▪ 網路層▪ 資料鏈路層

  • 第一層是物理層(也即OSI模型中的第一層也是最底層)
    在課堂上經常是容易被忽略的。它看起來似乎很簡單。但是,這一層的某些方面有時需要特別留意。物理層實際上就是佈線、光纖、網絡卡和其它用來把兩臺網路通訊裝置連線在一起的東西。甚至一個信鴿也可以被認為是一個1層裝置。網路故障的排除經常涉及到1層問題。我們不能忘記用五類線在整個一層樓進行連線的傳奇故事。由於辦公室的椅子經常從電纜線上壓過,導致網路連接出現斷斷續續的情況。遺憾的是,這種故障是很常見的,而且排除這種故障需要耗費很長時間。

  • 第二層是資料鏈路層
    執行乙太網等協議。請記住,我們要使這個問題簡單一些。第2層中最重要的是你應該理解網橋是什麼。交換機可以看成網橋,人們都這樣稱呼它。網橋都在2層工作,僅關注乙太網上的MAC地址。如果你在談論有關MAC地址、交換機或者網絡卡和驅動程式,你就是在第2層的範疇。集線器屬於第1層的領域,因為它們只是電子裝置,沒有2層的知識。第2層的相關問題在本網路講座中有自己的一部分,因此先不詳細討論這個問題的細節。只需要知道第2層把資料幀轉換成二進位制位供1層處理就可以了。

  • 第三層是網路層
    在計算機網路中進行通訊的兩個計算機之間可能會經過很多個數據鏈路,也可能還要經過很多通訊子網。網路層的任務就是選擇合適的網間路由和交換結點, 確保資料及時傳送。網路層將資料鏈路層提供的幀組成資料包,包中封裝有網路層包頭,其中含有邏輯地址資訊- -源站點和目的站點地址的網路地址。
    如果你在談論一個IP地址,那麼你是在處理第3層的問題,這是“資料包”問題,而不是第2層的“幀”。IP是第3層問題的一部分,此外還有一些路由協議和地址解析協議(ARP)。有關路由的一切事情都在第3層處理。地址解析和路由是3層的重要目的。

  • 第四層是處理資訊的傳輸層。
    第4層的資料單元也稱作資料包(packets)。但是,當你談論TCP等具體的協議時又有特殊的叫法,TCP的資料單元稱為段(segments)而UDP協議的資料單元稱為“資料報(datagrams)”。這個層負責獲取全部資訊,因此,它必須跟蹤資料單元碎片、亂序到達的資料包和其它在傳輸過程中可能發生的危險。理解第4層的另一種方法是,第4層提供端對端的通訊管理。像TCP等一些協議非常善於保證通訊的可靠性。有些協議並不在乎一些資料包是否丟失,UDP協議就是一個主要例子。

  • 第五層是會話層
    這一層也可以稱為會晤層或對話層,在會話層及以上的高層次中,資料傳送的單位不再另外命名,統稱為報文。會話層不參與具體的傳輸,它提供包括訪問驗證和會話管理在內的建立和維護應用之間通訊的機制。如伺服器驗證使用者登入便是由會話層完成的。

  • 第六層是表示層
    這一層主要解決使用者資訊的語法表示問題。它將欲交換的資料從適合於某一使用者的抽象語法,轉換為適合於OSI系統內部使用的傳送語法。即提供格式化的表示和轉換資料服務。資料的壓縮和解壓縮, 加密和解密等工作都由表示層負責。

  • 第七層是應用層。
    是專門用於應用程式的。應用層確定程序之間通訊的性質以滿足使用者需要以及提供網路與使用者應用軟體之間的介面服務如果你的程式需要一種具體格式的資料,你可以發明一些你希望能夠把資料傳送到目的地的格式,並且建立一個第7層協議。SMTP、DNS和FTP都是第7層協議。

DNS工作過程?

應用層協議,使用UDP。分為迭代查詢和遞迴查詢。採用分散式叢集的工作方式,防止單點故障,增加通訊容量。
迭代:主機訪問本地域名伺服器,若快取沒有IP則本地域名伺服器進一步向其他根域名伺服器查詢。
遞迴:主機分別向多個伺服器發出查詢請求。

UDP的優點?

傳送前無需連線,減少了開銷和時延,首部開銷小,無擁塞控制,方便實時應用,不保證可靠交付,無需維持連線狀態表。UDP的可靠性要通過應用層來控制。

資料鏈路層成幀方式?

字元填充法、字元計數法、位元填充法、違規編碼法。

RIP和OSPF?

RIP(Routing Information Protocol)路由資訊協議。在應用層,最大站點數為15
OSPF(Open Shortest Path First)網路層,洪泛法,迪傑斯特拉演算法

軟體工程

軟體重用?

同一個函式重複用。

軟體測試型別?

單元,整合,黑盒,白盒,灰盒,。

軟體工程步驟

需求,設計,開發,測試。

UML

系統流程建模工具

軟體工程的認識?

運用工程化的方法管理軟體開發。

類之間的關係有哪些?

繼承:類繼承另一個類的功能
實現:類實現介面的功能
依賴:A類的某個方法使用到了B類
關聯:強依賴關係,B類作為一個屬性出現在了A類
聚合:一種特別的關聯,公司與個人的關係
組合:強聚合關係,整體與部分的聯絡更緊密,如汽車與輪胎

軟體工程標準步驟?

問題定義
可行性研究
需求分析
總體設計
詳細設計
編碼和單元測試
綜合測試
軟體維護

有哪些軟體測試分類?

黑盒測試:不考慮軟體內部原理,以使用者角度測試軟體輸入輸出
白盒測試:知道軟體內部工作過程,確定每個分支都能按照預定正常工作
灰盒測試:集合白盒黑盒
冒煙測試:測試軟體基本功能,快速
系統測試:驗證系統是否滿足需求規格的黑盒類測試
效能測試:負載測試和壓力測試
安全測試:假扮黑客侵入系統
相容性測試:不同平臺不同環境下的測試

自頂向下和自底向上測試方法的區別?

自頂向下:從程式入口主控模組開始,按照系統程式結構,沿著控制層次從上而下測試各模組。方便把握整體結構,早期可發現頂層錯誤。
自底向上:從最底層模組,即葉子結點開始,按照呼叫從下而上的測試各模組。最後一個模組提交後才能完整系統測試,某些模組可以提前測試。

軟體工程的三要素?

方法、工具、過程。

軟體工程的主要模型?

1、瀑布模型:前一階段工作結束才可以進行下一階段工作。基於文件,易於維護,但加大了工作量。

2、快速原型:快速建立可以執行的程式,完成的功能是最終軟體的一個子集。不帶反饋環,滿足使用者真實需求,但會導致系統設計差,難以維護。

3、增量模型:每個階段不交付完整產品,軟體由一系列增量構件組成。降低開發風險,易於維護,但不容易控制整體過程

4、螺旋模型:結合快速原型和瀑布模型,有利於軟體重用,減少風險,風險人員需要一定經驗。

5、噴泉模型:迭代,無縫,節省開發時間。

6、敏捷

什麼是死程式碼?

永遠不會被執行到的程式碼。

內聚和耦合

內聚:指一個好的內聚模組內應當儘量只做一件事,描述的是模組內的功能聯絡。
耦合:各模組之間相互連線的一種度量,耦合強弱取決於模組間介面的複雜程度。
(1)內聚型別高→低:功能內聚、資訊內聚、通訊內聚、過程內聚、時間內聚、邏輯內聚、偶然內聚
(2)耦合型別高→低:內容耦合、公共耦合、外部耦合、控制耦合、標記耦合、資料耦合、非直接耦合

資料結構與演算法

順序結構和鏈式結構的區別?

順序結構是指記憶體連續的儲存單元進行儲存,而鏈式結構是指 記憶體不連續的結構,通過一個節點指向另外一個節點的地址。

棧和佇列的區別?

棧是先進後出的特殊線性表,佇列是先進先出的線性表。

複雜度是什麼?

複雜度包括時間複雜度和空間複雜度,用來評價一個演算法的好壞。

頭節點的作用是什麼?

頭節點是指向初始地址的一個節點,它本身資料段沒有內容,通過它可以標識這個連結串列。

介紹以下各種樹

樹,二叉樹:有左右子樹的區分和度不超過2.
二叉排序樹:左子樹均小於根,根均小於右節點。。
線索二叉樹:設定兩個標識標記左右指標指向的是孩子還是前軀節點。
平衡二叉樹:左右子樹高度差絕對值小於等於1。
哈夫曼樹:壓縮用的。權值大小排列。
完全二叉樹:只能從右邊為空。

度為2的樹和二叉樹的區別:

二叉樹有左右子樹的定義。

樹的儲存結構

孩子鏈儲存結構和雙親儲存結構。

樹的遍歷

先序中序後序三種。遞迴實現。

圖的儲存

鄰接矩陣和鄰接表,是多對多的關係,分為有向圖和無向圖。

線性表.查詢有那幾類?

直接查詢和有序表的二分查詢。

排序演算法的介紹?

插入排序有直接插入和折半插入。都是在有序表裡插入進去的。
交換排序:冒泡,快速:以一個數字劃分兩個區域,然後分別對兩個區域繼續劃分,直到區間為一。注意快排是不穩定。
選擇排序:簡單的選擇排序,堆排序
歸併排序:將兩個有序表歸併到一個有序表。將兩個有序表放到一起進行各個比較,比較完之後放回原來陣列內。

什麼是穩定的演算法?

一個序列中,關鍵字相同的數排序後相對位置不變即穩定,比如1、3、2、4、5、2序列,第三個位置2和最後一個位置2排序後,他們的位置先後不變化則穩定。

兩個棧模仿一個佇列?

進隊:入A棧。
出隊:若B棧不為空,則B棧全部出棧;否則將A棧中資料全部入B棧,再依次出B棧。

兩個佇列模仿一個棧?
入棧:入A隊
出棧:將A隊除隊尾元素全部轉移到B隊,出A隊,演算法思想就是兩個佇列倒來倒去,只留一個元素時出棧。

如何判斷連結串列是否有環?

設定快慢指標,快指標每次前進兩步,當兩指標重合則有環,快指標為null則無環。

如何判斷有環連結串列環的入口?

1、將遍歷過的結點都入set,如果當前結點在set裡有,則此結點即為入口。
2、快慢指標重合後,重置fast指標,此時fast每次走一步,再次重合結點即為入口。

最長公共子序列求解(LCS)?

DP。由最長公共子序列問題的最優子結構性質可知,要找出X=<x1, x2, …, xm>和Y=<y1, y2, …, yn>的最長公共子序列,可按以下方式遞迴地進行:當xm=yn時,找出Xm-1和Yn-1的最長公共子序列,然後在其尾部加上xm(=yn)即可得X和Y的一個最長公共子序列。當xm≠yn時,必須解兩個子問題,即找出Xm-1和Y的一個最長公共子序列及X和Yn-1的一個最長公共子序列。這兩個公共子序列中較長者即為X和Y的一個最長公共子序列。

連結串列能否使用二分查詢?

可以。先將連結串列排序,將各個結點的值記入陣列,再二分查詢。
給定一顆二叉樹的頭結點,和這顆二叉樹中2個節點n1和n2,求這兩個節點的最近公共祖先
後序遍歷方法

public class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root == null || root == p || root == q) return root;
TreeNode left = lowestCommonAncestor(root.left, p, q);
TreeNode right = lowestCommonAncestor(root.right, p, q);
if(left != null && right != null) return root;
return left != null ? left : right;
}
}

棧應用括號匹配?

左括號入棧,右括號出棧進行匹配,棧空仍未匹配到則失敗。

二叉樹刪除節點?

被刪除的節點是葉子節點,這時候只要把這個節點刪除,再把指向這個節點的父節點指標置為空就行。
被刪除的節點有左子樹,或者有右子樹,而且只有其中一個,那麼只要把當前刪除節點的父節點指向被刪除節點的左子樹或者右子樹就行。
被刪除的節點既有左子樹而且又有右子樹,這時候需要把左子樹的最右邊的節點或者右子樹最左邊的節點提到被刪除節點的位置。

雜湊表最好最壞情況下複雜度?

O(1)和O(n),n為表長。

求二叉樹的直徑?

兩次DFS,第一次找出距離root最遠點,第二次以第一次結果為起點找出第二個點,這兩點的距離即為直徑。

設計模式

建立型模式:抽象的例項化過程,隱藏了物件建立的具體細節,使程式程式碼不依賴具體的物件。

例:單例模式是 Java 中最簡單的設計模式之一。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。
這種模式涉及到一個單一的類,該類負責建立自己的物件,同時確保只有單個物件被建立。這個類提供了一種訪問其唯一的物件的方式,可以直接訪問,不需要例項化該類的物件。

抽象工廠模式是圍繞一個超級工廠建立其他工廠。該超級工廠又稱為其他工廠的工廠。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。
在抽象工廠模式中,介面是負責建立一個相關物件的工廠,不需要顯式指定它們的類。每個生成的工廠都能按照工廠模式提供物件。
建造者模式建造者模式(Builder Pattern)使用多個簡單的物件一步一步構建成一個複雜的物件。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。一個 Builder 類會一步一步構造最終的物件。該 Builder 類是獨立於其他物件的。

工廠模式是 Java 中最常用的設計模式之一。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。
在工廠模式中,我們在建立物件時不會對客戶端暴露建立邏輯,並且是通過使用一個共同的介面來指向新建立的物件。
原型模式
是用於建立重複的物件,同時又能保證效能。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。
這種模式是實現了一個原型介面,該介面用於建立當前物件的克隆。當直接建立物件的代價比較大時,則採用這種模式。例如,一個物件需要在一個高代價的資料庫操作之後被建立。我們可以快取該物件,在下一個請求時返回它的克隆,在需要的時候更新資料庫,以此來減少資料庫呼叫。

結構型模式:描述類和物件之間通過組織形成新的結構,以實現新的功能。

例:介面卡模式、橋接模式、裝飾模式、組合模式、外觀模式、享元模式、代理模式。

行為型模式:描述演算法以及物件之間的任務(職責)分配及它們之間的通訊模式。

例:模版方法模式、命令模式、迭代器模式、觀察者模式、中介者模式、備忘錄模式、直譯器模式、狀態模式、策略模式、職責鏈模式、訪問者模式。

設計模式的六大原則

1、開閉原則(Open Close Principle)
開閉原則的意思是:對擴充套件開放,對修改關閉。在程式需要進行拓展的時候,不能去修改原有的程式碼,實現一個熱插拔的效果。簡言之,是為了使程式的擴充套件性好,易於維護和升級。想要達到這樣的效果,我們需要使用介面和抽象類,後面的具體設計中我們會提到這點。
2、里氏代換原則(Liskov Substitution Principle)
里氏代換原則是面向物件設計的基本原則之一。 里氏代換原則中說,任何基類可以出現的地方,子類一定可以出現。LSP 是繼承複用的基石,只有當派生類可以替換掉基類,且軟體單位的功能不受到影響時,基類才能真正被複用,而派生類也能夠在基類的基礎上增加新的行為。里氏代換原則是對開閉原則的補充。實現開閉原則的關鍵步驟就是抽象化,而基類與子類的繼承關係就是抽象化的具體實現,所以里氏代換原則是對實現抽象化的具體步驟的規範。
3、依賴倒轉原則(Dependence Inversion Principle)
這個原則是開閉原則的基礎,具體內容:針對介面程式設計,依賴於抽象而不依賴於具體。
4、介面隔離原則(Interface Segregation Principle)
這個原則的意思是:使用多個隔離的介面,比使用單個介面要好。它還有另外一個意思是:降低類之間的耦合度。由此可見,其實設計模式就是從大型軟體架構出發、便於升級和維護的軟體設計思想,它強調降低依賴,降低耦合。
5、迪米特法則,又稱最少知道原則(Demeter Principle)
最少知道原則是指:一個實體應當儘量少地與其他實體之間發生相互作用,使得系統功能模組相對獨立。
6、合成複用原則(Composite Reuse Principle)
合成複用原則是指:儘量使用合成/聚合的方式,而不是使用繼承。

資料庫

正規化的定義?

改造關係模式,通過分解關係模型來消除其中不合適的資料依賴,以決絕插入異常,刪除異常,資料用餘。

事務?

類似查詢一次的命令,要求全部執行完。

事務執行的四個基本要素?

原子性,一致性,隔離性,永續性。

資料庫和檔案系統的比較?

資料庫結構化,共享性好,獨立性。有介面介面。

資料模型有哪幾種?

關係模型,層次模型,網狀模型

索引建的多的好還是少的好?

恰當把握,多的話佔空間,少的話查詢不足,速度達不到。

資料庫的ACID?

原子性Atomicity:一個事務被視為一個最小單元,要麼全部提交,要麼全部回滾
一致性Consistency:事務總是由一種狀態轉換為另一種狀態,資料庫事務只會是執行前的狀態或是執行後的狀態,不會出現執行中的狀態。即如果一個事務執行了十秒,那麼第一秒讀到的結果和第九秒得到的應該是相同的。
隔離性Isolation:一個事務的執行不會被另一個事務影響,互不干擾。
永續性Durability:事務只要提交了,那麼資料庫中的資料也永久的發生了變化。

資料庫三正規化?

1NF(Normal Form):R的所有屬性都不能再分解為更基本的資料單位。
2NF:R的所有非主屬性都依賴於R的關鍵屬性,所有列都依賴於任意一組候選關鍵字。
3NF:每一列都與任意候選關鍵字直接相關而不是間接相關,沒有傳遞依賴。
BCNF:3NF基礎上,關係R只有一個單屬性,或R的子集都是單屬性,則R滿足BCNF。

插入100個數據和100萬個資料有何區別?

100數量級小,可以隨意插入;100萬數量級大,如果表裡有索引,則索引更新代價很高,可以採取先刪除索引再插入,插入完成後再建索引的策略。

資料庫資料可以無限插入嗎?

可以。大小受到主機記憶體的制約。資料量大時要先刪索引。減少提交次數,即減少IO次數。

處理大資料量的策略?

表分割槽,備份,入帶庫。

group by having,having和where的區別?

WHERE 子句用來篩選 FROM 子句中指定的操作所產生的行。
GROUP BY 子句用來分組 WHERE 子句的輸出。
HAVING 子句用來從分組的結果中篩選行。
在查詢過程中聚合語句(sum,min,max,avg,count)要比having子句優先執行.而where子句在查詢過程中執行優先級別優先於聚合語句(sum,min,max,avg,count)。

簡述資料庫以及執行緒死鎖產生的原理及必要條件,簡述如何避免死鎖?

產生死鎖的原因主要是:
(1) 因為系統資源不足。
(2) 程序執行推進的順序不合適。
(3) 資源分配不當等。
產生死鎖的四個必要條件:
(1)互斥條件:一個資源每次只能被一個程序使用。
(2)請求與保持條件:一個程序因請求資源而阻塞時,對已獲得的資源保持不放。
(3)不可剝奪條件:程序已獲得的資源,在末使用完之前,不能強行剝奪。
(4)迴圈等待條件:若干程序之間形成一種頭尾相接的迴圈等待資源關係。

避免死鎖

死鎖的預防是通過破壞產生條件來阻止死鎖的產生,但這種方法破壞了系統的並行性和併發性。
死鎖產生的前三個條件是死鎖產生的必要條件,也就是說要產生死鎖必須具備的條件,而不是存在這3個條件就一定產生死鎖,那麼只要在邏輯上回避了第四個條件就可以避免死鎖。
避免死鎖採用的是允許前三個條件存在,但通過合理的資源分配演算法來確保永遠不會形成環形等待的封閉程序鏈,從而避免死鎖。該方法支援多個程序的並行執行,為了避免死鎖,系統動態的確定是否分配一個資源給請求的程序。
預防死鎖:具體的做法是破壞產生死鎖的四個必要條件之一。
銀行家演算法:該演算法需要檢查申請者對各類資源的最大需求量,如果現存的各類資源可以滿足當前它對各類資源的最大需求量時,就滿足當前的申請。換言之,僅當申請者可以在一定時間內無條件歸還它所申請的全部資源時,才能把資源分配給它。這樣申請者就可以很快完成其計算,然後釋放它佔用的資源,從而保證了系統中的所有程序都能完成,所以可以避免死鎖的發生。這種演算法的主要問題是,要求每個程序必須先知道資源的最大需求量,而且在系統的執行過程中,考察每個程序對各類資源的申請需花費較多的時間。另外,這一演算法本身也有些保守,因為它總是考慮最壞可能的情況。

其他

Redis

1、什麼是Redis?簡述它的優缺點?
Redis本質上是一個Key-Value型別的記憶體資料庫,很像memcached,整個資料庫統統載入在記憶體當中進行操作,定期通過非同步操作把資料庫資料flush到硬碟上進行儲存。
因為是純記憶體操作,Redis的效能非常出色,每秒可以處理超過 10萬次讀寫操作,是已知效能最快的Key-Value DB。
Redis的出色之處不僅僅是效能,Redis最大的魅力是支援儲存多種資料結構,此外單個value的最大限制是1GB,不像 memcached只能儲存1MB的資料,因此Redis可以用來實現很多有用的功能。
比方說用他的List來做FIFO雙向連結串列,實現一個輕量級的高性 能訊息佇列服務,用他的Set可以做高效能的tag系統等等。
另外Redis也可以對存入的Key-Value設定expire時間,因此也可以被當作一 個功能加強版的memcached來用。 Redis的主要缺點是資料庫容量受到實體記憶體的限制,不能用作海量資料的高效能讀寫,因此Redis適合的場景主要侷限在較小資料量的高效能操作和運算上。
2、Redis相比memcached是一套分散式的快取記憶體系統,有哪些優勢?
(1) memcached所有的值均是簡單的字串,redis作為其替代者,支援更為豐富的資料型別
(2) redis的速度比memcached快很多
(3) redis可以持久化其資料
3、Redis支援哪幾種資料型別?
String、List、Set、Sorted Set、hashes
4、Redis主要消耗什麼物理資源?
記憶體。
5、Redis的全稱是什麼?
Remote Dictionary Server。
6、Redis有哪幾種資料淘汰策略?
6中淘汰策略。
noeviction:返回錯誤當記憶體限制達到並且客戶端嘗試執行會讓更多記憶體被使用的命令(大部分的寫入指令,但DEL和幾個例外)
allkeys-lru: 嘗試回收最少使用的鍵(LRU),使得新新增的資料有空間存放。
volatile-lru: 嘗試回收最少使用的鍵(LRU),但僅限於在過期集合的鍵,使得新新增的資料有空間存放。
allkeys-random: 回收隨機的鍵使得新新增的資料有空間存放。
volatile-random: 回收隨機的鍵使得新新增的資料有空間存放,但僅限於在過期集合的鍵。
volatile-ttl: 回收在過期集合的鍵,並且優先回收存活時間(TTL)較短的鍵,使得新新增的資料有空間存放。
7、Redis官方為什麼不提供Windows版本?
因為目前Linux版本已經相當穩定,而且使用者量很大,無需開發windows版本,反而會帶來相容性等問題。
8、一個字串型別的值能儲存最大容量是多少?
512M
9、為什麼Redis需要把所有資料放到記憶體中?
Redis為了達到最快的讀寫速度將資料都讀到記憶體中,並通過非同步的方式將資料寫入磁碟。
所以redis具有快速和資料持久化的特徵。如果不將資料放在記憶體中,磁碟I/O速度為嚴重影響redis的效能。
在記憶體越來越便宜的今天,redis將會越來越受歡迎。 如果設定了最大使用的記憶體,則資料已有記錄數達到記憶體限值後不能繼續插入新值。
10、Redis叢集方案應該怎麼做?都有哪些方案?
1.codis。
目前用的最多的叢集方案,基本和twemproxy一致的效果,但它支援在 節點數量改變情況下,舊節點資料可恢復到新hash節點。
2.redis cluster3.0自帶的叢集,特點在於他的分散式演算法不是一致性hash,而是hash槽的概念,以及自身支援節點設定從節點。具體看官方文件介紹。
4.在業務程式碼層實現,起幾個毫無關聯的redis例項,在程式碼層,對key 進行hash計算,然後去對應的redis例項操作資料。 這種方式對hash層程式碼要求比較高,考慮部分包括,節點失效後的替代演算法方案,資料震盪後的自動指令碼恢復,例項的監控,等等。
11、Redis叢集方案什麼情況下會導致整個叢集不可用?
有A,B,C三個節點的叢集,在沒有複製模型的情況下,如果節點B失敗了,那麼整個叢集就會以為缺少5501-11000這個範圍的槽而不可用。
12、MySQL裡有2000w資料,redis中只存20w的資料,如何保證redis中的資料都是熱點資料?
redis記憶體資料集大小上升到一定大小的時候,就會施行資料淘汰策略。
13、Redis有哪些適合的場景?
(1)會話快取(Session Cache)
最常用的一種使用Redis的情景是會話快取(session cache)。用Redis快取會話比其他儲存(如Memcached)的優勢在於:Redis提供持久化。當維護一個不是嚴格要求一致性的快取時,如果使用者的購物車資訊全部丟失,大部分人都會不高興的,現在,他們還會這樣嗎?
幸運的是,隨著 Redis 這些年的改進,很容易找到怎麼恰當的使用Redis來快取會話的文件。甚至廣為人知的商業平臺Magento也提供Redis的外掛。
(2)全頁快取(FPC)
除基本的會話token之外,Redis還提供很簡便的FPC平臺。回到一致性問題,即使重啟了Redis例項,因為有磁碟的持久化,使用者也不會看到頁面載入速度的下降,這是一個極大改進,類似PHP本地FPC。
再次以Magento為例,Magento提供一個外掛來使用Redis作為全頁快取後端。
此外,對WordPress的使用者來說,Pantheon有一個非常好的外掛 wp-redis,這個外掛能幫助你以最快速度載入你曾瀏覽過的頁面。
(3)佇列
Reids在記憶體儲存引擎領域的一大優點是提供 list 和 set 操作,這使得Redis能作為一個很好的訊息佇列平臺來使用。Redis作為佇列使用的操作,就類似於本地程式語言(如Python)對 list 的 push/pop 操作。
如果你快速的在Google中搜索“Redis queues”,你馬上就能找到大量的開源專案,這些專案的目的就是利用Redis建立非常好的後端工具,以滿足各種佇列需求。例如,Celery有一個後臺就是使用Redis作為broker,你可以從這裡去檢視。
(4)排行榜/計數器
Redis在記憶體中對數字進行遞增或遞減的操作實現的非常好。集合(Set)和有序集合(Sorted Set)也使得我們在執行這些操作的時候變的非常簡單,Redis只是正好提供了這兩種資料結構。
所以,我們要從排序集合中獲取到排名最靠前的10個使用者–我們稱之為“user_scores”,我們只需要像下面一樣執行即可:
當然,這是假定你是根據你使用者的分數做遞增的排序。如果你想返回使用者及使用者的分數,你需要這樣執行:
ZRANGE user_scores 0 10 WITHSCORES
Agora Games就是一個很好的例子,用Ruby實現的,它的排行榜就是使用Redis來儲存資料的,你可以在這裡看到。
(5)釋出/訂閱
最後(但肯定不是最不重要的)是Redis的釋出/訂閱功能。釋出/訂閱的使用場景確實非常多。我已看見人們在社交網路連線中使用,還可作為基於釋出/訂閱的指令碼觸發器,甚至用Redis的釋出/訂閱功能來建立聊天系統!
14、Redis支援的Java客戶端都有哪些?官方推薦用哪個?
Redisson、Jedis、lettuce等等,官方推薦使用Redisson。
15、Redis和Redisson有什麼關係?
Redisson是一個高階的分散式協調Redis客服端,能幫助使用者在分散式環境中輕鬆實現一些Java的物件 (Bloom filter, BitSet, Set, SetMultimap, ScoredSortedSet, SortedSet, Map, ConcurrentMap, List, ListMultimap, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, ReadWriteLock, AtomicLong, CountDownLatch, Publish / Subscribe, HyperLogLog)。
16、Jedis與Redisson對比有什麼優缺點?
Jedis是Redis的Java實現的客戶端,其API提供了比較全面的Redis命令的支援;
Redisson實現了分散式和可擴充套件的Java資料結構,和Jedis相比,功能較為簡單,不支援字串操作,不支援排序、事務、管道、分割槽等Redis特性。Redisson的宗旨是促進使用者對Redis的關注分離,從而讓使用者能夠將精力更集中地放在處理業務邏輯上。
17、Redis如何設定密碼及驗證密碼?
設定密碼:config set requirepass 123456
授權密碼:auth 123456
18、說說Redis雜湊槽的概念?
Redis叢集沒有使用一致性hash,而是引入了雜湊槽的概念,Redis叢集有16384個雜湊槽,每個key通過CRC16校驗後對16384取模來決定放置哪個槽,叢集的每個節點負責一部分hash槽。
19、Redis叢集的主從複製模型是怎樣的?
為了使在部分節點失敗或者大部分節點無法通訊的情況下叢集仍然可用,所以叢集使用了主從複製模型,每個節點都會有N-1個複製品.
20、Redis叢集會有寫操作丟失嗎?為什麼?
Redis並不能保證資料的強一致性,這意味這在實際中叢集在特定的條件下可能會丟失寫操作。
21、Redis叢集之間是如何複製的?
非同步複製
22、Redis叢集最大節點個數是多少?
16384個。
23、Redis叢集如何選擇資料庫?
Redis叢集目前無法做資料庫選擇,預設在0資料庫。
24、怎麼測試Redis的連通性?
ping
25、Redis中的管道有什麼用?
一次請求/響應伺服器能實現處理新的請求即使舊的請求還未被響應。這樣就可以將多個命令傳送到伺服器,而不用等待回覆,最後在一個步驟中讀取該答覆。
這就是管道(pipelining),是一種幾十年來廣泛使用的技術。例如許多POP3協議已經實現支援這個功能,大大加快了從伺服器下載新郵件的過程。
26、怎麼理解Redis事務?
事務是一個單獨的隔離操作:事務中的所有命令都會序列化、按順序地執行。事務在執行的過程中,不會被其他客戶端傳送來的命令請求所打斷。
事務是一個原子操作:事務中的命令要麼全部被執行,要麼全部都不執行。
27、Redis事務相關的命令有哪幾個?
MULTI、EXEC、DISCARD、WATCH
28、Redis key的過期時間和永久有效分別怎麼設定?
EXPIRE和PERSIST命令。
29、Redis如何做記憶體優化?
儘可能使用散列表(hashes),散列表(是說散列表裡面儲存的數少)使用的記憶體非常小,所以你應該儘可能的將你的資料模型抽象到一個散列表裡面。
比如你的web系統中有一個使用者物件,不要為這個使用者的名稱,姓氏,郵箱,密碼設定單獨的key,而是應該把這個使用者的所有資訊儲存到一張散列表裡面。
30、Redis回收程序如何工作的?
一個客戶端運行了新的命令,添加了新的資料。
Redi檢查記憶體使用情況,如果大於maxmemory的限制, 則根據設定好的策略進行回收。
一個新的命令被執行,等等。
所以我們不斷地穿越記憶體限制的邊界,通過不斷達到邊界然後不斷地回收回到邊界以下。
如果一個命令的結果導致大量記憶體被使用(例如很大的集合的交集儲存到一個新的鍵),不用多久記憶體限制就會被這個記憶體使用量超越。

redis分散式鎖?
setnx(set if not exist)和expire、delete聯合實現(假設各個客戶端時鐘大致相同,誤差處於可接受範圍)釋放鎖的操作用lua指令碼實現來保證原子性。在叢集環境下分散式鎖的key值應當是隨機的不可重複的,否則如果一個客戶端獲得了鎖,但發生了阻塞,當鎖過期redis自動釋放了資源,這時第二個客戶端獲得了鎖,客戶端1此時從阻塞中恢復釋放了鎖,就會造成混亂。

為什麼Redis是單執行緒的
單執行緒指的是網路請求模組使用了一個執行緒(所以不需考慮併發安全性),即一個執行緒處理所有網路請求,其他模組仍用了多個執行緒(epoll模型)。
因為Redis是基於記憶體的操作,CPU不是Redis的瓶頸,Redis的瓶頸最有可能是機器記憶體的大小或者網路頻寬。既然單執行緒容易實現,而且CPU不會成為瓶頸,那就順理成章地採用單執行緒的方案了。

Redis為什麼這麼快
1、完全基於記憶體,絕大部分請求是純粹的記憶體操作,非常快速。資料存在記憶體中,類似於HashMap,HashMap的優勢就是查詢和操作的時間複雜度都是O(1);

2、資料結構簡單,對資料操作也簡單,Redis中的資料結構是專門進行設計的;

3、採用單執行緒,避免了不必要的上下文切換和競爭條件,也不存在多程序或者多執行緒導致的切換而消耗 CPU,不用去考慮各種鎖的問題,不存在加鎖釋放鎖操作,沒有因為可能出現死鎖而導致的效能消耗;

4、使用多路I/O複用模型,非阻塞IO;

5、使用底層模型不同,它們之間底層實現方式以及與客戶端之間通訊的應用協議不一樣,Redis直接自己構建了VM 機制 ,因為一般的系統呼叫系統函式的話,會浪費一定的時間去移動和請求;
(1)多路 I/O 複用模型
多路I/O複用模型是利用 select、poll、epoll 可以同時監察多個流的 I/O 事件的能力,在空閒的時候,會把當前執行緒阻塞掉,當有一個或多個流有 I/O 事件時,就從阻塞態中喚醒,於是程式就會輪詢一遍所有的流(epoll 是隻輪詢那些真正發出了事件的流),並且只依次順序的處理就緒的流,這種做法就避免了大量的無用操作。

這裡“多路”指的是多個網路連線,“複用”指的是複用同一個執行緒。採用多路 I/O 複用技術可以讓單個執行緒高效的處理多個連線請求(儘量減少網路 IO 的時間消耗),且 Redis 在記憶體中操作資料的速度非常快,也就是說記憶體內的操作不會成為影響Redis效能的瓶頸,主要由以上幾點造就了 Redis 具有很高的吞吐量。

快取雪崩、快取穿透、快取熱點?
一、快取穿透預防及優化
快取穿透是指查詢一個根本不存在的資料,快取層和儲存層都不會命中,但是出於容錯的考慮,如果從儲存層查不到資料則不寫入快取層,如圖 11-3 所示整個過程分為如下 3 步:

  1. 快取層不命中
  2. 儲存層不命中,所以不將空結果寫回快取
  3. 返回空結果
        快取穿透將導致不存在的資料每次請求都要到儲存層去查詢,失去了快取保護後端儲存的意義。 快取穿透問題可能會使後端儲存負載加大,由於很多後端儲存不具備高併發性,甚至可能造成後端儲存宕掉。通常可以在程式中分別統計總呼叫數、快取層命中數、儲存層命中數,如果發現大量儲存層空命中,可能就是出現了快取穿透問題。
    造成快取穿透的基本有兩個。第一,業務自身程式碼或者資料出現問題,第二,一些惡意攻擊、爬蟲等造成大量空命中,下面我們來看一下如何解決快取穿透問題。
    二、快取穿透的解決方法
    1)快取空物件
    如下圖所示,當第 2 步儲存層不命中後,仍然將空物件保留到快取層中,之後再訪問這個資料將會從快取中獲取,保護了後端資料來源。
    快取空物件會有兩個問題:
    第一,空值做了快取,意味著快取層中存了更多的鍵,需要更多的記憶體空間 ( 如果是攻擊,問題更嚴重 ),比較有效的方法是針對這類資料設定一個較短的過期時間,讓其自動剔除。
    第二,快取層和儲存層的資料會有一段時間視窗的不一致,可能會對業務有一定影響。例如過期時間設定為 5 分鐘,如果此時儲存層添加了這個資料,那此段時間就會出現快取層和儲存層資料的不一致,此時可以利用訊息系統或者其他方式清除掉快取層中的空物件。

下面給出了快取空物件的實現虛擬碼:

2)布隆過濾器攔截
如下圖所示,在訪問快取層和儲存層之前,將存在的 key 用布隆過濾器提前儲存起來,做第一層攔截。
例如: 一個個性化推薦系統有 4 億個使用者 ID,每個小時演算法工程師會根據每個使用者之前歷史行為做出來的個性化放到儲存層中,但是最新的使用者由於沒有歷史行為,就會發生快取穿透的行為,為此可以將所有有個性化推薦資料的使用者做成布隆過濾器。如果布隆過濾器認為該使用者 ID 不存在,那麼就不會訪問儲存層,在一定程度保護了儲存層。
開發提示:
有關布隆過濾器的相關知識,可以參考: Bloom Filter(布隆過濾器)的概念和原理
可以利用 Redis 的 Bitmaps 實現布隆過濾器,GitHub 上已經開源了類似的方案,讀者可以進行參考:
https://github.com/erikdubbelboer/Redis-Lua-scaling-bloom-filter

使用布隆過濾器應對穿透問題
這種方法適用於資料命中不高,資料相對固定實時性低(通常是資料集較大)的應用場景,程式碼維護較為複雜,但是快取空間佔用少。
兩種方案對比
前面介紹了快取穿透問題的兩種解決方法 ( 實際上這個問題是一個開放問題,有很多解決方法 ),下面通過下表從適用場景和維護成本兩個方面對兩種方案進行分析。
快取空物件和布隆過濾器方案對比

三、快取雪崩問題優化
從下圖可以很清晰出什麼是快取雪崩:由於快取層承載著大量請求,有效的保護了儲存層,但是如果快取層由於某些原因整體不能提供服務,於是所有的請求都會達到儲存層,儲存層的呼叫量會暴增,造成儲存層也會掛掉的情況。快取雪崩的英文原意是 stampeding herd(奔逃的野牛),指的是緩層宕掉後,流量會像奔逃的野牛一樣,打向後端儲存。

預防和解決快取雪崩問題,可以從以下三個方面進行著手。
1)保證快取層服務高可用性。
和飛機都有多個引擎一樣,如果快取層設計成高可用的,即使個別節點、個別機器、甚至是機房宕掉,依然可以提供服務,例如前面介紹過的 Redis Sentinel 和 Redis Cluster 都實現了高可用。
2)依賴隔離元件為後端限流並降級。
無論是快取層還是儲存層都會有出錯的概率,可以將它們視同為資源。作為併發量較大的系統,假如有一個資源不可用,可能會造成執行緒全部 hang 在這個資源上,造成整個系統不可用。降級在高併發系統中是非常正常的:比如推薦服務中,如果個性化推薦服務不可用,可以降級補充熱點資料,不至於造成前端頁面是開天窗。
在實際專案中,我們需要制定如下目標:

  1. 減少重建快取的次數
  2. 資料儘可能一致
  3. 較少的潛在危險

雲端計算?

雲端計算是一種按使用量付費的模式,這種模式提供可用的、便捷的、按需的網路訪問, 進入可配置的計算資源共享池,這些資源能夠被快速提供,只需投入很少的管理工作,或與服務供應商進行很少的互動。基礎設施、安裝配置好開發環境、應用服務為雲端計算三個層面。

大資料的特點?

1.Volume:資料量巨大
體量大是大資料區分於傳統資料最顯著的特徵。一般關係型資料庫處理的資料量在TB級,大資料所處理的資料量通常在PB級以上。
2.Variety:資料型別多
大資料所處理的計算機資料型別早已不是單一的文字形式或者結構化資料庫中的表,它包括訂單、日誌、BLOG、微博、音訊、視訊等各種複雜結構的資料。
3.Velocity:資料流動快
速度是大資料區分於傳統資料的重要特徵。在海量資料面前,需要實時分析獲取需要的資訊,處理資料的效率就是組織的生命。
4.Value:資料潛在價值大
在研究和技術開發領域,上述三個特徵已經足夠表徵大資料的特點。但在商業應用領域,第四個特徵就顯得非常關鍵!投入如此巨大的研究和技術開發的努力,就是因為大家
都洞察到了大資料的潛在巨大價值。如何通過強大的機器學習和高階分析更迅速地完成資料的價值“提純”,挖掘出大資料的潛在價值,這是目前大資料應用背景下苛待解決的難題。

大資料發展的瓶頸?

沒有成熟的方法採集和處理大資料。
資料涉及到隱私,法律法規還沒有完善。
大量不同類別的資料不知道怎麼儲存。
資料的獨佔性:有價值的資料別人不一定會分享。
人工智慧
算力和資料是核心,以及神經網路、遺傳演算法、深度學習。
區塊鏈:blockchain
儲存資料的一個個塊,通過鏈char256演算法將塊連結起來。

KNN演算法的優缺點?

KNN演算法的優點:

1、思想簡單,理論成熟,既可以用來做分類也可以用來做迴歸;
2、可用於非線性分類;
3、訓練時間複雜度為O(n);
4、準確度高,對資料沒有假設,對outlier不敏感;

缺點:
1、計算量大;
2、樣本不平衡問題(即有些類別的樣本數量很多,而其它樣本的數量很少);
3、需要大量的記憶體;

其虛擬碼如下:

  1. 計算已知類別資料集中的點與當前點之間的距離;
  2. 按照距離遞增次序排序;
  3. 選擇與當前距離最小的k個點;
  4. 確定前k個點所在類別的出現概率
  5. 返回前k個點出現頻率最高的類別作為當前點的預測分類。

windows中程式的啟動過程?

Explorer.exe

Windows 能夠流行起來,很大一個原因是它有友好的使用者圖形介面,操作方便簡單,容易上手。在Windows環境下開啟一個程式,只要雙擊軟體的圖示就行了,那麼它是如何啟動起來的?

當我們啟動電腦進入桌面時,系統會建立 Explorer.exe 程序。Explorer.exe是Windows程式管理器 或者叫 檔案資源管理器,用於管理Windows圖形殼,刪除該程式會導致 Windows 圖形介面無法使用。所以,如果有時候我們電腦的桌面空白了,或者藍屏,可以通過 Alt+Ctrl+delete(或者在dos中輸入 taskmgr 命令) 開啟工作管理員, 點選“檔案”-> “新建任務”,輸入 "explorer.exe",就可以找回我們的桌面了。

當雙擊某個圖示時,Explorer.exe程序的一個執行緒會偵測到這個操作,它根據登錄檔中的資訊取得檔名,然後Explorer.exe 以這個檔名呼叫 CreateProcess 函式。登錄檔中有相關的項儲存著雙擊操作的資訊,如 exe 檔案關聯、啟動 exe 的 Shell 是哪個。PC中的大多其它的程序都是 Explorer.exe 的子程序,因為它們都是由Explorer.exe 程序建立的。

2. CreateProcess 函式的執行過程

(1)CreateProcess 實際上是通過 NtCreateProcess 函式實現的, 此時,系統會建立一個程序核心物件。程序核心物件可以看作是作業系統用來管理程序的小的資料結構,它是在核心堆區分配的一個結構體,是系統用來存放關於程序統計資訊的地方。程序核心物件維護了一個控制代碼表的結構,當程序被初始化之後,其控制代碼表是空的。當程序內的一個執行緒通過指定的函式建立了一個核心物件時,核心會為物件分配一塊記憶體區域並初始化這塊區域,然後核心會在程序的控制代碼表中查詢一個空的入口,找到之後會初始化控制代碼表的以索引定位的區域。初始化的主要過程就是填充控制代碼表的一個單元,包括指定核心物件地址,指定訪問碼,指定標記等。

(2)程序核心物件建立後,它的引用計數被置為1。然後系統為剛剛建立的程序分配的程序虛擬地址空間。要注意了,之所以稱為虛擬地址空間,就是因為這塊地址空間並不在記憶體之中,它只是在硬碟上劃分的被稱為“頁”的檔案。每個程序都有自己的虛擬地址空間,在程序初始化的時候,其所有的程式和資料會被載入到這個地址空間中。等到真正執行的時候,系統為每個程序配置的頁表會把虛擬地址對映為真正的實體地址(這個過程,我會在後面的部落格中詳細介紹如何對映)。

(3)初始化虛擬地址空間。程序地址空間建立後,Windows的裝載器(loader,也稱為PE裝載器)開始工作,Loader會讀取EXE檔案的資訊(PE檔案)。此時 loader 會檢查PE檔案的有效性,如果PE檔案有錯誤,程序也就無法啟動了。如果PE檔案沒有錯誤,裝載器就把PE檔案的內容(二進位制程式碼)對映到程序的地址空間中,然後讀取 PE檔案的匯入地址表(Import Table),這裡存放有exe檔案需要匯入的模組檔案(DLL),系統會一一載入這些DLL到程序的地址空間中,具體做法是呼叫 LoadLibrary 函式載入程式程式碼到某個地址,然後系統會對映這些程式碼到程序的地址空間中,要知道DLL只需載入一次就可對映到所有程序的地址空間(對映過程我會在後面詳細闡述)中,併為每個DLL維護一個引用計數,當引用計數為 0 時,DLL就從記憶體中解除安裝,釋放佔用的記憶體。DLL裡面可能又引用了其它的DLL,因此載入DLL時是遞迴形式的,直到載入完Import Table 裡描述的所有DLL模組,此時程序初始化部分完成。

(4)建立程序的主執行緒。當程序的初始化完成後,開始建立程序的主執行緒,一個程序至少要有一個主執行緒才能執行,可以說程序只是充當一個容器的作用,而執行緒才是執行程式碼的載體。執行緒是用 CreateThread 這個函式建立的。建立執行緒時,也和程序相似,系統會建立執行緒核心物件,初始化執行緒堆疊。執行緒堆疊有兩個,一個是核心堆疊,由核心態維護;另一個是使用者堆疊,執行在使用者態下。同樣的,執行緒的引用計數也置為1。
(5)C/C++執行期庫初始化。當程序的主執行緒初始化完成後,並且執行緒得到了CPU時間片,CPU把CS:IP指向程式入口(OEP),這個地址相當重要,因為這是程式執行時第一條指令所在的地址(我們可以使用一些PE輔助工具來檢視PE檔案的地址資訊,注意真實地址==偏移地址 + 基址)。其實,CS:IP指向的地址處是一條JMP指令,它跳轉到程式真正的入口函式,入口函式有以下4種形式:
···
mainCRTStartup (用於 ANSI 版本的控制檯應用程式 )
wmainCRTStartup ( 用於 Unicode 版本的控制檯應用程式 )
WinMainCRTStartup ( 用於 ANSI 版本的視窗應用程式 )
wWinMainCRTStartup ( 用於 Unicode 版本的視窗應用程式)
·

資料探勘的資訊熵?

資訊是個很抽象的概念。人們常常說資訊很多,或者資訊較少,但卻很難說清楚資訊到底有多少。比如一本五十萬字的中文書到底有多少資訊量。直到1948年,夏農提出了“資訊熵”的概念,才解決了對資訊的量化度量問題。

公式為:H(x)=E[I(xi)]=E[ log(2,1/p(xi)) ]=-∑p(xi)log(2,p(xi)) (i=1,2,..n)該值越大表示資訊量越大

在一個系統中,該系統越混亂,那麼就越難把它搞清楚,需要的資訊量就越大,資訊熵就越大,回到資料探勘中用決策樹進行分類中,在分類的之前,我們需要建立一個決策樹,在建立決策樹的時候屬性的選擇是一個非常關鍵的問題,我們選擇的屬性的標準是讓劃分儘量純(落在給定劃分中的元祖都屬於相同類的越多,那麼就越純),結合上面我們可以推理出如果按照某個屬性劃分後,每個該屬性屬性值所對應的元組越統一(元組所屬的類別越統一),那麼我們這個屬性的選擇就越符合我們的需求。和資訊熵結合,就是選擇該屬性之後,所有屬性值對應的分類的資訊熵之和越小,那麼我們元組分類所需要的平均資訊越少,該屬性就越符合我們的要求

決策樹?

決策樹模型是一類演算法的集合,在資料探勘十大演算法中,具體的決策樹算法佔有兩席位置,即C4.5和CART演算法,本文都會介紹到它們。
決策樹基礎
決策樹是一種用於對例項進行分類的樹形結構。決策樹由節點(node)和有向邊(directed edge)組成。節點的型別有兩種:內部節點和葉子節點。其中,內部節點表示一個特徵或屬性的測試條件(用於分開具有不同特性的記錄),葉子節點表示一個分類。
一旦我們構造了一個決策樹模型,以它為基礎來進行分類將是非常容易的。具體做法是,從根節點開始,地例項的某一特徵進行測試,根據測試結構將例項分配到其子節點(也就是選擇適當的分支);沿著該分支可能達到葉子節點或者到達另一個內部節點時,那麼就使用新的測試條件遞迴執行下去,直到抵達一個葉子節點。當到達葉子節點時,我們便得到了最終的分類結果。