1.數組能通過值參數,地址參數和引用參數三種方式傳遞給函數。
2.進程狀態
三態模型:運行態,就緒態,阻塞態
舞臺模型:新建態,終止態,運行態,就緒態,阻塞態
3.函數定義時,函數體內不能包含另一個函數的定義,即函數不能嵌套定義
4.操作系統的分頁式存儲管理
爲什麼要使用頁表存儲:
學過操作系統的都知道,在操作系統中存在一個虛擬內存的概念,它用於內存的管理,使得應用程序認爲它有一段連續的內存,大大地簡化了程序員碼代碼的難度。程序員只用關注在這個連續的虛擬內存段中怎麼使用內存,不用關心在物理內存中到底用那一段內存,進程運行的時候操作系統會自動進行映射。操作系統是怎麼做到的呢?實際上操作系統爲每一個進程維護了一個從虛擬地址到物理地址的映射關係的數據結構,叫頁表,頁表的內容就是該進程的虛擬地址到物理地址的一個映射。
基本概念:
- 頁(Page):進程的邏輯地址空間劃分爲大小相等的塊,且塊相對比較小,每個塊稱爲一頁(Page),由頁號和頁內地址組成。
- 幀(PageFrame):將物理內存空間也劃分爲同樣大小的塊,每個塊稱爲一頁面(幀)(頁框)(物理頁)(塊)。
我搞了半天好不容易搞懂這個概念,因爲網上Page和PageFrame的中文真的什麼都有。。。。
地址結構:
每頁(或幀)裏面包含的纔是真正的地址,在得到頁碼(幀號)之後,再通過頁內偏移(或幀內偏移),也就是頁偏移(幀偏移)來找到相應的地址。所以每個邏輯地址(物理地址)的表示方法是 頁碼(幀號)+頁偏移量(幀偏移量)。
分頁系統中的地址結構由兩部分組成,頁號和頁內偏移量。
可以解釋爲一個二元組(p,w),其中p是頁號,w是頁面p中的偏移量或者相對於p頁開始的位置。
下圖(a) 中的地址長度爲32位,其中0 - 9位爲頁內偏移量,每頁的大小爲2的10次方 = 1k;10 - 31位爲頁號,共計2的22次方 = 4M頁。在圖(b)中,地址長度同樣爲32位,其中0 - 11位頁內偏移量,每頁的大小爲2的12次方 = 4k;12 - 31位爲頁號,共計2的20次方 = 1M頁,由此可知不同的系統頁的大小是不一樣的。
上圖頁面大小爲1KB(2的10次方)
上圖頁面大小爲4KB(2的12次方)
對於特定的機器來說,其地址結構是一定的。
若給定邏輯地址A,頁面大小爲L,則頁號p和頁內偏移量w分別爲
p = A / L
w = A % L
例如:系統的頁面大小事1K,設A = 3096,則由上式得出 p =3,w =24
例如:邏輯地址32位,頁面大小4KB,則頁表項爲多少?爲什麼?(我覺得頁表項個數就是頁的個數)
32的邏輯地址,分成兩部分。前部分是代表虛擬的頁號,後部分代表的是虛擬頁偏移量,如果頁面是4KB的話,那麼這個後部分虛擬頁偏移量佔了12位,那麼前面就是32-12=20位。這20位就是頁表中所有的頁表項的和。就是2的20次方,也就是1M個頁表項,如果每個頁表項佔4B的話。那麼這個頁表就佔了4MB的空間。一般都會有兩級甚至更多的。用來減少頁表佔的空間
例如:已知邏輯空間地址爲2^m個字節(也就是說邏輯地址的長度是m位),已知頁大小是2^n字節。那麼一共可以有2^(m-n)個頁。因此頁碼部分會佔m-n位,之後的n位,用來存儲頁偏移。
例如:頁大小爲4B,而邏輯內存爲32B(8頁),邏輯地址0的頁號爲0,頁號0對應幀5,因此邏輯地址映射爲物理地址5*4+0=20。邏輯地址3映射物理地址5*4+3=23。邏輯地址13(4*3+1,頁號爲3,偏移爲1,因此幀號爲2),映射到物理地址9。
參考:(偏硬件一點)內存管理筆記(分頁,分段,邏輯地址,物理地址與地址轉換方式)
5.什麼是內存泄露?
一般我們常說的內存泄漏是指堆內存的泄漏。堆內存是指程序從堆中分配的,大小任意的(內存塊的大小可以在程序運行期決定),使用完後必須顯式釋放的內存。應用程序一般使用malloc,calloc,realloc,new等函數從堆中分配到一塊內存,使用完後,程序必須負責相應的調用free或delete釋放該內存塊,否則,這塊內存就不能被再次使用,我們就說這塊內存泄漏了。
內存泄漏(Memory Leak)是指程序中己動態分配的堆內存由於某種原因程序未釋放或無法釋放,造成系統內存的浪費,導致程序運行速度減慢甚至系統崩潰等嚴重後果。
應用程序一般使用malloc,calloc,realloc,new等函數從堆中分配到一塊內存,使用完後,程序必須負責相應的調用free或delete釋放該內存塊,否則,這塊內存就不能被再次使用,我們就說這塊內存泄漏了。
6.makefile和程序的編譯鏈接過程
C/C++程序的生成, 分爲如下幾個步驟
1). 預處理: 引入頭文件,解析並展開宏定義
2). 編譯: 簡單一點就是把源代碼轉化爲彙編碼(機器指令)
3). 鏈接: 組裝各個子模塊和相應的庫,並生成最終的可執行程序
首先要把源文件編譯成中間代碼文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,這個動作叫做編譯(compile)。然後再把大量的Object File合成執行文件,這個動作叫作鏈接(link)。 編譯時,編譯器需要的是語法的正確,函數與變量的聲明的正確。對於後者,通常是你需要告訴編譯器頭文件的所在位置(頭文件中應該只是聲明,而定義應該放在C/C++文件中),只要所有的語法正確,編譯器就可以編譯出中間目標文件。一般來說,每個源文件都應該對應於一箇中間目標文件(O文件或是OBJ文件)。鏈接時,主要是鏈接函數和全局變量,所以,我們可以使用這些中間目標文件(O文件或是OBJ文件)來鏈接我們的應用程序。鏈接器並不管函數所在的源文件,只管函數的中間目標文件(Object File),
總結一下,源文件首先會生成中間目標文件,再由中間目標文件生成執行文件。在編譯時,編譯器只檢測程序語法,和函數、變量是否被聲明。如果函數未被聲明,編譯器會給出一個警告,但可以生成Object File。而在鏈接程序時,鏈接器會在所有的Object File中找尋函數的實現,如果找不到,那到就會報鏈接錯誤碼(Linker Error),在VC下,這種錯誤一般是:Link 2001錯誤,意思說是說,鏈接器未能找到函數的實現。你需要指定函數的Object File.
7.隊列和棧有什麼區別?
1、隊列先進先出,棧先進後出。
2、對插入和刪除操作的"限定"不同。
棧是限定只能在表的一端進行插入和刪除操作的線性表。
隊列是限定只能在表的一端進行插入和在另一端進行刪除操作的線性表。
3、遍歷數據速度不同。
棧只能從頭部取數據,也就最先放入的需要遍歷整個棧最後才能取出來,而且在遍歷數據的時候還得爲數據開闢臨時空間,保持數據在遍歷前的一致性。
隊列則不同,它基於地址指針進行遍歷,而且可以從頭或尾部開始遍歷,但不能同時遍歷,無需開闢臨時空間,因爲在遍歷的過程中不影像數據結構,速度要快的多
8.ARM有哪幾種異常?異常處理機制?
ARM是處理器的意思
未定義指令、預取中止、數據中止、中斷、快中斷、復位、軟中斷指令SWI。
當一種異常發生時,硬件就會自動執行如下動作:
(1)將CPSR保存到相應異常模式下的SPSR中
(2)把PC寄存器保存到相應異常模式下的LR中
(3)將CPSR設置成相應的異常模式
(4)設置PC寄存器的值爲相應處理程序的入口地址
拷貝 CPSR 到 SPSR_
設置適當的 CPSR 位:
改變處理器狀態進入ARM態
改變處理器模式進入相應的異常模式
設置中斷禁止位禁止相應中斷 (如果需要)
保存返回地址到 LR_
設置 PC 爲相應的異常向量
返回時, 異常處理需要:
從 SPSR_恢復CPSR
從LR_恢復PC
9.一個表中的id有多個記錄,把所有這個id的記錄查出來,並顯示共有多少條記錄數
select id ,Count(*) from table_name group by id having count(*)>1
給出一張表
查詢數學成績相同的記錄,並顯示出該成績相同記錄數
SELECT Math,COUNT(*) from [TestDB].[dbo].[Student] group by Math having COUNT(*)>1;
結果
10.請解釋一下概念:黑盒測試,白盒測試,alpha測試和beta測試
- 黑盒測試一般用來確認軟件功能的正確性和可操作性,目的是檢測軟件的各個功能是否能得以實現,把被測試的程序當作一個黑盒,不考慮其內部結構,在知道該程序的輸入和輸出之間的關係或程序功能的情況下,依靠軟件規格說明書來確定測試用例和推斷測試結果的正確性。
- 白盒測試根據軟件內部的邏輯結構分析來進行測試,是基於代碼的測試,測試人員通過閱讀程序代碼或者通過使用開發工具中的單步調試來判斷軟件的質量,一般黑盒測試由項目經理在程序員開發中來實現。
alpha測試版,有點相當於內部測試,一般開發人員在場 ,是由用戶做測試,但開發人員在場,一般是請用戶到開發現場去測試。系統開發接近完成時對應用系統的測試;測試後仍然會有少量的設計變更。這種測試一般由最終用戶或其它人員完成,不能由程序或測試員完成。 α測試是由一個用戶在開發環境下進行的測試,也可以是公司內部的用戶在模擬實際操作環境下進行的受控測試
beta測試版,完全交給用戶,由用戶做測試,返回測試報告,相當於發行前的一個版本。當開發和測試根本完成時所做的測試,最終的錯誤和問題需要在最終發行前找到。這種測試一般由最終用戶或其它人員完成,不能由程序或測試員完成。 β測試是軟件的多個用戶在一個或多個用戶的實際使用環境下進行的測試。
11.對於下面這段代碼每行的作用是什麼:
#ifdef __cplusplus
extern "C" {
#endif
//一段代碼
#ifdef __cplusplus
}
#endif
首先,__cplusplus是cpp中的自定義宏,那麼定義了這個宏的話表示這是一段cpp的代碼,也就是說,上面的代碼的含義是:如果這是一段cpp的代碼,那麼加入extern "C"{和}處理其中的代碼。
C和C++對函數的處理方式是不同的.extern "C"是使C++能夠調用C寫作的庫文件的一個手段,被extern “C”修飾的函數或者變量是按照C語言方式編譯和鏈接的,所以可以用一句話來概括extern “C”的真實目的:實現C++與C的混合編程。
12.按值傳遞,按地址傳遞和引用傳遞的區別?
值傳遞:在調用函數中將原函數的值拷貝一份過去被調用的函數,在被調用函數中對該值的修改不會影響原函數的值。形式參數只是用實際參數的值初始化自己的存儲單元內容,是兩個不同的存儲單元,
地址傳遞:在調用函數的時候將原函數的值所在的地址拷貝一份過去,被調用函數對這個地址所作的修改會影響原來的值。是傳值的一種特殊方式,只是他傳遞的是地址,不是普通的如int
那麼傳地址以後,實參和行參都指向同一個對象
引用傳遞:這時實際參數與形式參數指向同一個地址,在方法執行中,對形式參數的操作實際上就是對實際參數的操作,所謂引用傳遞是指在調用函數時將實際參數的地址傳遞到函數中,那麼在函數中對參數所進行的修改,將影響到實際參數。真正的以地址的方式傳遞參數
傳遞以後,行參和實參都是同一個對象,只是他們名字不同而已
對行參的修改將影響實參的值
13.請問交換機和路由器分別的實現原理是什麼?分別在哪個層次上面實現的?
一般意義上說交換機是工作在數據鏈路層。
但隨着科技的發展,現在有了三層交換機,三層交換機已經擴展到了網絡層。
也就是說:它等於“數據鏈路層 + 部分網絡層”。
交換機中傳的是幀。通過存儲轉發來實現的。
路由器是工作在網絡層。路由器中傳的是IP數據報。主要是選址和路由。
交換機屬於OSI第二層即數據鏈路層設備。它根據MAC地址尋址,通過站表選擇路由,站表的建立和維護由交換機自動進行。路由器屬於OSI第三層即網絡層設備,它根據IP地址進行尋址,通過路由表路由協議產生。交換機最大的好處是快速,路由器最大的好處是控制能力強。
14.多進程與多線程,併發與並行
https://www.cnblogs.com/forzheng/p/8280925.html
15.描述insmod,ismod,rmmod作用
insmod: insmod命令用於將給定的模塊加載到內核中。Linux有許多功能是通過模塊的方式,在需要時才載入kernel。如此可使kernel較爲精簡,進而提高效率,以及保有較大的彈性。這類可載入的模塊,通常是設備驅動程序。例如:insmod xxx.ko
ismod:Linux lsmod命令用於顯示已載入系統的模塊。
rmmod:rmmod命令用於從當前運行的內核中移除指定的內核模塊。執行rmmod指令,可刪除不需要的模塊。Linux操作系統的核心具有模塊化的特性,應此在編譯核心時,務須把全部的功能都放如核心。你可以將這些功能編譯成一個個單獨的模塊,待有需要時再分別載入它們。例如:rmmod xxx.ko
16.描述mknod作用及使用
mknod - make block or character special files
mknod [OPTION]... NAME TYPE [MAJOR MINOR]
option 有用的就是 -m 了
name 自定義
type 有 b 和 c 還有 p
主設備號
次設備號
主設備號是由linux/major.h定義的,如下定義了一個DOC設備:
#define IGEL_FLASH_MAJOR 62
假如有一個命令mknod doc b 62 0 :
其中的doc爲定義的名字,b指塊設備,0指的是整個DOC。如果把0換爲1,則1指的是DOC的第一個分區。2是第2個,對於塊設備次設備號就表示該塊設備上的分區號,依次類推。
至於mknod console c 5 1 的意思也很相似:
console是設備的名字
c指字符設備
5是該設備在major.h中定義的標記
1是第一個子設備
mknod console c 5 1
console爲設備文件名,自己隨便取
c是指字符型設備 (可選b,塊設備)
5是主設備號 /dev/devices裏面記錄現有的設備
找個沒有用的就可以了
1是次設備號,當你要給兩個同樣的設備上一個驅動的時候就要分了,從0開始,1就是第二個了 ,對於字符設備,次設備號就表示同類型設備的不同設備。
參考