天天看點

阿裡巴巴c++複習

1、c++基礎知識

  • 變量的聲明和定義有什麼差別 .為變量配置設定位址和存儲空間的稱為定義,不配置設定位址的稱為聲明。一個變量可以在多個地方聲明,但是隻在一個地方定義。加入extern修飾的是變量的聲明,說明此變量将在檔案以外或在檔案後面部分定義。 說明:很多時候一個變量,隻是聲明不配置設定記憶體空間,直到具體使用時才初始化,配置設定記憶體空間,如外部變量。 
  • sizeof和strlen的差別 
  • sizeof是一個操作符,strlen是庫函數。 
  • sizeof的參數可以是資料的類型,也可以是變量,而strlen隻能以結尾為‘\0‘的字元串作參數。 
  • 編譯器在編譯時就計算出了sizeof的結果。而strlen函數必須在運作時才能計算出來。并且sizeof計算的是資料類型占記憶體的大小,而strlen計算的是字元串實際的長度。  數組做sizeof的參數不退化,傳遞給strlen就退化為指針了。 
  • C語言的關鍵字 static 和 C++ 的關鍵字 static 有什麼差別 
  • 在C中static用來修飾局部靜态變量和外部靜态變量、函數。
  • 而C++中除了上述功能外,還用來定義類的成員變量和函數。即靜态成員和靜态成員函數。 
  • 程式設計時static的記憶性,和全局性的特點可以讓在不同時期調用的函數進行通信,傳遞資訊,而C++的靜态成員則可以在多個對象執行個體間進行通信,傳遞資訊。 
  • static有什麼作用 
  • static在C中主要用于定義全局靜态變量、定義局部靜态變量、定義靜态函數。在C++中新增了兩種作用:定義靜态資料成員、靜态函數成員。 
  • 因為static定義的變量配置設定在靜态區,是以其定義的變量的預設值為0,普通變量的預設值為随機數,在定義指針變量時要特别注意。 
  • 一個指針可以是volatile嗎 .可以,因為指針和普通變量一樣
  • volatile(易變的)關鍵字,volatile提醒編譯器它後面所定義的變量随時都有可能改變,是以編譯後的程式每次需要存儲或讀取這個變量的時候,都會直接從變量位址中讀取資料。如果沒有volatile關鍵字,則編譯器可能優化讀取和存儲,可能暫時使用寄存器中的值,如果這個變量由别的程式更新了的話,将出現不一緻的現象。由于通路寄存器的速度要快過RAM,是以編譯器一般都會作減少存取外部RAM的優化
  • 簡述C、C++程式編譯的記憶體配置設定情況 C、C++中記憶體配置設定方式可以分為三種: 
  • 從靜态存儲區域配置設定: 記憶體在程式編譯時就已經配置設定好,這塊記憶體在程式的整個運作期間都存在。速度快、不容易出錯,因為有系統會善後。例如全局變量,static變量等。 
  • 在棧上配置設定: 在執行函數時,函數内局部變量的存儲單元都在棧上建立,函數執行結束時這些存儲單元自動被釋放。棧記憶體配置設定運算内置于處理器的指令集中,效率很高,但是配置設定的記憶體容量有限。 
  • 從堆上配置設定: 即動态記憶體配置設定。程式在運作的時候用malloc或new申請任意大小的記憶體,程式員自己負責在何時用free或delete釋放記憶體。動态記憶體的生存期由程式員決定,使用非常靈活。如果在堆上配置設定了空間,就有責任回收它,否則運作的程式會出現記憶體洩漏,另外頻繁地配置設定和釋放不同大小的堆空間将會産生堆内碎塊。 
  • 簡述strcpy、sprintf與memcpy的差別  
  • 操作對象不同,strcpy的兩個操作對象均為字元串,sprintf的操作源對象可以是多種資料類型,目的操作對象是字元串,memcpy 的兩個對象就是兩個任意可操作的記憶體位址,并不限于何種資料類型。 
  • 執行效率不同,memcpy最高,strcpy次之,sprintf的效率最低。 
  • 實作功能不同,strcpy主要實作字元串變量間的拷貝,sprintf主要實作其他資料類型格式到字元串的轉化,memcpy主要是記憶體塊間的拷貝。
  • 面向對象的三大特征 
  • 封裝性:将客觀事物抽象成類,每個類對自身的資料和方法實行protection(private, protected,public)。 
  • 繼承性:廣義的繼承有三種實作形式:實作繼承(使用基類的屬性和方法而無需額外編碼的能力)、可視繼承(子窗體使用父窗體的外觀和實作代碼)、接口繼承(僅使用屬性和方法,實作滞後到子類實作)。 
  • 多态性:是将父類對象設定成為和一個或更多它的子對象相等的技術。用子類對象給父類對象指派之後,父類對象就可以根據目前指派給它的子對象的特性以不同的方式運作。(多态詳解​​javascript:void(0)​​) 
  • C++的空類有哪些成員函數 
  • 預設構造函數。 
  • 預設拷貝構造函數。 
  • 預設析構函數。 
  • 預設指派運算符。 
  • 預設取址運算符。 
  • 預設取址運算符 const。
  • 注意:有些書上隻是簡單的介紹了前四個函數。沒有提及後面這兩個函數。但後面這兩個函數也是空類的預設函數。另外需要注意的是,隻有當實際使用這些函數的時候,編譯器才會去定義它們。 
  • 談談你對拷貝構造函數和指派運算符的認識 
  • 拷貝構造函數生成新的類對象,而指派運算符不能。 
  • 由于拷貝構造函數是直接構造一個新的類對象,是以在初始化這個對象之前不用檢驗源對象是否和建立對象相同。而指派運算符則需要這個操作,另外指派運算中如果原來的對象中有記憶體配置設定要先把記憶體釋放掉 
  • 簡述類成員函數的重寫、重載和隐藏的差別
  • 重寫和重載主要有以下幾點不同
  • 範圍的差別:被重寫的和重寫的函數在兩個類中,而重載和被重載的函數在同一個類中。 
  • 參數的差別:被重寫函數和重寫函數的參數清單一定相同,而被重載函數和重載函數的參數清單一定不同。 
  • virtual的差別:重寫的基類中被重寫的函數必須要有virtual修飾,而重載函數和被重載函數可以被virtual修飾,也可以沒有。
  • 隐藏和重寫、重載有以下幾點不同。 
  • 與重載的範圍不同:和重寫一樣,隐藏函數和被隐藏函數不在同一個類中。 
  • 參數的差別:隐藏函數和被隐藏的函數的參數清單可以相同,也可不同,但是函數名肯定要相同。
  • 當參數不相同時,無論基類中的參數是否被virtual修飾,基類的函數都是被隐藏,而不是被重寫。 
  • 說明:雖然重載和覆寫都是實作多态的基礎,但是兩者實作的技術完全不相同,達到的目的也是完全不同的,覆寫是動态态綁定的多态,而重載是靜态綁定的多态。
  • 簡述多态實作的原理    編譯器發現一個類中有虛函數,便會立即為此類生成虛函數表 vtable。虛函數表的各表項為指向對應虛函數的指針。編譯器還會在此類中隐含插入一個指針vptr(對vc編譯器來說,它插在類的第一個位置上)指向虛函數表。調用此類的構造函數時,在類的構造函數中,編譯器會隐含執行vptr與vtable的關聯代碼,将vptr指向對應的vtable,将類與此類的vtable聯系了起來。另外在調用類的構造函數時,指向基礎類的指針此時已經變成指向具體的類的this指針,這樣依靠此this指針即可得到正确的vtable,。如此才能真正與函數體進行連接配接,這就是動态聯編,實作多态的基本原理。 
  • typedef和define有什麼差別 
  • 用法不同:typedef用來定義一種資料類型的别名,增強程式的可讀性。define主要用來定義常量,以及書寫複雜使用頻繁的宏。 
  • 執行時間不同:typedef是編譯過程的一部分,有類型檢查的功能。define是宏定義,是預編譯的部分,其發生在編譯之前,隻是簡單的進行字元串的替換,不進行類型的檢查。 
  • 作用域不同:typedef有作用域限定。define不受作用域限制,隻要是在define聲明後的引用都是正确的。 
  • 對指針的操作不同:typedef和define定義的指針時有很大的差別。 
  • typedef定義是語句,因為句尾要加上分号。而define不是語句,千萬不能在句尾加分号。
  • 關鍵字const是什麼 
  • const用來定義一個隻讀的變量或對象。主要優點:便于類型檢查、同宏定義一樣可以友善地進行參數的修改和調整、節省空間,避免不必要的記憶體配置設定、可為函數重載提供參考。 
  • 說明:const修飾函數參數,是一種程式設計規範的要求,便于閱讀,一看即知這個參數不能被改變,實作時不易出錯
  • extern有什麼作用 ,extern辨別的變量或者函數聲明其定義在别的檔案中,提示編譯器遇到此變量和函數時在其它子產品中尋找其定義。 
  • 流操作符重載為什麼傳回引用   在程式中,流操作符>>和<<經常連續使用。是以這兩個操作符的傳回值應該是一個仍舊支援這兩個操作符的流引用。其他的資料類型都無法做到這一點。 
  • 簡述指針常量與常量指針差別 
  • 指針常量是指定義了一個指針,這個指針的值隻能在定義時初始化,其他地方不能改變。常量指針是指定義了一個指針,這個指針指向一個隻讀的對象,不能通過常量指針來改變這個對象的值。 
  • 指針常量強調的是指針的不可改變性,而常量指針強調的是指針對其所指對象的不可改變性。 
  • 注意:無論是指針常量還是常量指針,其最大的用途就是作為函數的形式參數,保證明參在被調用函數中的不可改變特性。 
  • 如何避免“野指針” 
  • 指針變量聲明時沒有被初始化。解決辦法:指針聲明時初始化,可以是具體的位址值,也可讓它指向NULL。 
  • 指針 p 被 free 或者 delete 之後,沒有置為 NULL。解決辦法:指針指向的記憶體空間被釋放後指針應該指向NULL。 
  • 指針操作超越了變量的作用範圍。解決辦法:在變量的作用域結束前釋放掉變量的位址空間并且讓指針指向NULL。 
  • 注意:“野指針”的解決方法也是程式設計規範的基本原則,平時使用指針時一定要避免産生“野指針”,在使用指針前一定要檢驗指針的合法性。 
  • 常引用有什麼作用 
  • 常引用的引入主要是為了避免使用變量的引用時,在不知情的情況下改變變量的值。常引用主要用于定義一個普通變量的隻讀屬性的别名、作為函數的傳入形參,避免實參在調用函數中被意外的改變。 
  • 很多情況下,需要用常引用做形參,被引用對象等效于常對象,不能在函數中改變實參的值,這樣的好處是有較高的易讀性和較小的出錯率。 
  • 構造函數能否為虛函數 
  • 構造函數不能是虛函數。而且不能在構造函數中調用虛函數,因為那樣實際執行的是父類的對應函數,因為自己還沒有構造好。析構函數可以是虛函數,而且,在一個複雜類結構中,這往往是必須的。析構函數也可以是純虛函數,但純虛析構函數必須有定義體,因為析構函數的調用是在子類中隐含的。
  • 談談你對面向對象的認識 
  • 面向對象可以了解成對待每一個問題,都是首先要确定這個問題由幾個部分組成,而每一個部分其實就是一個對象。然後再分别設計這些對象,最後得到整個程式。傳統的程式設計多是基于功能的思想來進行考慮和設計的,而面向對象的程式設計則是基于對象的角度來考慮問題。這樣做能夠使得程式更加的簡潔清晰。 
  • 空結構體sizeof的傳回值   sizeof(空類/空結構體) = 1; 空類,沒有任何成員變量或函數,即沒有存儲任何内容;但是由于空類仍然可以執行個體化,一個類能夠執行個體化,編譯器就需給它配置設定記憶體空間,來訓示類執行個體的位址。這裡編譯器預設配置設定了一個位元組(如:char),以便标記可能初始化的類執行個體,同時使空類占用的空間也最少(即1位元組)。
  • free和delete差別,free和mall比對:釋放malloc出來動态記憶體; delete和new比對:釋放new出來的動态記憶體空間。
  • new、delete 是操作符,可以重載,隻能在C++中使用。 
  • malloc、free是函數,可以覆寫,C、C++中都可以使用。 
  • new 可以調用對象的構造函數,對應的delete調用相應的析構函數。 
  • malloc僅僅配置設定記憶體,free僅僅回收記憶體,并不執行構造和析構函數 
  • new、delete傳回的是某種資料類型指針,malloc、free傳回的是void指針。 
  • 它們都是隻把指針所指向的記憶體釋放掉了,并沒有把指針本身幹掉。在free和delete之後,都需要把指向清理記憶體的指針置為空,即p=NULL,否則指針指向的記憶體空間雖然釋放了,但是指針p的值還是記錄的那塊位址,該位址對應的記憶體是垃圾,p就成了“野指針”。同樣會使人認為p是個合法的指針,如果程式較長,我們通常在使用一個指針前會檢查p!=NULL,這樣就起不到作用了。此時如果再釋放p指向的空間,編譯器就會報錯,因為釋放一個已經被釋放過的空間是不合法的。而将其置為NULL之後再重複釋放就不會産生問題,因為delete一個0指針是安全的。
  • int i=1;sizeof(i++); i的值變為多少,sizeof是一個編譯時刻就起效果的​​運算符​​​,在其内的任何運算都沒有意義,j = sizeof(i++); 在編譯的時候被翻譯成 j=sizeof((i++的​​資料類型​​)) 也就是 j = sizeof(int); 也就是 j= 4; (32bit系統,如果是16位系統,則j=2) 然後才會繼續編譯成最終的程式,當然在最終程式執行的時候,自然不會執行任何++i了。
  • 一個char跟int的結構體大小是多少。結構體記憶體對齊的規則【未指定#pragma pack時】a.第一個成員起始于0偏移處; b.每個成員按其類型大小和指定對齊參數n中較小的一個進行對齊;
  • 構造函數可以抛出異常麼?析構函數可以嗎?                                                                                                                                                     從文法上來說,構造函數和析構函數都可以抛出異常。但從邏輯上和風險控制上,構造函數可以,析構函數不推薦抛出異常,構造函數可以抛出異常:無論何時,從構造函數中抛出異常都是可以的。動态建立對象要進行兩個操作:配置設定記憶體和調用構造函數。若在配置設定記憶體時出錯,會抛出bad_alloc異常。c++不推薦從析構函數中抛出異常,必須要求在析構函數内消化所有異常。因為析構函數可能在對象正常結束生命周期時調用,也可能在有異常發生時從函數堆棧清理時調用。前一種情況抛出異常不會有無法預料的結果,可以正常捕獲;但後一種情況下,因為已經發生了異常而導緻函數的局部變量的析構函數被調用,此時析構函數又抛出異常。在兩個異常同時存在的情況下,異常處理機制隻能調用terminate()。
  • C++ 隻有​

    ​explicit​

    ​關鍵字,沒有implicit關鍵字。編譯器允許解析函數的參數時,對參數作隐式轉換。也就是說,編譯器能夠使用帶單個參數的構造函數,将函數參數轉換為正确的類型。帶有單個形參的構造函數定義了一種由實參類型到類類型的隐式轉換。由于無意中的隐式轉換會隐藏bug, 這就是構造函數前面加​

    ​explicit​

    ​的原因。
  • 模闆聲明與定義要放在同一檔案中?“通常情況下,你會在.h檔案中聲明函數和類,而将它們的定義放置在一個單獨的.cpp檔案中。但是在使用模闆時,這種習慣性做法将變得不再有用,因為當執行個體化一個模闆時,編譯器必須看到模闆确切的定義,而不僅僅是它的聲明。是以,最好的辦法就是将模闆的聲明和定義都放置在同一個.h檔案中。這就是為什麼所有的STL頭檔案都包含模闆定義的原因。”[1]"标準要求編譯器在執行個體化模闆時必須在上下文中可以檢視到其定義實體;而反過來,在看到執行個體化模闆之前,編譯器對模闆的定義體是不處理的——原因很簡單,編譯器怎麼會預先知道 typename 實參是什麼呢?是以模闆的執行個體化與定義體必須放到同一翻譯單元中。​​javascript:void(0)​​因為C++标準明确表示,當一個模闆不被用到的時 //侯它就不該被具現出來。編譯沒錯,連結出錯。找不到子產品函數的實作。編譯模版的定義cpp時如果該cpp中沒有該模版的具體執行個體,那麼該cpp中就不會處理和子產品有關的代碼。連結時就找不到模版函數的定義。
  • 模闆特化和偏特化,C++中的模闆分為類模闆和函數模闆
  • 講下虛函數的機制,C++中虛函數的唯一用處就是構成多态,C++提供多态的目的是:可以通過基類指針對所有派生類(包括直接派生和間接派生)的成員變量和成員函數進行“全方位”的通路,尤其是成員函數。如果沒有多态,我們隻能通路成員變量。 前面我們說過,通過指針調用普通的成員函數時會根據指針的類型(通過哪個類定義的指針)來判斷調用哪個類的成員函數,但是通過本節的分析可以發現,這種說法并不适用于虛函數,虛函數是根據指針的指向來調用的,指針指向哪個類的對象就調用哪個類的虛函數
  • 講下虛繼承,虛拟繼承是多重繼承中特有的概念。虛拟基類是為解決多重繼承而出現的。如:類D繼承自類B1、B2,而類B1、B2都繼承自類A,是以在類D中兩次出現類A中的變量和函數。為了節省記憶體空間,可以将B1、B2對A的繼承定義為虛拟繼承,而A就成了虛拟基類
  • unsigned char a=-1,printf("%d",a)輸出什麼;255【-1的補碼是11111111】
  • 通路類private成員的方法,比如編寫單元測試,私有成員沒有暴露接口。
  • std::string怎麼實作的;線程安全嗎,中間有'\0'時cout輸出;用printf的輸出,輸出一樣,都是遇到\0結束
  • 了解C++11嗎,講下auto關鍵字與類中的delete。 auto關鍵字實作自動類型推斷,讓編譯器能夠将變量的類型設定為初始值的類型,auto聲明的變量必須要初始化,否則編譯器不能判斷變量的類型,auto實際上實在編譯時對變量進行了類型推導,是以不會對程式的運作效率造成不良影響。另外,auto并不會影響編譯速度,因為編譯時本來也要右側推導然後判斷與左側是否比對。
  • 智能指針的原理是什麼? C++11有哪些智能指針?主要用來處理忘記delete或者程式運作中抛異常無法執行到delete等導緻的記憶體洩露問題。簡單來說即為将指針類型封裝為對象,當其“徹底”消亡時将調用析構函數,進而自動地将其從堆中配置設定的記憶體釋放掉,而不用去關心記憶體洩露的問題。兩種智能指針 shared_ptr 和 unique_ptr, 還有一個名為weak_ptr的伴随類。shared_ptr, 共享所有權,允許多個指針指向同一個對象,其内部有一個關聯的引用計數,用來記錄有多少個其他的shared_ptr指向相同的對象,當引用計數為0時将調用析構函數釋放對應空間。unique_ptr遵循獨占語義,在任何時間點,資源隻能唯一地被一個unique_ptr占有,當其離開作用域,所包含的資源被釋放。weak_ptr解決shared_ptr循環引用時的bug
  • 講講函數參數是多個參數怎麼傳遞,比如說printf的參數,怎麼确定大小等,一個int printf%s會出什麼情況。
  • gcc跟vs哪個比較熟,問了gdb的斷點怎麼實作的。C++裡用過彙編語言嗎。

2、作業系統

  • 請分别簡單說一說程序和線程以及它們的差別。程序是具有一定功能的程式關于某個資料集合上的一次運作活動,程序是系統進行資源排程和配置設定的一個獨立機關。線程是程序的實體,是CPU排程和分派的基本機關,它是比程序更小的能獨立運作的基本機關。一個程序可以有多個線程,多個線程也可以并發執行
  • 線程同步的方式有哪些?互斥量:采用互斥對象機制,隻有擁有互斥對象的線程才有通路公共資源的權限。因為互斥對象隻有一個,是以可以保證公共資源不會被多個線程同時通路。信号量:它允許同一時刻多個線程通路同一資源,但是需要控制同一時刻通路此資源的最大線程數量。事件(信号):通過通知操作的方式來保持多線程同步,還可以友善的實作多線程優先級的比較操作。
  • 說一說程序同步有哪幾種機制,和程序同步的方式相同
  • 程序的通信方式有哪些?主要分為:管道、系統IPC(Inter-Process Communication,程序間通信,包括消息隊列、信号量、共享存儲)、SOCKET,管道主要分為:普通管道PIPE 、流管道(s_pipe)、命名管道(name_pipe),管道是一種半雙工的通信方式,資料隻能單項流動,并且隻能在具有親緣關系的程序間流動,程序的親緣關系通常是父子程序命名管道也是半雙工的通信方式,它允許無親緣關系的程序間進行通信信号量是一個計數器,用來控制多個程序對資源的通路,它通常作為一種鎖機制。消息隊列是消息的連結清單,存放在核心中并由消息隊列辨別符辨別。信号是一種比較複雜的通信方式,用于通知接收程序某個事件已經發生。共享記憶體就是映射一段能被其它程序通路的記憶體,這段共享記憶體由一個程序建立,但是多個程序可以通路。
  • 什麼是緩沖區溢出?有什麼危害?其原因是什麼?緩沖區溢出是指當計算機向緩沖區填充資料時超出了緩沖區本身的容量,溢出的資料覆寫在合法資料上。危害有以下兩點:程式崩潰,導緻拒絕額服務,跳轉并且執行一段惡意代碼,造成緩沖區溢出的主要原因是程式中沒有仔細檢查使用者輸入。 
  • 什麼是死鎖?死鎖産生的條件?在兩個或者多個并發程序中,如果每個程序持有某種資源而又等待其它程序釋放它或它們現在保持着的資源,在未改變這種狀态之前都不能向前推進,稱這一組程序産生了死鎖。通俗的講就是兩個或多個程序無限期的阻塞、互相等待的一種狀态。死鎖産生的四個條件(有一個條件不成立,則不會産生死鎖)互斥條件:一個資源一次隻能被一個程序使用;請求與保持條件:一個程序因請求資源而阻塞時,對已獲得資源保持不放;不剝奪條件:程序獲得的資源,在未完全使用完之前,不能強行剝奪;循環等待條件:若幹程序之間形成一種頭尾相接的環形等待資源關系 ,
  • 說一說死鎖的處理基本政策和常用方法。産生死鎖的原因:(1)競争系統資源 (2)程序的推進順序不當産生死鎖的必要條件:産生死鎖的必要條件:互斥條件,請求和保持條件,不剝奪條件,環路等待條件;解決死鎖的基本方法如下: 預防死鎖【資源一次性配置設定:(破壞請求和保持條件),可剝奪資源:即當某程序新的資源未滿足時,釋放已占有的資源(破壞不可剝奪條件),資源有序配置設定法((破壞環路等待條件))】、避免死鎖(系統在進行資源配置設定之前預先計算資源配置設定的安全性。若此次配置設定不會導緻系統進入​​不安全狀态​​,則将資源配置設定給程序;否則,程序等待。其中最具有代表性的避免死鎖算法是銀行家算法。)、檢測死鎖(首先為每個程序和每個資源指定一個唯一的号碼;然後建立資源配置設定表和程序等待表)、解除死鎖(剝奪資源:從其它程序剝奪足夠數量的資源給死鎖程序,以解除死鎖狀态;撤消程序:可以直接撤消死鎖程序或撤消代價最小的程序,直至有足夠的資源可用,死鎖狀态.消除為止;所謂代價是指優先級、運作代價、程序的重要性和價值等。

    ) 。

  • 程序有哪幾種狀态?就緒狀态:程序已獲得除處理機以外的所需資源,等待配置設定處理機資源;運作狀态:占用處理機資源運作,處于此狀态的程序數小于等于CPU數;阻塞狀态: 程序等待某種條件,在條件滿足之前無法執行
  • 程序三種狀态間的轉換,一個程序在運作期間,不斷地從一種狀态轉換到另一種狀态,它可以多次處于就緒狀态和執行狀态,也可以多次處于阻塞狀态。圖3_4描述了程序的三種基本狀态及其轉換。(1) 就緒→執行處于就緒狀态的程序,當程序排程程式為之配置設定了處理機後,該程序便由就緒狀态轉變成執行狀态(2) 執行→就緒處于執行狀态的程序在其執行過程中,因配置設定給它的一個時間片已用完而不得不讓出處理機,于是程序從執行狀态轉變成就緒狀态。(3) 執行→阻塞正在執行的程序因等待某種事件發生而無法繼續執行時,便從執行狀态變成阻塞狀态。(4) 阻塞→就緒,處于阻塞狀态的程序,若其等待的事件已經發生,于是程序由阻塞狀态轉變為就緒狀态。
  • 作業系統中程序排程政策有哪幾種?FCFS(先來先服務),短作業(程序)優先排程算法、優先級(優先權排程算法的類型【1、非搶占式優先權算法;2、搶占式優先權排程算法】,高響應比優先排程算法【等待時間與服務時間之和就是系統對該作業的響應時間】),時間片輪轉(時間片輪轉法、多級回報隊列排程算法)
  • 分頁和分段有什麼差別?段是資訊的邏輯機關,它是根據使用者的需要劃分的,是以段對使用者是可見的 ;頁是資訊的實體機關,是為了管理主存的友善而劃分的,對使用者是透明的。段的大小不固定,有它所完成的功能決定;頁大大小固定,由系統決定;段向使用者提供二維位址空間;頁向使用者提供的是一維位址空間,段是資訊的邏輯機關,便于存儲保護和資訊的共享,頁的保護和共享受到限制
  • 什麼是内部碎片,什麼是外部碎片?。内部碎片:已經被配置設定出去的的記憶體空間大于請求所需的記憶體空間。外部碎片:還沒有配置設定出去,但是由于大小太小而無法配置設定給申請空間的新程序的記憶體空間空閑塊
  • Window記憶體管理方式主要分為:頁式管理、段式管理、段頁式管理。 1、頁式管理

               使用者程式的邏輯位址空間被劃分成若幹固定大小的頁,相應地,記憶體實體空間也分成相對應的若幹個實體塊,頁和塊的大小相等。可将使用者程式的任一頁放在記憶體的任一塊中,這些塊不必連續,實作了離散配置設定。由于最後一頁經常裝不滿一塊而形成了不可利用的碎片,稱之為“内碎片”。

              邏輯位址映射成實體位址的過程:頁表寄存器中存放頁表長度和頁表起始位址,指令給出的位址包括頁号和頁内位址,用頁号去索引頁表,索引之前,先比較頁号與頁表長度,若頁号大于等于頁表長度,則發生越界中斷,否則,将頁表起始位址與頁号相加可以得到該頁在頁表中的位置,進而得到對應的實體塊位址,将實體塊位址和頁内位址相加即可得到實體位址。

            優點:沒有外碎片,每個内碎片不超過頁的大小,程式不必連續存放。

            缺點:要求程式全部裝入記憶體,沒有足夠的記憶體,程式就不能執行。

                2、段式管理

               使用者程式的邏輯位址空間被劃分成若幹大小不等的段,每段可以定義一組相對完整的邏輯資訊,段的長度由相應的邏輯資訊組的長度決定。存儲配置設定時,以段為機關,段與段在記憶體中可以不相鄰接,也實作了離散配置設定。

               邏輯位址映射成實體位址的過程:段表寄存器中存放段表長度和段表起始位址,指令給出的位址包括段号和段内位址,用段号去索引段表,索引之前,先比較段号與段表長度,若段号大于等于段表長度,則發生越界中斷,否則,将段表起始位址與段号相加可以得到該段在段表中的位置,進而得到實體段位址,将實體段位址和段内位址相加即可得到實體位址。

                優點:每次交換的是一組相對完整的邏輯資訊,而不像頁式管理那樣隻交換固定大小的頁進而需要多次缺頁中斷才能把資訊完整地調入記憶體。

                 缺點:會産生外部碎片。

                 3、段頁式管理

                  分頁系統能有效地提高記憶體的使用率,而分段系統能反映程式的邏輯結構,将分頁與分段結合起來,就形成了段頁式管理方式。在段頁式管理系統中,使用者程式的邏輯位址空間首先被劃分成若幹個邏輯分段,每段都有自己的段号,然後再将每段分成若幹個大小相等的頁。

                  邏輯位址映射成實體位址的過程:段表寄存器中存放段表長度和段表起始位址,指令給出的位址包括段号、段内頁号和頁内位址,用段号去索引段表,段表中存放段号、頁表長度、頁表起始位址,索引之前,先比較段号與段表長度,若段号大于等于段表長度,則發生越界中斷,否則,将段表起始位址與段号相加可以得到該段在段表中的位置,進而得到頁表起始位址,将頁表起始位址與段内頁号相加可以得到對應的實體塊位址,将實體塊位址和頁内位址相加即可得到實體位址。

                  優點:程式是以段為機關分割的,每個段内是連續的,但段間可以不連續;沒有外碎片,能減少存儲空間的浪費。

                  缺點:有内部碎片;由于管理軟體的增加,複雜性和開銷也随之增加。

  • 什麼是虛拟記憶體?    1、記憶體的發展曆程

      沒有記憶體抽象(單程序,除去作業系統所用的記憶體之外,全部給使用者程式使用) —>

             有記憶體抽象(多程序,程序獨立的位址空間,交換技術(記憶體大小不可能容納下所有并發執行的程序) )—>

             連續記憶體配置設定(固定大小分區(多道程式的程度受限),可變分區(首次适應,最佳适應,最差适應),碎片) —>

             不連續記憶體配置設定(分段,分頁,段頁式,虛拟記憶體)

            2、虛拟記憶體允許執行程序不必完全在記憶體中。虛拟記憶體的基本思想是:每個程序擁有獨立的位址空間,這個空間被分為大小相等的多個塊,稱為頁(Page),每個頁都是一段連續的位址。這些頁被映射到實體記憶體,但并不是所有的頁都必須在記憶體中才能運作程式。當程式引用到一部分在實體記憶體中的位址空間時,由硬體立刻進行必要的映射;當程式引用到一部分不在實體記憶體中的位址空間時,由作業系統負責将缺失的部分裝入實體記憶體并重新執行失敗的指令。這樣,對于程序而言,邏輯上似乎有很大的記憶體空間,實際上其中一部分對應實體記憶體上的一塊(稱為幀,通常頁和幀大小相等),還有一些沒加載在記憶體中的對應在硬碟上,

              注意,請求分頁系統、請求分段系統和請求段頁式系統都是針對虛拟記憶體的,通過請求實作記憶體與外存的資訊置換。

  • 頁面置換算法 ,FIFO先進先出算法:在作業系統中經常被用到,比如作業排程(主要實作簡單,很容易想到);LRU(Least recently use)最近最少使用算法:根據使用時間到現在的長短來判斷;LFU(Least frequently use)最少使用次數算法:根據使用次數來判斷;OPT(Optimal replacement)最優置換算法:理論的最優,理論;就是要保證置換出去的是不再被使用的頁,或者是在實際記憶體中最晚使用的算法。
  • 虛拟記憶體的應用與優點,虛拟記憶體很适合在多道程式設計系統中使用,許多程式的片段同時儲存在記憶體中。當一個程式等待它的一部分讀入記憶體時,可以把CPU交給另一個程序使用。虛拟記憶體的使用可以帶來以下好處:在記憶體中可以保留多個程序,系統并發度提高,解除了使用者與記憶體之間的緊密限制,程序可以比記憶體的全部空間還大。颠簸
  • 颠簸本質上是指頻繁的頁排程行為,具體來講,程序發生缺頁中斷,這時,必須置換某一頁。然而,其他所有的頁都在使用,它置換一個頁,但又立刻再次需要這個頁。是以,會不斷産生缺頁中斷,導緻整個系統的效率急劇下降,這種現象稱為颠簸(抖動)。記憶體颠簸的解決政策包括:如果是因為頁面替換政策失誤,可以修改替換算法來解決這個問題;如果是因為運作的程式太多,造成程式無法同時将所有頻繁通路的頁面調入記憶體,則要降低多道程式的數量;否則,還剩下兩個辦法:終止該程序或增加實體記憶體容量。
  • 局部性原理(1). 時間上的局部性:最近被通路的頁在不久的将來還會被通路;(2). 空間上的局部性:記憶體中被通路的頁周圍的頁也很可能被通路。
  • 請闡述動态連結庫與靜态連結庫的差別,靜态連結庫是.lib格式的檔案,一般在工程的設定界面加入工程中,程式編譯時會把lib檔案的代碼加入你的程式中是以會增加代碼大小,你的程式一運作lib代碼強制被裝入你程式的運作空間,不能手動移除lib代碼,動态連結庫是程式運作時動态裝入記憶體的子產品,格式*.dll,在程式運作時可以随意加載和移除,節省記憶體空間。在大型的軟體項目中一般要實作很多功能,如果把所有單獨的功能寫成一個個lib檔案的話,程式運作的時候要占用很大的記憶體空間,導緻運作緩慢;但是如果将功能寫成dll檔案,就可以在用到該功能的時候調用功能對應的dll檔案,不用這個功能時将dll檔案移除記憶體,這樣可以節省記憶體空間。
  • 中斷,所謂的中斷就是在計算機執行程式的過程中,由于出現了某些特殊事情,使得CPU暫停對程式的執行,轉而去執行處理這一事件的程式。等這些特殊事情處理完之後再回去執行之前的程式。中斷一般分為三類:由計算機硬體異常或故障引起的中斷,稱為内部異常中斷; 由程式中執行了引起中斷的指令而造成的中斷,稱為軟中斷(這也是和我們将要說明的系統調用相關的中斷); 由外部裝置請求引起的中斷,稱為外部中斷。簡單來說,對中斷的了解就是對一些特殊事情的處理。 與中斷緊密相連的一個概念就是中斷處理程式了。當中斷發生的時候,系統需要去對中斷進行處理,對這些中斷的處理是由作業系統核心中的特定函數進行的,這些進行中斷的特定的函數就是我們所說的中斷處理程式了。另一個與中斷緊密相連的概念就是中斷的優先級。中斷的優先級說明的是當一個中斷正在被處理的時候,處理器能接受的中斷的級别。中斷的優先級也表明了中斷需要被處理的緊急程度。每個中斷都有一個對應的優先級,當處理器在處理某一中斷的時候,隻有比這個中斷優先級高的中斷可以被處理器接受并且被處理。優先級比這個目前正在被處理的中斷優先級要低的中斷将會被忽略。典型的中斷優先級如下所示:機器錯誤 > 時鐘 > 磁盤 > 網絡裝置 > 終端 > 軟體中斷 ,當發生軟體中斷時,其他所有的中斷都可能發生并被處理;但當發生磁盤中斷時,就隻有時鐘中斷和機器錯誤中斷能被處理了。
  • 系統調用   在講系統調用之前,先說下程序的執行在系統上的兩個級别:使用者級和核心級,也稱為使用者态和系統态(user mode and kernel mode)。程式的執行一般是在使用者态下執行的,但當程式需要使用作業系統提供的服務時,比如說打開某一裝置、建立檔案、讀寫檔案等,就需要向作業系統發出調用服務的請求,這就是系統調用。Linux系統有專門的函數庫來提供這些請求作業系統服務的入口,這個函數庫中包含了作業系統所提供的對外服務的接口。當程序發出系統調用之後,它所處的運作狀态就會由使用者态變成核心态。但這個時候,程序本身其實并沒有做什麼事情,這個時候是由核心在做相應的操作,去完成程序所提出的這些請求。系統調用和中斷的關系就在于,當程序發出系統調用申請的時候,會産生一個軟體中斷。産生這個軟體中斷以後,系統會去對這個軟中斷進行處理,這個時候程序就處于核心态了。
  • 那麼使用者态和核心态之間的差別是什麼呢?(以下差別摘至《UNIX作業系統設計》)使用者态的程序能存取它們自己的指令和資料,但不能存取核心指令和資料(或其他程序的指令和資料)。然而,核心态下的程序能夠存取核心和使用者位址 ,某些機器指令是特權指令,在使用者态下執行特權指令會引起錯誤 ,對此要了解的一個是,在系統中核心并不是作為一個與使用者程序平行的估計的程序的集合,核心是為使用者程序運作的。

4 、計算機網絡

  • Http和Https的差別,Http協定運作在TCP之上,明文傳輸,用戶端與伺服器端都無法驗證對方的身份;Https是身披SSL(Secure Socket Layer)外殼的Http,運作于SSL上,SSL運作于TCP之上,是添加了加密和認證機制的HTTP。二者之間存在如下不同:端口不同:Http與Http使用不同的連接配接方式,用的端口也不一樣,前者是80,後者是443;資源消耗:和HTTP通信相比,Https通信會由于加減密處理消耗更多的CPU和記憶體資源;開銷:Https通信需要證書,而證書一般需要向認證機構購買; Https的加密機制是一種共享密鑰加密和公開密鑰加密并用的混合加密機制。
  • 對稱加密與非對稱加密:對稱密鑰加密是指加密和解密使用同一個密鑰的方式,這種方式存在的最大問題就是密鑰發送問題,即如何安全地将密鑰發給對方;而非對稱加密是指使用一對非對稱密鑰,即公鑰和私鑰,公鑰可以随意釋出,但私鑰隻有自己知道。發送密文的一方使用對方的公鑰進行加密處理,對方接收到加密資訊後,使用自己的私鑰進行解密。由于非對稱加密的方式不需要發送用來解密的私鑰,是以可以保證安全性;但是和對稱加密比起來,它非常的慢,是以我們還是要用對稱加密來傳送消息,但對稱加密所使用的密鑰我們可以通過非對稱加密的方式發送出去。
  • TCP的三次握手與四次揮手

           第一次握手:Client将标志位SYN置為1,随機産生一個值seq=J,并将該資料包發送給Server,Client進入SYN_SENT狀态,等待Server确認

           第二次握手:Server收到資料包後由标志位SYN=1知道Client請求建立連接配接,Server将标志位SYN和ACK都置為1,ack=J+1,随機産生一個值seq=K,并将該資料包發送給Client以确認連接配接請求,Server進入SYN_RCVD狀态。

           第三次握手:Client收到确認後,檢查ack是否為J+1,ACK是否為1,如果正确則将标志位ACK置為1,ack=K+1,并将該資料包發送給Server,Server檢查ack是否為K+1,ACK是否為1,如果正确則連接配接建立成功,Client和Server進入ESTABLISHED狀态,完成三次握手,随後Client與Server之間可以開始傳輸資料了。

           第一次揮手:Client發送一個FIN,用來關閉Client到Server的資料傳送,Client進入FIN_WAIT_1狀态。

           第二次揮手:Server收到FIN後,發送一個ACK給Client,确認序号為收到序号+1(與SYN相同,一個FIN占用一個序号),Server進入CLOSE_WAIT狀态。此時TCP連結處于半關閉狀态,即用戶端已經沒有要發送的資料了,但服務端若發送資料,則用戶端仍要接收。

          第三次揮手:Server發送一個FIN,用來關閉Server到Client的資料傳送,Server進入LAST_ACK狀态

          第四次揮手:Client收到FIN後,Client進入TIME_WAIT狀态,接着發送一個ACK給Server,确認序号為收到序号+1,Server進入CLOSED狀态,完成四次揮手。

  • 為什麼TCP連結需要三次握手,兩次不可以麼,為什麼?為了防止 已失效的連結請求封包突然又傳送到了服務端,因而産生錯誤。用戶端發出的連接配接請求封包并未丢失,而是在某個網絡節點長時間滞留了,以緻延誤到連結釋放以後的某個時間才到達Server。這是,Server誤以為這是Client發出的一個新的連結請求,于是就向用戶端發送确認資料包,同意建立連結。若不采用“三次握手”,那麼隻要Server發出确認資料包,新的連結就建立了。由于client此時并未發出建立連結的請求,是以其不會理睬Server的确認,也不與Server通信;而這時Server一直在等待Client的請求,這樣Server就白白浪費了一定的資源。若采用“三次握手”,在這種情況下,由于Server端沒有收到來自用戶端的确認,則就會知道Client并沒有要求建立請求,就不會建立連結。
  • TCP協定如何來保證傳輸的可靠性,TCP提供一種面向連接配接的、可靠的位元組流服務。其中,面向連接配接意味着兩個使用TCP的應用(通常是一個客戶和一個伺服器)在彼此交換資料之前必須先建立一個TCP連接配接。在一個TCP連接配接中,僅有兩方進行彼此通信;而位元組流服務意味着兩個應用程式通過TCP連結交換8bit位元組構成的位元組流,TCP不在位元組流中插入記錄辨別符。對于可靠性,TCP通過以下方式進行保證:資料包校驗,目的是檢測資料在傳輸過程中的任何變化,若校驗出包有錯,則丢棄封包段并且不給出響應,這時TCP發送資料端逾時後會重發資料;對失序資料包重排序,既然TCP封包段作為IP資料報來傳輸,而IP資料報的到達可能會失序,是以TCP封包段的到達也可能會失序。TCP将對失序資料進行重新排序,然後才交給應用層;丢棄重複資料,對于重複資料,能夠丢棄重複資料;應答機制,當TCP收到發自TCP連接配接另一端的資料,它将發送一個确認。這個确認不是立即發送,通常将推遲幾分之一秒;逾時重發,當TCP發出一個段後,它啟動一個定時器,等待目的端确認收到這個封包段。如果不能及時收到一個确認,将重發這個封包段;流量控制:TCP連接配接的每一方都有固定大小的緩沖空間。TCP的接收端隻允許另一端發送接收端緩沖區所能接納的資料,這可以防止較快主機緻使較慢主機的緩沖區溢出,這就是流量控制。TCP使用的流量控制協定是可變大小的滑動視窗協定。
  • 用戶端不斷進行請求連結會怎樣?DDos(Distributed Denial of Service)攻擊?伺服器端會為每個請求建立一個連結,并向其發送确認封包,然後等待用戶端進行确認。DDos 攻擊:用戶端向服務端發送請求連結資料包,服務端向用戶端發送确認資料包用戶端不向服務端發送确認資料包,伺服器一直等待來自用戶端的确認。DDos 預防 ( 沒有徹底根治的辦法,除非不使用TCP )限制同時打開SYN半連結的數目,縮短SYN半連結的Time out 時間,關閉不必要的服務
  • 計算機網絡七層協定:OSI(open system interconnect開放系統互聯)七層模型:實體層,資料鍊路層,網絡層,傳輸層,會話層,表示層,應用層。對等層之間不能互相直接通信,各層之間是嚴格單向依賴,上層使用下層提供的服務,下層向上層提供服務。                                                                           

          1.實體層(比特bit):通過媒介傳輸比特,确定機械及電氣規範。規定如何為網絡通信實作最底層的實體連接配接。如:如何使用電纜和接頭的類型、用來傳送信号的電壓等。實體層實際上是一種規定,規定實體媒介裝置在連接配接網絡時的各種規格、參數以及工作方式。

實體媒介(網線,電纜)不屬于實體層,雙絞線,線纜等實體媒介等是實體層的實作。

          2.資料鍊路層(幀frame):将比特組裝成幀和點到點的連接配接。規定了如何進行實體位址尋址,如何在實體線路上進行資料(幀frame)的可靠傳遞以及流量控制。協定有SLIP協定,CSLIP協定,PPP協定等。交換機工作在資料鍊路層,對幀解碼并根據幀中包含的資訊把資料發送到正确的接收方。

           3.網絡層(包packet):負責資料包從源到宿的傳遞和網際互連。

           4.傳輸層(段segment):提供端到端的可靠封包段和錯誤恢複。TCP UDP協定

           5.會話層(會話協定資料單元SPDU):在網絡中的兩個節點之間建立、維持和終止通信。

           6.表示層(表示協定資料單元PPDU):對資料進行翻譯、加密、解密和壓縮,在應用程式和網絡之間對資料進行格式化,使之能夠被另一方了解,即發送方的表示層将應用程式資料的抽象文法轉換成網絡适用于OSI網絡傳輸的傳送文法,接收方則相反。

           7.應用層(應用協定資料單元APDU):允許通路OSI環境的手段,最頂層的OSI層,為應用程式提供網絡服務。如為電子郵件、檔案傳輸功能提供協定支援。應用層協定有HTTP協定、FTP協定、SMTP協定等

           ​​javascript:void(0)​​

           ​​集線器​​工作在 OSI  模型的實體層,網卡工作在 OSI  模型的實體層,交換機工作在資料鍊路層,路由器工作在網絡層。

  • TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)協定屬于傳輸層協定,它們之間的差別包括:TCP是面向連接配接的,UDP是無連接配接的;TCP是可靠的,UDP是不可靠的;TCP隻支援點對點通信,UDP支援一對一、一對多、多對一、多對多的通信模式;TCP是面向位元組流的,UDP是面向封包的;TCP有擁塞控制機制;UDP沒有擁塞控制,适合媒體通信;TCP首部開銷(20個位元組)比UDP的首部開銷(8個位元組)要大;
  • TCP的擁塞處理,計算機網絡中的帶寬、交換結點中的緩存及處理機等都是網絡的資源。在某段時間,若對網絡中某一資源的需求超過了該資源所能提供的可用部分,網絡的性能就會變壞,這種情況就叫做擁塞。擁塞控制就是 防止過多的資料注入網絡中,這樣可以使網絡中的路由器或鍊路不緻過載。注意,擁塞控制和流量控制不同,前者是一個全局性的過程,而後者指點對點通信量的控制。擁塞控制的方法主要有以下四種:1). 慢啟動:不要一開始就發送大量的資料,先探測一下網絡的擁塞程度,也就是說由小到大逐漸增加擁塞視窗的大小;2). 擁塞避免:擁塞避免算法讓擁塞視窗緩慢增長,即每經過一個往返時間RTT就把發送方的擁塞視窗cwnd加1,而不是加倍,這樣擁塞視窗按線性規律緩慢增長。3). 快重傳:快重傳要求接收方在收到一個 失序的封包段 後就立即發出 重複确認(為的是使發送方及早知道有封包段沒有到達對方)而不要等到自己發送資料時捎帶确認。快重傳算法規定,發送方隻要一連收到三個重複确認就應當立即重傳對方尚未收到的封包段,而不必繼續等待設定的重傳計時器時間到期。4). 快恢複:快重傳配合使用的還有快恢複算法,當發送方連續收到三個重複确認時,就執行“乘法減小”算法,把ssthresh門限減半,但是接下去并不執行慢開始算法:因為如果網絡出現擁塞的話就不會收到好幾個重複的确認,是以發送方現在認為網絡可能沒有出現擁塞。是以此時不執行慢開始算法,而是将cwnd設定為ssthresh的大小,然後執行擁塞避免算法。
  • 從輸入網址到獲得頁面的過程。1). 浏覽器查詢 DNS,擷取域名對應的IP位址:具體過程包括浏覽器搜尋自身的DNS緩存、搜尋作業系統的DNS緩存、讀取本地的Host檔案和向本地DNS伺服器進行查詢等。對于向本地DNS伺服器進行查詢,如果要查詢的域名包含在本地配置區域資源中,則傳回解析結果給客戶機,完成域名解析(此解析具有權威性);如果要查詢的域名不由本地DNS伺服器區域解析,但該伺服器已緩存了此網址映射關系,則調用這個IP位址映射,完成域名解析(此解析不具有權威性)。如果本地域名伺服器并未緩存該網址映射關系,那麼将根據其設定發起遞歸查詢或者疊代查詢;(2). 浏覽器獲得域名對應的IP位址以後,浏覽器向伺服器請求建立連結,發起三次握手;(3). TCP/IP連結建立起來後,浏覽器向伺服器發送HTTP請求;(4). 伺服器接收到這個請求,并根據路徑參數映射到特定的請求處理器進行處理,并将處理結果及相應的視圖傳回給浏覽器;(5). 浏覽器解析并渲染視圖,若遇到對js檔案、css檔案及圖檔等靜态資源的引用,則重複上述步驟并向伺服器請求這些資源;(6). 浏覽器根據其請求到的資源、資料渲染頁面,最終向使用者呈現一個完整的頁面
  • Session、Cookie 與 Application。Cookie和Session都是用戶端與伺服器之間保持狀态的解決方案,具體來說,cookie機制采用的是在用戶端保持狀态的方案,而session機制采用的是在伺服器端保持狀态的方案。Cookie實際上是一小段的文本資訊。用戶端請求伺服器,如果伺服器需要記錄該使用者狀态,就使用response向用戶端浏覽器頒發一個Cookie,而用戶端浏覽器會把Cookie儲存起來。當浏覽器再請求該網站時,浏覽器把請求的網址連同該Cookie一同送出給伺服器,伺服器檢查該Cookie,以此來辨認使用者狀态。伺服器還可以根據需要修改Cookie的内容。同樣地,會話狀态也可以儲存在伺服器端。用戶端請求伺服器,如果伺服器記錄該使用者狀态,就擷取Session來儲存狀态,這時,如果伺服器已經為此用戶端建立過session,伺服器就按照sessionid把這個session檢索出來使用;如果用戶端請求不包含sessionid,則為此用戶端建立一個session并且生成一個與此session相關聯的sessionid,并将這個sessionid在本次響應中傳回給用戶端儲存。儲存這個sessionid的方式可以采用 cookie機制 ,這樣在互動過程中浏覽器可以自動的按照規則把這個辨別發揮給伺服器;若浏覽器禁用Cookie的話,可以通過 URL重寫機制 将sessionid傳回伺服器。ApplicationApplication(Java Web中的ServletContext):與一個Web應用程式相對應,為應用程式提供了一個全局的狀态,所有客戶都可以使用該狀态。
  • Session 與 Cookie 的對比,實作機制,Session的實作常常依賴于Cookie機制,通過Cookie機制回傳SessionID;大小限制:Cookie有大小限制并且浏覽器對每個站點也有cookie的個數限制,Session沒有大小限制,理論上隻與伺服器的記憶體大小有關;安全性:Cookie存在安全隐患,通過攔截或本地檔案找得到cookie後可以進行攻擊,而Session由于儲存在伺服器端,相對更加安全;伺服器資源消耗:Session是儲存在伺服器端上會存在一段時間才會消失,如果session過多會增加伺服器的壓力。
  • SQL 注入,SQL注入就是通過把SQL指令插入到Web表單送出或輸入域名或頁面請求的查詢字元串,最終達到欺騙伺服器執行惡意的SQL指令。SQL注入攻擊的總體思路(1). 尋找到SQL注入的位置 (2). 判斷伺服器類型和背景資料庫類型 (3). 針對不同的伺服器和資料庫特點進行SQL注入攻擊
  • XSS 攻擊,XSS是一種經常出現在web應用中的計算機安全漏洞,與SQL注入一起成為web中最主流的攻擊方式。XSS是指惡意攻擊者利用網站沒有對使用者送出資料進行轉義處理或者過濾不足的缺點,進而添加一些腳本代碼嵌入到web頁面中去,使别的使用者通路都會執行相應的嵌入代碼,進而盜取使用者資料、利用使用者身份進行某種動作或者對通路者進行病毒侵害的一種攻擊方式。
  • TCP和UDP分别對應的常見應用層協定。TCP對應的應用層協定:FTP:定義了檔案傳輸協定,使用21端口。常說某某計算機開了FTP服務便是啟動了檔案傳輸服務。下載下傳檔案,上傳首頁,都要用到FTP服務。Telnet:它是一種用于遠端登陸的端口,使用者可以以自己的身份遠端連接配接到計算機上,通過這種端口可以提供一種基于DOS模式下的通信服務。如以前的BBS是-純字元界面的,支援BBS的伺服器将23端口打開,對外提供服務。SMTP:定義了簡單郵件傳送協定,現在很多郵件伺服器都用的是這個協定,用于發送郵件。如常見的免費郵件服務中用的就是這個郵件服務端口,是以在電子郵件設定-中常看到有這麼SMTP端口設定這個欄,伺服器開放的是25号端口。POP3:它是和SMTP對應,POP3用于接收郵件。通常情況下,POP3協定所用的是110端口。也是說,隻要你有相應的使用POP3協定的程式(例如Fo-xmail或Outlook),就可以不以Web方式登陸進郵箱界面,直接用郵件程式就可以收到郵件(如是163郵箱就沒有必要先進入網易網站,再進入自己的郵-箱來收信)。HTTP:從Web伺服器傳輸超文本到本地浏覽器的傳送協定。
  • UDP對應的應用層協定。DNS:用于域名解析服務,将域名位址轉換為IP位址。DNS用的是53号端口。SNMP:簡單網絡管理協定,使用161号端口,是用來管理網絡裝置的。由于網絡裝置很多,無連接配接的服務就展現出其優勢。TFTP(Trival File Transfer Protocal):簡單檔案傳輸協定,該協定在熟知端口69上使用UDP服務。
  • 網絡層的ARP協定工作原理,網絡層的ARP協定完成了IP位址與實體位址的映射。首先,每台主機都會在自己的ARP緩沖區中建立一個ARP清單,以表示IP位址和MAC位址的對應關系。當源主機需要将一個資料包要發送到目的主機時,會首先檢查自己ARP清單中是否存在該IP位址對應的MAC位址:如果有,就直接将資料包發送到這個MAC位址;如果沒有,就向本地網段發起一個ARP請求的廣播包,查詢此目的主機對應的MAC位址。此ARP請求資料包裡包括源主機的IP位址、硬體位址、以及目的主機的IP位址。網絡中所有的主機收到這個ARP請求後,會檢查資料包中的目的IP是否和自己的IP位址一緻。如果不相同就忽略此資料包;如果相同,該主機首先将發送端的MAC位址和IP位址添加到自己的ARP清單中,如果ARP表中已經存在該IP的資訊,則将其覆寫,然後給源主機發送一個ARP響應資料包,告訴對方自己是它需要查找的MAC位址;源主機收到這個ARP響應資料包後,将得到的目的主機的IP位址和MAC位址添加到自己的ARP清單中,并利用此資訊開始資料的傳輸。如果源主機一直沒有收到ARP響應資料包,表示ARP查詢失敗。
  • B/S架構與C/S架構的差別,架構,即大家熟知的客戶機和伺服器結構。它是軟體系統體系結構,通過它可以充分利用兩端硬體環境的優勢,将任務合理配置設定到Client端和Server端來實作,降低了系統的通訊開銷。那麼常見的C/S架構和B/S架構有什麼差別?                    CS架構,就是你的電腦,需要裝個軟體,才能連接配接伺服器。而BS架構,就是你的電腦,隻需要用浏覽器,就可以連接配接伺服器了
  • IP位址的分類,IP位址是指網際網路協定位址,是IP協定提供的一種統一的位址格式,它為網際網路上的每一個網絡和每一台主機配置設定一個邏輯位址,以此來屏蔽實體位址的差異。IP位址編址方案将IP位址空間劃分為A、B、C、D、E五類,其中A、B、C是基本類,D、E類作為多點傳播和保留使用,為特殊位址。A類位址:以0開頭,第一個位元組範圍:0~127;B類位址:以10開頭,第一個位元組範圍:128~191;C類位址:以110開頭,第一個位元組範圍:192~223;D類位址:以1110開頭,第一個位元組範圍為224~239;E類位址:以1111開頭,保留位址
  • IP位址與實體位址,實體位址是資料鍊路層和實體層使用的位址,IP位址是網絡層和以上各層使用的位址,是一種邏輯位址,其中ARP協定用于IP位址與實體位址的對應。
  • 常見狀态碼及原因短語,HTTP請求結構: 請求方式 + 請求URI + 協定及其版本 ;HTTP響應結構: 狀态碼 + 原因短語 + 協定及其版本,1×× : 請求進行中,請求已被接受,正在處理;2×× : 請求成功,請求被成功處理 200 OK;3×× : 重定向,要完成請求必須進行進一步處理 301 : 永久性轉移 302 :暫時性轉移 304 : 已緩存;4×× : 用戶端錯誤,請求不合法 400:Bad Request,請求有文法問題 403:拒絕請求 404:用戶端所通路的頁面不存在;5×× : 伺服器端錯誤,伺服器不能處理合法請求 500 :伺服器内部錯誤 503 : 服務不可用,稍等 ;
  • GET和POST也是HTTP協定中的兩種方法。HTTP全稱為Hyper Text Transfer Protocol,中文翻譯為超文本傳輸協定,目的是保證浏覽器與伺服器之間的通信。HTTP的工作方式是用戶端與伺服器之間的請求-應答協定。                                                                                       HTTP協定中定義了浏覽器和伺服器進行互動的不同方法,基本方法有4種,分别是GET,POST,PUT,DELETE。這四種方法可以了解為,對伺服器資源的查,改,增,删。                                                                                                                                                 GET互動方式是從伺服器上擷取資料,而并非修改資料,是以GET互動方式是安全的。就像資料庫查詢一樣,從資料庫查詢資料,并不會影響資料庫的資料資訊,對資料庫來說,也就是安全的。                                                                                                                 GET:從伺服器上擷取資料,也就是所謂的查,僅僅是擷取伺服器資源,不進行修改。POST:向伺服器送出資料,這就涉及到了資料的更新,也就是更改伺服器的資料。
  • 數組和連結清單的差別。
  • 從邏輯結構上來看,數組必須實作定于固定的長度,不能适應資料動态增減的情況,即數組的大小一旦定義就不能改變。當資料增加是,可能超過原先定義的元素的個數;當資料減少時,造成記憶體浪費;連結清單動态進行存儲配置設定,可以适應資料動态地增減的情況,且可以友善地插入、删除資料項。
  • 從記憶體存儲的角度看;數組是一塊連續的空間,聲明時就要确定長度。連結清單是一塊可不連續的動态空間,長度可變,每個結點要儲存相鄰結點指針。 
  • 從通路方式類看,數組在記憶體中是連續的存儲,是以可以利用下标索引進行通路;連結清單是鍊式存儲結構,在通路元素時候隻能夠通過線性方式由前到後順序的通路,是以通路效率比數組要低。
  • 資料插入或删除:連結清單可以快速插入和删除結點,而數組則可能需要大量資料移動。 
  • 越界問題:連結清單不存在越界問題,數組有越界問題。
  • 簡述隊列和棧的異同 
  • 隊列和棧都是線性存儲結構,但是兩者的插入和删除資料的操作不同,隊列是“先進先出”,棧是“後進先出”。 
  • 注意:差別棧區和堆區。堆區的存取是“順序随意”,而棧區是“後進先出”。棧由編譯器自動配置設定釋放 ,存放函數的參數值,局部變量的值等。其操作方式類似于資料結構中的棧。堆一般由程式員配置設定釋放, 若程式員不釋放,程式結束時可能由OS回收。配置設定方式類似于連結清單。 
  • 它與本題中的堆和棧是兩回事。堆棧隻是一種資料結構,而堆區和棧區是程式的不同記憶體存儲區域。 、                                                                      
  • 簡述快速排序過程
  • 選擇一個基準元素,通常選擇第一個元素或者最後一個元素,
  • 通過一趟排序将待排序的記錄分割成獨立的兩部分,其中一部分記錄的元素值均比基準元素值小。另一部分記錄的元素值比基準值大。
  • 此時基準元素在其排好序後的正确位置
  • 然後分别對這兩部分記錄用同樣的方法繼續進行排序,直到整個序列有序。
  • 快速排序的改進
  • 對于分治算法,當每次劃分時,算法若都能分成兩個等長的子序列時,那麼分治算法效率會達到最大
  • 各類排序算法對比
  • 時間複雜度來說:
  • (1)平方階(O(n2))排序:各類簡單排序:直接插入、直接選擇和冒泡排序;
  • 線性對數階(O(nlog2n))排序:快速排序、堆排序和歸并排序;
  • O(n1+§))排序,§是介于0和1之間的常數。希爾排序
  • 線性階(O(n))排序:基數排序,此外還有桶、箱排序。
  • 當原表有序或基本有序時,直接插入排序和冒泡排序将大大減少比較次數和移動記錄的次數,時間複雜度可降至O(n);而快速排序則相反,當原表基本有序時,将蛻化為冒泡排序,時間複雜度提高為O(n2);原表是否有序,對簡單選擇排序、堆排序、歸并排序和基數排序的時間複雜度影響不大。
  • 穩定性:
  • 排序算法的穩定性:若待排序的序列中,存在多個具有相同關鍵字的記錄,經過排序,這些記錄的相對次序保持不變,則稱該算法是穩定的;若經排序後,記錄的相對次序發生了改變,則稱該算法是不穩定的。
  • 穩定的排序算法:冒泡排序、插入排序、歸并排序和基數排
  •  不是穩定的排序算法:選擇排序、快速排序、希爾排序、堆排序
  • 鄰接矩陣與鄰接表:
  • 鄰接矩陣表示法:在一個一維數組中存儲所有的點,在一個二維數組中存儲頂點之間的邊的權值
  • 鄰接表表示法:圖中頂點用一個一維數組存儲,圖中每個頂點vi的所有鄰接點構成單連結清單
  • 對比:
  • 在鄰接矩陣表示中,無向圖的鄰接矩陣是對稱的。矩陣中第 i 行或 第 i 列有效元素個數之和就是頂點的度。在有向圖中 第 i 行有效元素個數之和是頂點的出度,第 i 列有效元素個數之和是頂點的入度。
  • 在鄰接表的表示中,無向圖的同一條邊在鄰接表中存儲的兩次。如果想要知道頂點的度,隻需要求出所對應連結清單的結點個數即可。有向圖中每條邊在鄰接表中隻出現一次,求頂點的出度隻需要周遊所對應連結清單即可。求入度則需要周遊其他頂點的連結清單。
  • 鄰接矩陣與鄰接表優缺點:鄰接矩陣的優點是可以快速判斷兩個頂點之間是否存在邊,可以快速添加邊或者删除邊。而其缺點是如果頂點之間的邊比較少,會比較浪費空間。因為是一個 n∗n 的矩陣。而鄰接表的優點是節省空間,隻存儲實際存在的邊。其缺點是關注頂點的度時,就可能需要周遊一個連結清單。
  • 用循環比遞歸效率高嗎?遞歸和循環兩者完全可以互換。不能完全決定性地說循環地效率比遞歸的效率高。
  • 遞歸算法:
  • 優點:代碼簡潔、清晰,并且容易驗證正确性。
  • 缺點:它的運作需要較多次數的函數調用,如果調用層數比較深,需要增加額外的堆棧處理(還有可能出現堆棧溢出的情況),比如參數傳遞需要壓棧等操作,會對執行效率有一定影響。但是,對于某些問題,如果不使用遞歸,那将是極端難看的代碼。在編譯器優化後,對于多次調用的函數處理會有非常好的效率優化,效率未必低于循環。
  • 循環算法:
  • 優點:速度快,結構簡單。
  • 缺點:并不能解決所有的問題。有的問題适合使用遞歸而不是循環。如果使用循環并不困難的話,最好使用循環。