美團實習麵筋
實習面試過程中總結的一些面經。
麵筋1
1. 說一下二分查詢
二分查詢,時間複雜度是lg(n),每次取二分的中間值,然後將查詢區間縮小一半,直到最後找到查詢值,從二叉樹來表示的話,需要查詢的次數就是一棵樹的樹深。n個節點的樹,樹深為lg(n)
2. 二分查詢的條件是什麼
條件是查詢序列必須是有序的。
3. 說一下平衡二叉樹的概念
平衡二叉樹,又稱為avltree,是搜尋二叉樹的一種改進,為了避免二叉樹的傾斜退化稱為連結串列,影響查詢效率,平衡二叉樹要求任意兩個子樹的高度差不能超過1,要麼為0,要麼為1, 這就可以保證樹不會傾斜,退化稱為連結串列。
平衡二叉樹插入刪除查詢的時間複雜度都是lg(n),每次插入刪除的時候,如果子樹的高度不滿足要求,這個時候就會進行旋轉操作,左旋或者右旋,保證樹的高度差不超過1.
4. 你知道有哪些排序方式
內部8中排序方式,分為選擇排序,插入排序,交換排序,歸併排序,基數排序
選擇排序:簡單選擇排序,堆排序
插入排序:直接插入排序,希爾排序
交換排序:冒泡,快排
歸併:分治法
基數排序:線性排序方法,但是需要額外的空間
5. 歸併排序的思想及時間空間複雜度
思想,典型的分治法,把一個問題分為多個獨立的子問題,先求得這些子問題,最後將這些子問題合併,拿歸併排序來說,歸併排序就是把一個序列分為兩個序列,再次分為兩個序列,如果這兩個序列子問題已經排序好,只需要在把這兩個序列合併成為一個序列,即可排序好。
時間複雜度:nlg(n)
原址排序:不需要額外的空間
6. 你知道圖論演算法嗎
知道一些,主要有圖的最小生成樹演算法,圖的單元節點演算法。
圖的最小生成樹,是判斷圖中節點遍歷一遍,開銷最小的演算法,其實核心是使用的貪心演算法,每次選擇最小的路徑進行遍歷,如果發生了閉環,則跳過當前的最小路徑,最後遍歷完所有的節點,這種方法是ks演算法
圖的單元節點演算法,是判斷圖中任意兩點的最小距離,使用的是圖的廣度搜索演算法,首先找到最小的路徑,按照這個路徑進行廣度的搜尋,將每一個搜尋的節點都加上之前的距離,最後得出每個節點到源節點的距離。
7. C語言中記憶體對齊問題,sizeof(struct {char c; int a;}) = ?
結構體記憶體對齊,前面的地址要是後面地址的整數倍,不是就補齊,所以這個結構體,顯然char要補齊3個位元組,後面int也是4個位元組,最後就是8個位元組。
8. 程序的地址空間分佈
作業系統在管理記憶體時,每個程序都有一個獨立的程序地址空間,程序地址空間的地址為虛擬地址,對於32位作業系統,該虛擬地址空間為2^32=4GB。 程序在執行的時候,看到和使用的記憶體地址都是虛擬地址,而作業系統通過MMU部件將程序使用的虛擬地址轉換為實體地址。
程序地址空間中分為各個不同的部分:
(1)由於系統核心中有些程式碼、資料是所有程序所公用的,所以所有程序的程序地址空間中有一個專門的區域存放公共的核心程式碼和資料,該區域內的內容相同,且該虛擬記憶體對映到同一個實體記憶體區域。
(2)程序在執行的時候,需要維護程序相關的資料結構,比如頁表、task和mm結構、核心棧等,這些資料結構是程序獨立的,各個程序之間可能不同。這些資料結構在程序虛擬地址空間中一個專門的區域中。
(3)程序在進行函式呼叫的時候,需要使用棧,於是程序地址空間中存在一個專門的虛擬記憶體區域維護使用者棧。
(4)程序在進行動態記憶體分配的時候,需要使用堆,於是程序地址空間中存在一個專門的虛擬記憶體區域維護堆。
(5)==程序中未初始化的資料在 .bss 段 ==
(6)程序中初始化的資料在 .data 段
(7)程序程式碼在 .text 段
(8)程序執行的時候可能會呼叫共享庫,在程序地址空間中有一個共享庫的儲存器對映區域,這個是程序獨立的,因為每個程序可能呼叫不同的共享庫。
linux系統中程序的地址空間分佈如下圖所示,其中在32位系統中0-3GB為使用者空間,3-4GB為核心空間:
9. bss段的功能
先明確 BSS 段“存放”的是未初始化的全域性變數與區域性靜態變數,此處指的存放是指為其預留空間(佔位符)。但BSS段在磁碟上不是真的佔用變數大小的空間,它僅是在該段中記錄了所有未初始化全域性變數與區域性靜態變數的大小總和,至於每個變數的大小則儲存在符號表的size屬性中。即:
BSS段內容:無內容,它將在段表中佔一個段描述符,該段描述符的size屬性將記錄未初始化的全域性變數與區域性靜態變數的大小總和
每個未初始化全域性物件與靜態物件的大小:儲存在符號表的 size 屬性中
BSS段在載入執行前的處理
當可執行檔案載入執行前,會為BSS段中的變數分配足夠的空間並全部自動清理(因此,才有未初始化的全域性變數的值為0的說法)。
BSS段的作用
BSS段主要是為了節省可執行檔案在磁碟上所佔的空間,其僅僅記錄變數所需的大小。對未初始化的大型陣列的節省效率比較明顯。
10. 字串考察
char *str1 = "1";
char str2[] = "1";
str1, str2分別指向什麼地方
這個是c語言裡面的問題,第一個str1指向了一個常見字串,處於記憶體的常量區。
第二個str2是一個數組,陣列的指標指向了常量區域的常見字串1,那麼此時陣列的第一個值將被初始化稱為1。
11. 哪個命令可以檢視記憶體使用情況
top
12. touch有什麼用(一定要說兩個功能,很多人只知道一個功能)
修改一個檔案的時間戳
如果檔案不存在,則直接建立一個檔案
13.棋盤問題,氣數(函式calc計算圍棋盤位置(x,y)處的棋子還有多少口氣。
某個位置處的棋子還有多少口氣的計算方法(簡化計算):從該位置出發,向四個方向遍歷,允許拐彎,但不允許走斜線。如果遇到邊線和對方棋子,則認為不能繼續往前走。遍歷完成後統計遍歷過程中遇到的未落子的位置個數,該位置個數即出發點棋子的氣的數目。)
14.結構體記憶體對齊
(可以回答作用:1.平臺移植 2.提高<訪問>效率 3.節省儲存空間)
15.能不能修改預設對齊數,怎麼修改(使用巨集:#param pack)
explicit關鍵字的作用(防止隱性轉換和拷貝初始化,然後舉拷貝初始化失敗的一個例子)
strcpy在棧裡拷貝到一個字元陣列會出現的情況。(strcpy拷貝過程判斷’\0’,字元陣列沒有該字元時,會把後面地址的資料進行覆蓋)
16 對於struct結構體,能不能用memcmp進行記憶體比較。為什麼。
(不能,結構體對齊後,自動填充的位元組的內容是隨機的)
17 拷貝建構函式的引數不是引用可以嗎?
(不可以,函式對於非引用的引數值而言,都會對其在棧內進行拷貝,而對類進行拷貝,又呼叫了拷貝建構函式,這樣會造成無限的呼叫,直至函式棧溢位)
18 如果是執行緒池,固定了建立的執行緒數量,如果每個執行緒都阻塞了,怎麼辦。
(我並沒有併發開發的經驗,但個人根據OS原理:資源分配不合理導致的問題,要麼增加系統資源滿足任務呼叫,要麼重新分配任務的工作量,減少單個任務的資源佔用)
19 如果一個單執行緒阻塞了一個系統呼叫,比如read,如何解決。
(使用select函式進行定時讀取,多次阻塞無效後,放棄資源,提示應用系統錯誤資訊,交給使用者進一步排查;也可以是將read設定為非阻塞)
20 有A B C D四個數字序列,求這四個序列的交集。
記憶體放不下,沒考慮序列中有重複值,被鄙視。(先對數字序列進行排除重複值,然後建立二叉搜尋樹,節點含藏數值和計數變數,分別輸入四個處理後的數字序列,最後統計計數變數為4的數值,就是4個數字序列的交集)
21:struct{char data[0]}這個data表示什麼意思(有點像變長陣列,類似一個指標使用)
在實際的程式設計中,我們經常需要使用變長陣列,但是C語言並不支援變長的陣列。此時,我們可以使用結構體的方法實現C語言變長陣列。
struct MyData { int nLen; char data[0];};
在結構中,data是一個數組名;但該陣列沒有元素;該陣列的真實地址緊隨結構體MyData之後,而這個地址就是結構體後面資料的地址(如果給這個結構體分配的內容大於這個結構體實際大小,後面多餘的部分就是這個data的內容);這種宣告方法可以巧妙的實現C語言裡的陣列擴充套件。
實際用時採取這樣:
struct MyData *p = (struct MyData *)malloc(sizeof(struct MyData )+strlen(str))
這樣就可以通過p->data 來操作這個str。
22: struct結構體
例如:struct {char a:1,char b:1}(位域,同樣會有位元組對齊問題)
表示a只佔一個bit,b只佔1個bit
系統呼叫與函式呼叫(回答完四點,最好是加上自己的理解,不然就是背課本)
函式庫呼叫 | 系統呼叫 |
---|---|
在所有的ANSI C編譯器版本中,C庫函式是相同的 | 各個作業系統的系統呼叫是不同的 |
它呼叫函式庫中的一段程式(或函式) | 它呼叫系統核心的服務 |
與使用者程式相聯絡 | 是作業系統的一個入口點 |
在使用者地址空間執行 | 在核心地址空間執行 |
它的執行時間屬於“使用者時間” | 它的執行時間屬於“系統時間” |
屬於過程呼叫,呼叫開銷較小 | 需要在使用者空間和核心上下文環境間切換,開銷較大 |
在C函式庫libc中有大約300個函式 | 在UNIX中大約有90個系統呼叫 |
典型的C函式庫呼叫:system fprintf malloc | 典型的系統呼叫:chdir fork write brk |
23、linux訊號有哪些(中斷、堆疊、段錯誤、父子程序)
1) | SIGHUP | 連線結束通話 | 終止(預設處理) |
---|---|---|---|
2) | SIGINT | 終端中斷,Ctrl+c產生該訊號 | 終止(terminate) |
3) | SIGQUIT | 終端退出,Ctrl+\ | 終止+轉儲 |
4) | SIGILL | *程序試圖執行非法指令 | 終止+轉儲 |
5) | SIGTRAP | 進入斷點 | 終止+轉儲 |
6) | SIGABRT | *程序異常終止,abort()產生 | 終止+轉儲 |
7) | SIGBUS | 硬體或對齊錯誤 | 終止+轉儲 |
8) | SIGFPE | *浮點運算異常 | 終止+轉儲 |
9 | )SIGKILL | 不可以被捕獲或忽略的終止訊號 | 終止 |
10) | SIGUSR1 | 使用者定義訊號1 | 終止 |
11) | SIGSEGV | *無效的記憶體段訪問=>Segmentation error | 終止+轉儲 |
12) | SIGUSR2 | 使用者定義訊號2 | 終止 |
13) | SIGPIPE | 向讀端已關閉的管道寫入 | 終止 |
14) | SIGALRM | 真實定時器到期,alarm()產生 | 終止 |
15) | SIGTERM | 可以被捕獲或忽略的終止訊號 | 終止 |
16) | SIGSTKFLT | 協處理器棧錯誤 | 終止 |
17) | SIGCHLD | 子程序已經停止, 對於管理子程序很有用 | 忽略 |
18) | SIGCONT | 繼續執行暫停程序(使用者一般不用) | 忽略 |
19) | SIGSTOP | 不能被捕獲或忽略的停止訊號 | 停止(stop) |
20) | SIGTSTP | 終端掛起,使用者產生停止符(Ctrl+Z) | 停止 |
21) | SIGTTIN | 後臺程序讀控制終端 | 停止 |
22) | SIGTTOU | 後臺程序寫控制終端 | 停止 |
23) | SIGURG | 緊急I/O未處理 | 忽略 |
24) | SIGXCPU | 程序資源超限 | 終止+轉儲 |
25) | SIGXFSZ | 檔案資源超限 | 終止+轉儲 |
26) | SIGVTALRM | 虛擬定時器到期 | 終止 |
27) | SIGPROF | 實用定時器到期 | 終止 |
28) | SIGWINCH | 控制終端視窗大小改變 | 忽略 |
29) | SIGIO | 非同步I/O事件 | 終止 |
30) | SIGPWR | 斷電 | 終止 |
31) | SIGSYS | 程序試圖執行無效系統呼叫 | 終止+轉儲 |
24、記憶體溢位解決
(將要使用的記憶體超出了允許使用的範圍;使用strncpy而不是strcpy)
25、一棵樹轉換成二叉樹(翻車了,不會)
如何將一棵樹轉化為對應的二叉樹?
解答:
1.將 節點的孩子 放在左子樹;
2.將 節點的兄弟 放在右子樹。
例題:
答案:
延伸:
任何一棵樹都可以表示成二叉樹,並不是任何一棵二叉樹都可以表示成樹。那麼樹多還是二叉樹多?
1. 任何一棵樹都可以表示成二叉樹,結合以上題目很容易理解。
2.不是任何一棵二叉樹都可以表示成樹:
當根節點包含右子樹的時候,就無法表示成樹了。
26、如何比較兩個結構體是否相等(逐個成員對比,不能使用memcomp)
逐個成員對比,不能使用memcomp,因為存在記憶體對齊的問題
27. 一共四個人過橋
每個通過橋的時間為1,2,5,8分鐘,他們只有一個手電筒,橋每次只能承受兩個人的重量,問你怎麼過橋最快?換成是一堆人該怎麼辦?(講述思路即可,8=5+2+1;一堆人的話,就湊整)
28、 衛星網路中網路頻寬足夠,但丟包率高,導致網頁打不開,通訊質量差,什麼原因?如何解決?(裝置丟包、MTU設定不恰當、網路攻擊)
29,什麼技術可以代替巨集定義
(這其實考的面非常廣,看你軟體開發的經驗,看你對巨集技術發展的理解;C++裡面可以:const實現常量、inline內聯替代巨集函式、typedef替代型別定義、條件編譯)
麵筋2
1.資料庫的四大特性
本篇講訴資料庫中事務的四大特性(ACID),並且將會詳細地說明事務的隔離級別。
如果一個數據庫聲稱支援事務的操作,那麼該資料庫必須要具備以下四個特性:
⑴ 原子性(Atomicity)
原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾,這和前面兩篇部落格介紹事務的功能是一樣的概念,因此事務的操作如果成功就必須要完全應用到資料庫,如果操作失敗則不能對資料庫有任何影響。
⑵ 一致性(Consistency)
一致性是指事務必須使資料庫從一個一致性狀態變換到另一個一致性狀態,也就是說一個事務執行之前和執行之後都必須處於一致性狀態。
拿轉賬來說,假設使用者A和使用者B兩者的錢加起來一共是5000,那麼不管A和B之間如何轉賬,轉幾次賬,事務結束後兩個使用者的錢相加起來應該還得是5000,這就是事務的一致性。
⑶ 隔離性(Isolation)
隔離性是當多個使用者併發訪問資料庫時,比如操作同一張表時,資料庫為每一個使用者開啟的事務,不能被其他事務的操作所幹擾,多個併發事務之間要相互隔離。
即要達到這麼一種效果:對於任意兩個併發的事務T1和T2,在事務T1看來,T2要麼在T1開始之前就已經結束,要麼在T1結束之後才開始,這樣每個事務都感覺不到有其他事務在併發地執行。
關於事務的隔離性資料庫提供了多種隔離級別,稍後會介紹到。
⑷ 永續性(Durability)
永續性是指一個事務一旦被提交了,那麼對資料庫中的資料的改變就是永久性的,即便是在資料庫系統遇到故障的情況下也不會丟失提交事務的操作。
例如我們在使用JDBC操作資料庫時,在提交事務方法後,提示使用者事務操作完成,當我們程式執行完成直到看到提示後,就可以認定事務以及正確提交,即使這時候資料庫出現了問題,也必須要將我們的事務完全執行完成,否則就會造成我們看到提示事務處理完畢,但是資料庫因為故障而沒有執行事務的重大錯誤。
2.事務的隔離級別
事務的隔離性,當多個執行緒都開啟事務操作資料庫中的資料時,資料庫系統要能進行隔離操作,以保證各個執行緒獲取資料的準確性,在介紹資料庫提供的各種隔離級別之前,我們先看看如果不考慮事務的隔離性,會發生的幾種問題:
1,髒讀
髒讀是指在一個事務處理過程裡讀取了另一個未提交的事務中的資料。
當一個事務正在多次修改某個資料,而在這個事務中這多次的修改都還未提交,這時一個併發的事務來訪問該資料,就會造成兩個事務得到的資料不一致。例如:使用者A向用戶B轉賬100元,對應SQL命令如下
update account set money=money+100 where name=’B’; (此時A通知B)
update account set money=money - 100 where name=’A’;
當只執行第一條SQL時,A通知B檢視賬戶,B發現確實錢已到賬(此時即發生了髒讀),而之後無論第二條SQL是否執行,只要該事務不提交,則所有操作都將回滾,那麼當B以後再次檢視賬戶時就會發現錢其實並沒有轉。
2,不可重複讀
不可重複讀是指在對於資料庫中的某個資料,一個事務範圍內多次查詢卻返回了不同的資料值,這是由於在查詢間隔,被另一個事務修改並提交了。
例如事務T1在讀取某一資料,而事務T2立馬修改了這個資料並且提交事務給資料庫,事務T1再次讀取該資料就得到了不同的結果,傳送了不可重複讀。
不可重複讀和髒讀的區別是,髒讀是某一事務讀取了另一個事務未提交的髒資料,而不可重複讀則是讀取了前一事務提交的資料。
在某些情況下,不可重複讀並不是問題,比如我們多次查詢某個資料當然以最後查詢得到的結果為主。但在另一些情況下就有可能發生問題,例如對於同一個資料A和B依次查詢就可能不同,A和B就可能打起來了……
3,虛讀(幻讀)
幻讀是事務非獨立執行時發生的一種現象。例如事務T1對一個表中所有的行的某個資料項做了從“1”修改為“2”的操作,這時事務T2又對這個表中插入了一行資料項,而這個資料項的數值還是為“1”並且提交給資料庫。而操作事務T1的使用者如果再檢視剛剛修改的資料,會發現還有一行沒有修改,其實這行是從事務T2中新增的,就好像產生幻覺一樣,這就是發生了幻讀。
幻讀和不可重複讀都是讀取了另一條已經提交的事務(這點就髒讀不同),所不同的是不可重複讀查詢的都是同一個資料項,而幻讀針對的是一批資料整體(比如資料的個數)。
——現在來看看MySQL資料庫為我們提供的四種隔離級別:
① Serializable (序列化):可避免髒讀、不可重複讀、幻讀的發生。
② Repeatable read (可重複讀):可避免髒讀、不可重複讀的發生。
③ Read committed (讀已提交):可避免髒讀的發生。
④ Read uncommitted (讀未提交):最低級別,任何情況都無法保證。
以上四種隔離級別最高的是Serializable級別,最低的是Read uncommitted級別,當然級別越高,執行效率就越低。像Serializable這樣的級別,就是以鎖表的方式(類似於Java多執行緒中的鎖)使得其他的執行緒只能在鎖外等待,所以平時選用何種隔離級別應該根據實際情況。在MySQL資料庫中預設的隔離級別為Repeatable read (可重複讀)。
3.可重複性讀是怎麼實現的,底層原理
Repeatable Read(可重複讀):一個事務在執行過程中可以看到其他事務已經提交的新插入的記錄(讀已經提交的,其實是讀早於本事務開始且已經提交的),但是不能看到其他事務對已有記錄的更新(即晚於本事務開始的),並且,該事務不要求與其他事務是“可序列化”的。
這句話的核心,是“但是不能看到其他事務對已有記錄的更新”,那麼RR隔離級別是怎麼保證這一點的呢?
如果資料庫併發控制引擎是單純的封鎖協議機制,則應該在讀取資料的時候,判斷資料項是不是其他事務更新過的。可是InnoDB沒有這麼做,而是通過如下方式,在RR隔離級別下為事務設定了一個“一致性讀檢視(即快照)”,之後讀取資料,就是根據這個快照來獲取,這樣,就不能看到他晚於本事務的事務對已有記錄的更新(更新生成新版本,必然不在舊的快照所限定的範圍內)。
4.資料庫的優化
這個優化法則歸納為5個層次:
1、 減少資料訪問(減少磁碟訪問)
2、 返回更少資料(減少網路傳輸或磁碟訪問)
3、 減少互動次數(減少網路傳輸)
4、 減少伺服器CPU開銷(減少CPU及記憶體開銷)
5、 利用更多資源(增加資源)
5.哪些地方適合做索引
頻繁查詢某個列,但是很少刪除插入的地方
6.JAVA的垃圾回收機制
自動回收記憶體的一種機制
7.STL記憶體管理,實現機理,多執行緒的實現
這個allocator是一個由兩級分配器構成的記憶體管理器,當申請的記憶體大小大於128byte時,就啟動第一級分配器通過malloc直接向系統的堆空間分配,如果申請的記憶體大小小於128byte時,就啟動第二級分配器,從一個預先分配好的記憶體池中取一塊記憶體交付給使用者,這個記憶體池由16個不同大小(8的倍數,8~128byte)的空閒列表組成,allocator會根據申請記憶體的大小(將這個大小round up成8的倍數)從對應的空閒塊列表取表頭塊給使用者。
這種做法有兩個優點:
1)小物件的快速分配。小物件是從記憶體池分配的,這個記憶體池是系統呼叫一次malloc分配一塊足夠大的區域給程式備用,當記憶體池耗盡時再向系統申請一塊新的區域,整個過程類似於批發和零售,起先是由allocator向總經商批發一定量的貨物,然後零售給使用者,與每次都總經商要一個貨物再零售給使用者的過程相比,顯然是快捷了。當然,這裡的一個問題時,記憶體池會帶來一些記憶體的浪費,比如當只需分配一個小物件時,為了這個小物件可能要申請一大塊的記憶體池,但這個浪費還是值得的,況且這種情況在實際應用中也並不多見。
2)避免了記憶體碎片的生成。程式中的小物件的分配極易造成記憶體碎片,給作業系統的記憶體管理帶來了很大壓力,系統中碎片的增多不但會影響記憶體分配的速度,而且會極大地降低記憶體的利用率。以記憶體池組織小物件的記憶體,從系統的角度看,只是一大塊記憶體池,看不到小物件記憶體的分配和釋放。
10.資料庫的三級結構模式
資料庫系統的模式(Schema)
資料模型中有“型”和“值”的概念,如:學生(學號,性別,班級)是“型”,而:張三(20160310001,1,3年2班)是“值”。
模式(Schema)是資料庫中全體資料的邏輯結構和特徵的描述,它僅僅描述型,而並不包括值。模式的值稱為模式的一個例項(Instance),同一個模式可以有多個例項。
雖然實際的DBMS系統種類很多,他們支援的資料模式不盡相同,使用不同的語言,建立在不同的OS上,資料的儲存結構也各不相同,但他們在體系結構上通常具有相同的特徵,即採用三級模式結構
資料庫的三級模式結構是指:資料庫系統是由外模式、模式和內模式三級構成,如圖:
1. 模式(Schema)
模式也稱為:邏輯模式,它是DB中全體資料的邏輯結構和特徵的描述,是所有使用者的公共資料檢視。模式層是資料庫模式結構的中間層,既不涉及到資料的物理儲存細節和硬體環境,也與具體的應用程式、應用開發工具以及高階程式設計語言無關(C、C++、JAVA等)。
模式就是資料庫資料在邏輯上的檢視,且一個數據庫只有一個模式。實際工作中,模式就等同於程式設計師建立一個具體的資料庫的全部操作,如:這是一個MySQL資料庫,有2張表,每個表的名字,屬性的名字、型別、取值範圍,主鍵,外來鍵,索引,其他完整性約束等等。
DBMS提供模式描述語言(模式DDL)來嚴格地定義模式。
2. 外模式
外模式也稱為:子模式(subschema)/使用者模式,它是資料庫使用者(應用程式設計師、終端使用者)能夠看到的使用的區域性資料的邏輯結構和特徵的描述,是資料庫的資料檢視,是與某一個應用有關的資料的邏輯表示。
外模式通常是模式的子集。一個數據庫可以有多個外模式。同一個外模式可以為某一使用者的多個應用系統所使用,但一個應用系統只能使用一個外模式。
外模式是保證資料庫安全性的一個有力措施。每個使用者只能看見和訪問所對應的外模式中的資料,資料庫中的其餘資料是不可見的。
DBMS提供子模式描述語言(子模式DDL)來嚴格地定義子模式。
3. 內模式
內模式也稱為:儲存模式(Storage schema),一個數據庫只有一個內模式。它是資料庫物理結構和儲存方式的描述,是資料在資料庫內部的表示方式。如:記錄的儲存方式是堆儲存,還是按照某些屬性值的升(降)儲存,還是按照屬性值聚簇(cluster)儲存;索引按照什麼方式組織,是B+樹索引,還是hash索引等等。
DBMS提供內模式描述語言(內模式DDL/儲存模式DDL)來嚴格定義內模式。
13.https是怎麼樣確保安全性的
HTTPS(全稱:Hypertext Transfer Protocol over Secure Socket Layer),是以安全為目標的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL
Https的作用
● 內容加密 建立一個資訊保安通道,來保證資料傳輸的安全;
● 身份認證 確認網站的真實性
● 資料完整性 防止內容被第三方冒充或者篡改
Https的劣勢
● 對資料進行加解密決定了它比http慢
需要進行非對稱的加解密,且需要三次握手。首次連線比較慢點,當然現在也有很多的優化。
出於安全考慮,瀏覽器不會在本地儲存HTTPS快取。實際上,只要在HTTP頭中使用特定命令,HTTPS是可以快取的。Firefox預設只在記憶體中快取HTTPS。但是,只要頭命令中有Cache-Control: Public,快取就會被寫到硬碟上。 IE只要http頭允許就可以快取https內容,快取策略與是否使用HTTPS協議無關。
HTTPS和HTTP的區別
● https協議需要到CA申請證書,一般免費證書很少,需要交費。
● http是超文字傳輸協議,資訊是明文傳輸;https 則是具有安全性的ssl加密傳輸協議。
● http和https使用的是完全不同的連線方式,用的埠也不一樣,前者是80,後者是443。
● http的連線很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,比http協議安全。
14.MD5為什麼不算是加密演算法
不是。MD5 好像是一種雜湊演算法。
根據解釋,一般來說:
MD5雜湊函式將任意長度的二進位制字串對映為固定長度的小型二進位制字串。加密雜湊函式有這樣一個屬性:在計算上不大可能找到雜湊為相同的值的兩個不同的輸入;也就是說,兩組資料的雜湊值僅在對應的資料也匹配時才會匹配。資料的少量更改會在雜湊值中產生不可預知的大量更改。
當前普遍MD5 演算法的雜湊值大小為 128 位。
我個人認為,加密演算法因該是指那些可以將明文通過一定演算法後得到密文,並且可以通過相對應的解密演算法和金鑰,計算出原來的明文。MD5演算法好像不符合這個模式。
16.死鎖相關問題及演算法,執行緒同步的問題
已有解釋
17.什麼是MVC
從圖中可以看出,控制器獲取到了使用者的請求 然後不做任何處理就轉發給了模型,模型通過自己的業務邏輯判斷,以及對資料庫中資料的操作,找到了滿足控制器所轉發過來的使用者請求,假設模型所要提交給檢視的請求都和檢視有一個虛擬的連結地址,那麼每次在模型確定好要傳送的已經處理好的使用者請求的時候,檢視就會對模型的這一請求做出迴應,便會將不同的頁面展示給使用者,然後根據使用者的進一步要求繼續重複之前的流程。
從個人角度,用大白話來說就是:模型=建築公司的施工部門;控制器=建築公司的銷售部門;檢視=建築公司的設計部門;
在銷售部門成功拉到使用者的時候,他會將使用者的需求直接交給施工部門,其中需求就包括到底誰要做什麼;施工部門在得到銷售部門從使用者那裡得到的請求之後,就會用使用者的請求和自己所能承接的專案做對比呀,比如 一個房地產開發商要蓋一座別墅,那麼施工部門就會判斷自己會不會改別墅嘍;在施工部門確定好是否能滿足使用者的需求之後就會把這個決定告訴設計部門,那麼就會讓設計部門負責把他們所能做的圖紙反饋給使用者,當然,如果不能做,那就會反饋給使用者一張白紙加許多句解釋的話唄。如果使用者滿意了,那麼就直接進行這個專案,如果使用者覺得圖紙上哪個地方有問題,那麼久繼續重複之前的操作。
MVC是一種設計思想,M代表model,模型。V代表view,檢視,C代表controller控制層。M主要是業務層以及資料實體類。V負責與使用者互動,前臺jsp等。C負責排程分配作用。從瀏覽器發出請求到收到響應顯現在頁面的順序。
a:使用者在瀏覽器輸入請求地址:http://主機:埠/應用名/index.do,請求協議是http超文字傳輸協議。
b:webContent下web.xml中配置訪問地址,如果預設welcome-list元素,那麼訪問預設 頁面index.jsp
如果配置servelt和server-mapping元素,那麼會自動分發。
c:請求路徑通過SimpleHandleMapping類自動匹配到後臺的RequestMapping中的路徑。如果配置MVC,那麼
需要配置mvc驅動。
d:在控制層呼叫業務層,處理完資料後,返回頁面和處理完的資料。
e:頁面重定向到頁面和配置檔案ViewRevoler的拼接,可以使用tiles框架(如果jsp頁面過多的情況)
同時將資料也帶過去,然後將響應返回瀏覽器。
f:瀏覽器顯示給使用者。
18.機器碼的大端儲存,小端儲存的問題
考慮一個16位整數,它由兩個位元組組成。記憶體中儲存這兩個位元組有兩種方法:一種是將低序位元組儲存在起始地址,這稱為小端(little-endian)位元組序;另一種方法是將高序位元組儲存在起始地址,這稱為大端(big-endian)位元組序。
19.迴圈隊裡的又來,一定要用順序表實現嗎,可以用連結串列嗎
佇列最好的方法就是連結串列來實現
非要用陣列來實現的時候,可以使用迴圈佇列的使用方法。
20,滿二叉樹和完全二叉樹的區別
滿二叉樹,所有的葉子節點都在最後一層
完全二叉樹,所有的葉子節點出現在最後一層和倒數第二層
21.http的狀態碼
404,沒有找打,200 成功,301 轉移了,500 伺服器錯誤
面經3
美團面經:
1.linux的啟動
首先bios硬體自檢,自檢通過了之後,bios韌體去硬碟第一個扇區MSR中找引導向grub,找到了grub,grub程式負責把核心映象從硬碟載入到記憶體中,映象中init.sh指令碼完成系統初始化程序,資源分配等。
2.回溯法dfs:劍指offer的最後兩個題,很有代表性