深信服電話面

2021-08-21 10:48:57 字數 3576 閱讀 3601

面試時間7.14 14分鐘36秒

1.講一下專案(linux檔案傳輸)的系統呼叫

系統呼叫:作業系統提供給使用者程式的一組「特殊」介面,使用者程式通過這種特殊介面來獲得作業系統核心獲得的服務。

它相當於乙個中間人,把使用者程序的請求傳送給核心,核心處理後將結果再返回給使用者。

系統服務之所以需要通過系統呼叫來提供給使用者空間的根本原因是為了對系統進行「保護」,因為我們知道linux的執行空間分為核心空間和使用者空間,它們各自執行在不同的級別中,邏輯上相互隔離。

軟中斷:它是通過軟體指令觸發而並非外設引發的中斷。

系統呼叫並非直接和程式設計師和系統管理員打交道,它僅僅是乙個通過軟中斷機制向核心提交請求,獲得核心服務介面

socket() bind() connect() accept() send() recv() listen() 這些都是系統呼叫

2.講一下專案流程?多執行緒,多程序用到了哪?

3.講一下static,extern,const

static:

在c語言中:

(1)在修飾變數的時候,static修飾的靜態區域性變數只執行一次,而且延長了區域性變數的生命週期,直到程式執行結束才釋放

(2)static修飾全域性變數的時候,這個全域性變數只能在本檔案中訪問,不能在其他檔案中訪問,即使是extern外部宣告也不可以

(3)static修飾乙個函式,則這個函式的只能在本檔案中呼叫,不能在其他檔案中被呼叫,static修飾的區域性變數存放在全域性資料區的靜態變數區,初始化的時候自動被初始化為0

(4)不想被釋放的時候,就加static修飾。比如修飾函式中存放棧空間的陣列,如果不想讓這個陣列在函式呼叫結束釋放

可以用static修飾

(5)考慮到資料安全性(當程想要使用全域性變數的時候應該先考慮使用static)

在c++中static關鍵字除了具有c中的作用還有在類中的使用

在類中,static可以用來修飾靜態資料成員和靜態成員方法

靜態資料成員

(1)靜態資料成員可以實現多個物件之間的資料共享,它是類的所有物件的共享成員,它在記憶體中只佔乙份空間,如果改變它的值,則各物件中這個資料成員的值都被改變。

(2)靜態資料成員是在程式開始執行時被分配空間,到程式結束之後才釋放,只要類中指定了靜態資料成員,即使不定義物件,也會為靜態資料成員分配空間。

(3)靜態資料成員可以被初始化,但是只能在類體外進行初始化,若未對靜態資料成員賦初值,則編譯器會自動為其初始化為0

(4)靜態資料成員既可以通過物件名引用,也可以通過類名引用。

靜態成員函式

(1)靜態成員函式和靜態資料成員一樣,他們都屬於類的靜態成員,而不是物件成員。

(2)非靜態成員函式有this指標,而靜態成員函式沒有this指標。

(3)靜態成員函式主要用來方位靜態資料成員而不能訪問非靜態成員。

const:

在c語言中是常變數(c++中是常量): const 型別說明符 變數名 簡單的說常變數就是其值不能改變的變數。

const int a = 5 與int const a = 5等同

類名const物件名與const類名 物件名等同

常引用: const 型別說明符 &引用名

int i = 10;

// 正確:表示不能通過該引用去修改對應的記憶體的內容。

const int& ri = i;

// 錯誤!不能這樣寫。

int& const rci = i;

常物件: 類名 const 物件名

常成員函式: 類名::fun(形參) const

修飾函式返回值,阻止使用者修改返回值,返回值也要相應的付給乙個常量或長指標

常陣列: 型別說明符 const 陣列名[大小]

常指標: const 型別說明符* 指標名 , 型別說明符* const 指標名

const int *m1 = new int(10);

int* const m2 = new int(20);

在上面的兩個表示式中,最容易讓人迷惑的是const 到底是修飾指標還是指標指向的記憶體區域?其實,只要知道:const 只對它左邊的東西起作用,唯一的例外就是const 本身就是最左邊的修飾符,那麼它才會對右邊的東西起作用。

根據這個規則來判斷,m1 應該是常量指標(即,不能通過m1 來修改它所指向的內容。);而m2 應該是指標常量(即,不能讓m2 指向其他的記憶體模組)。

extern:

(1)在c語言中,extern在變數或者函式前表明「此函式或變數是在別處定義的,要在此處引用」,extern宣告,不是定義,即不分配儲存空間

也就是說,在乙個檔案中定義了變數和函式, 在其他檔案中要使用它們, 可以有兩種方式:

1.使用標頭檔案,然後宣告它們,然後其他檔案去包含標頭檔案

2.在其他檔案中直接extern

(2)告訴編譯器是用c語言規則編譯還是用c++規則編譯

4.說一下fork程序,怎樣解決殭屍程序

fork是複製程序,fork底層是通過do_fork方法傳入的不同引數來實現的,首先為程序分配乙個唯一標識的pid,這一步分配失敗就退出複製,pid能表示的範圍也就決定著系統理論上最多能執行多少個程序,接下來分配pcb,並繼承父程序的pcb的值,只是將特有的資訊改過來,用父程序的核心棧複製給子程序,但將eax暫存器的值強制為0,這也就是父子程序為什麼沿著統一的位置開始執行,以及子程序的返回值為什麼是0,接下來根據傳入的do_fork的引數複製程序實體,複製的時候有寫實拷貝。

解決殭屍程序:

(1).改寫父程序,在子程序死後要為它收屍。具體做法是接管sigchld訊號。子程序死後,會傳送sigchld訊號給父程序,父程序收到此訊號後,執行waitpid()函式為子程序收屍。這是基於這樣的原理:就算父程序沒有呼叫wait,核心也會向它傳送sigchld訊息,儘管對的預設處理是忽略,如果想響應這個訊息,可以設定乙個處理函式。

(2)把父程序殺掉。父程序死後,殭屍程序成為」孤兒程序」,過繼給1號程序init,init始終會負責清理殭屍程序.它產生的所有殭屍程序也跟著消失。

(3)殺父程序不行的話,就嘗試用 skill -t tty 關閉相應終端,tty是程序相應的tty號(終端號)。

(4)實在不行,重啟系統吧,這也是最常用到方法之一。

5.c++學了什麼,講一下多型吧?怎樣實現多型

6.說一下stl中的容器,vector和list用在哪些場景中,它倆的區別

容器:

(1)順序容器:vector dequeue list

(2)關聯容器: 有序的關聯容器 (底層資料結構:紅黑樹)資料排好序了,非常適合範圍查詢

無序的關聯容器 (底層資料結構:雜湊表)不適合範圍查詢

vector適用:物件數量變化少,簡單物件,隨機訪問元素頻繁

list適用:物件數量變化大,物件複雜,插入和刪除頻繁

最大的區別是,list是雙向的,而vector是單向的。

面經筆記 深信服電話面試

接到 我是懵逼的,因為早上睡了懶覺,剛到實驗室就來個 首先問是否方便,然後說你簡歷寫了cuda程式設計,其主要應用在了 工程中的cuda是不是你寫的?我說應用在三維影象處理,cuda是我引入工程並實現的。我發現每個公司都對cuda很感興趣,會cuda的一定要提前準備好常見的面試問題。他說除了cuda...

2014深信服面經

又到了招聘季,有同學跟我說今年深信服校招開的工資蠻高的,本科生開9000 因為使用過深信服的vpn,一開始知道這家公司,所以就和同學一起去聽了它的宣講會.然後回去查了一下這家公司的歷史.發現這家公司是2000年由華為的人跳槽辦的,發展比較快,現在規模屬於中型企業吧 有1800人左右 從網上了解到的資...

深信服面經 2014 武漢

面試官和我年紀差不多,好年輕,手裡有三張紙,每張紙上有50個題目左右,抽一些簡歷上相關的題目問,我感覺醬油了。1 寫出ls原始碼 2 寫出printf源 3 生產者 消費者不使用鎖,如何實現?4 二叉樹的前序 中序 後序遍歷?5 紅黑樹的特性,使用 6 select poll socket 7 li...