2020年考研計算機復試面試題總結_第1頁
2020年考研計算機復試面試題總結_第2頁
2020年考研計算機復試面試題總結_第3頁
2020年考研計算機復試面試題總結_第4頁
2020年考研計算機復試面試題總結_第5頁
已閱讀5頁,還剩77頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

2020年考研計算機復試面試題總結

概念問題

C++/數據結構

1、簡述你對“面向對象”和“面向過程”編程思想的認識與思考用就能夠了。

面向過程

例:考慮一個工資系統T

?這種功能明確的系統確實適合結構化的開發方法:自頂3

下,逐步求精。

?你完美地完成了任務。

?而后,極有可能,客戶會跑過來跟你說:

?給我加個統計報我撤

?卜?個月我想一些人發記時工資,一些人發計件I:資啊行啊,有人

每月一發,有人林周一發哦

?加個個人所得稅系統接口

?加個圖像用戶界面,用交互查詢

就是分析出解決問題所需要的步驟,然后用函數

把這些步驟一步一步實現,使用的時候一個一個

依次調

面向對象是把構成問題事務分解成各個對象,建

立對象的目的不是為了完成一個步驟,而是為了

描敘某個事物在整個解決問題的步驟中的行為。

例如五子棋,面向過程的設計思路就是首先分析

問題的步驟:1、開始游戲,2、黑子先走,3、繪

制畫面,4、判斷輸贏,5、輪到白子,6、繪制

畫面,7、判斷輸贏,8、返回步驟2,9、輸出

最后結果。把上面每個步驟用分別的函數來實

現,問題就解決了。

而面向對象的設計則是從另外的思路來解決問

題。整個五子棋能夠分為1、黑白雙方,這兩方

的行為是一模一樣的,2、棋盤系統,負責繪制

畫面,3、規則系統,負責判定諸如犯規、輸贏

等。第一類對象(玩家對象)負責接受用戶輸入,

并告知第二類對象(棋盤對象)棋子布局的變化,

棋盤對象接收到了棋子的i變化就要負責在屏

幕上面顯示出這種變化,同時利用第三類對象

(規則系統)來對棋局進行判定。

能夠明顯地看出,面向對象是以功能來劃分問

題,而不是步驟。同樣是繪制棋局,這樣的行為

在面向過程的設計中分散在了總多步驟中,很可

能出現不同的繪制版本,因為通常設計人員會考

慮到實際情況進行各種各樣的簡化。而面向對象

的設計中,繪圖只可能在棋盤對象中出現,從而

保證了繪圖的統一。

功能上的統一保證了面向對象設計的可擴展性。

比如我要加入悔棋的功能,如果要改動面向過程

的設計,那么從輸入到判斷到顯示這一連串的步

驟都要改動,甚至步驟之間的循序都要進行大規

模調整。如果是面向對象的話,只用改動棋盤對

象就行了,棋盤系統保存了黑白雙方的棋譜,簡

單回溯就能夠了,而顯示和規則判斷則不用顧

及,同時整個對對象功能的調用順序都沒有變

化,改動只是局部的。

再比如我要把這個五子棋游戲改為圍棋游戲,如

果你是面向過程設計,那么五子棋的規則就分布

在了你的程序的每一個角落,要改動還不如重

寫。但是如果你當初就是面向對象的設計,那么

你只用改動規則對象就能夠了,五子棋和圍棋的

區別不就是規則嗎?(當然棋盤大小仿佛也不一

樣,但是你會覺得這是一個難題嗎?直接在棋盤

對象中進行一番小改動就能夠了。)而下棋的大

致步驟從面向對象的角度來看沒有任何變化。

當然,要達到改動只是局部的需要設計的人有足

夠的經驗,使用對象不能保證你的程序就是面向

對象,初學者或者很蹩腳的程序員很可能以面向

對象之虛而行面向過程之實,這樣設計出來的所

謂面向對象的程序很難有良好的可移植性和可

擴展性。

2、ADT是什么?簡述你對“數據抽象”和“信息隱藏”的認

抽象數據類型(AbstractDataType簡稱ADT)

是指一個數學模型以及定義在此數學模型上的

一組操作。抽象數據類型需要通過固有數據類型

(高級編程語言中已實現的數據類型)來實現。

抽象數據類型是與表示無關的數據類型,是一個

數據模型及定義在該模型上的一組運算。對一個

抽象數據類型進行定義時,必須給出它的名字及

各運算的運算符名,即函數名,并且規定這些函

數的參數性質。一旦定義了一個抽象數據類型及

具體實現,程序設計中就能夠像使用基本數據類

型那樣,十分方便地使用抽象數據類型。

抽象數據類型通過類(class)實現

X程序設計語言對抽象數據類型的支持是指允

許用戶自定義具有如下特征的數據類型:

1.模塊封裝:Therepresentationof,and

operationson,objectsofthetypeare

definedinasingle

syntacticunit

2.信息隱蔽:Therepresentationofobjects

ofthetypeishiddenfromtheprogramunits

thatusethese

objects,sotheonlyoperationspossibleare

thoseprovidedinthetype'sdefinition

3、const和static有什么作用?

const是一個C和C++語言的關鍵字,它限定一

個變量不允許被改變,即只讀。使用const在一

定程度上能夠提高程序的安全性和可靠性,也便

于實現對此進行優化(如把只讀對象放入ROM

中)。const作為類型限定符,是類型的一部分。

靜態變量(StaticVariable)在計克機編程領域指在程序執行前系統就為之(也即在運行時中不

再改變分配情況)存儲空間的一類變量.與之相對應的是在運行時只暫時存在的自動變量(即局部變量)

與以動態分配方式獲取存儲空間的些對象,其中自動變量的存儲空間在遇里戰上分配與釋放。

初始化為非零值的靜態分配數據和全局數據存在數據段中,運行相同程序的每個進程都有H己的數據段.

初始化為零值的靜態分配數據和全局數據存放在進程的BSS區域內.

BSS段:BSS段(bsssegment)通常是指用來存放程序中未初始化的全局變盤的一塊內存區域.BSS是英文

BlockStatedbySymbol的簡稱.BSS段屬于靜態內存分配.

足BlockStartedbySymbol"的縮寫,意為“以符號開始的塊”.

BSS是Unix鞋接器產生的未初始化數據段.其他的段分別是包含程序代碼的“text”

段和包含已初始化數據的”data”段.BSS段的變室只有名稱和大小卻沒有值.此幺后來

被許多文件格式使用.包括吒?”以符號開始的塊”指的是編譯器處現卡初始化數據的地

方?BSS”.不包含任何數據,只是簡單的維護開始和結束的地址,以便內存區能在壇行

時被有效地清冬.BSS節任應用程療的一進制映象文件中并不存莊.

數據段:數據段(datasegment)通常是指用來存放程序中一初始化的全局變盤的一塊內存區域.數據段屬「靜

態內存分配。靜態變■存放在data段中

代碼段:代碼段(codesegment/textsegment)通常是指用來存放程序執行代刊的?塊內存區域.這部分區域的

大小在程序運行前就已經確定.并1L內存區城通常屈于只讀,某些架構也允i午代碼段為可寫.即允許修改程序-在

代碼段中?也仃可能包含一些只漆的常數變埴,例如字符小常量等。代碼段是存放了程序代碼的數據,假如機器

中有數個進程運行相同的一個程序,那么它們就可以使用同一個代碼段。

(heap):堆是用于存放進程運行中被動態分配的內存段.它的K小并不固定,可動態擴張或縮減。與進程調

用malloc等函數分配內存時.新分配的內存就被動態添加到堆上(堆被擴張);當利用free等函數擇放內存時,

被釋放的內存從堆中被剔除(堆被縮減)

腳加㈤:棧;稱堆枝,是用戶「「「匕創建的局部變量.也中定義的變工(但

不包括static:聲明的變量,static意味著在數據段中存放變量).除此以外,任函數被調用時,其參數也會被出入

發起調用的進程棧中,并且待到調用結束后,函數的返回值也會被存放回棧中.由廣棧的先進先出特點.所以棧

特別方便用來保存/恢復調用現場.從這個意義上講,我們可以把堆??闯?個寄存、交換臨時數據的內存區。

4、友元關系的利與弊

如果將一個函數或一個類聲明為另一個類的友

元,那么它就能夠直接存取這個類對象中的各種

數據,而不必在意這些數據的封裝級別,即無論

是private的,protected的,還是public的,

有錢同使,有難同當。

5、C++多態的實現

1.用virtual關鍵字申明的函數叫做虛函數,

虛函數肯定是類的成員函數。

2.存在虛函數的類都有一個一維的虛函數表叫

做虛表。類的對象有一個指向虛表開始的虛指

針。虛表是和類對應的,虛表指針是和對象對應

的。

3.多態性是一個接口多種實現,是面向對象的

核心。分為類的多態性和函數的多態性。

4.多態用虛函數來實現,結合動態綁定。

5.純虛函數是虛函數再加上二Oo

6.抽象類是指包括至少一個純虛函數的類。

構造函數順序:

基類構造函數。派生類構造函數

前面輸出的結果是因為編譯器在編譯的時候,就

已經確定了對象調用的函數的地址,要解決這個

問題就要使用遲綁定(latebinding)技術。當

編譯器使用遲綁定時,就會在運行時再去確定對

象的類型以及正確的調用函數。而要讓編譯器采

用遲綁定,就要在基類中聲明函數時使用

virtual關鍵字(注意,這是必須的,很多學員

就是因為沒有使用虛函數而寫出很多錯誤的例

子),這樣的函數我們稱為虛函數。一旦某個函

數在基類中聲明為virtual,那么在所有的派生

類中該函數都是virtual,而不需要再顯式地聲

明為virtualo

前面輸出的結果是因為編譯器在編譯的時候,就

已經確定了對象調用的函數的地址,要解決這個

問題就要使用遲綁定(latebinding)技術。當

編譯器使用遲綁定時,就會在運行時再去確定對

象的類型以及正確的調用函數。而要讓編譯器采

用遲綁定,就要在基類中聲明函數時使用

virtual關鍵字(注意,這是必須的,很多學員

就是因為沒有使用虛函數而寫出很多錯誤的例

子),這樣的函數我們稱為虛函數。一旦某個函

數在基類中聲明為virtual,那么在所有的派生

類中該函數都是virtual,而不需要再顯式地聲

明為virtualo

編譯器在編譯的時候,發現基類中有虛函數,此

時編譯器會為每個包含虛函數的類創建一個虛

表(即vtable),該表是一個一維數組,在這個

數組中存放每個虛函數的地址。

那么如何定位虛表呢?編譯器另外還為每個類的

對象提供了一個虛表指針(即vptr),這個指針

指向了對象所屬類的虛表。在程序運行時,根據

對象的類型去初始化vptr

基類1的對

索所占內存

派生類時象

哥占麻

派生類對象自身

增劉的學分

,從而讓

基類的viable

繼承類的"table基類和繼承類的虛

I■表

vptr正確的指向所屬類的虛表,從而在調用虛

函數時,就能夠找到正確的函數。對于例1-2的

程序,由于pAn實際指向的對象類型是fish,

因此vptr指向的fish類的vtable,當調用

pAn->breathe()時,根據虛表中的函數地址找到

的就是fish類的breathe()函數。

那么虛表指針在什么時候,或者說在什么地方初

始化呢?

答案是在構造函數中進行虛表的創建和虛表指

針的初始化。還記得構造函數的調用順序嗎,在

構造子類對象時,要先調用父類的構造函數,此

時編譯器只“看到了”父類,并不知道后面是否

后還有繼承者,它初始化父類對象的虛表指針,

該虛表指針指向父類的虛表。當執行子類的構造

函數時,子類對象的虛表指針被初始化,指向自

身的虛表。對于例2-2的程序來說,當fish類

的fh對象構造完畢后,其內部的虛表指針也就

被初始化為指向fish類的虛表。在類型轉換后,

調用pAn->breathe(),由于pAn實際指向的是

fish類的對象,該對象內部的虛表指針指向的

是fish類的虛表,因此最終調用的是fish類的

breathe()函數。

要注意:對于虛函數調用來說,每一個對象內部

都有一個虛表指針,該虛表指針被初始化為本類

的虛表。所以在程序中,不論你的對象類型如何

轉換,但該對象內部的虛表指針是固定的,所以

呢,才能實現動態的對象函數調用,這就是C++

多態性實現的原理。

6、STL是什么?組成部分和核心作用

標準模板庫(蔓文:StandardTemplateLibrary.縮寫:STL),是一個C++軟件庫,也是C++

標準程序庫的一部分。其中包含5個組件,分別為算法、容器、迭代器、函數、適配黑。容器即物之所

屬;算法是解決問題的方式;迭代器是對容器的訪問邏輯的抽象,是連接算法和容器的紐帶,通過添加

了一種間接層的方式實現了容器和算法之間的獨立。本文從應用的角度對STL的方方面面進行了簡單的

介紹。

糜是C+十程序設計語言中的一個重要特征,而標準模板庫正是基于此特征。標準模板庫使得C++

編程語言在有了同Java一樣強大的類庫的同時,保有了更大的可擴展性。

標準模板庫于1994年2月年正式成為ANSI/ISO

C++的一部份,它的出現,促使C++程序員的思

維方式更朝向泛型編程(genericprogram)發

展。

7、闡述C++在什么情況下必須進行運算符重載。

9

8、為什么說“繼承是C++面向對象的一個主要

特征之一”,請做一下簡要說明。

9

9、請說明函數模板(FunctionTemplate)和函

數模板實例化(function-1emplate

specification)的區別和聯系。

函數模板實例化

在函數模板為每個類型時首先調用中,編譯器創

建一個實例化。每個實例化是為該類型的該模

板化功能的版本。在中,此函數為類型時,使

用此實例化將調用。如果您有幾個相同的實例

化,即使在不同的模塊,因此,只有該實例化的

一個副本在可執行文件將結果。

函數參數將所有參數的函數模板允許和參數,對

該參數不依賴于模板參數的位置。

函數模板能夠通過聲明與特定類型的模板顯式

實例化作為參數。

C++中提供了函數模板,實際上是建立一個通用

函數,其函數類型和形參類型不具體指定,用一

個虛擬的類型來代表,這個通用函數就成為函數

模板。使用模板的好處就是對于那些函數體相同

的函數都能夠用這個模板來代替,而不必去定義

每個具體的函數去實現。下面通過一個簡單的具

體例子(比較兩個數的大小)來說明:

#include<iostream>

usingnamespacestd;

template<classT>〃模板聲明,T為類型參數

TMax(Ta,Tb)〃定義一個通用函數,用T作

虛擬的類型名

if(a>b)

{

returna;

)

else

returnb;

}

模板(Template)指C++程廳改適宜中的正當H卜;與二別出板,大:體對應于iava和C#中的泛

型。目前,模板己經成為C++的泛型編程中不可缺少的一部分。

模扳定義以關鍵字template開始,后接模板形參表,模板形參表是用尖括號括住的一個或者多個模

板形參的列表,形參之間以逗號分隔。模板形參可以是表示類型的類型形參,也可以是表示常量表達式

的非類型影參。作類型影參跟作類型說明符之后聲明.類型形參跟在關鉞字class或typename之后定

義.

模板是C++程序員絕佳的武器,特別是結合了多重繼承(multipleinheritance)與運算符重載

(operatoroverloading)之后。C++的標準庫提供許多有用的函數大多結合了模板的觀念,如STL以

及IOStream.

模板實例化(templateinstantiation)是指

在編譯或鏈接時生成函數模板或類模板的具體

實例源代碼。ISOC++定義了兩種模板實例化方

法:隱式實例化(當使用實例化的模板時自動地

在當前代碼單元之前插入模板的實例化代碼)、

顯式實例化(直接聲明模板實例化)。

10、編譯和鏈接的過程

源文件的編譯過程包含兩個主要階段,而它們之

間的轉換是自動的。第一個階段是預處理階段,

在正式的編譯階段之前進行。預處理階段將根據

已放置在文件中的預處理指令來修改源文件的

內容。#include指令就是一個預處理指令,

這個在編譯之前修改源文件的方式提供了很大

的靈活性,以適應不同的計算機和操作系統環境

的限制。一個環境需要的代碼跟另一個環境所需

的代碼可能有所不同,因為可用的硬件或操作系

統是不同的。在許多情況下,能夠把用于不同環

境的代碼放在同一個文件中,再在預處理階段修

改代碼,使之適應當前的環境。

預處理器顯示為一個獨立的操作,但一般不能獨

立于編譯器來執行這個操作。調用編譯器會自動

執行預處理過程,之后才編譯代碼。

編譯器為給定源文件輸出的是機器碼,執行這個

過程需要較長時間。在對象文件之間并沒有建立

任何連接。對應于某個源文件的對象文件包含在

其它源文件中定義的函數引用或其它指定項的

引用,而這些函數或項仍沒有被解析。同樣,也

沒有建立同庫函數的鏈接。實際上,這些函數的

代碼并不是文件的一部分。這些工作是由鏈接程

序(有時稱為鏈接編輯器)完成的

鏈接程序把所有對象文件中的機器碼組合在一

起,并解析它們之間的交叉引用。它還集成了對

象模塊所使用的庫函數的代碼。這是鏈接程序的

一種簡化表示,因為這里假定在可執行模塊中,

模塊之間的所有鏈接都是靜態建立的。實際上有

些鏈接是動態的,即這些鏈接是在程序執行時建

立的。

鏈接程序靜態地建立函數之間的鏈接,即在程序

執行之前建立組成程序的源文件中所包含的函

數鏈接。動態建立的函數之間的鏈接(在程序執

行過程中建立的鏈接)將函數編譯并鏈接起來,

創建另一種可執行模塊一一動態鏈接庫或共享

庫。動態鏈接庫中的函數鏈接是在程序調用函數

時才建立的,在程序調用之前,該鏈接是不存在

的。

動態鏈接庫有幾個重要的優點。一個主要的優點

是動態鏈接庫中的函數能夠在幾個并行執行的

程序之間共享,這將節省相同函數占用的內存空

間。另一個優點是動態鏈接庫在調用其中的函數

之前是不會加載到內存中的。也就是說,如果不

使用給定動態鏈接庫中的函數,該動態鏈接庫就

不會占用內存空間

11、解釋“優先級隊列”這一抽象數據類型及實現方法

如果我們給每個元素都分配一個數字來標記其

優先級,不妨設較小的數字具有較高的優先級,

這樣我們就能夠在一個集合中訪問優先級最高

的元素并對其進行查找和刪除操作了。這樣,我

們就引入了優先級隊列這種數據結構。

缺省情況下,優先級隊列利用一個最大堆完成

函數列表:

empty()如果優先隊列為空,則返回真

pop()刪除第一個元素

push()加入一個元素

sizeO返回優先隊列中擁有的元素的個數

top()返回優先隊列中有最高優先級的元素

用途就不用多說了吧,例如Huffman編碼、分支

限界、A*啟發式都需要用到優先隊列存放信息。

12、逆波蘭式用什么數據結構算法的效率比較高,為什么

卜面以(a+b)*c為例子進行說明:

(a+b)'c的逆波式為ab+c\假設計算機把ab+c*按從左到右的限序壓入棧13并且按照遇到星理液就把為頂

兩個元素里找,執行運算,得到的結果再入棧的原則來進行處理,那么ab+c?的執行結果如卜.:

1)a入棧(0位置)

2)b入棧(1位置)

3)泄到運靠符將a和b也找,執行a+b的操作,得到結果(1=2+4再將d入棧(。位置)

4)C入棧(1位置)

5)遇到左遜將d和c也找,執行d*c的操作,得到結果e,再將e入棧(0位置)

經過以上運算,計算機就可以得到(a+b)*c的運算結果e/.

逆界式除了可以實現上述類型的運克,它還可以派生出許多新的算法.一據站內,這就需要靈活運用了.逆

汲工式只是一種序列體現形式.

13、C和C++,C++和Java的區別

C是一個結構化語言,如譚老爺子所說:它的重

點在于算法和數據結構。C程序的設計首要考慮

的是如何通過一個過程,對輸入(或環境條件)

進行運算處理得到輸出(或實現過程(事務)控

制),而對于C++,首要考慮的是如何構造一個

對象模型,讓這個模型能夠契合與之對應的問題

域,這樣就能夠通過獲取對象的狀態信息得到輸

出或實現過程(事務)控制。

所以C與C++的最大區別在于它們的用于解決問

題的思想方法不一樣。之所以說C++比C更先進,

是因為面向對

象設計這個概念已經被融入到C++之中”,而就語言本身而言,在C中更多的是算法的概念.那么是不是C就

不重要了,錯!算法是程序設計的基礎,好的設計如果強有好的算法,?樣不行.而且,加上好的設計.也能罵

出非常好的東西.

對語再本身而言,C是C++的廣集,那么是什么樣的?個上生?從上文可以看出,C實現「C++中過程化控制及

其它相關功能,而在C++中的C(我稱它為“C+”),相對于原來的C還有所加強.引入了重教、內聯函數、異常

處理等等玩仍兒,C++更是拓展/面向對象設計的內容,如類、繼承、姓威等、模板和包容器類等等.

再提高一點,住C++中,數據封裝、類型這些東東己不是什么新鮮小兒需要考慮的是諸如:時象粒度的選擇、

對象接口的設ir和繼承、組合與繼承的使用等等問題.

所以相對jc.C++包含了更豐富的?設計”的概念,但c是C++的?個自洽上生,也具有強大的功能,同樣值得

學習.

C++Java

指針有JAVA喑占讓編程者無法找到指針來

直接訪問內存無指針.并且增添「門

M的內存管理功能.從而有效地防止

\c/c++i3'中指針操作失誤,如

野指針所造成的系統崩涉

笠重繼承C++支持多重繼承?這是C++的一個Java八支持多重繼承,但允許一個類

特征?它允許多攵類一生一個類.盡繼承多個接口

管衫值繼承功能很怩.但.使川更雜.(extends+implement).9jr!>\c十十"

商且會弓I起許多麻煩,編譯程序實現我繼承的功能.乂避免「C++中的8

它也很小容幼.垂維承實現方式帶來的諸一B小便.

多值繼承的問題,二義性:兩個基類解決多重繼承的問題:接11中沒有實

A部有同一個virtual方法,一個子類現.所以也就沒仃1刎才的問題了.

t了兩個基類,并同時overrideT

這個方法.那該聽誰的?

全局變量允許不允許

結構體struct

白幼內存菖理new%\要:顯式delete抻內存垃圾回收

操作符照棧支持不支持

眺省閑數叁數(inta=1)支持不支持(不過可以通過override實現)

goto語句支持《不提倡)不支持(但是保留關鍵字)

類型轉換支持降式轉換不支持降式轉換

14、什么是預處理

程序設計中的預處理(Preprocess),程序設計領

域,預處理是在程序源代碼被編譯之前,由預處

理器(Preprocessor)對程序源代碼進行的處理。

這個過程并不對程序的源代碼進行解析,但它把

源代碼分割或處理成為特定的符號用來支持宏

調用。

預處理器的主要作用就是把通過預處理的內建

功能對一個資源進行等價替換,最常見的預處

理有:文件包含,條件編譯、布局控制和宏替換

4種。

15、堆和棧的區別

棧區(stack)-由編譯器自動分配釋放,存

放函數的參數值,局部變量的值等。其操作方

式類似于數據結構中的棧。

堆區(heap)—一般由程序員分配釋放,若程序員不釋放,程序結束時可能由OS回

收.注:直它與數據結構中的堆是兩回事,分配方式倒是類似于鏈表,呵呵.

堆(英語:heap)亦被稱為:優先隊列(英語:priorityqueue),是計算.機科學中一類特殊的數據結

肉的統稱。堆通常是一個可以被看做一棵樹的數組對象。在隊列中,調度程序反復提取隊列中第一個作業

算運行,因而實際情況中某些時間較短的任務將等待很長時間才能結束,或者某些不短小,但具有重要性

的作業,同樣應當具有優先權.唯即為解決此類問題設計的一種數據結構。

堆棧(英文:stack),也可直接稱棧。臺灣作堆

疊,在計算機科學中,是一種特殊的串行形式的

數據結構,它的特殊之處在于只能允許在鏈結串

行或陣列的一端(稱為堆棧頂端指標,英文為

top)進行加入資料(push)和輸出資料(pop)

的運算。另外堆棧也能夠用一維陣列或連結串行

的形式來完成。堆棧的另外一個相對的操作方式

稱為佇列。

由于堆棧數據結構只允許在一端進行操作,因而

按照后進先出(LIFO,LastInFirstOut)的

原理運作。

堆棧數據結構使用兩種基本操作:推入(push)

和彈出(pop):

在計算機科學中,內聯函數(有時稱作在線函數或

宏(Macro),是一種批量批量處理的稱

編譯時期展開函數)是一種編程語言結構,用來建

謂。議編譯器對一些特殊函數進行內息投竹:(有時稱作

計算機科學里的宏是一種如邃(Abstraction),在線擴展);也就是說建議編譯器將指定的函數體

它根據一系列預定義的規則替換一定的文本模插入并取代每一處調用該函數的地方(上上義),從

而節省了每次調用函數帶來的額外時間開支。但在

式。解釋器或編譯器在遇到宏時會自動進行這一

選擇使用內聯函數時,必須在程序占用空間和程序

模式替換。對于編譯語言,宏展開在編譯時發

也行X"之間進行權衡,因為過多的比較復雜的函

生,進行宏展開的工具常被稱為宏展開器。宏這數進行內聯擴展將帶來很大的存儲資源開支。另外

沐語也常常被用于許多類似的環境中,它們是還需要非常注意的是對遞歸困數的內聯擴展可能

源自宏展開的概念,這包括進匚的和宏語言。絕帶來部分編譯器的無窮編譯。

大多數情況下,“宏"這個詞的使用暗示著將小命令

或動作轉化為一系列指令。

宏的用途在于自動化頻繁使用的串行或者是

獲得一種更強大的抽象能力——但這常常是一回

事。

17、簡述在面向對象程序設計中,引入繼承和封

裝的主要作用繼承:代碼重用封裝:代碼安全

18、簡述C語言中指針及其作用

19、Java語言的多線程機制

20、簡述四種常見的數據邏輯結構

①集合集合中任何兩個數據元素之間都沒有

邏輯關系,組織形式松散。

②我件幺加線性結構中的結點按邏輯關系依次排列形成一個"鎖鏈

③樹形結構樹形結構具有分支、層次特性,其形態有點象自然界中的樹.

④圖狀結構圖狀結構中的結點按邏輯關系互

相纏繞,任何兩個結點都能夠鄰接

21、簡述在一棵二叉排序樹中查找一特定元素x

的算法過程

二叉排序樹(BinarySortTree)又稱二叉查找

樹。它或者是一棵空樹;

或者是具有下列性質的二叉樹:

(1)若左子樹不空,則左子樹上所有結點的值

均小于它的根結點的值;

(2)若右子樹不空,則右子樹上所有結點的值

均大于它的根結點的值;

:分治法1通過?趟排序將耍排序的數據分別成獨立的網部分,其中-部分的所有數據都比另外?部分的所行數據都

要小,然后再按此方法對這兩部分數據分別進行快速排序,整個排序過再可以幽進行,以此達到整個數據變成仃

序序列.

(3)左、右子樹也分別為二叉排序樹;

在最壞的情況是,兩子數列擁有大各為1和

n-1,且調用樹(calltree)變成為一個n個

嵌套(nested)調用的線性連串(chain)。第i

次調用作了0(n-i)的工作量,且遞歸關系式為:

這與插入排序和選擇排序有相同的關系式,以及

它被解為T(n)=0(n2)o

它的最壞情況是很恐怖的,需要

空間,遠比數列本身還多。

23、簡述在一帶權有向圖中尋找關鍵路徑的基本

思想

關鍵路徑:關鍵路徑是指網絡終端元素的元素的

序列,該序列具有最長的總工期并決定了整個項

目的最短完成時間。在AOE網中,從始點到終點

具有最大路徑長度(該路徑上的各個活動所持續

的時間之和)的路徑為關鍵路徑關鍵活動:關鍵

路徑上的活動稱為關鍵活動。

只有所有關鍵活動提前完成,整個工程才能提前

完成。

最早可能開始時間Ve[i]:從原點到頂點Vi最長

路徑的長度(之前所有事情做完了才可能開始);

最遲允許開始時間保證匯點Vn-1在

Ve[n-1]時刻完成的前提下(整體工期不拖),事

件Vi最遲允許的開始時間。

VI[i]=min{VI[k]-dur?Vi,Vk?}

關鍵活動:松弛時間(slack

time)Al[j]-Ae[k]==0的節點。

24、類作用域和文件作用域的區別是什么

文件作用域也稱“全局作用域”。?

?定義在所有函數之外的標識符,具有文件作用

域,作用域為從定義處到整個源文件結束。文

件中定義的全局變量和函數都具有文件作用域。

如果某個文件中說明了具有文件作用域的標識

符,該文件又被另一個文件包含,則該標識符的

作用域延伸到新的文件中。,。

操作系統1.進程和線程的區別及聯系,操作系

統的程序?!?/p>

線程和進程的區別:

1、線程是進程的一部分,所以線程有的時候被

稱為是輕權進程或者輕量級進程。

2、一個沒有線程的進程是能夠被看作單線程

的,如果一個進程內擁有多個進程,進程的執行

過程不是一條線(線程)的,而是多條線(線程)

共同完成的。

3、系統在運行的時候會為每個進程分配不同的

內存區域,但是不會為線程分配內存(線程所使

用的資源是它所屬的進程的資源),線程組只能

共享資源。那就是說,出了CPU之外(線程在運

行的時候要占用CPU資源),計算機內部的軟硬

件資源的分配與線程無關,線程只能共享它所屬

進程的資源。

4、與進程的控制表PCB相似,線程也有自己的

控制表TCB,但是TCB中所保存的線程狀態比PCB

表中少多了(上下文保存一下就行)。

5、進程是系統所有資源分配時候的一個基本單

位,擁有一個完整的虛擬空間地址,并不依賴線

程而獨立存在。

進程與程序的區別:

程序是一組指令的集合,它是靜態的實體,沒有

執行的含義。而進程是一個動態的實體,有自己

的生命周期。一般說來,一個進程肯定與一個程

序相對應,并且只有一個,但是一個程序能夠有

多個進程,或者一個進程都沒有也能夠只有一個

進程。除此之外,進程還有并發性和交往性。簡

單地說,進程是程序的一部分,程序運行的時候

會產生進程。總結:線程是進程的一部分,進程

是程序的一部分。

前一句說的不太準確,線程也有自己的資源,比

如棧,私有數據等等。說他使用而不擁有資源指

的是使用的是進程的打開文件句柄,進程的全局

數據,進程的地址空間等等,這些都屬于進程,

而不屬于線程,進程內個線程共享。

進程切換比線程切換開銷大是因為進程切換時

要切頁表,而且往往伴隨著頁調度,因為進程的

數據段代碼段要換出去,以便把將要執行的進程

的內容換進來。本來進程的內容就是線程的超

集。而且線程只需要保存線程的上下文(相關寄

存器狀態和棧的信息)就好了,動作很小。

2.OS里面進程的“三態”“五態”“七態”是

什么

3.什么是操作系統

操作系統(英文:OperatingSystem,

縮寫:OS)是管理計竟機硬件與軟件資

源的計算機程序,同時也是計算機系統

的內核與基石。操作系統需要處理如管

理與配置電理、決定系統資源供需的優

先次序、控制輸入與輸出設備、操作網

絡與管理文件系統等基本事務。操作系

統也提供一個讓用戶與系統交互的操作

界面。

4.死鎖的條件,檢測死鎖的可能方法及其基本

思想

Adeadlockisasituationinwhichtwoor

morecompetingactionsareeachwaitingfor

theothertofinish,andthusneitherever

does.

1.(互斥):Atleasttworesourcesmustbe

non-shareable.[1]Onlyoneprocesscanuse

theresourceatanygiveninstantoftime.

2.HoldandWaitorResourceHolding:A

processiscurrentlyholdingatleastone

resourceandrequesting

additionalresourceswhicharebeingheldby

otherprocesses.

Hardware硬爆

3.No(禁止搶占):Theoperatingsystemmust

notde-allocateresourcesoncetheyhave

been

allocated;theymustbereleasedbythe

holdingprocessvoluntarily.

4.Aprocessmustbewaitingforaresource

whichisbeingheldbyanotherprocess,

whichinturniswaitingforthefirst

processtoreleasetheresource.Ingeneral,

thereisaofwaiting

processes,P={Pl,P2,...,PN},suchthat

PliswaitingforaresourceheldbyP2,P2

iswaitingforaresourceheldbyP3andso

onuntilPNiswaitingforaresourceheld

byPl.

Thesefourconditionsareknownasthe

Coffmanconditionsfromtheirfirst

descriptionina1971article

by[7]Unfulfillmentofanyofthese

conditionsisenoughtoprecludeadeadlock

fromoccurring.

Ensurethatthesystemwillneverentera

deadlockstate.

Prevention:Ensureoneofthefour

conditionsfails.

Avoidance:TheOSneedsmoreinformationso

thatitcandetermineifthecurrentrequest

canbesatisfiedor

delayed.

死鎖檢測:

1.Resource-AllocationGraph

2.DetectionAlgorithm

5.用戶態和內核態

當程序運行在3級特權級上時,就能夠稱之為運

行在用戶態,因為這是最低特權級,是普通的用

戶進程運行的特權級,大部分用戶直接面對的程

序都是運行在用戶態;反之,當程序運行在級特

權級上時,就能夠稱之為運行在內核態。用戶

態切換到內核態的3種方式

a.系統調用

這是用戶態進程主動要求切換到內核態的一種

方式,用戶態進程通過系統調用申請使用操作系

統提供的服務程序完成工作,比如前例中forkO

實際上就是執行了一個創建新進程的系統調用。

而系統調用的機制其核心還是使用了操作系統

為用戶特別開放的一個中斷來實現,例如Linux

的int80h中斷。

b.異常

當CPU在執行運行在用戶態下的程序時,發生了

某些事先不可知的異常,這時會觸發由當前運行

進程切換到處理此異常的內核相關程序中,也就

轉到了內核態,比如缺頁異常。

c.外圍設備的中斷

當外圍設備完成用戶請求的操作后,會向CPU發

出相應的中斷信號,這時CPU會暫停執行下一條

即將要執行的指令轉而去執行與中斷信號對應

的處理程序,如果先前執行的指令是用戶態下的

程序,那么這個轉換的過程自然也就發生了由用

戶態到內核態的切換。比如硬盤讀寫操作完成,

系統會切換到硬盤讀寫的中斷處理程序中執行

后續操作等。

這3種方式是系統在運行時由用戶態轉到內核

態的最主要方式,其中系統調用能夠認為是用戶

進程主動發起的,異常和外圍設備中斷則是被動

的。

6.面包店算法

該算法的基本思想源于顧客在面包店中購買面

包時的排隊原理.顧客在進入面包店前,首先

抓一個號,然后按照號碼由小到大的次序依次

進入面包店購買面包.這里,面包店發放的號

碼是由小到大的,但是兩個或兩個以上的顧客

卻有可能得到相同的號碼(使所抓號碼不同需要

互斥),如果多個顧客抓到相同的號碼,則規定

按照顧客名字的字典次序進行排序,這里假定

顧客是沒有重名的.在計算機系統中,顧客就

相當于進程,每個進程有一個唯一的標識,我

們用P的下面加一個下標來表示.例如:對于

Pi和Pj,如果有i<j,則先為Pi服務,即Pi

先進入臨界區

7.系統調用和庫函數的區別

⑴調用形式不同。過程(函數)使用一般調用

指令,其轉向地址是固定不變的,包含在跳轉語

句中;但系統調用中不包含處理程序入口,而僅

僅提供功能號,按功能號調用。

⑵被調用代碼的位置不同。過程(函數)調用

是一種靜態調用,調用者和被調用代碼在同一程

序內,經過連接編輯后作為目標代碼的一部份。

當過程(函數)升級或修改時,必須重新編譯連

結。而系統調用是一種動態調用,系統調用的處

理代碼在調用程序之外(在操作系統中),這樣

一來,系統調用處理代碼升級或修改時,與調用

程序無關。而且,調用程序的長度也大大縮短,

減少了調用程序占用的存儲空間。

⑶提供方式不同。過程(函數)往往由編譯系

統提供,不同編譯系統提供的過程(函數)能夠

不同;系統調用由操作系統提供,

一旦操作系統設計好,系統調用的功能、種類與

數量便固定不變了。

(4)調用的實現不同o程序使用一般機器指令(跳

轉指令)來調用過程(函數),是在用戶態運行

的;程序執行系統調用,是通過中斷機構來實現,

需要從用戶態轉變到核心態,在管理狀態執行,

因此,安全性好。

8.經典進程同步問題是什么,同步思想?

生產者-消費者問題是著名的進程同步問題,它

描述一組生產者進程向一組消費者進程提供消

息。它們共享一個有界緩沖池,生產者向其中投

放消息,消費者從中取得消息。生產者-消費者

問題是許多相互合作進程的一種抽象。假定緩沖

池中有n個緩沖區,每個緩沖區存放一個消息、。

由于緩沖池是臨界資源,它只允許一個生產者投

入消息,或者一個消費者從中取出消息。生產者

之間、生產者與消費者之間、消費者之間都必須

互斥地使用緩沖池。所以必須設置互斥信號量

mutex,它代表緩沖池資源,它的數值為1。讀

者-寫者問題

問題描述:一個數據集(如文件)被幾個并行進

程所共享,有些進程只要求讀數據集內容,稱為

讀者,而另一些進程則要求修改數據集內容,稱

為寫者,幾個讀者能夠同時讀數據集,而不需要

互斥,但一個寫者不能和其它進程(不論是寫者

或讀者)同時訪問這些數據集,它們之間必須互

斥。

哲學家進餐問題

該問題描述如下:有五個哲學家,他們的生活方

式是交替地進行思考和進餐。哲學家們公用一張

圓桌,周圍放有五把椅子,每人坐一把。在圓桌

上有五個碗和五根筷子,當一個哲學家思考時,

他不與其它人交談,饑餓時便試圖取用其左、右

最靠近他的筷子,但他可能一根都拿不到。只有

在他拿到兩根筷子時,方能進餐,進餐完后,放

下筷子又繼續思考。

9.文件管理及組織,FAT

FAT=FileAllocationTable

10.設備驅動程序是否屬于OS,他的作用是什

不是,驅動程序是另外安裝的軟件,是操作系統

控制并且和硬件之間通訊的橋梁(程序)

11.程序和任務的區別

任務是最抽象的,是一個一般性的術語,指由軟

件完成的一個活動。一個任務既能夠是一個進程,

也能夠是一個線程。簡而言之,它指的是一系列

共同達到某一目的的操作。例如,讀取數據并將

數據放入內存中。這個任務能夠作為一個進程來

實現,也能夠作為一個線程(或作為一個中斷任

務)來實現。進程常常被定義為程序的執行。

能夠把一個進程看成是一個獨立的程序,在內存

中有其完備的數據空間和代碼空間。一個進程所

擁有的數據和變量只屬于它自己。線程則是某

一進程中一路單獨運行的程序。也就是說,線程

存在于進程之中。一個進程由一個或多個線程構

成,各線程共享相同的代碼和全局數據,但各有

其自己的堆棧。由于堆棧是每個線程一個,所以

局部變量對每一線程來說是私有的。由于所有線

程共享同樣的代碼和全局數據,它們比進程更緊

密,比單獨的進程間更趨向于相互作用,線程間

的相互作用更容易些,因為它們本身就有某些供

通信用的共享內存:進程的全局數據進程的全局

數據進程的全局數據進程的全局數據

進程:資源分配、調度運行的基本單位。

線程:進程中執行運算的最小單位,執行處理機

調度的基本單位。

12.數據庫安全性和操作系統安全性的關系

安全性問題不是數據庫系統所獨有的,,而且為

許多最終用戶直接共享,,包括操作系統,網絡系

統的安全性是緊密聯系,相互支持的.

13.中斷處理的過程

請求中斷一響應中斷一關閉中斷一保留斷點一

中斷源識別一保護現場一中斷服務子程序一恢

復現場一中斷返回在實際運行中,一旦設備通

過某引腳N向8259A發出中斷指令,后者便向

8086A的INTR引腳發送中斷信號。8086A通過

INTA引腳通知8259A中斷有效(這個過程實際

上還包括對此8259A的選址),后者即通過地址

總線將對應引腳N的中斷類型碼(已預先存好,

見上節)發送給CPU。CPU得到中斷類型碼后,

先進行現場保護,主要包括:

1.狀態寄存器FLAGS壓棧(同時堆棧寄存器

SP-2);

2.關閉中斷(將FLAGS寄存器的IF位置零);

3.將當前代碼段寄存器CS和程序計數器IP壓

棧(同時堆棧寄存器SP-4)。現場保護完成后,

CPU開始按照前述的兩步驟翻譯中斷程序入口地

址。在得到中斷處理程序地址之后但調用中斷處

理程序之前,CPU會再檢查一下NMI引腳是否有

信號,以防在剛才的處理過程中忽略了可能的

NMI中斷。NMI的優先級始終高于INTRo

中斷處理程序雖然是由程序員編寫,但須循一定

規范。作為例程,中斷處理程序應該先將各寄存

器信息(除了IP和CS,此二寄存器現已指向當

前中斷程序)壓入堆棧予以保存,這樣才能在中

斷處理程序內部使用這些寄存器。在程序結束

時,應該按與壓棧保護時相反的順序彈出各寄存

器的值。中斷程序的最后一句始終是IRET指令,

這條指令將棧頂6個字節分別彈出并存入IP、

CS和FLAGS寄存器,完成了現場的還原。

當然,如果是操作系統的中斷處理程序,則未必

——通常不會一一還原中斷前的狀態。這樣的中

斷處理程序通常會在調用完寄存器保存例程后,

調用進程調度程序(多由高級語言編寫),并決

定下一個運行的進程。隨后將此進程的寄存器信

息(上次中斷時保存下來的)存入寄存器并返回o

在中斷程序結束之后,主程序也發生了改變。

14.計算機系統怎樣實現存儲保護

1.防止地址越界(對進程所產生的地址必須加

以檢查,發生越界時產生中斷,由操作系統進行

相應處理)

2.防止操作越權(對屬于自己區域的信息,可

讀可寫:對公共區域中允許共享的信息或獲得授

權可使用的信息,可讀而不可修改;對未授權使

用的信息,不可讀,不可寫)

15.調度的基本準則(SchedulingCriteria)

Therearemanycriteriaforcomparing

differentschedulingalgorithms.Hereare

fivecommonones:CPUutilization(CPU不(J用

率)

Throughput(吞吐量)

Turnaroundtime(周轉時間)

Waitingtime(等待時間)

Responsetime(響應時間)

16.多線程是否真正能提高效率

17.磁盤調度算法有哪幾種

FCFS

SSTF(ShortestSeekTimeFirst)

Scan/Look

C-Sacn/C-Look

18.RAID工作原理

RAID(RedundantArrayofIndependentDisks)

通過條帶化存儲和奇偶校驗兩個措施來實現其

冗余和容錯的目標。條帶化存儲意味著能夠一次

寫入一個數據塊的方式將文件寫入多個磁盤。條

帶化存儲技術將數據分開寫入多個驅動器,從而

提高數據傳輸速率并縮短磁盤處理總時間。這種

系統非常適用于交易處理、但可靠性卻很差,因

為系統的可靠性等于最差的單個驅動器的可靠

性。

奇偶校驗通過在傳輸后對所有數據進行冗余校

驗能夠確保數據的有效性。利用奇偶校驗,當

RAID系統的一個磁盤發生故障時,其它磁盤能

夠重建該故障磁盤。在這兩種情況中,這些功能

對于操作系統都是透明的。由磁盤陣列控制器

(DAC)進行條帶化存儲和奇偶校驗控制。

19.Windows中段最長多少字節

20.同步、互斥

MethodShortDescriptionProvidedby(operatinqsystemsorotherenvironments)

Arecordstoredondiskthatcanbe

FileMostoperatingsystems

accessedbynamebyanyprocess

Asystemmessagesentfromone

Mostoperatingsystems;somesystems,suchasWindows,

processtoanother,notusually

SiqnalimplementsignalsinonlytheCrun-timelibraryandprovideno

usedtostoreinformationbut

supportfortheiruseasanIPCmethodls^^^^l

insteadgivecommands.

22.簡述請求段頁式虛擬內存管理基本思想

Bring

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論