计算机考研复试面试题整理
考研復(fù)試面試題整理
文章目錄
- 前言
- 數(shù)據(jù)結(jié)構(gòu)部分
- 操作系統(tǒng)部分
- 計算機網(wǎng)絡(luò)部分
- C++
- JAVA
- 編譯原理
- 軟件工程
- 排序算法專題
前言
筆者剛剛參加完2022年考研復(fù)試,現(xiàn)將復(fù)試過程中自己整理的部分面試題整理出來,僅供參考。
數(shù)據(jù)結(jié)構(gòu)部分
1.數(shù)據(jù)結(jié)構(gòu)按邏輯結(jié)構(gòu)可以分為哪兩類?
可以分為線性結(jié)構(gòu)(線性表、棧、隊列)和非線性結(jié)構(gòu)(樹、圖、集合)
2.數(shù)據(jù)結(jié)構(gòu)按存儲結(jié)構(gòu)可以分為哪兩類?
順序存儲、鏈?zhǔn)酱鎯Α⑺饕鎯Α⑸⒘写鎯Α?br /> 3.順序結(jié)構(gòu)和鏈?zhǔn)浇Y(jié)構(gòu)的區(qū)別?
順序結(jié)構(gòu)是指內(nèi)存連續(xù)的存儲單元進(jìn)行存儲,而鏈?zhǔn)浇Y(jié)構(gòu)是指內(nèi)存不連續(xù)的結(jié)構(gòu),通過一個節(jié)點指向另外一個節(jié)點的地址。
順序存儲很方便隨機查找,但不利于頻繁的插入刪除數(shù)據(jù)。
鏈?zhǔn)浇Y(jié)構(gòu)無法做到隨機查找,只能通過遍歷的方式依次查找,但是很方便結(jié)點的插入和刪除。
4如何判斷鏈表是否有環(huán)?
設(shè)置快慢指針,快指針每次前進(jìn)兩步,當(dāng)兩指針重合則有環(huán),快指針為null則無環(huán)。
5如何判斷有環(huán)鏈表環(huán)的入口?
1、將遍歷過的結(jié)點都入set,如果當(dāng)前結(jié)點在set里有,則此結(jié)點即為入口。
2、快慢指針重合后,重置fast指針,此時fast每次走一步,再次重合結(jié)點即為入口。
6鏈表能否使用二分查找?
可以。先將鏈表排序,將各個結(jié)點的值記入數(shù)組,再二分查找。
給定一顆二叉樹的頭結(jié)點,和這顆二叉樹中2個節(jié)點n1和n2,求這兩個節(jié)點的最近公共祖先
7棧和隊列的區(qū)別?
棧是先進(jìn)后出的特殊線性表,隊列是先進(jìn)先出的線性表。
8兩個棧模仿一個隊列?
進(jìn)隊:入A棧。
出隊:若B棧不為空,則B棧全部出棧;否則將A棧中數(shù)據(jù)全部入B棧,再依次出B棧。
9兩個隊列模仿一個棧?
入棧:入A隊
出棧:將A隊除隊尾元素全部轉(zhuǎn)移到B隊,出A隊,算法思想就是兩個隊列倒來倒去,只留一個元素時出棧。
10復(fù)雜度是什么?
復(fù)雜度包括時間復(fù)雜度和空間復(fù)雜度,用來評價一個算法的好壞。
11頭節(jié)點的作用是什么?
12為什么要引入雙向鏈表?
因為單鏈表結(jié)點中只有一個指向其后繼的指針,使得單鏈表只能從頭開始依次順序地向后遍歷。這樣的查找速度和效率不高。
13若有n個不同的元素進(jìn)展沒出站元素不同排列的個數(shù)為:
14什么是共享棧?
利用棧底位置相對不變的特性,可讓兩個順序棧共享一個一維空間數(shù)組,將兩個棧的棧底分別設(shè)置在共享空間的兩端,兩個棧頂向共享空間的中間延伸。
15循環(huán)隊列如何區(qū)分隊空還是隊滿?
1)犧牲一個單元來區(qū)分,入隊時少用一個隊列單元,規(guī)定隊頭指針在隊尾指針的下一個位置作為隊滿的標(biāo)志。隊空的標(biāo)志仍為隊頭指針和隊尾指針重合。
2)增設(shè)表示元素個數(shù)的數(shù)據(jù)成員。
3)增設(shè)tag數(shù)據(jù)成員,tag為0時,若因刪除導(dǎo)致frontrear,則隊空。Tag為1時,若因插入導(dǎo)致frontrear,則隊滿。
16棧和隊列的應(yīng)用
棧:括號匹配、遞歸
隊列:緩沖區(qū)、隊列
17介紹以下各種樹
樹,二叉樹:有左右子樹的區(qū)分和度不超過2.
二叉排序樹:左子樹均小于根,根均小于右節(jié)點。。
線索二叉樹:設(shè)置兩個標(biāo)識標(biāo)記左右指針指向的是孩子還是前軀節(jié)點。
平衡二叉樹:左右子樹高度差絕對值小于等于1。
哈夫曼樹:壓縮用的。權(quán)值大小排列。
完全二叉樹:只能從右邊為空。
n0=n2+1
18度為2的樹和二叉樹的區(qū)別:
二叉樹有左右子樹的定義。
19樹的存儲結(jié)構(gòu)
雙親表示法、孩子表示法、孩子兄弟表示法
20樹的遍歷
先序中序后序三種。遞歸實現(xiàn)。
21什么是線索二叉樹?
指向節(jié)點前驅(qū)和后繼的指針,叫做線索。加上線索的二叉樹稱為線索二叉樹
22什么是哈夫曼樹?
在含有N個帶權(quán)葉子結(jié)點的二叉樹中,其中帶權(quán)路徑(WPL)最小的二叉樹稱為哈夫曼樹
23二叉樹刪除節(jié)點?
被刪除的節(jié)點是葉子節(jié)點,這時候只要把這個節(jié)點刪除,再把指向這個節(jié)點的父節(jié)點指針置為空就行。
被刪除的節(jié)點有左子樹,或者有右子樹,而且只有其中一個,那么只要把當(dāng)前刪除節(jié)點的父節(jié)點指向被刪除節(jié)點的左子樹或者右子樹就行。
被刪除的節(jié)點既有左子樹而且又有右子樹,這時候需要把左子樹的最右邊的節(jié)點或者右子樹最左邊的節(jié)點提到被刪除節(jié)點的位置。
24圖的存儲
鄰接矩陣和鄰接表,是多對多的關(guān)系,分為有向圖和無向圖。
25查找有哪幾種?
查找有順序查找、折半查找、分塊查找
26線性表的查找有那幾類?
直接查找和有序表的二分查找。
27散列函數(shù)的構(gòu)造方法
直接定址法、除留余數(shù)法、數(shù)字分析法、平方取中法
28處理沖突的方法
開放定址法:(線性探測法、平方探測法、再散列法、偽隨機序列法)
拉鏈法
29排序算法的介紹?
插入排序有直接插入和折半插入。都是在有序表里插入進(jìn)去的。
交換排序:冒泡,快速:以一個數(shù)字劃分兩個區(qū)域,然后分別對兩個區(qū)域繼續(xù)劃分,直到區(qū)間為一。注意快排是不穩(wěn)定。
選擇排序:簡單的選擇排序,堆排序
歸并排序:將兩個有序表歸并到一個有序表。將兩個有序表放到一起進(jìn)行各個比較,比較完之后放回原來數(shù)組內(nèi)。
30排序算法總結(jié)
31什么是穩(wěn)定的排序算法?
一個序列中,關(guān)鍵字相同的數(shù)排序后相對位置不變即穩(wěn)定,比如1、3、2、4、5、2序列,第三個位置2和最后一個位置2排序后,他們的位置先后不變化則穩(wěn)定。
32B樹和B+樹的區(qū)別?
一、關(guān)鍵字不同
1、b樹每一個關(guān)鍵字有且只出現(xiàn)一次。
2、而b+樹有n棵子樹的非葉節(jié)點有n個關(guān)鍵字,關(guān)鍵字會存儲重復(fù)。
二、存儲內(nèi)容不同
1、b樹每個節(jié)點除了存儲關(guān)鍵字,還存儲數(shù)據(jù)。
2、b+樹只有葉子節(jié)點存儲關(guān)鍵字信息,以及指向關(guān)鍵字記錄的指針。
三、查找不同
1、b樹查找相當(dāng)于二分查找,可以在非葉節(jié)點結(jié)束。
2、而b+樹的查找路徑是由根到葉子節(jié)點,每次查找路徑長度比較穩(wěn)定。
操作系統(tǒng)部分
第一章
一、操作系統(tǒng)的基本特征有哪些?其中最基本的是什么?
并發(fā)、共享、虛擬、異步
最基本的是并發(fā)、共享
二、什么是原語?
所謂原語,一般是指由若干條指令組成的程序段,用來實現(xiàn)某個特定功能,在執(zhí)行過程中不可被中斷。
三、什么是系統(tǒng)調(diào)用?
系統(tǒng)調(diào)用是指用戶在程序中調(diào)用操作系統(tǒng)所提供的一些子功能,系統(tǒng)調(diào)用可視為特殊的公共子程序。用戶程序執(zhí)行陷入指令來發(fā)起系統(tǒng)調(diào)用,請求操作系統(tǒng)提供服務(wù)。
四、為什么要區(qū)分用戶態(tài)和內(nèi)核態(tài)?用戶態(tài)和核心態(tài)的區(qū)別是什么?他們是如何讓實現(xiàn)轉(zhuǎn)換的?
區(qū)分執(zhí)行態(tài)的主要目的是保護(hù)系統(tǒng)程序。
處于核心態(tài)時,說明此時正在運行的是內(nèi)核程序,此時可以執(zhí)行特權(quán)指令。
處于用戶態(tài)時,說明此時正在運行的是應(yīng)用程序,此時可以執(zhí)行非特權(quán)指令。
內(nèi)核態(tài)->用戶態(tài):執(zhí)行一條特權(quán)指令,修改PSW的標(biāo)志位為用戶態(tài)。
用戶態(tài)->內(nèi)核態(tài):訪管指令,由中斷引發(fā),硬件自動完成。
五、分別簡述大內(nèi)核和微內(nèi)核
大內(nèi)核:將操作系統(tǒng)的主要功能模塊進(jìn)行集中,從而用以提供高性能的系統(tǒng)服務(wù)
微內(nèi)核:將內(nèi)核中最基本的功能保留在內(nèi)核,將不需要在核心態(tài)執(zhí)行的功能轉(zhuǎn)移到用戶態(tài)執(zhí)行,降低內(nèi)核設(shè)計的復(fù)雜性。
六、中斷的分類
中斷分為內(nèi)中斷和外中斷
中斷也稱為外中斷,指來自CPU執(zhí)行指令以外發(fā)生的事,一般是外設(shè)請求或人為干預(yù)。
異常也稱內(nèi)中斷,指的是源自CPU執(zhí)行指令內(nèi)部的事,一般不能被屏蔽,例如:程序的非法操作碼、地址越界、算術(shù)溢出、虛存系統(tǒng)的缺頁及專門的陷入指令等引起的事件。
七、簡述特權(quán)指令和非特權(quán)指令
特權(quán)指令指有特殊權(quán)限的指令,必須在核心態(tài)執(zhí)行,只能用于操作系統(tǒng)和其他系統(tǒng)軟件,不直接提供給用戶使用。
非特權(quán)指令只能在用戶態(tài)下使用
八、并行和并發(fā)的區(qū)別
并行性是指兩個或多個事件在同一時刻發(fā)生。
并發(fā)性是指兩個或多個事件在同一時間間隔內(nèi)發(fā)生。
九、簡述訪管指令與訪管中斷
訪管指令是一條在用戶態(tài)下執(zhí)行的指令,在用戶程序中,因要求操作系統(tǒng)提供服務(wù)而有意識地使用訪管指令,從而產(chǎn)生訪管中斷,將操作系統(tǒng)轉(zhuǎn)換為核心態(tài)。
十、簡述中斷處理的過程
第二章 進(jìn)程管理
一、進(jìn)程映像有哪幾部分構(gòu)成?
進(jìn)程映像由程序段、相關(guān)數(shù)據(jù)段、PCB組成。
二、進(jìn)程控制塊(PCB)的作用是什么?PCB主要包括哪些信息?
PCB是進(jìn)程存在的唯一標(biāo)志,用來描述進(jìn)程的基本情況和運行狀態(tài),進(jìn)而控制和管理進(jìn)程。
PCB主要包括進(jìn)程描述信息、進(jìn)程控制和管理信息、資源分配清單、處理機相關(guān)信息。
三、簡要描述進(jìn)程的創(chuàng)建過程以及進(jìn)程的終止過程
在創(chuàng)建一個進(jìn)程時所要完成的主要工作是什么?
在撤銷一個進(jìn)程時所要完成的主要工作是什么?
1.根據(jù)被終止進(jìn)程標(biāo)識符,從PCB集中檢索出進(jìn)程PCB,讀出該進(jìn)程狀態(tài)。
2.若被終止進(jìn)程處于執(zhí)行狀態(tài),立即終止該進(jìn)程的執(zhí)行。
3.若該進(jìn)程還有子進(jìn)程,應(yīng)將所有子孫進(jìn)程終止。
4.將被終止進(jìn)程擁有的全部資源,歸還給父進(jìn)程,或歸還給系統(tǒng)。
5.將被終止進(jìn)程PCB從所在隊列或列表中移出。
四、進(jìn)程的組織方式有哪幾種?
1.鏈接方式:按進(jìn)程狀態(tài)將PCB分為多個隊列,此時操作系統(tǒng)持有指向各個隊列的指針。
2.索引方式:根據(jù)進(jìn)程狀態(tài)不同,建立幾張索引表,此時操作系統(tǒng)持有指向各個索引表的指針。
五、進(jìn)程之間的通信方式有哪些?
共享存儲、消息傳遞、管道通信
共享存儲:通信進(jìn)程之間存在一塊可以被直接訪問的共享空間。
消息傳遞:進(jìn)程通過系統(tǒng)提供的發(fā)送消息和接收消息兩個原語進(jìn)行數(shù)據(jù)交換。
管道通信:發(fā)送進(jìn)程以字符流形式將大量數(shù)據(jù)送入寫管道,接收進(jìn)程從管道中接收數(shù)據(jù)。
六、進(jìn)程與線程的區(qū)別是什么?
1.進(jìn)程是資源分配的基本單位,線程是獨立調(diào)度的基本單位。
2.進(jìn)程的地址空間之間相互獨立,同一進(jìn)程的各線程之間共享進(jìn)程的資源。
3.進(jìn)程間通信需要進(jìn)程同步和互斥手段的輔助以保證數(shù)據(jù)的一致性,線程間可以直接讀/寫進(jìn)程程序段來進(jìn)行通信。
七、線程的實現(xiàn)方式有哪兩種?各自優(yōu)缺點是什么?
用戶級線程、內(nèi)核級線程
用戶級線程:有關(guān)線程管理的所有工作都由應(yīng)用程序完成,內(nèi)核意識不到線程的存在。開銷低,高效,并發(fā)能力強,一個線程阻塞則進(jìn)程內(nèi)所有線程都阻塞。
內(nèi)核級線程:線程的管理工作全部由內(nèi)核完成。由內(nèi)核管理,開銷大,效率低,不靈活,但并行能力強。
八、介紹三級調(diào)度,以及三級調(diào)度的聯(lián)系
作業(yè)調(diào)度(高級調(diào)度):從輔存中選擇作業(yè)送入內(nèi)存
中級調(diào)度(內(nèi)存調(diào)度):將暫時不能運行的進(jìn)程調(diào)至外存,使其進(jìn)入掛起態(tài)。或者將己經(jīng)具備運行條件的進(jìn)程調(diào)入內(nèi)存,修改其狀態(tài)為就緒態(tài)。
進(jìn)程調(diào)度(低級調(diào)度):按照某種策略或者方法從就緒隊列中選取一個進(jìn)程,將處理機分配給它。
作業(yè)調(diào)度為進(jìn)程活動做準(zhǔn)備,進(jìn)程調(diào)度使進(jìn)程正常活動起來,中級調(diào)度將暫時不能運行的進(jìn)程掛起,中級調(diào)度處于作業(yè)調(diào)度和進(jìn)程調(diào)度之問
作業(yè)調(diào)度次數(shù)少,中級調(diào)度次數(shù)略多,進(jìn)程調(diào)度頻率最高
進(jìn)程調(diào)度是最基本的、不可或缺的
九、掛起和阻塞的區(qū)別是什么?
兩種狀態(tài)都是暫時不能獲得CPU服務(wù)的狀態(tài),但掛起狀態(tài)將進(jìn)程映像調(diào)到外存,而阻塞態(tài)下進(jìn)程映像還在內(nèi)存中。
十、實現(xiàn)臨界區(qū)互斥的基本方法有哪些?
軟件方法有:單標(biāo)志法、雙標(biāo)志先檢查法、雙標(biāo)志后檢查法、皮特森算法。
硬件實現(xiàn)方法有:中斷屏蔽法,硬件指令法
十一、什么是死鎖?死鎖產(chǎn)生的原因是什么?
死鎖是指多個進(jìn)程因為競爭資源造成的一種僵局,沒有外力作用,這些進(jìn)程都有無法向前繼續(xù)推進(jìn)。
死鎖產(chǎn)生的原因是系統(tǒng)資源的競爭和進(jìn)程推進(jìn)順序非法。
十二、死鎖產(chǎn)生的必要條件是什么?
互斥、不可剝奪、請求保持、循環(huán)等待
十三、死鎖的處理策略有什么?哪種方法最易于實現(xiàn)?哪種方法使資源利用率最高?
死鎖預(yù)防、死鎖避免、死鎖的檢測和解除。
其中銀行家算法是經(jīng)典的死鎖避免算法。
死鎖預(yù)防的方法是破壞死鎖產(chǎn)生的四個必要條件。
預(yù)防死鎖最容易實現(xiàn);避免死鎖使資源的利用率最高
十四、簡述死鎖定理
在資源分配圖中找到分配滿足的進(jìn)程,然后消去其請求邊與分配邊
如果最后所有邊都可以被消去 ,那么就是可以簡化的,不存在死鎖,反之存在死鎖
十五、死鎖的解除有哪幾種方法?
資源剝奪法、撤銷進(jìn)程法、進(jìn)程回退法。
十六、不同進(jìn)程之間存在著什么關(guān)系?
進(jìn)程之間存在同步與互斥的制約關(guān)系,
同步是指為完成某種任務(wù)而建立的兩個或多個進(jìn)程,這些進(jìn)程因為需要在某些位置上協(xié)調(diào)它們的工作次序而等待、傳遞信息所產(chǎn)生的制約關(guān)系。
互斥是指當(dāng)一個進(jìn)程進(jìn)入臨界區(qū)使用臨界資源時,另一個進(jìn)程必須等待,當(dāng)占用臨界資源的進(jìn)程退出臨界區(qū)后,另一進(jìn)程才允許去訪問此臨界資源
十七、PV操作描述:整形信號量、and型信號量、記錄型信號量
十八、為什么要引入進(jìn)程?
為了使程序在多道程序環(huán)境下能并發(fā)執(zhí)行,并對并發(fā)執(zhí)行的程序加以控制和描述,在操作系統(tǒng)中引入了進(jìn)程概念。
十九、什么是多線程?多線程和多任務(wù)的區(qū)別是什么?
多線程是指在一個程序中可以定義多個線程并同時運行它們,每個線程可以執(zhí)行不同的任務(wù)。
多線程與多任務(wù)的區(qū)別:多任務(wù)是針對操作系統(tǒng)而言的,代表操作系統(tǒng)可以同時執(zhí)行的程序個數(shù):多線程是針對一個程序而言的,代表一個程序可以同時執(zhí)行的線程個數(shù),而每個線程可以完成不同的任務(wù)。
二十、為什么要引入進(jìn)程同步的概念?
在多道程序共同執(zhí)行的條件下,進(jìn)程與進(jìn)程是并發(fā)執(zhí)行的,不同進(jìn)程之間存在不同的互相制約關(guān)系,為了協(xié)調(diào)進(jìn)程之間的互相制約關(guān)系,引入了進(jìn)程同步的概念。
二十一、簡述銀行家算法的工作原理
銀行家算法的主要思想是避免系統(tǒng)進(jìn)入不安全狀態(tài)。
在每次進(jìn)行資源分配時,
①它首先檢查系統(tǒng)是否有足夠的資源滿足要求,
②若有則先進(jìn)行分配,并對分配后的新狀態(tài)進(jìn)行安全性檢查。
③若新狀態(tài)安全,則正式分配上述資源,
④否則拒絕分配上述資源。
這樣,它保證系統(tǒng)始終處于安全狀態(tài),從而避免了死鎖的發(fā)生。
二十二、為什么要引入線程?
在操作系統(tǒng)中引入線程,則是為了減少程序在并發(fā)執(zhí)行時所付出的時空開銷,使OS具有更好的并發(fā)性,提高CPU的利用率。
二十三、PCB的作用是什么?PCB的組織方式有哪幾種?
PCB的作用是使一個在多道環(huán)境下不能獨立運行的程序,成為一個獨立運行的基本單位,一個能與其他進(jìn)程并發(fā)執(zhí)行的進(jìn)程。從OS的角度來看,OS是根據(jù)PCB來對并發(fā)執(zhí)行的進(jìn)程進(jìn)行控制和管理的。
PCB的組織方式有兩種:鏈接方式、索引方式
二十四、PCB中包含哪些信息?
進(jìn)程標(biāo)識符、處理機狀態(tài)、進(jìn)程調(diào)度信息、進(jìn)程控制信息
第三章 內(nèi)存管理
一、程序的創(chuàng)建步驟是什么?鏈接有哪幾種類型?裝入有哪幾種模式?
程序的創(chuàng)建分為編譯、鏈接、裝入三個步驟
鏈接有靜態(tài)鏈接、裝入時動態(tài)鏈接、運行時動態(tài)鏈接。
裝入模式有絕對裝入(單道程序環(huán)境)、可重定位裝入(多道程序環(huán)境)、動態(tài)運行時裝入(多道程序環(huán)境)。
二、邏輯地址與物理地址的區(qū)別是什么?
邏輯地址是相對地址,是程序按照各個模塊的相對地址構(gòu)成統(tǒng)一的從0號單元開始編址的邏輯地址空間。
物理地址是內(nèi)存中物理單元的集合,進(jìn)程在運行時執(zhí)行指令和訪問數(shù)據(jù)都要通過物理地址從內(nèi)存中存取。
三、內(nèi)存保護(hù)有哪幾種方法?
1.在CPU中設(shè)置一對上下限寄存器,存放用戶作業(yè)在內(nèi)存中的下限和上限地址。
2.采用重定位寄存器和界地址寄存器來實現(xiàn)這種保護(hù)。
四、內(nèi)存連續(xù)分配方式有哪幾種?
單一連續(xù)分配、固定分區(qū)分配、動態(tài)分區(qū)分配
五、動態(tài)分區(qū)的分配策略有哪幾種?
首次適應(yīng):空閑分區(qū)按照地址遞增的順序進(jìn)行查找,找到第一個滿足要求的分區(qū)進(jìn)行分配。
最佳適應(yīng):按容量遞增的順序進(jìn)行查找分區(qū),將第一個滿足條件的進(jìn)行分配。
最壞適應(yīng):空閑分區(qū)按照容量遞減的次序進(jìn)行查找,第一個滿足條件的進(jìn)行分配。
臨近適應(yīng):分配內(nèi)存時從上次查找結(jié)束的位置開始繼續(xù)查找。
其中首次適應(yīng)算法是最簡單的也是最好的和最快的。
六、描述基本分頁存儲管理方式中地址的變換過程
不帶快表:
1、根據(jù)邏輯地址分出頁號和頁內(nèi)偏移量。
2、判越界,比較頁號和頁表長度,若越界則產(chǎn)生越界中斷。
3、根據(jù) 頁表項地址=頁表始址+頁號*頁表項長度 查找頁表得到該頁的物理塊號
4、根據(jù)物理塊號和頁內(nèi)偏移量得到物理地址
帶快表:
1、根據(jù)邏輯地址分出頁號和頁內(nèi)偏移量。
2、查詢快表是否命中,若命中則根據(jù)物理塊號和頁內(nèi)偏移量得到物理地址
3、若不命中,判越界,比較頁號和頁表長度,若越界則產(chǎn)生越界中斷。
4、根據(jù) 頁表項地址=頁表始址+頁號*頁表項長度 查找頁表得到該頁的物理塊號
5、根據(jù)物理塊號和頁內(nèi)偏移量得到物理地址
七、描述基本分段存儲管理方式中地址的變換過程
不帶快表:
1、根據(jù)邏輯地址分出段號和段內(nèi)偏移量。
2、判越界,比較段號和段表長度,若越界則產(chǎn)生越界中斷。
3、根據(jù) 段表項地址=段表始址+段號段表項長度 查找段表得到該段的始址b和段長c,比較偏移地址與c的大小判斷是否越界
4、根據(jù)段表始址和段內(nèi)偏移量得到物理地址
帶快表:
1、根據(jù)邏輯地址分出段號和段內(nèi)偏移量。
2、查詢快表是否命中,若命中則根據(jù)快表得到該段的始址b和段長c,比較偏移地址與c的大小判斷是否越界,若不越界則根據(jù)段表始址b和段內(nèi)偏移量得到物理地址
3、若快表未命中,判越界,比較段號和段表長度,若越界則產(chǎn)生越界中斷。
4、根據(jù) 段表項地址=段表始址+段號段表項長度 查找段表得到該段的始址b和段長c,比較偏移地址與c的大小判斷是否越界
5、根據(jù)段表始址和段內(nèi)偏移量得到物理地址
八、分段與分頁的區(qū)別有哪些?
1.分頁對用戶不可見,分段對用戶可見。
2.分頁的地址空間是一維的,分段的地址空間是二維的。
3.分頁、分段訪問一個邏輯地址空間都需要兩次訪存(沒引入快表的情況下)
4.分段更容易實現(xiàn)信息的共享和保護(hù)。
九、分段與分頁的區(qū)別的優(yōu)缺點分別有哪些?
分頁管理:
優(yōu)點:內(nèi)存利用率高,無外部碎片,只有少量內(nèi)部碎片。
缺點:不方便按照邏輯模塊實現(xiàn)信息的保護(hù)和共享。
分段管理:
優(yōu)點:很方便按照邏輯模塊實現(xiàn)信息的保護(hù)和共享。
缺點:會產(chǎn)生外部碎片。
十、什么是局部性原理?
局部性分為時間局部性和空間局部性。
時間局部性是指一條指令執(zhí)行不久之后就可能再次被執(zhí)行,數(shù)據(jù)訪問后不久數(shù)據(jù)可能再次被訪問。
空間局部性是指一旦程序訪問了某個存儲單元,不久之后附近的存儲單元也將被訪問。
十一、請求分頁管理方式中的地址變換機構(gòu)是什么?
1、根據(jù)邏輯地址分出頁號和頁內(nèi)偏移量。
2、查詢快表是否命中,若命中則根據(jù)物理塊號和頁內(nèi)偏移量得到物理地址
3、若不命中,判越界,比較頁號和頁表長度,若越界則產(chǎn)生越界中斷。
4、根據(jù) 頁表項地址=頁表始址+頁號頁表項長度 查找頁表得到該頁的物理塊號
5、若沒有找到該頁的頁表,則到內(nèi)存中尋找該頁,若該頁在內(nèi)存中則調(diào)入頁表,若該頁不在內(nèi)存中,則產(chǎn)生缺頁中斷,請求從外存中把該頁調(diào)入內(nèi)存。
6、根據(jù)物理塊號和頁內(nèi)偏移量得到物理地址
十二、虛擬內(nèi)存是怎么解決問題的,它會帶來什么問題?
虛擬內(nèi)存使用外存的空間來擴充內(nèi)存的空間,通過一定的換入換出使得整個系統(tǒng)在邏輯上能夠使用一個遠(yuǎn)遠(yuǎn)超出其物理內(nèi)存大小的內(nèi)存容量。
在換入換出調(diào)換頁面時會訪問外存,導(dǎo)致平均訪存時間增加。
十三、簡述缺頁中斷和其它中斷的區(qū)別
(1) 普通中斷是CPU 都是在一條指令執(zhí)行完后,才檢查是否有中斷請求到達(dá)。然而缺頁中斷是在指令執(zhí)行期間,發(fā)現(xiàn)所要訪問的指令或數(shù)據(jù)不在內(nèi)存時所產(chǎn)生和處理的。
(2) 缺頁中斷一條指令在執(zhí)行期間,可能產(chǎn)生多次缺頁中斷。
十四、為什么要引入虛擬內(nèi)存?
在物理擴展內(nèi)存相對有限的條件下,應(yīng)嘗試以一些其他可行的方式在邏輯上擴充內(nèi)存。
十五、描述段頁式存儲管理方式中地址的變換過程
1、根據(jù)邏輯地址分出段號、頁號和頁內(nèi)偏移量。
2、判越界,比較段號和段表長度,若越界則產(chǎn)生越界中斷。
3、根據(jù) 段表項地址=段表始址+段號段表項長度 查找段表得到頁表長度c和頁表始址d,比較偏移地址與c的大小判斷是否越界。
4、若不越界則b根據(jù) 頁表項地址=頁表始址d+頁號*頁表項長度 查找頁表得到物理塊號b。
5.根據(jù)物理塊號b和頁內(nèi)偏移量計算出物理地址。
十六、為什么說分段系統(tǒng)比分頁系統(tǒng)更易于實現(xiàn)信息的共享和保護(hù)?
分頁系統(tǒng)的每個頁面是分散存儲的,為了實現(xiàn)信息共享保護(hù)需要建立大量的頁 表項;而分段系統(tǒng)的每個段都從0編址,并采用一段連續(xù)的地址空間,在實現(xiàn)共享和保護(hù)時,只需為要共享和保護(hù)的程序設(shè)置一個段表項,將其中的基址與內(nèi)存一一對應(yīng)就能夠?qū)崿F(xiàn)。
十七、虛擬存儲器有哪些特征?其中最本質(zhì)的特征是什么?
答:虛擬存儲器有多次性、對換性、虛擬性三大特征。最本質(zhì)的特征是虛擬性。
十八、請求分頁中地址變換的過程是什么
第四章 文件管理
一、創(chuàng)建文件的基本步驟
①在文件系統(tǒng)中為文件找到空間。
②在目錄中為新文件創(chuàng)建條目
二、文件的打開與關(guān)閉
操作系統(tǒng)維護(hù)一個包含所有打開文件信息的表,當(dāng)用戶需要一個文件操作時,可通過該表的一個索引指定文件。操作OPEN會根據(jù)文件名搜索目錄,并將目錄條目復(fù)制到文件打開表,OPEN通常返回一個指向文件打開表中的一個條目的指針,通過使用該指針進(jìn)行所有I/O操作,以簡化步驟并節(jié)省資源。
三、什么是文件的邏輯結(jié)構(gòu),文件的邏輯結(jié)構(gòu)如何分類?
文件的邏輯結(jié)構(gòu)是指從用戶的觀點出發(fā)看到的文件的組織形式。
文件的邏輯結(jié)構(gòu)可以分為記錄式文件(順序文件、索引文件、索引順序文件)和流式文件。
四、什么是文件控制塊?
文件控制塊是用來存放控制文件需要的各種信息的數(shù)據(jù)結(jié)構(gòu),以實現(xiàn)按名存取。
FCB主要包括基本信息、存取控制信息、使用信息。
五、文件的共享有哪幾種方式?
1.基于索引節(jié)點的共享方式(硬鏈接):硬鏈接是多個指針指向一個索引結(jié)點,保證只要還有一個指針指向索引節(jié)點,索引節(jié)點就不能刪除。
2.利用符號鏈實現(xiàn)文件共享(軟鏈接):軟連接就是把到達(dá)共享文件的路徑記錄下來,當(dāng)要訪問文件時,根據(jù)路徑尋找文件。
六、什么是文件的物理結(jié)構(gòu),文件的物理結(jié)構(gòu)如何分類,各有什么優(yōu)缺點?
文件的物理結(jié)構(gòu)是指文件在物理存儲設(shè)備上是如何分配和組織的。
分為連續(xù)分配、鏈接分配、索引分配
連續(xù)分配:
優(yōu)點:速度快,可以隨機訪問
缺點:要求連續(xù)的存儲空間,容易產(chǎn)生碎片,不利于文件擴充
鏈接分配:
優(yōu)點:易于文件擴充,不要求連續(xù)空間
缺點:只適合順序訪問,不適合隨機訪問
索引分配:
優(yōu)點:既支持順序訪問,又支持隨機訪問
缺點:索引表會占用一定空間
七、文件存儲空間管理方法
空閑表法、空閑鏈表法、位示圖法、成組鏈接法。
八、磁盤讀寫時間的組成
磁盤讀寫時間由尋找時間、延遲時間、傳輸時間組成。
尋找時間:活動頭磁盤在讀寫信息前,將磁頭移動到指定磁道所需要的時間。
延遲時間:磁頭定位到某一次到扇區(qū)所需要的時間,Tr=1/2r
傳輸時間:從磁盤讀出或向磁盤寫入數(shù)據(jù)經(jīng)過的時間。Tr=b/rN
九、何謂數(shù)據(jù)項、記錄和文件?
第五章 輸入、輸出管理
一、常見的四種I/O控制方式是什么?分別介紹
常見的I/O控制方式有程序直接控制方式、中斷驅(qū)動方式、DMA方式、通道控制方式。
1.程序直接控制方式:計算機從外部設(shè)備讀取數(shù)據(jù)到存儲器,對于每次讀入的數(shù)據(jù),CPU都要對外設(shè)狀態(tài)進(jìn)行狀態(tài)檢查,以確定該字已在I/O設(shè)備控制器的數(shù)據(jù)寄存器中。
2.中斷驅(qū)動方式:允許I/O設(shè)備主動打斷CPU的運行并請求服務(wù),從而解放CPU,使得其向I/O控制器發(fā)送讀命令后可以繼續(xù)做其他有用的工作
3.DMA方式:在I/O設(shè)備和內(nèi)存之間開辟直接的數(shù)據(jù)通路,傳輸數(shù)據(jù)塊,徹底接放CPU
4.I/O通道方式:I/O通道是專門負(fù)責(zé)輸入/輸出的處理機,可以將CPU對數(shù)據(jù)塊的讀(或?qū)?#xff09;及有關(guān)控制和管理減少為以組為單位的干預(yù)。
二、什么是I/O調(diào)度?
通過I/O調(diào)度改善系統(tǒng)的整體性能,使得進(jìn)程之間公平共享設(shè)備訪問,減少I/O完成所需要的平均等待時間。
三、緩沖區(qū)的作用(什么是緩沖區(qū))
為了緩解CPU與設(shè)備的速度不匹配的矛盾、提高CPU與I/O設(shè)備之間的并行性、減少對CPU的中斷頻率。
四、SPOOLING技術(shù)的目的是什么?
緩和CPU與I/O的速度差異矛盾。
五、SPOOLING系統(tǒng)的工作過程是什么?
工作過程:
輸入進(jìn)程:將用戶要求的數(shù)據(jù)從輸入機通過輸入緩沖區(qū)送到輸入井中,當(dāng)CPU需要數(shù)據(jù)時,直接將輸出井中的數(shù)據(jù)送入內(nèi)存
輸出進(jìn)程:將用戶要求輸出的數(shù)據(jù)先送到輸出井中,待輸出設(shè)備空閑時,再將輸出井中的數(shù)據(jù)通過輸出緩沖區(qū)送到輸出設(shè)備。
六、什么是獨占設(shè)備、共享設(shè)備、虛擬設(shè)備?
獨占設(shè)備:一個時段只能分配給一個進(jìn)程
共享設(shè)備:可同時分配給多個進(jìn)程使用的設(shè)備
虛擬設(shè)備:采用某種技術(shù)處理將獨占設(shè)備改造成虛擬的共享設(shè)備,可同時分配給多個進(jìn)程使用。
七、什么是設(shè)備獨立性,好處是什么?如何實現(xiàn)設(shè)備的獨立性?
應(yīng)用程序獨立于具體使用的物理設(shè)備,應(yīng)用程序以邏輯設(shè)備名請求使用某類設(shè)備。
優(yōu)點:
①設(shè)備分配時靈活。
②易于實現(xiàn)I/O重定向。
八、有哪些常見的緩沖模式?
單緩沖、雙緩沖、循環(huán)緩沖、緩沖池
九、通道采用交叉連接的原因是什么?
通道采用交叉連接是為了緩解通道不足引起的“瓶頸”現(xiàn)象,增加I/O與主存之間的通路,既解決瓶頸現(xiàn)象,又提高系統(tǒng)的可靠性。
十、通道與一般處理機的區(qū)別是什么?
1、通道類型單一,只局限于I/O操作有關(guān)的指令。
2、通道沒有自己的內(nèi)存。
十一、RAID的優(yōu)點有什么?
1.可靠性高。
2.磁盤I/O速度高。
3.性價比高。
十二、說明DMA的工作流程。
①向磁盤控制器發(fā)送讀/寫命令,放入命令寄存器CR中。
②發(fā)送讀入/寫入的數(shù)據(jù)的內(nèi)存起始目標(biāo)地址,送入內(nèi)存地址寄存器MAR。
③發(fā)送讀入/寫入的數(shù)據(jù)的字節(jié)數(shù),送入數(shù)據(jù)計數(shù)器DC。
④將磁盤中的源地址直接送至DMA控制器的I/O控制邏輯上。
⑤啟動DMA控制器進(jìn)行數(shù)據(jù)傳輸,cpu去處理其他任務(wù)。
十三、為什么要引入高速緩沖?何謂高速緩沖?
為提高磁盤I/O的速度,便引入了磁盤高速緩沖。
磁盤高速緩沖是指利用內(nèi)存中的存儲空間,暫存從磁盤中讀出的一系列盤塊中的信息。
十四、廉價磁盤冗余陣列是如何提高對磁盤的訪問速度和可靠性的?
廉價磁盤冗余陣列RAID是利用一臺磁盤陣列控制器,統(tǒng)一管理和控制一組(幾臺到幾十臺)磁盤驅(qū)動器,組成高度可靠快速大容量的磁盤系統(tǒng)。
用戶數(shù)據(jù)和系統(tǒng)數(shù)據(jù)可分布在陣列的所有磁盤中,并采取并行傳輸方式,大大減少數(shù)據(jù)傳輸時間和提高了可靠性,
操作系統(tǒng)簡答題補充:
1、文件的幾種操作
創(chuàng)建文件:
①為新文件分配必要的外存空間。
②在文件系統(tǒng)的目錄中,為之建立一個目錄項。
刪除文件
①系統(tǒng)應(yīng) 先從目錄中找到要刪除文件的目錄項,使之成為空項。
②然后回收該文件所占用的存儲空間。
讀、寫文件:
先查找目錄,找到指定文件的目錄項,再利用目錄中的指針進(jìn)行讀/寫操作。
2、什么是隱式連接分配,什么是顯式鏈接分配?
隱式連接分配:在文件目錄的每個目錄項中,都須含有指向鏈接文件第一個盤塊和最后一個盤塊的指針,且在每個盤塊中都含有一個指向下一個盤塊的指針。
顯式鏈接分配:把用于鏈接文件各物理塊的指針,顯式地存放在內(nèi)存的一張鏈接表中。
3、什么是索引塊?
索引分配方式為每個文件分配一個索引塊(表),再把分配給該文件的所有盤塊號都記錄在該索引塊中,因而該索引塊就是一個含有許多盤塊號的數(shù)組。
4、什么是文件控制塊FCB?
為了能對一個文件進(jìn)行正確的存取,必須為文件設(shè)置用于描述和控制文件的數(shù)據(jù)結(jié)構(gòu),稱之為FCB. 文件管理程序可借助于文件控制塊中的信息,對文件施以各種操作。
在文件控制塊中,通常應(yīng)含有三類信息,
即基本信息、存取控制信息及使用信息。
5、什么是目錄?
文件目錄是文件控制塊的有序集合。
6、什么是索引節(jié)點?
使文件描述信息單獨形成一個稱為索引結(jié)點的數(shù)據(jù)結(jié)構(gòu), 簡稱為i 結(jié)點。在文件目錄中的每個目錄項僅由文件名和指向該文件所對應(yīng)的i 結(jié)點的指針?biāo)鶚?gòu)成。
7、常用的目錄結(jié)構(gòu)形式有哪些?
常用的目錄結(jié)構(gòu)形式有單級目錄、兩級目錄和多級目錄。
8、目錄的實現(xiàn)方式有哪幾種?
①線性結(jié)構(gòu):使用存儲文件名和數(shù)據(jù)塊指針的線性表。
②哈希表:根據(jù)文件名得到一個值,然后返回一個指向線性列表中元素的指針。
9、文件存儲空間的管理方法有哪幾種?
空閑表法、空閑鏈表法、位示圖法、成組鏈接法。
空閑表法:系統(tǒng)為空閑區(qū)建立一張空閑盤塊表存放每個空閑區(qū)第一個盤塊號、該區(qū)的空閑盤塊數(shù)等信息。
空閑鏈表法:將所有的空閑盤區(qū)拉成一條空閑鏈。
位示圖法:用二進(jìn)制來表示一個盤快的使用情況,每一個盤塊都有一個二進(jìn)制位與之對應(yīng)。
成組鏈接法:
第三章 內(nèi)存管理
1、內(nèi)存的連續(xù)分配方法和回收方法
2、如何將一個用戶源程序變?yōu)橐粋€在內(nèi)存中執(zhí)行的程序?
①編譯:將用戶的源代碼編譯成若干個目標(biāo)模塊。
②鏈接:將一組目標(biāo)模塊以及他們所需要的庫函數(shù)鏈接在一起,形成一個完整的裝入模塊。
③裝入:由裝入程序?qū)⒀b入模塊裝入內(nèi)存。
3、什么是“緊湊”,緊湊操作之后要注意什么?
通過移動內(nèi)存中作業(yè)的位置,以把原來多個分散的小分區(qū)拼接成一個大分區(qū)的方法,稱為“拼接”或“緊湊”。由于經(jīng)過緊湊后的某些用戶程序在內(nèi)存中的位置發(fā)生了變化,此時若不對程序和數(shù)據(jù)的地址加以修改(變換),則程序必將無法執(zhí)行。為此,
在每次“緊湊”后,都必須對移動了的程序或數(shù)據(jù)進(jìn)行重定位。
第二章
1、程序順序執(zhí)行時的特征和并發(fā)執(zhí)行的特征?
順序執(zhí)行:順序性、封閉性、可再現(xiàn)性。
并發(fā)執(zhí)行:間斷性、失去封閉性、不可再現(xiàn)性。
2、信號量機制
①整型信號量
wait(S): while S<=0 do no-op;
S:=S-1;
signal(S): S:=S+1;
②記錄型信號量
(以下部分只需理解)
③AND型信號量
3.消息緩沖隊列的通信機制
計算機網(wǎng)絡(luò)部分
計算機網(wǎng)絡(luò)面試題
IP和mac的區(qū)別?
IP是網(wǎng)絡(luò)層地址,MAC是數(shù)據(jù)鏈路層且地址是全球唯一的。
登陸baidu.com,簡述協(xié)議過程
1、解析baidu.com域名對應(yīng)的ip地址(ARRP(獲得網(wǎng)關(guān)地址) - DNS(獲得IP地址))
2、得到baidu.com對應(yīng)的IP后,客戶端會發(fā)送TCP的三次握手,進(jìn)行連接;
3、連接成功后,使用HTTP協(xié)議發(fā)送請求數(shù)據(jù)包給WEB服務(wù)器;
4、web服務(wù)器受到數(shù)據(jù)請求后,通過查詢自己的服務(wù)器的到對應(yīng)的結(jié)果,并將結(jié)果原路返回給瀏覽器;
5、瀏覽器收到數(shù)據(jù)后,通過瀏覽器的渲染結(jié)果來顯示網(wǎng)頁;
6、瀏覽器關(guān)閉TCP,即四次揮手離別。
hub,switch,router屬于OSI哪一層?
hub是集線器屬于物理層,交換機是數(shù)據(jù)鏈路層,router是路由器網(wǎng)絡(luò)層的,負(fù)責(zé)不同網(wǎng)絡(luò)結(jié)合。
子網(wǎng)掩碼和IP地址怎么理解?
在國際互聯(lián)網(wǎng)(Internet)上有成千百萬臺主機(host),為了區(qū)分這些主機,人們給每臺主機都分配了一個專門的“地址”作為標(biāo)識,稱為IP地址。子網(wǎng)掩碼的作用是用來區(qū)分網(wǎng)絡(luò)上的主機是否在同一網(wǎng)絡(luò)段內(nèi)。子網(wǎng)掩碼不能單獨存在,它必須結(jié)合IP地址一起使用。子網(wǎng)掩碼只有一個作用,就是將某個IP地址劃分成網(wǎng)絡(luò)地址和主機地址兩部分。
ipv4,ipv6的區(qū)別?
IPV6更安全,更大的存儲空間。
XML和HTML區(qū)別?
跨平臺的標(biāo)記語言,重在儲存數(shù)據(jù)。HTML重在存儲界面顯示內(nèi)容
OSI模型全稱?
Opening System Interconnection - Reference Model
DNS工作過程?
應(yīng)用層協(xié)議,使用UDP。分為迭代查詢和遞歸查詢。采用分布式集群的工作方式,防止單點故障,增加通信容量。
迭代:主機訪問本地域名服務(wù)器,若緩存沒有IP則本地域名服務(wù)器進(jìn)一步向其他根域名服務(wù)器查詢。
遞歸:主機分別向多個服務(wù)器發(fā)出查詢請求。
UDP的優(yōu)點?
發(fā)送前無需連接,減少了開銷和時延,首部開銷小,無擁塞控制,方便實時應(yīng)用,不保證可靠交付,無需維持連接狀態(tài)表。UDP的可靠性要通過應(yīng)用層來控制。
Q:擁塞控制和流量控制都是什么,兩者的區(qū)別?
流量控制是端到端的控制,例如A通過網(wǎng)絡(luò)給B發(fā)數(shù)據(jù),A發(fā)送的太快導(dǎo)致B沒法接收(B緩沖窗口過小或者處理過慢),這時候的控制就是流量控制,原理是通過滑動窗口的大小改變來實現(xiàn)。
擁塞控制是A與B之間的網(wǎng)絡(luò)發(fā)生堵塞導(dǎo)致傳輸過慢或者丟包,來不及傳輸。防止過多的數(shù)據(jù)注入到網(wǎng)絡(luò)中,這樣可以使網(wǎng)絡(luò)中的路由器或鏈路不至于過載。擁塞控制是一個全局性的過程,涉及到所有的主機、路由器,以及與降低網(wǎng)絡(luò)性能有關(guān)的所有因素。
Q:談?wù)剬CP/IP協(xié)議的理解
簡述計算機網(wǎng)絡(luò)分層的好處
計算機網(wǎng)絡(luò)是一個復(fù)雜的系統(tǒng),采用層次化結(jié)構(gòu)的方法來描述它,可以將復(fù)雜的網(wǎng)絡(luò)間題分解為許多比較小的、界線比較清晰簡單的部分來處理;
一靈活性好。
二 各層之間是獨立的。
三易于實現(xiàn)和維護(hù)。
四能促進(jìn)標(biāo)準(zhǔn)化工作。
十五.簡述你對面向連接服務(wù)的理解?
在面向連接服務(wù)中, 通信前雙方必須先建立連接, 分配相應(yīng)的資源(如緩沖區(qū)), 以保證通
信能正常進(jìn)行, 傳輸結(jié)束后釋放連接和所占用的資源。因此這種服務(wù)可以分為連接建立、數(shù)據(jù)傳
輸和連接釋放三個階段。例如TCP就是一種面向連接服務(wù)的協(xié)議。
在無連接服務(wù)中, 通信前雙方不需要先建立連接, 需要發(fā)送數(shù)據(jù)時可直接發(fā)送,把每個帶有
目的地址的包(報文分組) 傳送到線路上, 由系統(tǒng)選定路線進(jìn)行傳輸。這是一種不可靠的服務(wù)。
這種服務(wù)常被描述為“盡最大努力交付" (Best-Effort-Delivery), 它并不保證通信的可靠性。例如
IP、UDP就是一種無連接服務(wù)的協(xié)議。
十六簡述你對客戶服務(wù)器工作方式的理解
互聯(lián)網(wǎng)應(yīng)用系統(tǒng)采用客戶/服務(wù)器模式的主要原因是網(wǎng)絡(luò)資源分布的不均勻性
十七什么是 MAC 地址和 IP 地址,分析他們的區(qū)別和兩者之間的轉(zhuǎn)換機制。
1.對于IP地址,相信大家都很熟悉,即指使用TCP/IP協(xié)議指定給主機的32位地址。IP地址由用點分隔開的4個8八位組構(gòu)成,
2 對于MAC地址,由于我們不直接和它接觸,所以大家不一定很熟悉。MAC地址也叫物理地址、硬件地址或鏈路地址,由網(wǎng)絡(luò)設(shè)備制造商生產(chǎn)時寫在硬件內(nèi)部。這個地址與網(wǎng)絡(luò)無關(guān),也即無論將帶有這個地址的硬件(如網(wǎng)卡、集線器、路由器等)接入到網(wǎng)絡(luò)的何處,它都有相同的MAC地址,MAC地址一般不可改變,不能由用戶自己設(shè)定。
TCP協(xié)議是面向連接的,但TCP使用的IP協(xié)議卻是無連接的.這兩種協(xié)議都有哪些主要的區(qū)別.
IP協(xié)議提供的是不可靠的,面向非連接的服務(wù)
TCP協(xié)議提供的是可靠的,面向連接的服務(wù)
TCP協(xié)議實現(xiàn)的是主機應(yīng)用程序之間的通信,IP協(xié)議只實現(xiàn)主機間的通信
TCP協(xié)議是以IP協(xié)議為基礎(chǔ)實現(xiàn)的,給應(yīng)用層提供服務(wù);IP協(xié)議為TCP協(xié)議提供服務(wù).
簡單來說,IP協(xié)議負(fù)責(zé)將數(shù)據(jù)從一臺主機傳輸?shù)搅硪慌_主機,而TCP協(xié)議保證傳輸?shù)恼_性.
假定所有的路由器和主機都正常工作,所有軟件也都正常運行.那么是否還有可能會把分組投遞到錯誤的目的地址?
有可能.因為分組在傳輸過程中可能遭到破壞,分組的校驗和并不能檢查出所有的差錯.如果分組的目的地址字段在傳輸過程中改變,但整個分組的校驗和檢驗仍然正確,分組將會被投遞到錯誤的目的地址,并可能被接收為正確的分組.盡管這種可能性很小,但仍可能發(fā)送.
應(yīng)用層的協(xié)議如HTTP,FTP,SMTP,POP3分別使用的是運輸層的什么協(xié)議?Why?
都是運行在TCP協(xié)議上的.因為它們都需要數(shù)據(jù)傳輸?shù)目煽啃?而TCP協(xié)議提供了面向連接的可靠數(shù)據(jù)傳輸服務(wù),這樣使得高層協(xié)議不需要考慮數(shù)據(jù)傳輸?shù)目煽啃詥栴}.如果采用無連接,不可靠的UDP協(xié)議(例如TFTP高層協(xié)議),高層協(xié)議就需要采取比較復(fù)雜的機制來進(jìn)行確認(rèn),重傳以保證數(shù)據(jù)傳輸?shù)目煽啃?
單工、半雙工、全雙工
單工:又稱為單向通信,即只能有一個方向的通信而沒有反方向的交互。例:無線電廣播,電視廣播
半雙工:又稱為雙向交替通信,即通信的雙方都可以發(fā)送信息,但不能雙方同時發(fā)送(當(dāng)然也就不能同時接受)
全雙工:又稱為雙向同時通信,即通信的雙方可以同時發(fā)送和接受信息。
單工只要一條信道,而半雙工和全雙工需都需要兩條信道(每個方向各一條)。
頻分復(fù)用 時分復(fù)用 波分復(fù)用 碼分復(fù)用
頻分復(fù)用:給每個信號分配唯一的載波頻率并通過單一媒體來傳輸多個獨立信號的方法。
時分復(fù)用:把多個信號復(fù)用到單個硬件傳輸信道,它允許每個信號在一個很短的時間使用信道,接著再讓 下一個信號使用。
波分復(fù)用:就是光的頻分復(fù)用。用一根光纖同時傳輸多個頻率很接近的光載波信號。
碼分復(fù)用:碼分復(fù)用是用一組包含互相正交的碼字的碼組攜帶多路信號。每一個用戶可以在同樣的時間使 用同樣的頻帶進(jìn)行通信。由于各用戶使用經(jīng)過特殊挑選的不同碼型,各用戶之間不會造成干擾,因此這種 系統(tǒng)發(fā)送的信號有很強的抗干擾能力。
頻分復(fù)用如何避免各路信號間的干擾
頻分復(fù)用要求總頻率寬度大于各個子信道頻率之和,同時為了保證各子信道中所傳輸?shù)男盘柣ゲ桓蓴_,應(yīng)在各子信道之間設(shè)立隔離帶(也就是保護(hù)頻帶,即插入一些 空白的頻段 ),這樣就保證了各路信號互不干擾
CSMA/CD 協(xié)議 如果兩端同時發(fā)送信息會出現(xiàn)什么情況,為什么?
兩端都檢測到?jīng)_突,均停止發(fā)送數(shù)據(jù),等待一個隨機時間再重發(fā)
連接兩個局域網(wǎng)需要用什么設(shè)備,在哪一層
首先,來區(qū)分以下幾個常見設(shè)備:
物理層設(shè)備:中繼器,集線器 —— 均不能隔離沖突域和廣播域
中繼器(RP repeater):是工作在物理層上的連接設(shè)備。適用于完全相同的兩個網(wǎng)絡(luò)的互連,主要功能是通過對數(shù)據(jù)信號的重新發(fā)送或者轉(zhuǎn)發(fā),來擴大網(wǎng)絡(luò)傳輸?shù)木嚯x。 中繼器是對信號進(jìn)行再生和還原的網(wǎng)絡(luò)設(shè)備,設(shè)計的目的是給你的網(wǎng)絡(luò)信號以推動,以使它們傳輸?shù)酶h(yuǎn)。
集線器(Hub):“Hub”是“中心”的意思,集線器的主要功能是對接收到的信號進(jìn)行再生整形放大,以擴大網(wǎng)絡(luò)的傳輸距離,同時把所有節(jié)點集中在以它為中心的節(jié)點上。它可以視作多端口的中繼器,若它偵測到碰撞,它會提交阻塞信號。
鏈路層設(shè)備:網(wǎng)橋,交換機 —— 隔離沖突域不能隔離廣播域
網(wǎng)橋(Bridge) : 是早期的兩端口二層網(wǎng)絡(luò)設(shè)備,用來連接不同網(wǎng)段。網(wǎng)橋的兩個端口分別有一條獨立的交換信道,不是共享一條背板總線,可隔離沖突域。網(wǎng)橋比集線器(Hub)性能更好,集線器上各端口都是共享同一條背板總線的。后來,網(wǎng)橋被具有更多端口、同時也可隔離沖突域的交換機(Switch)所取代。
網(wǎng)橋(Bridge)像一個聰明的中繼器。中繼器從一個網(wǎng)絡(luò)電纜里接收信號, 放大它們,將其送入下一個電纜。相比較而言,網(wǎng)橋?qū)年P(guān)卡上傳下來的信息更敏銳一些。網(wǎng)橋是一種對幀進(jìn)行轉(zhuǎn)發(fā)的技術(shù),根據(jù)MAC分區(qū)塊,可隔離碰撞。網(wǎng)橋?qū)⒕W(wǎng)絡(luò)的多個網(wǎng)段在數(shù)據(jù)鏈路層連接起來。
網(wǎng)橋也叫橋接器,是連接兩個局域網(wǎng)的一種存儲/轉(zhuǎn)發(fā)設(shè)備,它能將一個大的LAN分割為多個網(wǎng)段,或?qū)蓚€以上的LAN互聯(lián)為一個邏輯LAN,使LAN上的所有用戶都可訪問服務(wù)器。
擴展局域網(wǎng)最常見的方法是使用網(wǎng)橋。最簡單的網(wǎng)橋有兩個端口,復(fù)雜些的網(wǎng)橋可以有更多的端口。網(wǎng)橋的每個端口與一個網(wǎng)段相連。
交換機(Switch) 意為“開關(guān)”是一種用于電(光)信號轉(zhuǎn)發(fā)的網(wǎng)絡(luò)設(shè)備。它可以為接入交換機的任意兩個網(wǎng)絡(luò)節(jié)點提供獨享的電信號通路。最常見的交換機是以太網(wǎng)交換機。其他常見的還有電話語音交換機、光纖交換機等。
交換是按照通信兩端傳輸信息的需要,用人工或設(shè)備自動完成的方法,把要傳輸?shù)男畔⑺偷椒弦蟮南鄳?yīng)路由上的技術(shù)的統(tǒng)稱。交換機根據(jù)工作位置的不同,可以分為廣域網(wǎng)交換機和局域網(wǎng)交換機。廣域的交換機就是一種在通信系統(tǒng)中完成信息交換功能的設(shè)備,它應(yīng)用在數(shù)據(jù)鏈路層。交換機有多個端口,每個端口都具有橋接功能,可以連接一個局域網(wǎng)或一臺高性能服務(wù)器或工作站。實際上,交換機有時被稱為多端口網(wǎng)橋。
網(wǎng)絡(luò)交換機,是一個擴大網(wǎng)絡(luò)的器材,能為子網(wǎng)絡(luò)中提供更多的連接端口,以便連接更多的計算機。隨著通信業(yè)的發(fā)展以及國民經(jīng)濟(jì)信息化的推進(jìn),網(wǎng)絡(luò)交換機市場呈穩(wěn)步上升態(tài)勢。它具有性價比高、高度靈活、相對簡單和易于實現(xiàn)等特點。以太網(wǎng)技術(shù)已成為當(dāng)今最重要的一種局域網(wǎng)組網(wǎng)技術(shù),網(wǎng)絡(luò)交換機也就成為了最普及的交換機。
網(wǎng)路層設(shè)備:路由器 —— 隔離沖突域和廣播域
路由器 又可以稱之為網(wǎng)關(guān)設(shè)備。對不同的網(wǎng)絡(luò)之間的數(shù)據(jù)包進(jìn)行存儲、分組轉(zhuǎn)發(fā)處理,其主要就是在不同的邏輯分開網(wǎng)絡(luò)。而數(shù)據(jù)在一個子網(wǎng)中傳輸?shù)搅硪粋€子網(wǎng)中,可以通過路由器的路由功能進(jìn)行處理。在網(wǎng)絡(luò)通信中,路由器具有判斷網(wǎng)絡(luò)地址以及選擇IP路徑的作用,可以在多個網(wǎng)絡(luò)環(huán)境中,構(gòu)建靈活的鏈接系統(tǒng),通過不同的數(shù)據(jù)分組以及介質(zhì)訪問方式對各個子網(wǎng)進(jìn)行鏈接。路由器在操作中僅接受源站或者其他相關(guān)路由器傳遞的信息,是一種基于網(wǎng)絡(luò)層的互聯(lián)設(shè)備。
比如你買了個路由器,有2臺電腦,在路由器的這邊你家就是一個局域網(wǎng),而在路由器的那邊卻是一個互聯(lián)網(wǎng),所以路由器可以連接兩個不同類型的網(wǎng)絡(luò)。
綜上可得,連接兩個局域網(wǎng),即連接兩個同類型網(wǎng)絡(luò),需要使用網(wǎng)橋或者交換機,工作在數(shù)據(jù)鏈路層
什么是滑動窗口協(xié)議
滑動窗口協(xié)議,是TCP使用的一種流量控制方法。該協(xié)議允許發(fā)送方在停止并等待確認(rèn)前可以連續(xù)發(fā)送 多個分組。由于發(fā)送方不必每發(fā)一個分組就停下來等待確認(rèn),因此該協(xié)議可以加速數(shù)據(jù)的傳輸。
流量控制在哪些層實現(xiàn)
流量控制就是要控制發(fā)送方數(shù)據(jù)傳輸?shù)乃俾?#xff0c;使接收方來得及接收
傳輸層
TCP流量控制,利用滑動窗口機制控制發(fā)送方的速度
數(shù)據(jù)鏈路層/傳輸層
ARQ停等協(xié)議
IPV4和IPV6的位數(shù)
IPV4是32位;IPV6是128位
IPv4地址缺乏的解決辦法(替代方案)
NAT 網(wǎng)絡(luò)地址轉(zhuǎn)換:根據(jù)NAT轉(zhuǎn)換表,NAT路由器將 專用網(wǎng)上的IP地址 和 因特網(wǎng)上的外部全球唯一IP地址 進(jìn)行轉(zhuǎn)化
CIDR 無分類編址,構(gòu)成超網(wǎng):CIDR消除了傳統(tǒng)的A類、B類和C類地址以及劃分子網(wǎng)的概念,融合子網(wǎng)地址和子網(wǎng)掩碼,方便子網(wǎng)劃分,把網(wǎng)絡(luò)前綴都相同的連續(xù)IP地址組成一個CIDR地址塊
IPv4和IPv6如何相互通信?
32位的IPV4地址空間已分配殆盡,CIDR、NAT治標(biāo)不治本,IPV6從根本上解決地址耗盡問題。
IPV4向IPV6過渡的策略:
雙棧協(xié)議:同時啟用IPV4和IPV6協(xié)議棧
隧道技術(shù):將其他協(xié)議的數(shù)據(jù)幀或包重新封裝然后通過隧道發(fā)送
為什么要三次握手,兩次為什么不行?
如果只有兩次:客戶機首先請求與服務(wù)器連接;服務(wù)器同意連接同時準(zhǔn)備內(nèi)存資源,并發(fā)報文給客戶機,萬一這個報文中途丟失,客戶機一直不給服務(wù)器響應(yīng),基于兩次握手,服務(wù)器認(rèn)為已經(jīng)成功建立連接,就一直等待,實際上根本沒通。所以需要三次握手才靠譜
有哪些交換技術(shù)?
電路交換
優(yōu)點:傳輸時延小、沒有沖突、實時性強;
缺點:獨占式信道利用率低、建立連接時間長、靈活性差。
報文交換
優(yōu)點:無需建立連接、信道利用率高;
缺點:轉(zhuǎn)發(fā)時延長、要求的緩存空間大。
分組交換(無連接的數(shù)據(jù)報、面向連接的虛電路)
優(yōu)點:無需建立連接、信道利用率高、簡化了存儲管理、加速了傳輸;
缺點:存在發(fā)送時延、可能會存在分組失序、丟失、重復(fù)。
虛電路和數(shù)據(jù)報有什么區(qū)別?
虛電路技術(shù)
主要特點:在數(shù)據(jù)傳輸之前必須通過虛呼叫設(shè)置一條虛電路,可靠由網(wǎng)絡(luò)來保證,它適用于兩端之間長時間的數(shù)據(jù)交換。 有連接。分組均按同一路由進(jìn)行轉(zhuǎn)發(fā)。分組按順序到達(dá)。當(dāng)接電出故障,所有通過故障結(jié)點的虛電路均不能工作。
優(yōu)點:可靠、保持順序;
缺點:如有故障,則經(jīng)過故障點的數(shù)據(jù)全部丟失.
數(shù)據(jù)報
特點:在數(shù)據(jù)報方式中,每個分組被稱為一個數(shù)據(jù)報,在目的地需要重新組裝報文,可靠性由用戶主機來保證。 無連接。分組獨立選擇路由進(jìn)行轉(zhuǎn)發(fā)。分組到達(dá)順序不一定。接電
優(yōu)點:如有故障可繞過故障點。
缺點:不能保證按順序到達(dá),丟失不能立即知曉。
從單獨的通信網(wǎng)來說,采用有連接的虛電路方式,或是采用無連接的數(shù)據(jù)報方式都是可以的。但是對于網(wǎng)間互聯(lián)或IP業(yè)務(wù),則是采用數(shù)據(jù)報方式有利。因為數(shù)據(jù)報方式可以最大限度地節(jié)省對網(wǎng)絡(luò)節(jié)點的處理要求,不需要采取可靠性措施或流量控制,不需要預(yù)先建立邏輯的連接路徑。
它在遇到網(wǎng)內(nèi)擁塞等情況時,可以迅速改變路由,因而適用于各種不同類型的網(wǎng)絡(luò)。在國際計算機互聯(lián)網(wǎng)(因特網(wǎng))中,用的就是數(shù)據(jù)報方式。虛電路適合于交互式通信,數(shù)據(jù)報方式更適合于單向地傳送短信息。
TCP中的流量控制和擁塞控制
注:tcp協(xié)議如何保證傳輸?shù)目煽啃?/p>
流量控制主要針對的是端到端傳輸中控制流量大小并保證傳輸可靠性(未收到ack就不滑動)。流量控制往往是指點對點通信量的控制,所要做的是抑制發(fā)送端發(fā)送數(shù)據(jù)的速率。
擁塞控制主要是一個全局性過程,涉及到所有主機,路由器,以及與降低網(wǎng)絡(luò)傳輸性能有關(guān)的所有因素。防止過多的數(shù)據(jù)注入到網(wǎng)絡(luò)中。如果有發(fā)生丟包則通過擁塞控制減小窗口,確定出合適(慢啟動 擁塞避免 快重傳 快恢復(fù))的擁塞窗口(增性加乘性減)。
注:
1). 慢啟動:不要一開始就發(fā)送大量的數(shù)據(jù),先探測一下網(wǎng)絡(luò)的擁塞程度,也就是說由小到大逐漸增加擁塞窗口的大小;
2). 擁塞避免:擁塞避免算法讓擁塞窗口緩慢增長,即每經(jīng)過一個往返時間RTT就把發(fā)送方的擁塞窗口cwnd加1,而不是加倍,這樣擁塞窗口按線性規(guī)律緩慢增長。
3). 快重傳:快重傳要求接收方在收到一個 失序的報文段 后就立即發(fā)出 重復(fù)確認(rèn)(為的是使發(fā)送方及早知道有報文段沒有到達(dá)對方)而不要等到自己發(fā)送數(shù)據(jù)時捎帶確認(rèn)。快重傳算法規(guī)定,發(fā)送方只要一連收到三個重復(fù)確認(rèn)就應(yīng)當(dāng)立即重傳對方尚未收到的報文段,而不必繼續(xù)等待設(shè)置的重傳計時器時間到期。
4). 快恢復(fù):快重傳配合使用的還有快恢復(fù)算法,當(dāng)發(fā)送方連續(xù)收到三個重復(fù)確認(rèn)時,就執(zhí)行“乘法減小”算法,把ssthresh門限減半,但是接下去并不執(zhí)行慢開始算法:因為如果網(wǎng)絡(luò)出現(xiàn)擁塞的話就不會收到好幾個重復(fù)的確認(rèn),所以發(fā)送方現(xiàn)在認(rèn)為網(wǎng)絡(luò)可能沒有出現(xiàn)擁塞。所以此時不執(zhí)行慢開始算法,而是將cwnd設(shè)置為ssthresh的大小,然后執(zhí)行擁塞避免算法。
5 TCP可靠傳輸
TCP可靠傳輸
使用機制:校驗、序號、確認(rèn)、重傳
校驗:TCP的校驗機制和UDP相同;
序號:TCP首部的序號字段用來保證數(shù)據(jù)能有序提交到應(yīng)用層(只保證有序發(fā)送,不保證有序到達(dá));
確認(rèn):TCP采用累積確認(rèn),確認(rèn)號是期望收到對方下一個報文段的數(shù)據(jù)的第一個字節(jié)的序號;
重傳:導(dǎo)致TCP重傳的兩種事件:超時和冗余ACK
6 Get與POST的區(qū)別
GET與POST是我們常用的兩種HTTP Method,二者之間的區(qū)別主要包括如下五個方面:
(1). 從功能上講,GET一般用來從服務(wù)器上獲取資源,POST一般用來更新服務(wù)器上的資源;
(2). 從REST服務(wù)角度上說,GET是冪等的,即讀取同一個資源,總是得到相同的數(shù)據(jù),
而POST不是冪等的,因為每次請求對資源的改變并不是相同的;
進(jìn)一步地,GET不會改變服務(wù)器上的資源,而POST會對服務(wù)器資源進(jìn)行改變;
(3). 從請求參數(shù)形式上看,GET請求的數(shù)據(jù)會附在URL之后,即將請求數(shù)據(jù)放置在HTTP報文的 請求頭 中,以?分割URL和傳輸數(shù)據(jù),參數(shù)之間以&相連
。特別地,如果數(shù)據(jù)是英文字母/數(shù)字,原樣發(fā)送;否則,會將其編碼為 application/x-www-form-urlencoded MIME 字符串(如果是空格,轉(zhuǎn)換為+,如果是中文/其他字符,則直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX為該符號以16進(jìn)制表示的ASCII);
而POST請求會把提交的數(shù)據(jù)則放置在是HTTP請求報文的 請求體 中。
(4). 就安全性而言,POST的安全性要比GET的安全性高,因為GET請求提交的數(shù)據(jù)將明文出現(xiàn)在URL上,而且POST請求參數(shù)則被包裝到請求體中,相對更安全。
(5). 從請求的大小看,GET請求的長度受限于瀏覽器或服務(wù)器對URL長度的限制,允許發(fā)送的數(shù)據(jù)量比較小,而POST請求則是沒有大小限制的。
C++
C++面試題
C++
c++和c中字符串區(qū)別?
c++是類,c中是基本類型函數(shù)。
C++的特點是什么?
封裝,繼承,多態(tài)。支持面向?qū)ο蠛兔嫦蜻^程的開發(fā)。
C++的異常處理機制?
拋出異常和捕捉異常進(jìn)行處理。(實際開發(fā))
c和c++,java的區(qū)別?
c是純過程,c++是對象加過程,java是純面向?qū)ο蟮?/p>
純虛函數(shù)?
被virtual修飾的成員函數(shù),再基類不能實現(xiàn),而他的實現(xiàn)放到派生類中實現(xiàn)。
什么是內(nèi)存泄漏?
內(nèi)存泄漏(Memory Leak)是指程序中己動態(tài)分配的堆內(nèi)存由于某種原因程序未釋放或無法釋放,造成系統(tǒng)內(nèi)存的浪費,導(dǎo)致程序運行速度減慢甚至系統(tǒng)崩潰等嚴(yán)重后果。
指針和引用的區(qū)別?
指針是一個存儲地址的變量,該地址為內(nèi)存的一個存儲單元;引用是原變量的一個別名;
指針可以為空,而引用不能為空;
指針可以有多級,而引用只能有一級;
指針可以重新賦值,而引用只能初始化一次
sizeof引用得到的是變量大小,而sizeof指針得到的是指針本身大小
將引用作為函數(shù)返回值的好處是?
在內(nèi)存中不會產(chǎn)生被返回值的副本,同時不能返回局部變量的引用,因為隨著調(diào)用結(jié)束局部變量會被銷毀。
三種傳參方式?
值傳遞
傳遞的是實參的一個拷貝,修改形參不會改變實參值。
地址傳遞
傳遞的是實參地址的一個拷貝,修改形參會改變實參值。
引用傳遞
傳遞的是實參的一個別名,修改形參會導(dǎo)致改變實參。
被調(diào)用函數(shù)的形參只有在被調(diào)用時才會臨時分配存儲單元,一旦調(diào)用結(jié)束則釋放內(nèi)存。
const作用?
被const修飾符修飾的變量不能被修改。const *x表明x數(shù)據(jù)是常量,不能修改;*const x表明指針本身是常量,x的指針不能指向其他內(nèi)存地址,x本身可被修改;*const *x表明x本身數(shù)據(jù)和地址都不能被修改。
static作用?
被static修飾符修飾的變量在整個文件中都是可見的,而在文件外是不可見的。該變量在全局?jǐn)?shù)據(jù)區(qū)分配內(nèi)存。C++中由程序運行new出的動態(tài)數(shù)據(jù)存放在堆區(qū),而函數(shù)內(nèi)部局部變量存放在棧區(qū)。
靜態(tài)局部變量:在函數(shù)內(nèi)部定義static變量,第一次運行到這里初始化,存儲到全局?jǐn)?shù)據(jù)區(qū),下一次執(zhí)行到這里不會再重新初始化。
static變量如果沒有顯式初始化,默認(rèn)初始值為0。
靜態(tài)函數(shù)不能被其他函數(shù)所調(diào)用。
面向?qū)ο蟮娜齻€要素(基本特征)?
1、封裝:將客觀事物封裝成類,隱藏實現(xiàn)細(xì)節(jié),模塊化代碼。
2、多態(tài):實現(xiàn)多態(tài)的兩種方式——覆蓋(重寫)和重載。
覆蓋是子類重新定義父類的虛函數(shù),與多態(tài)真正相關(guān)。當(dāng)子類重新定義了父類的虛函數(shù)后,父類指針根據(jù)賦給它的不同的子類指針,動態(tài)的調(diào)用屬于子類的該函數(shù),這樣的函數(shù)調(diào)用在編譯期間是無法確定的(調(diào)用的子類的虛函數(shù)的地址無法給出)。因此,這樣的函數(shù)地址是在運行期綁定的(晚綁定)。
重載是存在多個同名函數(shù),但是函數(shù)的參數(shù)個數(shù)不同。這些函數(shù)實際上成為了不同的函數(shù),對它們的調(diào)用在編譯期間就已經(jīng)確定,屬于早綁定,與多態(tài)無關(guān)。
3、繼承:子類繼承父類功能,對父類功能進(jìn)行擴展。
結(jié)構(gòu)體和聯(lián)合有什么區(qū)別?
結(jié)構(gòu)和聯(lián)合都是由多個不同的數(shù)據(jù)類型成員組成, 但在任何同一時刻, 聯(lián)合中只存放了一個被選中的成員(所有成員共用一塊地址空間), 而結(jié)構(gòu)的所有成員都存在(不同成員的存放地址不同)。
對于聯(lián)合的不同成員賦值, 將會對其它成員重寫, 原來成員的值就不存在了, 而對于結(jié)構(gòu)的不同成員賦值是互不影響的。
C++是不是類型安全的語言?
不是。不同類型間指針可以強制互轉(zhuǎn)。
const與#define區(qū)別?
const修飾常量受到強制保護(hù),程序更健壯,而且const修飾的常量有數(shù)據(jù)類型,有類型安全檢查。
基類的析構(gòu)函數(shù)為什么是虛函數(shù)?
為了防止派生類析構(gòu)函數(shù)未執(zhí)行,造成資源泄露。
#include尖括號和雙引號區(qū)別?
<>是標(biāo)準(zhǔn)頭文件,“”是非系統(tǒng)頭文件
為什么有了指針,還要使用引用?
為了支持運算符的重載。更加方便。
如何避免野指針?
聲明指針記得初始化,暫時不用就指向NULL;使用malloc分配內(nèi)存,必須經(jīng)過顯式釋放(free),避免內(nèi)存泄漏。
STL
什么是STL?
STL(Standard Template Library),即標(biāo)準(zhǔn)模板庫,是一個具有工業(yè)強度的,高效的C++程序庫。
STL有什么特點?
STL的一個重要特點是數(shù)據(jù)結(jié)構(gòu)和算法的分離。
例如,由于STL的sort()函數(shù)是完全通用的,你可以用它來操作幾乎任何數(shù)據(jù)集合,包括鏈表,容器和數(shù)組;
STL另一個重要特性是它不是面向?qū)ο蟮摹?/p>
JAVA
Java面試題
Java
java的特點?
一次編譯到處運行,沒有指針,完全對象化,面向?qū)ο?#xff08;封裝、繼承、多態(tài))。
java常用術(shù)語
JavaEE:Java Platform Enterprise Edition,是Sun公司為企業(yè)級應(yīng)用推出的標(biāo)準(zhǔn)平臺。
J2EE:Java 2 Platform,Enterprise Edition,是JavaEE以前的叫法。
JDBC:Java DataBase Connectivity,Java數(shù)據(jù)庫連接。
JNDI:Java Naming and Directory Interface,提供一個目錄系統(tǒng),使得開發(fā)人員可以通過名稱來訪問資源。
EJB:Enterprise JavaBean,用來構(gòu)建一個可以管理的服務(wù)器組件。
Servlet:Java編寫的服務(wù)端程序,可以動態(tài)修改web內(nèi)容。
JSP:Java Server Pages,Sun主導(dǎo)的一種動態(tài)網(wǎng)頁技術(shù)標(biāo)準(zhǔn),JSP部署于網(wǎng)絡(luò)服務(wù)器上,可以響應(yīng)客戶端請求,并返回相應(yīng)內(nèi)容。
RMI:Remote Method Invocation,使得客戶端可以像調(diào)用本地對象一樣調(diào)用遠(yuǎn)程服務(wù)器上的方法。和RPC(Remote Procedure Call Protocol)不同,RMI只適用于Java,返回結(jié)果也有區(qū)別。RML在文件傳輸時,需要進(jìn)行序列化serial,轉(zhuǎn)換為二進(jìn)制才能被servlet傳輸
XML:Extensible Markup Language,用于傳輸和存儲數(shù)據(jù)
JMS:Java Message Service,Java平臺面向消息中間件的一個服務(wù),用于在分布式系統(tǒng)或應(yīng)用程序間傳遞服務(wù)。
JTA:Java Transaction API,事務(wù)管理組件。
Weblogic:Oracle公司推出的商業(yè)化JavaEE服務(wù)器
java怎么處理對象分配和釋放的?
java把內(nèi)存分為堆棧空間存儲,在堆中new的空間不用自己收回,自動垃圾收回。
JVM
不同于C++需要編程人員手動釋放內(nèi)存,Java有虛擬機,因此Java不需要程序員主動去釋放內(nèi)存,而是通過虛擬機自身的垃圾回收器(Garbage Collector-GC)來進(jìn)行對象的回收。Java語言由于有虛擬機的存在,實現(xiàn)了平臺無關(guān)性,在任意平臺都是通過將代碼轉(zhuǎn)換為字節(jié)碼文件,從而在平臺下的虛擬機中運行代碼的。
名詞解釋:
內(nèi)存區(qū)域分布
虛擬機棧:存放每個方法執(zhí)行時的棧幀,一個方法調(diào)用到完成就對應(yīng)棧幀在虛擬機棧中入棧和出棧的過程。
本地方法棧:和虛擬機棧類似,不過是為Java中native方法服務(wù)的。平時所說的“棧內(nèi)存”指的就是虛擬機棧和本地方法棧的合稱。
程序計數(shù)器:當(dāng)前線程執(zhí)行字節(jié)碼的行號指示器,字節(jié)碼解釋器工作依賴于它。占用較小的內(nèi)存空間,不會出現(xiàn)OOM。
堆:即所謂的“堆內(nèi)存”。JVM所管理最大的一塊內(nèi)存,被所有線程共享。唯一作用就是給對象實例分配內(nèi)存空間,在分代回收算法中的新生代老年代就在于堆中。
方法區(qū)(也稱為永久代):不在堆中,被各個線程共享,存儲已被JVM加載的類信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù)。其中包括常量池。
另:直接內(nèi)存,不屬于JVM內(nèi)存區(qū)域,與NIO聯(lián)系緊密,不受JVM內(nèi)存大小限制。
JVM垃圾回收機制
何時進(jìn)行垃圾回收?
GC本質(zhì)上是一道守護(hù)進(jìn)程(Daemon Thread),不停的檢測堆中是否有不可達(dá)對象并釋放內(nèi)存,因此GC在何時發(fā)生其實我們是無法預(yù)測的。GC通過調(diào)用對象的finalize()方法來摧毀對象。
不可達(dá)對象的判定:根搜索算法。JVM中有一系列設(shè)定的GC Roots,當(dāng)一個對象到任意一個GC Root都沒有引用鏈時,則說明此對象不可達(dá)。
JVM中的垃圾回收算法
1、標(biāo)記-清除算法
最基礎(chǔ)的算法,GC會判斷堆中對象是否不可達(dá),如果滿足清理條件(查看該對象是否有必要執(zhí)行finalize()方法,有無必要的標(biāo)準(zhǔn)是該對象有沒有被調(diào)用過finalize方法或該對象有沒有覆蓋finalize()方法,因為finalize()只能被調(diào)用一次),則給這個對象進(jìn)行標(biāo)記,將對象放在F-queue隊列。此時除非對象在finalize()方法中重新獲得了引用,否則它就會被清除掉。
2、復(fù)制算法
將內(nèi)存分為大小相等的兩塊,當(dāng)對象不可達(dá)后并不是及時清理,而是等待正在使用的內(nèi)存滿了之后,將該內(nèi)存內(nèi)還存活的對象整體復(fù)制到另一塊內(nèi)存中,復(fù)制結(jié)束后再清理掉原內(nèi)存塊中的所有內(nèi)容。這種方法的優(yōu)點是快速,但犧牲了一半的內(nèi)存。方法的改進(jìn)版(事實上也是虛擬機的做法)是只在新生代空間使用復(fù)制算法,并且由于新生代對象生命周期往往很短,因此又將新生代區(qū)域分為Eden和Survivor空間。其中Eden分配的空間又比Survivor大出很多,從而節(jié)省內(nèi)存空間。如果存活對象過多,使得Survivor區(qū)也滿,那么就會轉(zhuǎn)移Survivor區(qū)對象到老年代。
3、標(biāo)記-整理算法
標(biāo)記過程與1一樣,將1中的清除過程換成了整理,即將內(nèi)存中存活的對象歸攏到一邊,使得內(nèi)存更“緊湊”一些,整理之后將邊界之外的對象清理掉。這種算法是為了防止2算法中出現(xiàn)存活率100%的極端情況,那么復(fù)制就沒有止境了。
4、分代算法
新生代采用2算法,老年代采用1或3算法。這是由他們的特點決定的,新生代注定了其中很多對象生命周期轉(zhuǎn)瞬即逝,因此復(fù)制算法移動的存貨對象并不是很多。而老年代存活率較高,只能采用1、3來執(zhí)行,提高效率。
JVM參數(shù)相關(guān)
可以調(diào)整堆內(nèi)新生代老年代比例
可以調(diào)整對象移入老年代的年齡
可以調(diào)整堆內(nèi)存大小
可以設(shè)置每個棧大小
可以設(shè)置堆內(nèi)分區(qū)大小
可選擇垃圾回收方式
JVM類加載機制
雙親委派模型。
類加載器(ClassLoader)用來實現(xiàn)類的加載動作。JVM中只存在兩種不同的類加載器:啟動類加載器和其他類加載器。
啟動類加載器:即Bootstrap ClassLoader。由C++編寫,在JVM內(nèi)部。其他類加載器都由Java編寫,在JVM外部,全部繼承于抽象類java.lang.ClassLoader。
類加載器之間的層次關(guān)系,稱為雙親委派模型。
頂層為啟動類加載器,下邊為擴展類加載器,再下為應(yīng)用程序類加載器,其中包含多種自定義類加載器。
如果一個類加載器收到了加載類的請求,它首先不會自己去加載,而是委派給它的父加載器去執(zhí)行。層層委派之后,到了頂層由啟動類加載器加載,只有當(dāng)父加載器反饋無法加載此請求,才會讓子加載器去加載。這種結(jié)構(gòu)使得Java類型體系中的加載機制清晰準(zhǔn)確,不易造成混亂。
有一種雙親委派模型的異常情況,即類似啟動類加載器這種基礎(chǔ)的類加載器,本應(yīng)默認(rèn)為所有類適用的加載器,但由于一些環(huán)境下調(diào)用SPI(Service Provider Interface),繞過雙親委派模型的層次結(jié)構(gòu)使得父加載器委派子加載器去完成類加載動作。
還有一種情況,即為了實現(xiàn)模塊的動態(tài)性、熱部署,不再使用雙親委派模型,而是使用更加復(fù)雜的網(wǎng)狀結(jié)構(gòu)。OSGi技術(shù)即是類加載器網(wǎng)狀結(jié)構(gòu)的一個最佳實踐。
如何判斷當(dāng)前系統(tǒng)內(nèi)是否存在死鎖?
可以打印當(dāng)前的內(nèi)存快照,可以看到快照中有deadLock對象,所在的方法,請求被鎖的資源,從而進(jìn)一步分析死鎖原因。
ThreadLocal
ThreadLocal,很多地方叫做線程本地變量,也有些地方叫做線程本地存儲,其實意思差不多。可能很多朋友都知道ThreadLocal為變量在每個線程中都創(chuàng)建了一個副本,那么每個線程可以訪問自己內(nèi)部的副本變量。示例:
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();
}
}
假設(shè)有這樣一個數(shù)據(jù)庫鏈接管理類,這段代碼在單線程中使用是沒有任何問題的,但是如果在多線程中使用呢?很顯然,在多線程中使用會存在線程安全問題:第一,這里面的2個方法都沒有進(jìn)行同步,很可能在openConnection方法中會多次創(chuàng)建connect;第二,由于connect是共享變量,那么必然在調(diào)用connect的地方需要使用到同步來保障線程安全,因為很可能一個線程在使用connect進(jìn)行數(shù)據(jù)庫操作,而另外一個線程調(diào)用closeConnection關(guān)閉鏈接。
ThreadLocal的應(yīng)用場景
最常見的ThreadLocal使用場景為 用來解決數(shù)據(jù)庫連接、Session管理等。
編譯原理
編譯原理簡答題整理
1.說明LR(0)、SLR(1)、LR(1)、LALR(1)四類文法之間的關(guān)系。
LR(1)>LALR(1)>SLR(1)>LR(0)
2.如何判斷一個上下文無關(guān)文法是否是LR(0)?
①構(gòu)造項目集規(guī)范族。
②檢查是否有移進(jìn)-規(guī)約沖突或歸約-歸約沖突。
③若每個狀態(tài)中都不存在移進(jìn)-規(guī)約沖突或歸約-歸約沖突則該項目是LR(0)文法,否則,不是LR(0)文法。
3.如何判斷一個上下文無關(guān)文法是否是SLR(1)?
①構(gòu)造項目集規(guī)范族。
②檢查是否有移進(jìn)-規(guī)約沖突或歸約-歸約沖突。
③若某個狀態(tài)I中存在移進(jìn)-規(guī)約沖突或歸約-歸約沖突,則可通過引入FOLLOW集的方法解決,(例如{X->A · bB,A->c · ,B->d · }
首先滿足FOLLOW(A)∩FOLLOW(B)=?且FOLLOW(A)∩{b}=FOLLOW(B)∩{b}=?,
則:
在狀態(tài)I中面臨輸入符a的動作可由下面決策:
若a∈FOLLOW(A),則利用歸約
若a∈FOLLOW(B),則利用歸約
若a=b,則移進(jìn)
其他情況報錯。)
即在構(gòu)造LR分析表時,只需要遇到規(guī)約項目時,只需要在該項目左邊非終結(jié)符的FOLLOW集元素列置歸約標(biāo)記。
④若這樣構(gòu)造出來的LR分析表不存在沖突,則是SLR1文法,否則不是SLR1文法。
4.如何判斷一個上下文無關(guān)文法是否是LR(1)?
①構(gòu)造項目集規(guī)范族。
②檢查是否有移進(jìn)-規(guī)約沖突或歸約-歸約沖突。
③若某個狀態(tài)中存在移進(jìn)-規(guī)約沖突或歸約-歸約沖突但這些沖突都可以通過項目所帶的向前搜索符號集來解決(構(gòu)造LR分析表時,只在該項目所帶的向前搜索符號集元素列置rj,如果這樣構(gòu)造出的分析表不存在沖突),則是LR(1)。
5. 如何判斷一個上下文無關(guān)文法是否是LALR(1)?
①構(gòu)造項目集規(guī)范族。
②檢查是否有移進(jìn)-規(guī)約沖突或歸約-歸約沖突。
③若某個狀態(tài)中存在移進(jìn)-規(guī)約沖突或歸約-歸約沖突但這些沖突都可以通過項目所帶的向前搜索符號集來解決(根據(jù)合并同心集之后的LR1規(guī)范集族構(gòu)造LR分析表時,只在該項目所帶的向前搜索符號集元素列置rj,如果這樣構(gòu)造出的分析表不存在沖突),則是LALR(1)。
6.算符優(yōu)先分析法的優(yōu)缺點是什么?
優(yōu)點:在確定句柄時只考慮終結(jié)符之間的優(yōu)先關(guān)系,而與非終結(jié)符無關(guān),這使得算符優(yōu)先分析法具有效率高的優(yōu)點。
缺點:由于去掉了單非終結(jié)符之間的歸約,有可能將錯誤的句子識別為正確的。
7.什么是代碼優(yōu)化?代碼優(yōu)化的原則有哪些?
代碼優(yōu)化實質(zhì)上是對代碼進(jìn)行等價變換,使得變換后的代碼運行結(jié)果和變換錢的代碼運行結(jié)果相同,但運行速度或占用的存儲空間情況得到改善,生成更加有效的目標(biāo)代碼。
代碼優(yōu)化的原則有等價原則、有效原則、合算原則
8. 代碼優(yōu)化的分類有哪些?常用的優(yōu)化技術(shù)有哪些?
代碼優(yōu)化分為局部優(yōu)化、循環(huán)優(yōu)化和全局優(yōu)化。
局部優(yōu)化的技術(shù)有:刪除公共子表達(dá)式、刪除無用賦值、合并已知量、交換語句位置、臨時變量改名等。
循環(huán)優(yōu)化的技術(shù)有:代碼外提、強度削弱、刪除歸納變量。
11.預(yù)處理的目的是什么?預(yù)處理主要做哪些工作?
預(yù)處理的目的是為了降低編譯程序的處理負(fù)擔(dān)。
預(yù)處理的主要工作是對源程序進(jìn)行格式方面的規(guī)范化處理。
12.自上而下語法分析的基本思想是什么?
【解答】自上而下語法分析的基本思想是:從文法起始符號出發(fā),不斷使用文法的產(chǎn)生式進(jìn)行推導(dǎo),如果最終能夠推導(dǎo)出待分析的終結(jié)符號串,則該終結(jié)符號串是文法的合法句子,否則該終結(jié)符號串不是文法的合法句子。
13.自上而下與自下而上的語法分析策略有什么區(qū)別?
【解答】自上而下語法分析是從文法起始符號出發(fā),不斷使用文法的產(chǎn)生式進(jìn)行推導(dǎo),
分析成功的標(biāo)志是推導(dǎo)出待分析的終結(jié)符號串。
而自下而上語法分析是從待分析的終結(jié)符號串出發(fā),使用產(chǎn)生式規(guī)則,對當(dāng)前的符號串(開始時是待分析的終結(jié)符號串),尋找其中的子串B,利用規(guī)則 A>B,將B替換成A,得到新的符號串。分析過程的主要操作是歸約。分析成功的標(biāo)志是從給定的終結(jié)符號串出
發(fā),經(jīng)過不斷歸約,得到文法起始符號。
14.自上而下語法分析的關(guān)鍵問題是什么?
【解答】自上而下語法分析存在的關(guān)鍵問題有兩點:
如果文法存在公共左因子,那么在對該終結(jié)符進(jìn)行推導(dǎo)時,不能確定到底應(yīng)該選擇哪個候選式。
如果文法中存在左遞歸,可能會導(dǎo)致推導(dǎo)的過程會無休止地進(jìn)行下去,語法分析過程永遠(yuǎn)不會停止。
15.什么是LL(1)文法?一個文法是LL(1)文法的充分必要條件是什么?
遞歸下降分析程序的設(shè)計思想是:
針對文法的每個非終結(jié)符設(shè)計一個子程序,完成相應(yīng)非終結(jié)符的擴展,通過所有子程序的相互調(diào)用,完成整個終結(jié)符號串的分析,分析開始時,文法起始符號所對應(yīng)的子程序首先被調(diào)用。
優(yōu)點:使用優(yōu)先函數(shù)減小了優(yōu)先關(guān)系表的尺寸,節(jié)省了存儲空間;同時通過數(shù)值表達(dá)終結(jié)符之間的優(yōu)先關(guān)系,提高了比較終結(jié)符之間優(yōu)先關(guān)系的效率。
缺點:在優(yōu)先關(guān)系表中,某些終結(jié)符之間不存在優(yōu)先關(guān)系,但是變成優(yōu)先函數(shù)后,由于任意數(shù)值之間都可比較,會導(dǎo)出任意終結(jié)符對都存在優(yōu)先關(guān)系的結(jié)論,這樣就產(chǎn)生了新問題。
【解答】自下而上語法分析的基本思想是從待分析的終結(jié)符號串出發(fā),反向使用產(chǎn)生式規(guī)則,將產(chǎn)生式規(guī)則右部的符號串歸約為左部的非終結(jié)符。通過一系列這樣的歸約,最終能歸約出文法的起始符號。
分析過程有4種基本動作:
移進(jìn)、歸約、接受、出錯
19.自下而上語法分析的關(guān)鍵問題是什么?
【解答】自下而上語法分析的關(guān)鍵問題是尋找可歸約串,即對于待分析的符號串,應(yīng)
該選擇其中的哪個子串進(jìn)行歸約。
20.什么是屬性文法?什么是綜合屬性?什么是語義屬性?
【解答】屬性文法,是指為上下文無關(guān)文法中的文法符號賦予一定的屬性,以便描述與文法符號相關(guān)的信息,利用這些信息為每個產(chǎn)生式規(guī)則配上語義子程序,在語義子程序中進(jìn)行屬性計算等工作。
綜合屬性:對于文法非終結(jié)符,如果其某個屬性的計算依賴于其產(chǎn)生式規(guī)則右部符號的屬性,則該屬性稱為綜合屬性。
繼承屬性:是指屆性的計算依賴于其兄弟節(jié)點和父節(jié)點的屬性,稱為繼承屬性。
21.簡述語法制導(dǎo)翻譯的基本思想。
【解答】所謂語法制導(dǎo)翻譯,是為語言的文法規(guī)則配上相應(yīng)的語義子程序,在語法分析過程中,當(dāng)某條規(guī)則被用來擴展一個文法非終結(jié)符(自上而下的分析),或者被用來歸約可歸約串(自下而上的語法分析)時,執(zhí)行相應(yīng)的語義子程序,完成屬性的計算和中間代碼的生成。
22.LL1算法描述
#,S入棧
Do{
X=當(dāng)前棧頂符號;a=當(dāng)前輸入符號;
If(X∈VT ∪ {#}){
IF(X==a){
If(X!=#){
將X彈出,且前移輸入指針;
}
Else error();
}
Else{
If(M[X,a] == Y1Y2…Yk){
將X彈出;
依次將YK…Y2Y1壓入棧;
}
Else error;
}while(X!=#);
23.LR1算法描述
設(shè)S是棧頂狀態(tài),a是輸入指針ip所指向的當(dāng)前符號。
1):
令ip指向輸入串的第一個符號
將#壓入符號棧,將開始狀態(tài)0壓入狀態(tài)棧。
2):
重復(fù)執(zhí)行如下過程:
If(action[S,a]==sj){
把符號a壓入符號棧;
把狀態(tài)j壓入狀態(tài)棧;
}
Else if(action[S,a]==rj){
從符號棧棧頂彈出第j條規(guī)則又不串長|β|個符號;
把按第j條規(guī)則歸約得到的非終結(jié)符 A壓入符號棧;
將goto[S,A]的值j壓入狀態(tài)棧;
并輸出規(guī)則A->β;
}
Else if(action[S,a]==acc){
Return;//分析成功
}
Else{
Error();
}
什么是表格管理程序?
編譯過程中源程序的各種信息被保留在種種不同的表格里,編譯各階段的工作涉及到構(gòu)造、查找或更新有關(guān)的表格,因此需要有表格管理工作。
什么是出錯處理程序?
編譯過程中,發(fā)現(xiàn)源程序有錯誤,編譯程序應(yīng)報告錯誤的性質(zhì)和出錯的地點,使得編譯程序能夠繼續(xù)向下進(jìn)行分析和處理。
簡述一下分析和綜合
分析階段:詞法分析、語法分析、語義分析,只對程序進(jìn)行識別和檢查,沒作實質(zhì)翻譯
綜合階段:中間代碼的生成,代碼優(yōu)化,目標(biāo)代碼生成,對源程序進(jìn)行翻譯,生成目標(biāo)代碼
什么是句型,什么是句子,什么是語言?
句型:從文法的起始符號開始,經(jīng)過有限步推導(dǎo)能夠推導(dǎo)出來的符號串。
句子:只有終結(jié)符構(gòu)成的句型
語言:所有句子的集合
什么是文法?喬姆斯基把文法分成幾種類型?
文法可以表示成四元組
0型短語文法 沒有任何限制
1型上下文有關(guān)文法 右側(cè)式子的長度要大于左側(cè)的
2型上下文無關(guān)文法 非終結(jié)符的替換可以不考慮上下文。
3型正規(guī)文法 每一個非終結(jié)符都推出非終結(jié)符+終結(jié)符或者直接推出終結(jié)符
3.高級語言、匯編語言、機器語言之間的區(qū)別是什么?
高級語言是一種面向算法、方便程序員編程的語言。
匯編語言是一種符號語言。
機器語言是一種二進(jìn)制代碼。
高級語言需要翻譯成匯編語言,再匯編成機器語言才能被理解和執(zhí)行。
4.中間代碼主要有哪幾種形式?
逆波蘭式、三元式、四元式
5.在編譯的各個階段都涉及到的工作是什么?
表格管理和出錯處理
6.出錯處理中的錯誤一般分為哪兩類?
語法錯誤和語義錯誤
7.什么叫做遍?
所謂遍就是指對源程序或者源程序的中間結(jié)果從頭到尾的掃描一次,并做有關(guān)的加工處理,生成新的中間結(jié)果或目標(biāo)程序。
8.什么是編譯前端?什么是編譯后端?
前端主要是指與源語言有關(guān)的部分。詞法分析、語法分析、語義分析和中間代碼的產(chǎn)生。
后端主要是指與目標(biāo)機有關(guān)的部分。代碼優(yōu)化、目標(biāo)代碼的產(chǎn)生。
9.自動編譯工具
LEX自動產(chǎn)生詞法分析器。
YACC自動產(chǎn)生語法分析器。
10.什么是二義性?
如果一個文法存在某個句子對應(yīng)兩棵不同的語法樹,那么這個問法就是二義性的
短語、直接短語、句柄、素短語、最左素短語分別是什么?
句柄:最左直接短語
素短語:至少含有一個終結(jié)符的短語并且除自身外不包含更小的素短語
最左素短語:句型中最左邊的素短語
什么是算符優(yōu)先文法?
對于任意的終結(jié)符對a b,最多存在三種優(yōu)先關(guān)系之一,則稱該算符文法為算符優(yōu)先文法。
算符優(yōu)先分析法分析句子成功的標(biāo)志是什么?
堆棧中為‘#’和文法的起始符號,緩沖區(qū)中的指針指向符號‘#’
LR1的含義
L自左向右掃描輸入串
R表示最右推導(dǎo)的逆過程
1表示向前看一個符號
移進(jìn)歸約接受出錯分別是什么?
需要構(gòu)造哪些表
什么是first follow firstvt lastvt
軟件工程
軟件工程面試題整理
軟件測試的層次?
軟件測試可以分為單元測試、集成測試、系統(tǒng)測試
單元測試:對程序單元進(jìn)行正確性檢驗的測試工作。
集成測試:測試多個單元接口。
系統(tǒng)測試:測試全部單元接口,關(guān)注整個系統(tǒng)行為。
黑盒測試和白盒測試?
黑盒測試:把測試對象看成一個黑盒子,完全基于輸入和輸出數(shù)據(jù)來判定測試對象的正確性。
黑盒測試常用方法:等價類劃分、邊界值分析、決策表、狀態(tài)轉(zhuǎn)換
白盒測試:將測試對象看作透明,按照測試對象內(nèi)部的程序結(jié)構(gòu)來設(shè)計測試用例進(jìn)行測試。
白盒測試常用方法:語句覆蓋、條件覆蓋、路徑覆蓋
白盒測試和黑盒測試的優(yōu)缺點?
白盒測試的優(yōu)點是覆蓋率較高,缺點是測試開銷大不能檢驗需求規(guī)格
黑盒測試的優(yōu)點是測試效率高,缺點時是覆蓋率低。
設(shè)計模式總結(jié)
什么是設(shè)計模式?
設(shè)計模式(Design pattern)是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計經(jīng)驗的總結(jié)。
設(shè)計模式如何分類?
工廠模式
抽象工廠模式
策略模式
觀察者模式
單例模式
迭代器模式
面向?qū)ο蟮脑O(shè)計原則有哪些?
軟件開發(fā)模型整理
常見的模型:瀑布模型、快速原型模型、增量模型、螺旋模型
瀑布模型:將軟件生命周期劃分為制定計劃、需求分析、軟件設(shè)計、程序編寫、軟件測試和運行維護(hù)等六個基本活動,并且規(guī)定了它們自上而下、相互銜接的固定次序,如同瀑布流水,逐級下落。
快速原型模型:快速原型模型的第一步是建造一個快速原型,實現(xiàn)客戶或未來的用戶與系統(tǒng)的交互,用戶或客戶對原型進(jìn)行評價,進(jìn)一步細(xì)化待開發(fā)軟件的需求。通過逐步調(diào)整原型使其滿足客戶的要求,開發(fā)人員可以確定客戶的真正需求是什么;第二步則在第一步的基礎(chǔ)上開發(fā)客戶滿意的軟件產(chǎn)品。
增量模型:在增量模型中,軟件被作為一系列的增量構(gòu)件來設(shè)計、實現(xiàn)、集成和測試,每一個構(gòu)件是由多種相互作用的模塊所形成的提供特定功能的代碼片段構(gòu)成。
螺旋模型:以原型為基礎(chǔ)沿螺線旋轉(zhuǎn)、每轉(zhuǎn)一圈都經(jīng)過計劃/風(fēng)險分析/實施/評估等過程且得到相應(yīng)新版本、經(jīng)過若干次螺旋上升得到最終版本。
排序算法專題
排序算法面試專題
插入排序
描述一下插入排序?
每次將一個待排序的記錄按其關(guān)鍵字大小插入前面已經(jīng)排好序的子序列中。
O(N^2) 穩(wěn)定排序
描述一下希爾排序?
先將整個待排序的記錄序列分割成為若干子序列分別進(jìn)行直接插入排序,待整個序列中的記錄“基本有序”時,再對全體記錄進(jìn)行依次直接插入排序。
O(N^1.3) 不穩(wěn)定排序
交換排序
描述一下冒泡排序?
從后往前兩兩比較相鄰元素的值,若為逆序,則交換他們,直到序列比較完。
O(N^2) 穩(wěn)定排序
描述一下快速排序?
O(nlog2N) 不穩(wěn)定排序
平均性能最優(yōu)的排序算法 當(dāng)初始表基本有序的情況下時間復(fù)雜度最差,為O(N^2)。
選擇排序
描述一下簡單選擇排序?
每一趟在后面N-I+1個元素中選取關(guān)鍵字最小的元素與第i個元素交換,直到n-1趟做完。
O(N^2) 不穩(wěn)定排序
描述一下堆排序?
首先建初堆,將其調(diào)整成大根堆。
將堆頂元素輸出,然后重新調(diào)整堆使其保證大根堆性質(zhì)。
再輸出堆頂元素。
重復(fù)此過程,直到堆中只剩一個元素為止。
O(nlog2N) 不穩(wěn)定排序
描述一下歸并排序?
把待排序序列分為若干個子序列,每個子序列是有序的。然后再把有序子序列合并為整體有序序列。
O(nlog2N) 穩(wěn)定排序
描述一下基數(shù)排序?
是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次類推,直到最高位。
O(n*k) 穩(wěn)定排序
總結(jié)
以上是生活随笔為你收集整理的计算机考研复试面试题整理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iptables 手册
- 下一篇: 【概率统计】(在更)