32位機器上,以下結構的sizeof(P)為
struct A {
int a;
char b;
int c;
char d;
}
struct P {
struct A w[2];
short b;
struct A* p;
}
/*考察結構體對齊和填充:
結構體每個成員相對于結構體首地址的偏移量都是成員大小的整數(shù)倍,如果不是,編譯器會自動在成員間填充。*/
- struct A {
int a; //4 bytes
char b; //1 bytes
//char pad[3] //3 bytes
int c; //4 bytes
char d; //1 bytes
//char pad[3] //3 bytes
} // total = 16 bytes
/* P中有結構體A的成員,但是計算時按照A中數(shù)據(jù)類型確定的*/
struct P {
struct A w[2]; // 2 * 16 bytes
short b; //2 bytes
//char pad[2] //2 bytes
struct A* p; //4 bytes
} // total = 40 bytes
下列關于const和#define定義常量的區(qū)別,說法不正確的有?
define宏是在預處理階段展開。const常量是編譯運行階段使用
宏沒有類型,不做任何類型檢查,僅僅是展開。const常量有具體的類型,在編譯階段會執(zhí)行類型檢查
define宏僅僅是展開,有多少地方使用,就展開多少次,不會分配內(nèi)存。const常量會在內(nèi)存中分配(可以是堆中也可以是棧中)
-
const定義和#define定義的常量在程序運行過程中只有一份拷貝
A,正確,#define定義的宏是在預處理階段進行替換的,const常量是在編譯、運行階段進行使用的。
注意是僅僅的字符串替換,并不會檢查其合法性。
預處理階段做了的任務:
1:將頭文件中的內(nèi)容(源文件之外的文件)插入到源文件中
2:進行了宏替換的過程(簡單的字符串替換),定義和替換了由#define指令定義的符號
3:刪除掉注釋的過程,注釋是不會帶入到編譯階段
4:條件編譯B,正確,所有的宏替換只是簡單的字符串替換,注意是字符串替換,所以并不會檢查其合法性,而const定義的常量依然是內(nèi)置類型等,所以會對其進行類型安全檢查。
C,正確,宏定義在程序中使用了幾次在預處理階段就會被展開幾次,并不會增加內(nèi)存占用,但是宏定義每展開一次,代碼的長度就要發(fā)生變化(所以有利必有弊啊!),而const常量也會為其分配內(nèi)存(如果是動態(tài)申請空間肯定就是堆中了)。
D,錯誤,const定義的常量只有一次拷貝沒毛病,而define定義的變量在內(nèi)存中并沒有拷貝,因為所有的預處理指令都在預處理時進行了替換。
考點:棧空間內(nèi)存是從高地址向低地址值分配的。
s3,s4是堆內(nèi)存地址,與s1,s2無法作對比。
除非s1,s2,s3,s4都取地址,那么s1的地址值是最大的。此地址值對應于虛擬內(nèi)存地址,非實際物理地址。
解答:
題目:
解析:
題目:
解析:
在TCP/IP中,ICMP屬于哪一層協(xié)議?**
答:ICMP協(xié)議是IP層的附屬協(xié)議,是介于IP層和TCP層之間的協(xié)議,一般認為屬于IP層協(xié)議。IP協(xié)議用它來與其他主機或路由器交換錯誤報文和其他的一些網(wǎng)絡情況。在ICMP包重攜帶了控制信息和故障恢復信息。
ICMP報文有兩種類型,即ICMP差錯報告報文和ICMP詢問報文。
灰度等級為256級,分辨率為1024*1024的顯示器,至少需要的幀緩存容量為()
1024*1024*8/8=1M
第一個8是因為256是2的8次方 除以8是因為要轉(zhuǎn)換字節(jié)和二進制位
設在一棵度數(shù)為3的樹中,度數(shù)為3的結點數(shù)有2個,度數(shù)為2的結點數(shù)有1個,度數(shù)為1的結點數(shù)有2個,那么度數(shù)為0的結點數(shù)有( )個。
答:根據(jù)圖論中樹的公式:頂點數(shù) - 1 = 邊數(shù),設出度為0的結點有y個,列方程求解。其中頂點數(shù)為2+1+2+x,邊數(shù)為2 x 3+1 x 2+2 x 1。解出來得 y = 6
500張骨牌整齊地排成一行,按順序編號為1、2、3、……、499、500。第一次拿走所有奇數(shù)位置上的骨牌,第二次再從剩余骨牌中拿走奇數(shù)位置上的骨牌,以此類推。請問最后剩下的一張骨牌的編號是?
答:
第一次后剩下250個偶數(shù):2,4,6,8......498,500(2的倍數(shù)留下,2的一次方)
第二次后剩下125個偶數(shù):4,8,12,16......496,500(4的倍數(shù)留下,2的二次方)
第三次后剩下62個偶數(shù):8,16,24....488,496(8的倍數(shù)留下,2的三次方)
..........................................................................
第八次后留下的1個偶數(shù):256(2的八次方倍數(shù)留下)
所以答案選C
Linux 文件權限一共 10 位長度,從前數(shù)第 5-7 位表示的內(nèi)容是
答:第一位表示是文件或者目錄,2~4是用戶權限, 5~7是組權限 ,8~10是其他用戶權限
關于TCP可靠數(shù)據(jù)傳輸服務的論述,正確的是
答:
A.錯誤。不一定需要超時才重傳,出錯了也可以重傳;
B.錯誤。錯在于這個時間間隔不是固定的。超時時間間隔 RTO,如果太短可能導致大量不必要的重傳,如果太長則會導致性能下降;所以超時時間間隔 RTO是通過往返時間RTT算出來的。TCP 采用了一個高度動態(tài)的算法,來不斷的調(diào)整時間間隔,總之超時時間間隔不是固定的~
C.錯誤。TCP是面向連接的,提供可靠服務的,所以需要對亂序到達的分組進行確認以及重排。
D.正確。如果發(fā)送方收到連續(xù)3條的同一個序列號的ACK,那么就會啟動快速重傳機制,不需要等到timeout,把這個ACK對應的發(fā)送包重新發(fā)送一次。
引入二叉線索樹的目的是()
答:加快查找結點的前驅(qū)或后繼的速度。
用鄰接表表示圖進行廣度優(yōu)先遍歷時,通常是采用()來實現(xiàn)算法的
答:記得廣度優(yōu)先用隊列,深度優(yōu)先用棧。
下面有關內(nèi)核線程和用戶線程說法錯誤的是?
用戶線程因 I/O 而處于等待狀態(tài)時,整個進程就會被調(diào)度程序切換為等待狀態(tài),其他線程得不到運行的機會
內(nèi)核線程只運行在內(nèi)核態(tài),不受用戶態(tài)上下文的影響。
用戶線程和內(nèi)核線程的調(diào)度都需要經(jīng)過內(nèi)核態(tài)。
內(nèi)核線程有利于發(fā)揮多處理器的并發(fā)優(yōu)勢,但卻占用了更多的系統(tǒng)開支。
解析:
線程通常被定義為一個進程中代碼的不同執(zhí)行路線。從實現(xiàn)方式上劃分,線程有兩種類型:“用戶級線程”和“內(nèi)核級線程”。 用戶線程指不需要內(nèi)核支持而在用戶程序中實現(xiàn)的線程,其不依賴于操作系統(tǒng)核心,應用進程利用線程庫提供創(chuàng)建、同步、調(diào)度和管理線程的函數(shù)來控制用戶線程。這種線程甚至在象 DOS 這樣的操作系統(tǒng)中也可實現(xiàn),但線程的調(diào)度需要用戶程序完成,這有些類似 Windows 3.x 的協(xié)作式多任務。另外一種則需要內(nèi)核的參與,由內(nèi)核完成線程的調(diào)度。其依賴于操作系統(tǒng)核心,由內(nèi)核的內(nèi)部需求進行創(chuàng)建和撤銷,這兩種模型各有其好處和缺點。用戶線程不需要額外的內(nèi)核開支,并且用戶態(tài)線程的實現(xiàn)方式可以被定制或修改以適應特殊應用的要求,但是當一個線程因 I/O 而處于等待狀態(tài)時,整個進程就會被調(diào)度程序切換為等待狀態(tài)敏感詞線程得不到運行的機會;而內(nèi)核線程則沒有各個限制,有利于發(fā)揮多處理器的并發(fā)優(yōu)勢,但卻占用了更多的系統(tǒng)開支。 Windows NT和OS/2支持內(nèi)核線程。Linux 支持內(nèi)核級的多線程 。
大整數(shù)845678992357836701轉(zhuǎn)化成16進制表示,最后兩位字符是?
AB
EF
8B
9D
答: 利用同余關系做。845678992357836701除以4余數(shù)為1( 845678992357836700能被4整除 ),在16進制數(shù)中,決定除以4后余數(shù)的只有最后一位(前面位都是16的倍數(shù),自然被4整除),算算也只有D(13)除以4余1,所以選D.
Java中用正則表達式截取字符串中第一個出現(xiàn)的英文左括號之前的字符串。比如:北京市(海淀區(qū))(朝陽區(qū))(西城區(qū)),截取結果為:北京市。正則表達式為()
答:
(?=Expression)
順序肯定環(huán)視,表示所在位置右側(cè)能夠匹配Expression
(?=()*就是匹配正括號, 因為(需要轉(zhuǎn)義, 所以要再前面加斜線
前面的.*?是非貪婪匹配的意思, 表示找到最小的這樣的匹配即可。
否則, 因為后面也有括號, 會匹配到 北京市(海淀區(qū))(朝陽區(qū))
編程:今年的第幾天?輸入年,月,日,計算該天是本年的第幾天。
tips:這里的重點主要就是有關閏年的判斷?在二月的天數(shù) + 1;
以下代碼執(zhí)行后輸出結果為:
public class Test {
public static Test t1 = new Test();
{
System.out.println("blockA");
}
static
{
System.out.println("blockB");
}
public static void main(String[]
args)
{
Test t2 = new Test();
}
}
截圖部分:
當mian方法中運行到Test t2 = newTest();時, 首先是執(zhí)行靜態(tài)變量和靜態(tài)代碼塊,然后才會到新建對象的構造代碼塊和構造方法(且構造代碼塊要優(yōu)先于構造方法)。即執(zhí)行順序為:靜態(tài)變量>靜態(tài)代碼塊>構造代碼塊>構造方法。
靜態(tài)變量就是 public static Test t1 = new Test(); 此時這行代碼會調(diào)用構造代碼塊,即輸出blockA; 注意構造代碼塊只有新建對象 Test() 才會執(zhí)行。
接著執(zhí)行靜態(tài)代碼塊,輸出 blockB; 注意靜態(tài)代碼塊之會執(zhí)行一次。
然后繼續(xù)就到了新建對象 t2 了,此時是先執(zhí)行構造代碼塊,輸出 blockA; 接著再執(zhí)行構造方法,無輸出。
綜上,選 A。
輸出:blockA blockB blockA
問:計算機系統(tǒng)中判別是否有中斷事件發(fā)生應是在()
答:應該發(fā)生在執(zhí)行完一條指令后。
問:某系統(tǒng)中有 3 個并發(fā)進程,都需要同類資源 4 個,試問該系統(tǒng)不會發(fā)生死鎖的最少資源數(shù)是:
答:注意極限情況問題,極限情況是每個并發(fā)進程都已經(jīng)有了三個資源,此時一共有9個,那么只需要再有一個資源就可以使一個進程完成操作任務,釋放資源之后循環(huán)。所以需要的最少資源數(shù)是 10 個。
問:下面有關共享內(nèi)存,說法不正確的是?
答:共享內(nèi)存不提供同步 參考 JMM java內(nèi)存模型
盡管每個進程都有自己的內(nèi)存地址,不同的進程可以同時將同一個內(nèi)存頁面映射到自己的地址空間中,從而達到共享內(nèi)存的目的。(這句話是正確的)
問:假設如下代碼中,若t1線程在t2線程啟動之前已經(jīng)完成啟動。代碼的輸出是()
public static void main(String[]args)throws Exception {
final Object obj = new Object();
Thread t1 = new Thread() {
public void run() {
synchronized (obj) {
try {
obj.wait();
System.out.println("Thread 1 wake up.");
} catch (InterruptedException e) {
}
}
}
};
t1.start();
Thread.sleep(1000);//We assume thread 1 must start up within 1 sec.
Thread t2 = new Thread() {
public void run() {
synchronized (obj) {
obj.notifyAll();
System.out.println("Thread 2 sent notify.");
}
}
};
t2.start();
}
以下 A 代表 t1,B 代表 t2。
當B調(diào)用 obj.notify/notifyAll 的時候,B 正持有 obj 鎖,因此,A1,A2,A3 雖被喚醒,但是仍無法獲得 obj 鎖。直到B退出 synchronized 塊,釋放 obj 鎖后,A1,A2,A3 中的一個才有機會獲得鎖繼續(xù)執(zhí)行。當B調(diào)用obj.notify/notifyAll 的時候,B正持有 obj 鎖,因此,A1,A2,A3雖被喚醒,但是仍無法獲得 obj 鎖。直到 B 退出 synchronized 塊,釋放 obj 鎖后,A1,A2,A3 中的一個才有機會獲得鎖繼續(xù)執(zhí)行。
tips :
因為T1中調(diào)用了obj.wait(),線程T1進入阻塞狀態(tài),釋放了鎖,所以T2就拿到了鎖??
問:在java類設計中,類的成員變量要求僅僅能夠被同一package下的類訪問,請問應該使用下列哪個修飾詞()
答:tips:當只要求類成員變量要求只是在同一個 package 包下的時候,不需要任何修飾符,注意被 protected 修飾的屬性和方法只能被類本身的方法和子類訪問,即使子類在不同的包中也可以訪問。
問:下面有關forward和redirect的描述,錯誤的是()
答:redirect默認將產(chǎn)生301 Permanently moved的HTTP響應。注意這里需要了解的是回答錯誤的條目。
301 是永久跳轉(zhuǎn),302 是暫時跳轉(zhuǎn)。 redirect 默認是 302 暫時性跳轉(zhuǎn)。
問:如果您想列出當前目錄以及子目錄下所有擴展名為“.txt”的文件,那么您可以使用的命令是()
答:find -name “*.txt”
一個類中含有抽象方法,則這個類為抽象類,一個類為抽象類,可以沒有抽象方法。
問:在使用mkdir命令創(chuàng)建新的目錄時,在其父目錄不存在時先創(chuàng)建父目錄的選項是
答:- p
問:在HTTP協(xié)議的網(wǎng)絡編程中,經(jīng)常會涉及到『長連接』、『短連接』、『長輪詢』等概念,關于這些以下哪種說法不正確:
答:tips:注意回答的答案是不正確的部分。此處回答應是 在網(wǎng)絡調(diào)用量很大的時候,短連接因為資源占用少,因而相對長連接性能更好。
頻繁創(chuàng)建 Socket 性能并不好