百度 騰訊 等名企多線程面試題目

第一題:線程的基本概念、線程的基本狀態及狀態之間的關係?

線程,有時稱爲輕量級進程,是CPU使用的基本單元;它由線程ID、程序計數器、寄存器集合和堆棧組成。它與屬於同一進程的其他線程共享其代碼段、數據段和其他操作系統資源(如打開文件和信號)。

線程有四種狀態:新生狀態、可運行狀態、被阻塞狀態、死亡狀態。狀態之間的轉換如下圖所示:

 


第二題:線程與進程的區別?

1、 線程是進程的一部分,所以線程有的時候被稱爲是輕權進程或者輕量級進程。
2、 一個沒有線程的進程是可以被看作單線程的,如果一個進程內擁有多個進程,進程的執行過程不是一條線(線程)的,而是多條線(線程)共同完成的。
3、 系統在運行的時候會爲每個進程分配不同的內存區域,但是不會爲線程分配內存(線程所使用的資源是它所屬的進程的資源),線程組只能共享資源。那就是說,出了CPU之外(線程在運行的時候要佔用CPU資源),計算機內部的軟硬件資源的分配與線程無關,線程只能共享它所屬進程的資源。
4、 與進程的控制表PCB相似,線程也有自己的控制表TCB,但是TCB中所保存的線程狀態比PCB表中少多了。
5、 進程是系統所有資源分配時候的一個基本單位,擁有一個完整的虛擬空間地址,並不依賴線程而獨立存在。

 

第三題:多線程有幾種實現方法,都是什麼?

 1. 繼承 Thread 類
  2. 實現 Runnable 接口再 new Thread(YourRunnableOjbect) 

第四題:多線程同步和互斥有幾種實現方法,都是什麼?



線程間的同步方法大體可分爲兩類:用戶模式和內核模式。顧名思義,內核模式就是指利用系統內核對象的單一性來進行同步,使用時需要切換內核態與用戶態,而用戶模式就是不需要切換到內核態,只在用戶態完成操作。
用戶模式下的方法有:原子操作(例如一個單一的全局變量),臨界區。內核模式下的方法有:事件,信號量,互斥量。

 

第五題:多線程同步和互斥有何異同,在什麼情況下分別使用他們?舉例說明。

線程同步是指線程之間所具有的一種制約關係,一個線程的執行依賴另一個線程的消息,當它沒有得到另一個線程的消息時應等待,直到消息到達時才被喚醒。

線程互斥是指對於共享的進程系統資源,在各單個線程訪問時的排它性。當有若干個線程都要使用某一共享資源時,任何時刻最多隻允許一個線程去使用,其它要使用該資源的線程必須等待,直到佔用資源者釋放該資源。線程互斥可以看成是一種特殊的線程同步(下文統稱爲同步)。

1


 

2、以下多線程對int型變量x的操作,哪幾個不需要進行同步(D)
        A. x=y;      B. x++;    C. ++x;    D. x=1;

        詳見:後面系列解析

3、多線程中棧與堆是公有的還是私有的 (C)

        A:棧公有, 堆私有

        B:棧公有,堆公有

        C:棧私有, 堆公有

        D:棧私有,堆私有

4、臨界區(Critical Section)和互斥量(Mutex)

        兩者都可以用於同一進程中不同子線程對資源的互斥訪問。

        互斥量是內核對象,因此還可以用於不同進程中子線程對資源的互斥訪問。

        互斥量可以很好的解決由於線程意外終止資源無法釋放的問題。

5、一個全局變量tally,兩個線程併發執行(代碼段都是ThreadProc),問兩個線程都結束後,tally取值範圍。

        inttally = 0;//glable

        voidThreadProc()

        {

              for(inti = 1;i <= 50;i++)

                   tally += 1;

        }

        答:[50,100]

6、編寫一個程序,開啓3個線程,這3個線程的ID分別爲ABC,每個線程將自己的ID在屏幕上打印10遍,要求輸出結果必須按ABC的順序顯示;如:ABCABC.依次遞推。

        思路:用信號量進行各個子線程之間的互斥,創建3個信號量A、B、C。初始時A的資源數爲1,B、C的資源數爲0,訪問A之後,將B的資源數加1,訪問B之後將C的資源數加1,訪問C之後將A的資源數加1。創建3個子線程順序訪問資源A、B、C。

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