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