大廠測試工程師面試題總結-二面(附參考答案)

二面:
1、線程與進程的區別?
一:進程與線程
概述:幾乎任何的操作系統都支持運行多個任務,通常一個任務就是一個程序,而一個程序就是一個進程。當一個進程運行時,內部可能包括多個順序執行流,每個順序執行流就是一個線程。
進程:進程是指處於運行過程中的程序,並且具有一定的獨立功能。進程是系統進行資源分配和調度的一個單位。當程序進入內存運行時,即爲進程。

線程:
線程是進程的組成部分,一個進程可以擁有多個線程,而一個線程必須擁有一個父進程。線程可以擁有自己的堆棧,自己的程序計數器和自己的局部變量,但不能擁有系統資源。它與父進程的其他線程共享該進程的所有資源。

線程的特點:
線程可以完成一定任務,可以和其它線程共享父進程的共享變量和部分環境,相互協作來完成任務。
線程是獨立運行的,其不知道進程中是否還有其他線程存在。
線程的執行是搶佔式的,也就是說,當前執行的線程隨時可能被掛起,以便運行另一個線程。
一個線程可以創建或撤銷另一個線程,一個進程中的多個線程可以併發執行

二、線程的創建及使用
方案一:繼承Thread類創建線程類

 步驟:① 定義Thread類的子類 並重寫該類的Run方法,該run方法的方法體就代表了該線程需要完成的任務

        ② 創建Thread類的實例,即創建了線程對象

        ③ 調用線程的start方法來啓動線程
public class ThreadTest extends Thread{
    private int i;
    @Override
    public void run() {//重寫run方法
        for (int i = 0; i < 10; i++) {
            //獲取當前正在執行的線程名
            System.out.println(getName()+"\t"+i);
            
        }
    }
    
}

public class MyTest{
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            System.out.println("調用線程"+Thread.currentThread().getName()+"\t"+i);
            if(i==5) {
                ThreadTest t1=new ThreadTest();
                ThreadTest t2=new ThreadTest();
                //開啓線程
                t1.start();
                t2.start();
            
            }
        }

    }

}

方案二:實現Runnable接口

 ①定義Runnable接口的實現類,並重寫它的Run方法,run方法同樣是該線程的執行體!

 ②創建Runnable實現類的實例,並將此實例作爲Thread的target創建一個Thread對象,該Thread對象纔是真正的線程對象!
public class TwoThread implements Runnable{

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("調用線程"+Thread.currentThread().getName()+"\t"+i);
            if(i==10)
                System.out.println(Thread.currentThread().getName()+"執行完畢");
        }
        
    }

}

2、打開一個url,發生了什麼?
基本概念:我們想要打開一個網站,首先是需要往瀏覽器的地址的URL輸入框架中輸入網地址。當我敲下回車後,通過HTTP協議,將網址傳送到域名解析服務器,域名解析服務器根據網址找到對應的IP主機(系統服務器)。這個過程叫request,即請求;當IP主機拿到請求後,將相應的資源返回給用戶瀏覽器。這個過程叫response,即響應。
  
當用戶瀏覽器向系統服務器請求時,有幾種方法,最常用的就是GET和POST兩種方法。

3、http的請求方式?
get和post區別

  
區別:

    
get請求無消息體,只能攜帶少量數據

    
post請求有消息體,可以攜帶大量數據

  
攜帶數據的方式:

    
get請求將數據放在url地址中

     
post請求將數據放在消息體中

GET請求請提交的數據放置在HTTP請求協議頭中,而POST提交的數據則放在實體數據中; 

GET方式提交的數據最多只能有1024字節,而POST則沒有此限制。 

4、http協議工作過程?
     一次HTTP操作稱爲一個事務,其工作整個過程如下:
     1 ) 、地址解析

     如用客戶端瀏覽器請求這個頁面:http://localhost.com:8080/index.htm

     從中分解出協議名、主機名、端口、對象路徑等部分,對於我們的這個地址,解析得到的結果如下:
     協議名:http
     主機名:localhost.com
     端口:8080
     對象路徑:/index.htm

      在這一步,需要域名系統DNS解析域名localhost.com,得主機的IP地址。

    2)、封裝HTTP請求數據包

     把以上部分結合本機自己的信息,封裝成一個HTTP請求數據包

     3)封裝成TCP包,建立TCP連接(TCP的三次握手)

       在HTTP工作開始之前,客戶機(Web瀏覽器)首先要通過網絡與服務器建立連接,該連接是通過TCP來完成的,該協議與IP協議共同構建Internet,即著名的TCP/IP協議族,因此Internet又被稱作是TCP/IP網絡。HTTP是比TCP更高層次的應用層協議,根據規則,只有低層協議建立之後才能,才能進行更層協議的連接,因此,首先要建立TCP連接,一般TCP連接的端口號是80。這裏是8080端口

     4)客戶機發送請求命令

       建立連接後,客戶機發送一個請求給服務器,請求方式的格式爲:統一資源標識符(URL)、協議版本號,後邊是MIME信息包括請求修飾符、客戶機信息和可內容。

     5)服務器響應

     服務器接到請求後,給予相應的響應信息,其格式爲一個狀態行,包括信息的協議版本號、一個成功或錯誤的代碼,後邊是MIME信息包括服務器信息、實體信息和可能的內容。

        實體消息是服務器向瀏覽器發送頭信息後,它會發送一個空白行來表示頭信息的發送到此爲結束,接着,它就以Content-Type應答頭信息所描述的格式發送用戶所請求的實際數據

     6)服務器關閉TCP連接

     一般情況下,一旦Web服務器向瀏覽器發送了請求數據,它就要關閉TCP連接,然後如果瀏覽器或者服務器在其頭信息加入了這行代碼

    Connection:keep-alive

   TCP連接在發送後將仍然保持打開狀態,於是,瀏覽器可以繼續通過相同的連接發送請求。保持連接節省了爲每個請求建立新連接所需的時間,還節約了網絡帶寬。

5、代碼實現二叉樹的高度(自己建樹)

6、長連接,短連接,http1.0 http1.1。
http協議過程:
一次完整的請求過程:

  
(1)域名解析

  
(2)建立TCP連接,三次握手

  
(3)Web瀏覽器向Web服務端發送HTTP請求報文

  
(4)服務器響應HTTP請求

  
(5)瀏覽器解析HTML代碼,並請求HTML代碼中的資源(JS,CSS,圖片)(這是自動向服務器請求下載的)

  
(6)瀏覽器對頁面進行渲染呈現給客戶

  
(7)斷開TCP連接
HTTP 1.1在繼承了HTTP 1.0優點的基礎上,也克服了HTTP 1.0的性能問題

8、描述socket通信過程,每個函數。

9、解釋抓包和構造包的過程。

10、i++和++i哪個效率高,有什麼區別。
i++是先把i的值拿來用,然後在自增1
++i是想把i自增1然後拿來用
內建數據類型的情況,效率沒有區別。
自定義數據類型的情況,++i效率較高。

12、線程間的同步方式。
13、撲克牌洗牌算法(提示用隊列實現)

14、java/C++內存管理方式。

15、列舉STL容器,解釋vector和list.
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章