1. 程式人生 > >軟體開發筆試題

軟體開發筆試題

4、有兩個執行緒,最初 n=0,一個執行緒執行 n++; n++; 另一個執行 n+=2; 問,最後可能的 n 值?()
A. 1
B. 2
C. 3
D. 4
解析:【BCD】大家要知道 C語言中的 ++ 和 += 並不是原子操作,而是通過多條微程式組成的,因此 ++ 和 += 在執行過程中可能被中斷的
第一種可能情況:現在假設兩個執行緒沒有並行順序執行的那麼結果顯然是 4。
第二種可能情況:再假設現在第一個n++ 已經執行完了 但是結果還沒有寫回記憶體 這個時候 n+=2 已經全部執行完 2 寫進了記憶體 結束 然後回到n++的寫回操作 這個時候記憶體就從2被改回1了,後面再來一次n++ 結果就為2。
第三種可能情況: 第n+=2 先讀取n的值到暫存器 即0入暫存器 這個時候被中斷 第一個n++開始執行 並直到結束 記憶體被改成了1 ,然後 n+=2 繼續執行 結束後記憶體變為2 第二個n++再執行 結果就是3了
我個人看了網上的這個解析後也覺得,肯定不可能為1了。

5、死鎖
產生死鎖的原因主要是:
(1) 因為系統資源不足。
(2) 程序執行推進的順序不合適。
(3) 資源分配不當等。
如果系統資源充足,程序的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則就會因爭奪有限的資源而陷入死鎖。其次,程序執行推進順序與速度不同,也可能產生死鎖。
產生死鎖的四個必要條件:
(1) 互斥條件:一個資源每次只能被一個程序使用。
(2) 請求與保持條件:一個程序因請求資源而阻塞時,對已獲得的資源保持不放。
(3) 不剝奪條件:程序已獲得的資源,在末使用完之前,不能強行剝奪。
(4) 迴圈等待條件:若干程序之間形成一種頭尾相接的迴圈等待資源關係。
這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之

6、在32位little endian機器上執行該程式,得到結果是什麼?

#include <stdio.h>
int main()
{
    long long a = 1, b = 2, c = 3;
    printf("%d %d %d \n", a, b, c);
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

解析:【1 0 2】因為long long 是8個位元組的,%d是4個位元組的,溢位覆蓋了後面,然後又是小端規則的。
【傳入引數,由右往左,棧空間記憶體從高往低,little endian, 棧空間如下:
記憶體高位->
00000000 00000011
00000000

00000010
00000000 00000001
<-記憶體低位

7、高內聚和低耦合,下面哪個耦合度最高?
A. 通過函式引數傳遞…
B. 一個函式修改另外一個函式中的資料;
C. 通過全域性變數…
D. 通過指示器…
解析:【C】
內聚:就是一個模組內各個元素彼此結合的緊密程度,高內聚就是一個模組內各個元素彼此結合的緊密程度高。所謂高內聚是指一個軟體模組是由相關性很強的程式碼組成,只負責一項任務,也就是常說的單一責任原則。
耦合:一個軟體結構內不同模組之間互連程度的度量(耦合性也叫塊間聯絡。指軟體系統結構中各模組間相互聯絡緊密程度的一種度量。模組之間聯絡越緊密,其耦合性就越強,模組的獨立性則越差,模組間耦合的高低取決於模組間介面的複雜性,呼叫的方式以及傳遞的資訊。) 對於低耦合,粗淺的理解是:一個完整的系統,模組與模組之間,儘可能的使其獨立存在。也就是說,讓每個模組,儘可能的獨立完成某個特定的子功能。模組與模組之間的介面,儘量的少而簡單。如果某兩個模組間的關係比較複雜的話,最好首先考慮進一步的模組劃分。這樣有利於修改和組合.

--------------------- 本文來自 tanxuan231 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/tanxuan231/article/details/44407801?utm_source=copy