筆試題總結

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)存中并沒有拷貝,因為所有的預處理指令都在預處理時進行了替換。

01.png

考點:棧空間內(nèi)存是從高地址向低地址值分配的。

s3,s4是堆內(nèi)存地址,與s1,s2無法作對比。

除非s1,s2,s3,s4都取地址,那么s1的地址值是最大的。此地址值對應于虛擬內(nèi)存地址,非實際物理地址。


02.png

解答:


03.png

題目:


04.png

解析:


05.png

題目:

06.png

解析:


07.png

在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;

04.png

以下代碼執(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();
 
        }
 
 }

截圖部分:


07.png

當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 性能并不好

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。