考研計算機復試面試題總結_第1頁
考研計算機復試面試題總結_第2頁
考研計算機復試面試題總結_第3頁
考研計算機復試面試題總結_第4頁
考研計算機復試面試題總結_第5頁
已閱讀5頁,還剩79頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、精選優(yōu)質文檔-傾情為你奉上考研計算機復試面試題總結專心-專注-專業(yè)概念問題C+/數(shù)據(jù)結構1、簡述你對“面向對象”和“面向過程”編程思想的認識與思考用就能夠了。面向過程就是分析出解決問題所需要的步驟,然后用函數(shù)把這些步驟一步一步實現(xiàn),使用的時候一個一個依次調面向對象是把構成問題事務分解成各個對象,建立對象的目的不是為了完成一個步驟,而是為了描敘某個事物在整個解決問題的步驟中的行為。例如五子棋,面向過程的設計思路就是首先分析問題的步驟:1、開始游戲,2、黑子先走,3、繪制畫面,4、判斷輸贏,5、輪到白子,6、繪制畫面,7、判斷輸贏,8、返回步驟2,9、輸出最后結果。把上面每個步驟用分別的函數(shù)來實現(xiàn)

2、,問題就解決了。而面向對象的設計則是從另外的思路來解決問題。整個五子棋能夠分為 1、黑白雙方,這兩方的行為是一模一樣的,2、棋盤系統(tǒng),負責繪制畫面,3、規(guī)則系統(tǒng),負責判定諸如犯規(guī)、輸贏等。第一類對象(玩家對象)負責接受用戶輸入,并告知第二類對象(棋盤對象)棋子布局的變化,棋盤對象接收到了棋子的i變化就要負責在屏幕上面顯示出這種變化,同時利用第三類對象(規(guī)則系統(tǒng))來對棋局進行判定。能夠明顯地看出,面向對象是以功能來劃分問題,而不是步驟。同樣是繪制棋局,這樣的行為在面向過程的設計中分散在了總多步驟中,很可能出現(xiàn)不同的繪制版本,因為一般設計人員會考慮到實際情況進行各種各樣的簡化。而面向對象的設計中,

3、繪圖只可能在棋盤對象中出現(xiàn),從而保證了繪圖的統(tǒng)一。功能上的統(tǒng)一保證了面向對象設計的可擴展性。比如我要加入悔棋的功能,如果要改動面向過程的設計,那么從輸入到判斷到顯示這一連串的步驟都要改動,甚至步驟之間的循序都要進行大規(guī)模調整。如果是面向對象的話,只用改動棋盤對象就行了,棋盤系統(tǒng)保存了黑白雙方的棋譜,簡單回溯就能夠了,而顯示和規(guī)則判斷則不用顧及,同時整個對對象功能的調用順序都沒有變化,改動只是局部的。再比如我要把這個五子棋游戲改為圍棋游戲,如果你是面向過程設計,那么五子棋的規(guī)則就分布在了你的程序的每一個角落,要改動還不如重寫??墒侨绻惝敵蹙褪敲嫦驅ο蟮脑O計,那么你只用改動規(guī)則對象就能夠了,五子

4、棋和圍棋的區(qū)別不就是規(guī)則嗎?(當然棋盤大小仿佛也不一樣,可是你會覺得這是一個難題嗎?直接在棋盤對象中進行一番小改動就能夠了。)而下棋的大致步驟從面向對象的角度來看沒有任何變化。當然,要達到改動只是局部的需要設計的人有足夠的經(jīng)驗,使用對象不能保證你的程序就是面向對象,初學者或者很蹩腳的程序員很可能以面向對象之虛而行面向過程之實,這樣設計出來的所謂面向對象的程序很難有良好的可移植性和可擴展性。2、 ADT是什么?簡述你對“數(shù)據(jù)抽象”和“信息隱藏”的認識抽象數(shù)據(jù)類型(Abstract Data Type 簡稱ADT)是指一個數(shù)學模型以及定義在此數(shù)學模型上的一組操作。抽象數(shù)據(jù)類型需要經(jīng)過固有數(shù)據(jù)類型(

5、高級編程語言中已實現(xiàn)的數(shù)據(jù)類型)來實現(xiàn)。抽象數(shù)據(jù)類型是與表示無關的數(shù)據(jù)類型,是一個數(shù)據(jù)模型及定義在該模型上的一組運算。對一個抽象數(shù)據(jù)類型進行定義時,必須給出它的名字及各運算的運算符名,即函數(shù)名,而且規(guī)定這些函數(shù)的參數(shù)性質。一旦定義了一個抽象數(shù)據(jù)類型及具體實現(xiàn),程序設計中就能夠像使用基本數(shù)據(jù)類型那樣,十分方便地使用抽象數(shù)據(jù)類型。抽象數(shù)據(jù)類型經(jīng)過類(class)實現(xiàn)l 程序設計語言對抽象數(shù)據(jù)類型的支持是指允許用戶自定義具有如下特征的數(shù)據(jù)類型:1. 模塊封裝:The representation of, and operations on, objects of the type are defin

6、ed in a singlesyntactic unit2. 信息隱蔽:The representation of objects of the type is hidden from the program units that use theseobjects, so the only operations possible are those provided in the type's definition3、const和static有什么作用?const是一個C和C+語言的關鍵字,它限定一個變量不允許被改變,即只讀。使用const在一定程度上能夠提高程序的安全性和可靠性,也便

7、于實現(xiàn)對此進行優(yōu)化(如把只讀對象放入ROM中)。const作為類型限定符,是類型的一部分。4、友元關系的利與弊如果將一個函數(shù)或一個類聲明為另一個類的友元,那么它就能夠直接存取這個類對象中的各種數(shù)據(jù),而不必在意這些數(shù)據(jù)的封裝級別,即無論是private的,protected的,還是public的,有錢同使,有難同當。5、C+多態(tài)的實現(xiàn)1. 用virtual關鍵字申明的函數(shù)叫做虛函數(shù),虛函數(shù)肯定是類的成員函數(shù)。2. 存在虛函數(shù)的類都有一個一維的虛函數(shù)表叫做虛表。類的對象有一個指向虛表開始的虛指針。虛表是和類對應的,虛表指針是和對象對應的。3. 多態(tài)性是一個接口多種實現(xiàn),是面向對象的核心。分為類的多

8、態(tài)性和函數(shù)的多態(tài)性。4. 多態(tài)用虛函數(shù)來實現(xiàn),結合動態(tài)綁定。5. 純虛函數(shù)是虛函數(shù)再加上= 0。6. 抽象類是指包括至少一個純虛函數(shù)的類。構造函數(shù)順序:基類構造函數(shù)à派生類構造函數(shù)前面輸出的結果是因為編譯器在編譯的時候,就已經(jīng)確定了對象調用的函數(shù)的地址,要解決這個問題就要使用遲綁定(late binding)技術。當編譯器使用遲綁定時,就會在運行時再去確定對象的類型以及正確的調用函數(shù)。而要讓編譯器采用遲綁定,就要在基類中聲明函數(shù)時使用virtual關鍵字(注意,這是必須的,很多學員就是因為沒有使用虛函數(shù)而寫出很多錯誤的例子),這樣的函數(shù)我們稱為虛函數(shù)。一旦某個函數(shù)在基類中聲明為vir

9、tual,那么在所有的派生類中該函數(shù)都是virtual,而不需要再顯式地聲明為virtual。前面輸出的結果是因為編譯器在編譯的時候,就已經(jīng)確定了對象調用的函數(shù)的地址,要解決這個問題就要使用遲綁定(late binding)技術。當編譯器使用遲綁定時,就會在運行時再去確定對象的類型以及正確的調用函數(shù)。而要讓編譯器采用遲綁定,就要在基類中聲明函數(shù)時使用virtual關鍵字(注意,這是必須的,很多學員就是因為沒有使用虛函數(shù)而寫出很多錯誤的例子),這樣的函數(shù)我們稱為虛函數(shù)。一旦某個函數(shù)在基類中聲明為virtual,那么在所有的派生類中該函數(shù)都是virtual,而不需要再顯式地聲明為virtual。編

10、譯器在編譯的時候,發(fā)現(xiàn)基類中有虛函數(shù),此時編譯器會為每個包含虛函數(shù)的類創(chuàng)立一個虛表(即vtable),該表是一個一維數(shù)組,在這個數(shù)組中存放每個虛函數(shù)的地址。那么如何定位虛表呢?編譯器另外還為每個類的對象提供了一個虛表指針(即vptr),這個指針指向了對象所屬類的虛表。在程序運行時,根據(jù)對象的類型去初始化vptr,從而讓vptr正確的指向所屬類的虛表,從而在調用虛函數(shù)時,就能夠找到正確的函數(shù)。對于例1-2的程序,由于pAn實際指向的對象類型是fish,因此vptr指向的fish類的vtable,當調用pAn->breathe()時,根據(jù)虛表中的函數(shù)地址找到的就是fish類的breathe(

11、)函數(shù)。那么虛表指針在什么時候,或者說在什么地方初始化呢?答案是在構造函數(shù)中進行虛表的創(chuàng)立和虛表指針的初始化。還記得構造函數(shù)的調用順序嗎,在構造子類對象時,要先調用父類的構造函數(shù),此時編譯器只“看到了”父類,并不知道后面是否后還有繼承者,它初始化父類對象的虛表指針,該虛表指針指向父類的虛表。當執(zhí)行子類的構造函數(shù)時,子類對象的虛表指針被初始化,指向自身的虛表。對于例2-2的程序來說,當fish類的fh對象構造完畢后,其內(nèi)部的虛表指針也就被初始化為指向fish類的虛表。在類型轉換后,調用pAn->breathe(),由于pAn實際指向的是fish類的對象,該對象內(nèi)部的虛表指針指向的是fish

12、類的虛表,因此最終調用的是fish類的breathe()函數(shù)。要注意:對于虛函數(shù)調用來說,每一個對象內(nèi)部都有一個虛表指針,該虛表指針被初始化為本類的虛表。因此在程序中,不論你的對象類型如何轉換,但該對象內(nèi)部的虛表指針是固定的,因此呢,才能實現(xiàn)動態(tài)的對象函數(shù)調用,這就是C+多態(tài)性實現(xiàn)的原理。6、STL是什么?組成部分和核心作用標準模板庫于1994年2月年正式成為ANSI/ISO C+的一部份,它的出現(xiàn),促使C+程序員的思維方式更朝向泛型編程(generic program)發(fā)展。7、闡述C+在什么情況下必須進行運算符重載。?8、 為什么說“繼承是C+面向對象的一個主要特征之一”,請做一下簡要說明

13、。?9、 請說明函數(shù)模板(Function Template)和函數(shù)模板實例化(function-template specification)的區(qū)別和聯(lián)系。函數(shù)模板實例化在函數(shù)模板為每個類型時首先調用中,編譯器創(chuàng)立一個實例化。 每個實例化是為該類型的該模板化功能的版本。 在中,此函數(shù)為類型時,使用此實例化將調用。 如果您有幾個相同的實例化,即使在不同的模塊,因此,只有該實例化的一個副本在可執(zhí)行文件將結果。函數(shù)參數(shù)將所有參數(shù)的函數(shù)模板允許和參數(shù),對該參數(shù)不依賴于模板參數(shù)的位置。函數(shù)模板能夠經(jīng)過聲明與特定類型的模板顯式實例化作為參數(shù)。C+中提供了函數(shù)模板,實際上是建立一個通用函數(shù),其函數(shù)類型和形

14、參類型不具體指定,用一個虛擬的類型來代表,這個通用函數(shù)就成為函數(shù)模板。使用模板的好處就是對于那些函數(shù)體相同的函數(shù)都能夠用這個模板來代替,而不必去定義每個具體的函數(shù)去實現(xiàn)。下面經(jīng)過一個簡單的具體例子(比較兩個數(shù)的大?。﹣碚f明:#include <iostream>using namespace std;template<class T> /模板聲明,T為類型參數(shù)T Max(T a, T b) /定義一個通用函數(shù),用T作虛擬的類型名if (a>b)return a;elsereturn b;模板實例化(template instantiation )是指在編譯或鏈接時

15、生成函數(shù)模板或類模板的具體實例源代碼。ISO C+定義了兩種模板實例化方法:隱式實例化(當使用實例化的模板時自動地在當前代碼單元之前插入模板的實例化代碼)、顯式實例化(直接聲明模板實例化)。10、編譯和鏈接的過程源文件的編譯過程包含兩個主要階段,而它們之間的轉換是自動的。第一個階段是預處理階段,在正式的編譯階段之前進行。預處理階段將根據(jù)已放置在文件中的預處理指令來修改源文件的內(nèi)容。#include指令就是一個預處理指令,它把頭文件的內(nèi)容添加到.cpp文件中還有其它許多預處理指令這個在編譯之前修改源文件的方式提供了很大的靈活性,以適應不同的計算機和操作系統(tǒng)環(huán)境的限制。一個環(huán)境需要的代碼跟另一個環(huán)

16、境所需的代碼可能有所不同,因為可用的硬件或操作系統(tǒng)是不同的。在許多情況下,能夠把用于不同環(huán)境的代碼放在同一個文件中,再在預處理階段修改代碼,使之適應當前的環(huán)境。預處理器顯示為一個獨立的操作,但一般不能獨立于編譯器來執(zhí)行這個操作。調用編譯器會自動執(zhí)行預處理過程,之后才編譯代碼。編譯器為給定源文件輸出的是機器碼,執(zhí)行這個過程需要較長時間。在對象文件之間并沒有建立任何連接。對應于某個源文件的對象文件包含在其它源文件中定義的函數(shù)引用或其它指定項的引用,而這些函數(shù)或項仍沒有被解析。同樣,也沒有建立同庫函數(shù)的鏈接。實際上,這些函數(shù)的代碼并不是文件的一部分。這些工作是由鏈接程序(有時稱為鏈接編輯器)完成的鏈

17、接程序把所有對象文件中的機器碼組合在一起,并解析它們之間的交叉引用。它還集成了對象模塊所使用的庫函數(shù)的代碼。這是鏈接程序的一種簡化表示,因為這里假定在可執(zhí)行模塊中,模塊之間的所有鏈接都是靜態(tài)建立的。實際上有些鏈接是動態(tài)的,即這些鏈接是在程序執(zhí)行時建立的。鏈接程序靜態(tài)地建立函數(shù)之間的鏈接,即在程序執(zhí)行之前建立組成程序的源文件中所包含的函數(shù)鏈接。動態(tài)建立的函數(shù)之間的鏈接(在程序執(zhí)行過程中建立的鏈接)將函數(shù)編譯并鏈接起來,創(chuàng)立另一種可執(zhí)行模塊 動態(tài)鏈接庫或共享庫。動態(tài)鏈接庫中的函數(shù)鏈接是在程序調用函數(shù)時才建立的,在程序調用之前,該鏈接是不存在的。動態(tài)鏈接庫有幾個重要的優(yōu)點。一個主要的優(yōu)點是動態(tài)鏈接庫

18、中的函數(shù)能夠在幾個并行執(zhí)行的程序之間共享,這將節(jié)省相同函數(shù)占用的內(nèi)存空間。另一個優(yōu)點是動態(tài)鏈接庫在調用其中的函數(shù)之前是不會加載到內(nèi)存中的。也就是說,如果不使用給定動態(tài)鏈接庫中的函數(shù),該動態(tài)鏈接庫就不會占用內(nèi)存空間11、解釋“優(yōu)先級隊列”這一抽象數(shù)據(jù)類型及實現(xiàn)方法如果我們給每個元素都分配一個數(shù)字來標記其優(yōu)先級,不妨設較小的數(shù)字具有較高的優(yōu)先級,這樣我們就能夠在一個集合中訪問優(yōu)先級最高的元素并對其進行查找和刪除操作了。這樣,我們就引入了優(yōu)先級隊列 這種數(shù)據(jù)結構。缺省情況下,優(yōu)先級隊列利用一個最大堆完成 函數(shù)列表:empty() 如果優(yōu)先隊列為空,則返回真pop() 刪除第一個元素push() 加入

19、一個元素size() 返回優(yōu)先隊列中擁有的元素的個數(shù)top() 返回優(yōu)先隊列中有最高優(yōu)先級的元素用途就不用多說了吧,例如Huffman編碼、分支限界、A*啟發(fā)式都需要用到優(yōu)先隊列存放信息。12、逆波蘭式用什么數(shù)據(jù)結構算法的效率比較高,為什么13、C和C+,C+和Java的區(qū)別C是一個結構化語言,如譚老爺子所說:它的重點在于算法和數(shù)據(jù)結構。C程序的設計首要考慮的是如何經(jīng)過一個過程,對輸入(或環(huán)境條件)進行運算處理得到輸出(或實現(xiàn)過程(事務)控制),而對于C+,首要考慮的是如何構造一個對象模型,讓這個模型能夠契合與之對應的問題域,這樣就能夠經(jīng)過獲取對象的狀態(tài)信息得到輸出或實現(xiàn)過程(事務)控制。因此

20、C與C+的最大區(qū)別在于它們的用于解決問題的思想方法不一樣。之因此說C+比C更先進,是因為面向對14、什么是預處理程序設計中的預處理(Preprocess),程序設計領域,預處理是在程序源代碼被編譯之前,由預處理器(Preprocessor)對程序源代碼進行的處理。這個過程并不對程序的源代碼進行解析,但它把源代碼分割或處理成為特定的符號用來支持宏調用。預處理器的主要作用就是把經(jīng)過預處理的內(nèi)建功能對一個資源進行等價替換,最常見 的預處理有:文件包含,條件編譯、布局控制和宏替換4種。15、堆和棧的區(qū)別棧區(qū)(stack) 由編譯器自動分配釋放 ,存放函數(shù)的參數(shù)值,局部變量的值等。其 操作方式類似于數(shù)據(jù)

21、結構中的棧。堆棧(英文:stack),也可直接稱棧。臺灣作堆疊,在計算機科學中,是一種特殊的串行形式的數(shù)據(jù)結構,它的特殊之處在于只能允許在鏈結串行或陣列的一端(稱為堆棧頂端指標,英文為top)進行加入資料(push)和輸出資料(pop)的運算。另外堆棧也能夠用一維陣列或連結串行的形式來完成。堆棧的另外一個相正確操作方式稱為佇列。由于堆棧數(shù)據(jù)結構只允許在一端進行操作,因而按照后進先出(LIFO, Last In First Out)的原理運作。堆棧數(shù)據(jù)結構使用兩種基本操作:推入(push)和彈出(pop):17、簡述在面向對象程序設計中,引入繼承和封裝的主要作用 繼承:代碼重用 封裝:代碼安全1

22、8、簡述C語言中指針及其作用19、Java語言的多線程機制20、簡述四種常見的數(shù)據(jù)邏輯結構 集合 集合中任何兩個數(shù)據(jù)元素之間都沒有邏輯關系,組織形式松散。 圖狀結構 圖狀結構中的結點按邏輯關系互相纏繞,任何兩個結點都能夠鄰接21、簡述在一棵二叉排序樹中查找一特定元素x的算法過程二叉排序樹(Binary Sort Tree)又稱二叉查找樹。 它或者是一棵空樹;或者是具有下列性質的二叉樹:(1)若左子樹不空,則左子樹上所有結點的值均小于它的根結點的值;(2)若右子樹不空,則右子樹上所有結點的值均大于它的根結點的值;(3)左、右子樹也分別為二叉排序樹;在最壞的情況是,兩子數(shù)列擁有大各為 1 和 n-

23、1,且調用樹(call tree)變成為一個 n 個嵌套(nested)調用的線性連串(chain)。第 i 次調用作了O(n-i)的工作量,且遞歸關系式為: 這與插入排序和選擇排序有相同的關系式,以及它被解為T(n) = O(n2)。它的最壞情況是很恐怖的,需要空間,遠比數(shù)列本身還多。23、簡述在一帶權有向圖中尋找關鍵路徑的基本思想關鍵路徑:關鍵路徑是指網(wǎng)絡終端元素的元素的序列,該序列具有最長的總工期并決定了整個項目的最短完成時間。在AOE網(wǎng)中,從始點到終點具有最大路徑長度(該路徑上的各個活動所持續(xù)的時間之和)的路徑為關鍵路徑 關鍵活動:關鍵路徑上的活動稱為關鍵活動。只有所有關鍵活動提前完成

24、,整個工程才能提前完成。最早可能開始時間Vei:從原點到頂點Vi最長路徑的長度(之前所有事情做完了才可能開始); 最遲允許開始時間Vli:保證匯點Vn-1在Ven-1時刻完成的前提下(整體工期不拖),事件Vi最遲允許的開始時間。Vli=minVlk-dur(<Vi,Vk>)關鍵活動:松弛時間(slack time)Alj-Aek=0的節(jié)點。24、類作用域和文件作用域的區(qū)別是什么文件作用域也稱“全局作用域”。 ··· 定義在所有函數(shù)之外的標識符,具有文件作用域,作用域為從定義處到整個源文件結束。 文件中定義的全局變量和函數(shù)都具有文件作用域。 如果某個文件

25、中說明了具有文件作用域的標識符,該文件又被另一個文件包含,則該標識符的作用域延伸到新的文件中。如cin和cout是在頭文件iostream.h中說明的具有文件作用域的標識符,它們的作用域也延伸到嵌入iostream.h的文件中。操作系統(tǒng) 1. 進程和線程的區(qū)別及聯(lián)系,操作系統(tǒng)的程序棧線程和進程的區(qū)別:1、 線程是進程的一部分,因此線程有的時候被稱為是輕權進程或者輕量級進程。2、 一個沒有線程的進程是能夠被看作單線程的,如果一個進程內(nèi)擁有多個進程,進程的執(zhí)行過程不是一條線(線程)的,而是多條線(線程)共同完成的。3、 系統(tǒng)在運行的時候會為每個進程分配不同的內(nèi)存區(qū)域,可是不會為線程分配內(nèi)存(線程所

26、使用的資源是它所屬的進程的資源),線程組只能共享資源。那就是說,出了CPU之外(線程在運行的時候要占用CPU資源),計算機內(nèi)部的軟硬件資源的分配與線程無關,線程只能共享它所屬進程的資源。4、 與進程的控制表PCB相似,線程也有自己的控制表TCB,可是TCB中所保存的線程狀態(tài)比PCB表中少多了(上下文保存一下就行)。5、 進程是系統(tǒng)所有資源分配時候的一個基本單位,擁有一個完整的虛擬空間地址,并不依賴線程而獨立存在。進程與程序的區(qū)別:程序是一組指令的集合,它是靜態(tài)的實體,沒有執(zhí)行的含義。而進程是一個動態(tài)的實體,有自己的生命周期。一般說來,一個進程肯定與一個程序相對應,而且只有一個,可是一個程序能夠

27、有多個進程,或者一個進程都沒有也能夠只有一個進程。除此之外,進程還有并發(fā)性和交往性。簡單地說,進程是程序的一部分,程序運行的時候會產(chǎn)生進程??偨Y:線程是進程的一部分,進程是程序的一部分。前一句說的不太準確,線程也有自己的資源,比如棧,私有數(shù)據(jù)等等。說她使用而不擁有資源指的是使用的是進程的打開文件句柄,進程的全局數(shù)據(jù),進程的地址空間等等,這些都屬于進程,而不屬于線程,進程內(nèi)個線程共享。進程切換比線程切換開銷大是因為進程切換時要切頁表,而且往往伴隨著頁調度,因為進程的數(shù)據(jù)段代碼段要換出去,以便把將要執(zhí)行的進程的內(nèi)容換進來。原來進程的內(nèi)容就是線程的超集。而且線程只需要保存線程的上下文(相關寄存器狀態(tài)

28、和棧的信息)就好了,動作很小。2. OS里面進程的“三態(tài)”“五態(tài)”“七態(tài)”是什么3. 什么是操作系統(tǒng)4. 死鎖的條件,檢測死鎖的可能方法及其基本思想A deadlock is a situation in which two or more competing actions are each waiting for the other to finish, and thus neither ever does.1. (互斥): At least two resources must be non-shareable.1 Only one process can use the resourc

29、e at any given instant of time.2. Hold and Wait or Resource Holding: A process is currently holding at least one resource and requestingadditional resources which are being held by other processes.3. No (禁止搶占): The operating system must not de-allocate resources once they have beenallocated; they mu

30、st be released by the holding process voluntarily.4. A process must be waiting for a resource which is being held by another process,which in turn is waiting for the first process to release the resource. In general, there is a of waitingprocesses, P = P1, P2, ., PN, such that P1 is waiting for a re

31、source held by P2, P2 is waiting for a resource held by P3 and so on until PN is waiting for a resource held by P1.17These four conditions are known as the Coffman conditions from their first description in a 1971 articleby 7 Unfulfillment of any of these conditions is enough to preclude a deadlock

32、from occurring.Ensure that the system will never enter a deadlock state.Prevention: Ensure one of the four conditions fails.Avoidance: The OS needs more information so that it can determine if the current request can be satisfied ordelayed.死鎖檢測:1. Resource-Allocation Graph2. Detection Algorithm5. 用戶

33、態(tài)和內(nèi)核態(tài)當程序運行在3級特權級上時,就能夠稱之為運行在用戶態(tài),因為這是最低特權級,是普通的用戶進程運行的特權級,大部分用戶直接面正確程序都是運行在用戶態(tài);反之,當程序運行在級特權級上時,就能夠稱之為運行在內(nèi)核態(tài)。 用戶態(tài)切換到內(nèi)核態(tài)的3種方式a. 系統(tǒng)調用這是用戶態(tài)進程主動要求切換到內(nèi)核態(tài)的一種方式,用戶態(tài)進程經(jīng)過系統(tǒng)調用申請使用操作系統(tǒng)提供的服務程序完成工作,比如前例中fork()實際上就是執(zhí)行了一個創(chuàng)立新進程的系統(tǒng)調用。而系統(tǒng)調用的機制其核心還是使用了操作系統(tǒng)為用戶特別開放的一個中斷來實現(xiàn),例如Linux的int 80h中斷。b. 異常當CPU在執(zhí)行運行在用戶態(tài)下的程序時,發(fā)生了某些事先

34、不可知的異常,這時會觸發(fā)由當前運行進程切換到處理此異常的內(nèi)核相關程序中,也就轉到了內(nèi)核態(tài),比如缺頁異常。c. 外圍設備的中斷當外圍設備完成用戶請求的操作后,會向CPU發(fā)出相應的中斷信號,這時CPU會暫停執(zhí)行下一條即將要執(zhí)行的指令轉而去執(zhí)行與中斷信號對應的處理程序,如果先前執(zhí)行的指令是用戶態(tài)下的程序,那么這個轉換的過程自然也就發(fā)生了由用戶態(tài)到內(nèi)核態(tài)的切換。比如硬盤讀寫操作完成,系統(tǒng)會切換到硬盤讀寫的中斷處理程序中執(zhí)行后續(xù)操作等。這3種方式是系統(tǒng)在運行時由用戶態(tài)轉到內(nèi)核態(tài)的最主要方式,其中系統(tǒng)調用能夠認為是用戶進程主動發(fā)起的,異常和外圍設備中斷則是被動的。6. 面包店算法該算法的基本思想源于顧客在

35、面包店中購買面包時的排隊原理. 顧客在進入面包店前, 首先抓一個號, 然后按照號碼由小到大的次序依次進入面包店購買面包. 這里, 面包店發(fā)放的號碼是由小到大的, 可是兩個或兩個以上的顧客卻有可能得到相同的號碼(使所抓號碼不同需要互斥), 如果多個顧客抓到相同的號碼, 則規(guī)定按照顧客名字的字典次序進行排序, 這里假定顧客是沒有重名的. 在計算機系統(tǒng)中, 顧客就相當于進程, 每個進程有一個唯一的標識, 我們用P的下面加一個下標來表示. 例如: 對于 Pi和Pj, 如果有i<j, 則先為Pi服務, 即Pi先進入臨界區(qū)7. 系統(tǒng)調用和庫函數(shù)的區(qū)別(1)調用形式不同。過程(函數(shù))使用一般調用指令,

36、其轉向地址是固定不變的,包含在跳轉語句中;但系統(tǒng)調用中不包含處理程序入口,而僅僅提供功能號,按功能號調用。(2)被調用代碼的位置不同。過程(函數(shù))調用是一種靜態(tài)調用,調用者和被調用代碼在同一程序內(nèi),經(jīng)過連接編輯后作為目標代碼的一部份。當過程(函數(shù))升級或修改時,必須重新編譯連結。而系統(tǒng)調用是一種動態(tài)調用,系統(tǒng)調用的處理代碼在調用程序之外(在操作系統(tǒng)中),這樣一來,系統(tǒng)調用處理代碼升級或修改時,與調用程序無關。而且,調用程序的長度也大大縮短,減少了調用程序占用的存儲空間。(3)提供方式不同。過程(函數(shù))往往由編譯系統(tǒng)提供,不同編譯系統(tǒng)提供的過程(函數(shù))能夠不同;系統(tǒng)調用由操作系統(tǒng)提供,一旦操作系

37、統(tǒng)設計好,系統(tǒng)調用的功能、種類與數(shù)量便固定不變了。(4)調用的實現(xiàn)不同。程序使用一般機器指令(跳轉指令)來調用過程(函數(shù)),是在用戶態(tài)運行的;程序執(zhí)行系統(tǒng)調用,是經(jīng)過中斷機構來實現(xiàn),需要從用戶態(tài)轉變到核心態(tài),在管理狀態(tài)執(zhí)行,因此,安全性好。8. 經(jīng)典進程同步問題是什么,同步思想?生產(chǎn)者-消費者問題是著名的進程同步問題,它描述一組生產(chǎn)者進程向一組消費者進程提供消息。它們共享一個有界緩沖池,生產(chǎn)者向其中投放消息,消費者從中取得消息。生產(chǎn)者-消費者問題是許多相互合作進程的一種抽象。假定緩沖池中有n個緩沖區(qū),每個緩沖區(qū)存放一個消息。由于緩沖池是臨界資源,它只允許一個生產(chǎn)者投入消息,或者一個消費者從中取

38、出消息。生產(chǎn)者之間、生產(chǎn)者與消費者之間、消費者之間都必須互斥地使用緩沖池。因此必須設置互斥信號量mutex,它代表緩沖池資源,它的數(shù)值為1。 讀者-寫者問題問題描述:一個數(shù)據(jù)集(如文件)被幾個并行進程所共享,有些進程只要求讀數(shù)據(jù)集內(nèi)容,稱為讀者,而另一些進程則要求修改數(shù)據(jù)集內(nèi)容,稱為寫者,幾個讀者能夠同時讀數(shù)據(jù)集,而不需要互斥,但一個寫者不能和其它進程(不論是寫者或讀者)同時訪問這些數(shù)據(jù)集,它們之間必須互斥。哲學家進餐問題該問題描述如下:有五個哲學家,她們的生活方式是交替地進行思考和進餐。哲學家們公用一張圓桌,周圍放有五把椅子,每人坐一把。在圓桌上有五個碗和五根筷子,當一個哲學家思考時,她不與

39、其它人交談,饑餓時便試圖取用其左、右最靠近她的筷子,但她可能一根都拿不到。只有在她拿到兩根筷子時,方能進餐,進餐完后,放下筷子又繼續(xù)思考。9. 文件管理及組織,F(xiàn)ATFAT = File Allocation Table10. 設備驅動程序是否屬于OS,她的作用是什么不是,驅動程序是另外安裝的軟件,是操作系統(tǒng)控制而且和硬件之間通訊的橋梁(程序)11. 程序和任務的區(qū)別任務是最抽象的,是一個一般性的術語,指由軟件完成的一個活動。一個任務既能夠是一個進程,也能夠是一個線程。簡而言之,它指的是一系列共同達到某一目的的操 作。例如,讀取數(shù)據(jù)并將數(shù)據(jù)放入內(nèi)存中。這個任務能夠作為一個進程來實現(xiàn),也能夠作為

40、一個線程(或作為一個中斷任務)來實現(xiàn)。 進程常常被定義為程序的執(zhí)行。能夠把一個進程看成是一個獨立的程序,在內(nèi)存中有其完備的數(shù)據(jù)空間和代碼空間。一個進程所擁有的數(shù)據(jù)和變量只屬于它自己。 線程則是某一進程中一路單獨運行的程序。也就是說,線程存在于進程之中。一個進程由一個或多個線程構成,各線程共享相同的代碼和全局數(shù)據(jù),但各有其自己的堆棧。由于堆棧是每個線程一個,因此局部變量對每一線程來說是私有的。由于所有線程共享同樣的代碼和全局數(shù)據(jù),它們比進程更緊密,比單獨的進程間更趨向于相互作用,線程間的相互作用更容易些,因為它們本身就有某些供通信用的共享內(nèi)存:進程的全局數(shù)據(jù)進程的全局數(shù)據(jù)進程的全局數(shù)據(jù)進程的全局

41、數(shù)據(jù)進程:資源分配、調度運行的基本單位。線程:進程中執(zhí)行運算的最小單位,執(zhí)行處理機調度的基本單位。12. 數(shù)據(jù)庫安全性和操作系統(tǒng)安全性的關系安全性問題不是數(shù)據(jù)庫系統(tǒng)所獨有的,所有計算機系統(tǒng)都有這個問題.只是在數(shù)據(jù)庫系統(tǒng)中大量數(shù)據(jù)集中存放,而且為許多最終用戶直接共享,從而使安全性問題更為突出.系統(tǒng)安全保護措施是否有效是數(shù)據(jù)庫系統(tǒng)的主要指標之一.數(shù)據(jù)庫的安全性和計算機系統(tǒng)的安全性,包括操作系統(tǒng),網(wǎng)絡系統(tǒng)的安全性是緊密聯(lián)系,相互支持的.13. 中斷處理的過程請求中斷響應中斷關閉中斷保留斷點中斷源識別保護現(xiàn)場中斷服務子程序恢復現(xiàn)場中斷返回 在實際運行中,一旦設備經(jīng)過某引腳N向8259A發(fā)出中斷指令,后

42、者便向8086A的INTR引腳發(fā)送中斷信號。8086A經(jīng)過INTA引腳通知8259A中斷有效(這個過程實際上還包括對此8259A的選址),后者即經(jīng)過地址總線將對應引腳N的中斷類型碼(已預先存好,見上節(jié))發(fā)送給CPU。CPU得到中斷類型碼后,先進行現(xiàn)場保護,主要包括:1. 狀態(tài)寄存器FLAGS壓棧(同時堆棧寄存器SP-2);2. 關閉中斷(將FLAGS寄存器的IF位置零);3. 將當前代碼段寄存器CS和程序計數(shù)器IP壓棧(同時堆棧寄存器SP-4)。 現(xiàn)場保護完成后,CPU開始按照前述的兩步驟翻譯中斷程序入口地址。在得到中斷處理程序地址之后但調用中斷處理程序之前,CPU會再檢查一下NMI引腳是否有

43、信號,以防在剛才的處理過程中忽略了可能的NMI中斷。NMI的優(yōu)先級始終高于INTR。中斷處理程序雖然是由程序員編寫,但須循一定規(guī)范。作為例程,中斷處理程序應該先將各寄存器信息(除了IP和CS,此二寄存器現(xiàn)已指向當前中斷程序)壓入堆棧予以保存,這樣才能在中斷處理程序內(nèi)部使用這些寄存器。在程序結束時,應該按與壓棧保護時相反的順序彈出各寄存器的值。中斷程序的最后一句始終是IRET指令,這條指令將棧頂6個字節(jié)分別彈出并存入IP、CS和FLAGS寄存器,完成了現(xiàn)場的還原。當然,如果是操作系統(tǒng)的中斷處理程序,則未必一般不會還原中斷前的狀態(tài)。這樣的中斷處理程序一般會在調用完寄存器保存例程后,調用進程調度程序

44、(多由高級語言編寫),并決定下一個運行的進程。隨后將此進程的寄存器信息(上次中斷時保存下來的)存入寄存器并返回。在中斷程序結束之后,主程序也發(fā)生了改變。14. 計算機系統(tǒng)怎樣實現(xiàn)存儲保護1. 防止地址越界(對進程所產(chǎn)生的地址必須加以檢查,發(fā)生越界時產(chǎn)生中斷,由操作系統(tǒng)進行相應處理)2. 防止操作越權(對屬于自己區(qū)域的信息,可讀可寫:對公共區(qū)域中允許共享的信息或獲得授權可使用的信息,可讀而不可修改;對未授權使用的信息,不可讀,不可寫)15. 調度的基本準則(Scheduling Criteria)There are many criteria for comparing different sc

45、heduling algorithms. Here are five common ones: CPU utilization(CPU利用率)􀏀Throughput(吞吐量)Turnaround time(周轉時間)􀏀Waiting time(等待時間)Response time(響應時間)16. 多線程是否真正能提高效率17. 磁盤調度算法有哪幾種FCFSSSTF (Shortest Seek Time First)Scan/LookC-Sacn/C-Look18. RAID工作原理RAID(Redundant Array of Independent D

46、isks)經(jīng)過條帶化存儲和奇偶校驗兩個措施來實現(xiàn)其冗余和容錯的目標。條帶化存儲意味著能夠一次寫入一個數(shù)據(jù)塊的方式將文件寫入多個磁盤。條帶化存儲技術將數(shù)據(jù)分開寫入多個驅動器,從而提高數(shù)據(jù)傳輸速率并縮短磁盤處理總時間。這種系統(tǒng)非常適用于交易處理、但可靠性卻很差,因為系統(tǒng)的可靠性等于最差的單個驅動器的可靠性。奇偶校驗經(jīng)過在傳輸后對所有數(shù)據(jù)進行冗余校驗能夠確保數(shù)據(jù)的有效性。利用奇偶校驗,當RAID系統(tǒng)的一個磁盤發(fā)生故障時,其它磁盤能夠重建該故障磁盤。在這兩種情況中,這些功能對于操作系統(tǒng)都是透明的。由磁盤陣列控制器(DAC)進行條帶化存儲和奇偶校驗控制。19. Windows中段最長多少字節(jié)?20. 同

47、步、互斥22. 簡述請求段頁式虛擬內(nèi)存管理基本思想Bring a page into memory only when it is needed.Less I/O neededLess memory neededFaster responseMore users􀏀 Page is needed reference to itinvalid reference abortnot-in-memory bring to memory網(wǎng)絡1. 路由協(xié)議常見路由協(xié)議有:RIP,OSPF,BGP等2. CSMA/CD, 指數(shù)回退載波偵聽多路訪問沖突檢測(英語:Carrier Sense

48、Multiple Access with CollisionDetection,CSMA/CD)此方案要求設備在發(fā)送幀的同時要對信道進行偵聽,以確定是否發(fā)生沖突,若在發(fā)送數(shù)據(jù)過程中檢測到?jīng)_突,則進行如下沖突處理操作:1. 發(fā)送特殊阻塞信息并立即停止發(fā)送數(shù)據(jù):特殊阻塞信息是連續(xù)幾個字節(jié)的全1信號,此舉意在強化沖突,以使得其它設備能盡快檢測到?jīng)_突發(fā)生。2. 在固定時間(一開始是 1 contention period times)內(nèi)等待隨機的時間,再次發(fā)送。3. 若依舊碰撞,則采用進行發(fā)送。即十次之內(nèi)停止前一次“固定時間”的兩倍時間內(nèi)隨機再發(fā)送,十次后則停止前一次“固定時間”內(nèi)隨機再發(fā)送。嘗試16

49、次之后依然失敗則放棄傳送。載波偵聽多路訪問沖突避免(英語:Carrier Sense Multiple Access with Collision Avoidance,CSMA/CA)此種方案采用主動避免碰撞而非被動偵測的方式來解決沖突問題。能夠滿足那些不易準確偵測是否有沖突發(fā)生的需求,如無線網(wǎng)域。CSMA/CA協(xié)議主要使用兩種方法來避免碰撞: 1. 設備欲發(fā)送訊框(Frame),且訊框聽到通道空閑時,維持一段時間后,再等待一段隨機的時間依然空閑時,才提交數(shù)據(jù)。由于各個設備的等待時間是分別隨機產(chǎn)生的,因此很大可能有所區(qū)別,由此能夠減少沖突的可能性。2. RTS-CTS三向握手(:handsha

50、ke):設備欲發(fā)送訊框前,先發(fā)送一個很小的RTS(Request to Send)訊框給目標端,等待目標端回應CTS(Clear to Send)幀后,才開始傳送。此方式能夠確保接下來傳送數(shù)據(jù)時,不會發(fā)生沖突。同時由于RTS幀與CTS幀都很小,讓傳送的無效開銷變小。3. 解釋FTP、HTTP的全稱及其原理。FTP、HTTP文件傳輸?shù)漠愅現(xiàn)TP:File Transfer ProtocolHTTP: Hyper Text Transfer Protocol都是應用層協(xié)議。4. 七層協(xié)議的名稱PhysicalData LinkNetworkTransmissionSessionPresentati

51、onApplication5. 電子郵件發(fā)送到接收的過程,協(xié)議電子郵件的工作過程遵循客戶-服務器模式。每份電子郵件 的發(fā)送都要涉及到發(fā)送方與接收方,發(fā)送方式構成客戶端,而接收方構成服務器,服務器含有 眾多用戶的電子信箱。發(fā)送方經(jīng)過郵件客戶程序,將編輯好的電子郵件向郵局服務器(SMTP服 務器)發(fā)送。郵局服務器識別接收者的地址,并向管理該地址的郵件服務器(POP3服務器)發(fā) 送消息。郵件服務器識將消息存放在接收者的電子信箱內(nèi),并告知接收者有新郵件到來。接收 者經(jīng)過郵件客戶程序連接到服務器后,就會看到服務器的通知,進而打開自己的電子信箱來查 收郵件。發(fā)送:SMTP接收:POP, IMAP6. P2

52、P技術,具體的實現(xiàn)機制實現(xiàn)P2P需要一個中轉服務器。也就是需要一個第三方。(一會兒我們來說為什么需要一個第三方)7. 網(wǎng)絡中的握手問題8. 無線傳感網(wǎng)絡(WSN)及其應用無線傳感網(wǎng)絡(Wireless sensor network),或譯無線感知網(wǎng)絡,是由許多在空間中分布的自動裝置組成的一種無線通訊計算機網(wǎng)絡,這些裝置使用傳感器協(xié)作地監(jiān)控不同位置的物理或環(huán)境狀況(比如溫度、聲音、振動、壓力、運動或污染物)。無線傳感器網(wǎng)絡的發(fā)展最初起源于戰(zhàn)場監(jiān)測等軍事應用。而現(xiàn)今無線傳感器網(wǎng)絡被應用于很多民用領域,如環(huán)境與生態(tài)監(jiān)測、健康監(jiān)護、家居自動化以及交通控制等。無線傳感網(wǎng)絡主要包括三個方面:感應,通訊,計

53、算(硬件,軟件,算法)。其中的關鍵技術主要有無線數(shù)據(jù)庫技術,比如使用在無線傳感器網(wǎng)絡的查詢,和用于和其它傳感器通訊的網(wǎng)絡技術,特別是多次跳躍路由協(xié)議。9. 當前網(wǎng)絡新技術及其應用,Web2.0Web 2.0,指的是一個利用Web的平臺,由用戶主導而生成的內(nèi)容互聯(lián)網(wǎng)產(chǎn)品模式,為了區(qū)別傳統(tǒng)由網(wǎng)站雇員主導生成的內(nèi)容而定義為web2.08. 無線傳感網(wǎng)絡(WSN)及其應用無線傳感網(wǎng)絡(Wireless sensor network),或譯無線感知網(wǎng)絡,是由許多在空間中分布的自動裝置組成的一種無線通訊計算機網(wǎng)絡,這些裝置使用傳感器協(xié)作地監(jiān)控不同位置的物理或環(huán)境狀況(比如溫度、聲音、振動、壓力、運動或污染

54、物)。無線傳感器網(wǎng)絡的發(fā)展最初起源于戰(zhàn)場監(jiān)測等軍事應用。而現(xiàn)今無線傳感器網(wǎng)絡被應用于很多民用領域,如環(huán)境與生態(tài)監(jiān)測、健康監(jiān)護、家居自動化以及交通控制等。無線傳感網(wǎng)絡主要包括三個方面:感應,通訊,計算(硬件,軟件,算法)。其中的關鍵技術主要有無線數(shù)據(jù)庫技術,比如使用在無線傳感器網(wǎng)絡的查詢,和用于和其它傳感器通訊的網(wǎng)絡技術,特別是多次跳躍路由協(xié)議。9. 當前網(wǎng)絡新技術及其應用,Web2.0Web 2.0,指的是一個利用Web的平臺,由用戶主導而生成的內(nèi)容互聯(lián)網(wǎng)產(chǎn)品模式,為了區(qū)別傳統(tǒng)由網(wǎng)站雇員主導生成的內(nèi)容而定義為web2.011. TCP擁塞控制(congestion control)與流量控制(

55、flow control)的功能和區(qū)別流量控制解決的問題:通信雙方速率不匹配。方法:Sliding window,控制滑動窗口大小,自適應速率。擁塞控制解決的問題:雙方速率都允許的情況下,如何保證途中不出問題。方法:使用RTT(Round Trip Time)以及RTO(Retransmission Time Out)以及計算這兩個量的算法,保證傳輸可能失敗的時候重傳。12. PPP協(xié)議點對點協(xié)議(英語:Point-to-Point Protocol,PPP)工作在數(shù)據(jù)鏈路層(以OSI參考模型的觀點)。它一般見在兩節(jié)點間創(chuàng)立直接的連接,并能夠提供連接認證、傳輸加密(使用ECP,RFC 1968

56、)以及壓縮。13. 集線器、路由器和交換機有什么區(qū)別。中繼器、集線器、交換機、網(wǎng)橋、網(wǎng)關、路由器的功能14. P2P網(wǎng)絡編程的特點?15. DNS的遞歸查詢和迭代查詢(1)遞歸查詢遞歸查詢是一種DNS 服務器的查詢模式,在該模式下DNS 服務器接收到客戶機請求,必須使用一個準確的查詢結果回復客戶機。如果DNS 服務器本地沒有存儲查詢DNS 信息,那么該服務器會詢問其它服務器,并將返回的查詢結果提交給客戶機。(2)迭代查詢DNS 服務器另外一種查詢方式為迭代查詢,DNS 服務器會向客戶機提供其它能夠解析查詢請求的DNS 服務器地址,當客戶機發(fā)送查詢請求時,DNS 服務器并不直接回復查詢結果,而是

57、告訴客戶機另一臺DNS 服務器地址,客戶機再向這臺DNS 服務器提交請求,依次循環(huán)直到返回查詢的結果為止。16. ARP協(xié)議、ARP攻擊地址解析協(xié)議(Address Resolution Protocol),其基本功能為經(jīng)過目標設備的IP地址,查詢目標設備的MAC地址,以保證通信的順利進行。它是中網(wǎng)絡層必不可少的協(xié)議,不過在中已不再適用,并被鄰居發(fā)現(xiàn)協(xié)議(NDP)所替代。在以太網(wǎng)協(xié)議中規(guī)定,同一局域網(wǎng)中的一臺主機要和另一臺主機進行直接通信,必須要知道目標主機的MAC地址。而在TCP/IP協(xié)議中,網(wǎng)絡層和傳輸層只關心目標主機的IP地址。這就導致在以太網(wǎng)中使用IP協(xié)議時,數(shù)據(jù)鏈路層的以太網(wǎng)協(xié)議接到上層IP協(xié)議提供的數(shù)據(jù)中,只包含目的主機的IP地址。于是需要一種方法,根據(jù)目的主機的IP地址,獲得其MAC地址。這就是ARP協(xié)議要做的事情。所謂地址解析(address resolution)就是主機在發(fā)送幀前將目標IP地址轉換成目標MAC地址的過程。ARP欺騙的運作原理是由攻擊者發(fā)送假的ARP數(shù)據(jù)包到網(wǎng)絡上,特別是送到網(wǎng)關上。其目的是要讓送至特定的IP地址的流量被錯誤送到攻擊者所取代的地方。因此攻擊者可將這些流量另

溫馨提示

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

評論

0/150

提交評論