海康威視

荒北發表於2024-05-12

1 static關鍵字作用

修飾區域性變數
​ static修飾區域性變數時,使得被修飾的變數成為靜態變數,儲存在靜態區。儲存在靜態區的資料生命週期與程式相同,在main函式之前初始化,在程式退出時銷燬。(無論是區域性靜態還是全域性靜態)

修飾全域性變數
​ 全域性變數本來就儲存在靜態區,因此static並不能改變其儲存位置。但是,static限制了其連結屬性。被static修飾的全域性變數只能被該包含該定義的檔案訪問(即改變了作用域)。

修飾函式
​ static修飾函式使得函式只能在包含該函式定義的檔案中被呼叫。對於靜態函式,宣告和定義需要放在同一個資料夾中。

修飾成員變數
​ 用static修飾類的資料成員使其成為類的全域性變數,會被類的所有物件共享,包括派生類的物件,所有的物件都只維持同一個例項。 因此,static成員必須在類外進行初始化(初始化格式:int base::var=5;),而不能在建構函式內進行初始化,不過也可以用const修飾static資料成員在類內初始化。

修飾成員函式
​ 用static修飾成員函式,使這個類只存在這一份函式,所有物件共享該函式,不含this指標,因而只能訪問類的static成員變數。靜態成員是可以獨立訪問的,也就是說,無須建立任何物件例項就可以訪問。例如可以封裝某些演算法,比如數學函式,如ln,sin,tan等等,這些函式本就沒必要屬於任何一個物件,所以從類上呼叫感覺更好。

最重要的特性:隱藏
​ 當同時編譯多個檔案時,所有未加static字首的全域性變數和函式都具有全域性可見性,其它的原始檔也能訪問。利用這一特性可以在不同的檔案中定義同名函式和同名變數,而不必擔心命名衝突。static可以用作函式和變數的字首,對於函式來講,static的作用僅限於隱藏。

2 涉及Linux系統呼叫

3 協議

4 在請求分頁儲存管理中,當訪問的頁面不在記憶體時,便產生缺頁中斷,缺頁中斷是屬於()。

I/O中斷
程式中斷
訪管中斷
外中斷

中斷型別分為如下兩大類:
一、強迫性中斷:正在執行的程式所不期望的,來自硬體故障或外部請求。
1、I/O 中斷:來自外部裝置通道;
2、程式性中斷:執行程式本身的中斷,如 溢位、缺頁中斷、缺段中斷、地址越界。
3、時鐘中斷
4、控制檯中斷
5、硬體故障
二、自願性中斷:使用者在程式設計時要求作業系統提供的服務,使用訪管指令或系統呼叫使中斷髮生。也稱為訪管中斷。包括執行I/O,建立程序,分配記憶體,訊號量操作,傳送/接收訊息。

5 紅黑樹

  • 節點是紅色或黑色。
  • 根是黑色。
  • 所有葉子都是黑色(葉子是NIL節點)。
  • 每個紅色節點必須有兩個黑色的子節點。(從每個葉子到根的所有路徑上不能有兩個連續的紅色節點。)
  • 從任一節點到其每個葉子的所有簡單路徑都包含相同數目的黑色節點(簡稱黑高)。

6 中斷服務函式

中斷處理函式的返回值和形參

中斷處理函式不能有返回值和形參,因為中斷處理函式都是硬體呼叫(或者叫觸發),沒有程式給它傳遞引數,也沒有程式接收它的返回值,其引數的傳遞透過全域性變數的方式。
但是要注意,如果在中斷服務函式中改變了供其他函式檢測的全域性變數的值,要使用volatile關鍵字定義該全域性變數。因為主程式可能將該變數讀取到暫存器中,以後每次只使用暫存器中的變數副本,這時候透過不使用volatile關鍵字,會導致中斷服務函式中修改該變數的操作被短路。

為什麼中斷處理函式中不能出現阻塞

1、 中斷處理的時候,不應該發生程序切換,因為在中斷context中,唯一能打斷當前中斷handler的只有更高優先順序的中斷,它不會被程序打斷,如果在中斷context中休眠,則沒有辦法喚醒它,因為所有的wake_up_xxx都是針對某個程序而言的,而在中斷context中,沒有程序的概念,沒有一個task_struct(這點對於softirq和tasklet一樣),因此真的休眠了,比如呼叫了會導致block的例程,核心幾乎肯定會死

2、schedule()在切換程序時,儲存當前的程序上下文(CPU暫存器的值、程序的狀態以及堆疊中的內容),以便以後恢復此程序執行。中斷髮生後,核心會先儲存當前被中斷的程序上下文(在呼叫中斷處理程式後恢復);但在中斷處理程式裡,CPU暫存器的值肯定已經變化了吧(最重要的程式計數器PC、堆疊SP等),如果此時因為睡眠或阻塞操作呼叫了schedule(),則儲存的程序上下文就不是當前的程序context了.所以不可以在中斷處理程式中呼叫schedule()。

3、中斷處理程式是帶便程序執行的,它所代表的程序必須總處理TASK_RUNNING狀態。當一箇中斷處理程式正在執行時,他所代表的IRQ線上發出的訊號就會暫時被忽略

4、同樣也是為了實現中斷巢狀進行所付出的代價,如果要保證可以中斷巢狀,就中斷處理程式必須永不阻塞。

7 關於訊號量描述錯誤的為

訊號量只能線上程之間共享

不允許銷燬一個正在等待的訊號量

使用者態使用的訊號量分為POSIX訊號量和SYSTEM V訊號量

訊號量有兩種基本操作:V操作,訊號量加1;P操作,訊號量減1(如果訊號量為0,則阻塞)

Linux 核心中的訊號量使用和使用者態的訊號量使用有所不同,

1、核心訊號量,由核心控制路徑使用。

2、使用者態訊號量分為兩種,一種為POSIX,另一種為 SYSTEM V

8 程序和執行緒的描述正確

每個執行緒擁有自己的堆疊和區域性變數

執行緒是程式執行的最小單位

程序有獨立的地址空間,而執行緒沒有

9 在程式執行過程中,該程式的某一個函式func()中申請的static型變數V有以下哪些特性

V僅能被func()使用
V存在於整個程式執行過程

10 能在Linux核心態執行的是

程序排程

缺頁異常

時鐘中斷

11 主存與cache的地址對映方式有全相聯方式、直接方式和組相聯方式三種

12 Linux程序間通訊方試中,如下哪一種最常用且最高效?

為什麼共享記憶體最高效?

訊息佇列和管道基本上都是4次複製,而共享記憶體(mmap, shmget)只有兩次。

4次:1,由使用者空間的buf中將資料複製到核心中。2,核心將資料複製到記憶體中。3,記憶體到核心。4,核心到使用者空間的buf;
2次: 1,使用者空間到記憶體。 2,記憶體到使用者空間。

相關文章