阿里騰訊實習生題目


騰訊筆試

2.   假設函數f1的時間複雜度O(n),那麼f1*f1的時間複雜度爲()

A.  O(n)B.   O(n*n)C.  O(n*log(n))D.  以上都不對

 這個題目我的思路是A,討論後答案應該是D,因爲f1的返回值不確定,如果是個數組當然複雜度就不同了。


3.   對下列四種排序方法,在排序中關鍵字比較次數與記錄初始化順序無關的是()

A.  直接排序B.   二分法插入C.  快速排序D.  歸併排序

B
1)冒泡:無關;如果加上特殊標誌,沒有交換就提前退出,就有關;(大的沉底)
2)選擇:無關;(未排序部分選擇最小值)
3)插入:有關,排序程度越大,比較越少;
4)shell:有關,它的基本思想基於插入排序;
5)歸併:有關,排序程度愈大,融合過程的比較次數越少;
6)堆排序:有關,排序程度越大,建立堆下沉操作越少;
7)快排序:有關,如果選擇最後值作爲閥值,那麼排序程度越好,就越可能退化成O(n^2);
           無關,隨機選擇閥值,那麼與排序程度無關。

4.   已知一段文本有1382個字符,使用了1382個字節存儲,這段文本全部是由a、b、c、d、e字符組成,a 354次,b 483次,c 227次,d 96次,e 222次,對這5個字符使用哈夫曼編碼。則以下說法正確的是?()

A.  使用哈夫曼編碼後,使用編碼值來存儲這段文本將花費最少的存儲空間、

B.   使用哈夫曼編碼後,a b c d e 這5個字符對應的編碼值是唯一確定的

C.  使用哈夫曼編碼後,a b c d e 這5個字符對應的編碼值可以有多套,但每個字符的編碼位數是確定的

D.  b這個字符的編碼位數最短,d這個字符的哈夫曼編碼位數應該最長

有人選D

6.   在編譯過程中,產生Parse  tree的過程是(A)  
A.  語法分析 B.   語義分析階段C.  詞法分析D.  目標代碼生成階段


7.   閱讀下面代碼,程序會打印出來的值是()

 

1
2
3
4
5
6
7
8
9
10
#include
Void
f(
char **p){
                *p
+= 2;
}
Void
main() {
                Char
*a[] = { “123”,”abc”,”456”},**p;
                p
= a;
                f(p);
                printf(“%s\r\n”,**p);
}

 

  A.  123  B.   abc  C.  456  D.  3 

 char *a[] , 多維數組,數組中每個元素是含有3個char類型對象的數組,指針的應用,a是二維數組的首位指針,首先取值之後變成第一行的首指針,+2移動至3的位置,輸出爲3。

8.   Char p1[] = “Tencent”, void* p2 = malloc((10)在32位機器上sizeof(p1)和sizeof(p2)對應的值是()

A.  8:0 B.   4:10 C.  8:4 D.  4:4

數組的長度和指針的長度,數組只有在傳參的時候纔會退化爲指針。sizeof的時候針對指針進行計算。字符串字面值""後面自動添加null‘\0’ 在申請空間時記得多個結束


9.   現在有以下兩個函數,調用test的結果是()

 

複製代碼
Char* getMem(void) {      Char * p = “hello world ”;
      P[5] = 0x0;
      Return p;
}
Voidtest(void) {      Char *s = 0x0;
      s = getMem();
      Printf(s);
}
複製代碼

 

A.  hello B.   無輸出 C.  Hello0world D.  不確定

 局部變量在函數返回的時候會刪除掉,指向內容就不確定了。答案應該是D。


10.  馮諾依曼體系結構計算機的基本原理是()
A信息存儲  B 存儲智能 C 數字控制 D 存儲程序和程序控制 

 應該是D。

12.下面哪種設計模式的定義爲:定義對象間的一種一對多的關係,當一個對象改變時,其他依賴於他的對象都能夠得到通知並自動更新。()

A.  Visitor B.   Adapter C.  Observer D.  Interpreter

 觀察者模式也就是C符合描述。

13.請看一下這一段C++代碼,如果編譯後程序在windows下運行,則一下說話正確的是()

Char*p1 = “123456”;  //123456\0,在常量區;p1在棧中或者在全局區  

Char*p2 = (char*)malloc(10); //p2在棧中或者全局區,分配來的是個字節在堆中  看他們出現在main()函數的裏面還是外面

A.  P1 he p2都存在棧中

B.   P2指向的10個字節內存在棧中

C.  堆和棧在內存中的生長方向是相反的

D.  “123456”這6個字符存儲在棧中

在C++中,內存分成5個區,他們分別是堆、棧、自由存儲區、全局/靜態存儲區和常量存儲區。

  棧,在執行函數時,函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動被釋放。棧內存分配運算內置於處理器的指令集中,效率很高,但是分配的內存容量有限。

  堆,就是那些由new分配的內存塊,他們的釋放編譯器不去管,由我們的應用程序去控制,一般一個new就要對應一個delete。如果程序員沒有釋放掉,那麼在程序結束後,操作系統會自動回收。

  自由存儲區,就是那些由malloc等分配的內存塊,他和堆是十分相似的,不過它是用free來結束自己的生命的。

  全局/靜態存儲區,全局變量和靜態變量被分配到同一塊內存中,在以前的C語言中,全局變量又分爲初始化的和未初始化的,在C++裏面沒有這個區分了,他們共同佔用同一塊內存區。

  常量存儲區,這是一塊比較特殊的存儲區,他們裏面存放的是常量,不允許修改。

15.對n個元素的數組進行快速排序,所需要的二外空間爲()

A.  O(1)B.   O(n)C.  O(log(2n)D.  O(n^2))

說明:最好O(log(n)),最差O(n)

16.下面關於編譯器與解釋器的觀點,錯誤的是()

A.  解釋器不產生目標程序,它直接執行源程序或者源程序的內部形式

B.   解釋程序和編譯程序的主要區別在於是否產生目標程序

C.  編譯器對高級語言程序的處理過程劃分成詞法分析、語法分析、語義分析,中間代碼生成、代碼優化、目標代碼生成幾個階段

D.  解釋器參與運行控制、程序執行的速度快

 這個我選擇的是D。

18.下面哪些協議,存在源端口和目的端口是()

A.  IP B.   TCP C.  UDP D.  ICMP協議

AB

19.下列哪些sql是等價的()

A.  Select A.tname ,A.depart from teacher A joincourse B on B.tno = .A.tno

B.   Select A.tname ,A.depart from teacher A whereA.tno = course.tno

C.  Select A.tname ,A.depart from teacher wheretno in (select tno from course)

D.  Select A.tname ,A.depart from teacher where exsist (select * from course B where B.tno = A.tno);

BC

21.將一個C類網絡劃分爲3個子網,每個子網最少要容納55臺主機,使用的子網掩碼是:()
  A、255.255.255.248   B、255.255.255.224  C、255.255.255.224  D、255.255.255. 192

 192,保留6位計算得到的。3個子網不確定是怎麼得到。

22下列關於計算機硬件的描述,正確的是:()
A、磁盤的平均存取時間指的是磁盤的尋道時間加上磁頭在某一磁道等待記錄扇區的時間
B、計算機的控制器是由多種部件組成,其中包括,指令寄存器、程序計數器和算數邏輯單元
C、一臺計算機的字長是32位,表明該機器能處理的數值最多爲4個字節//32位CPU就是在同一時間內處理字長爲32位的二進制數據,不是數值。
D、系統總線可以分爲數據總線、地址總線和控制總線三類
A:硬盤的平均存取時間由尋道時間和讀寫時間兩部分構成。尋道就是硬盤通過移動磁頭到達信息所在磁道上。讀就是利用電磁感應原理把信息從磁信號轉變爲電信號。寫就是電變磁。
B: 計算機的控制器是由由程序計數器、指令寄存器、指令譯碼器、時序產生器和操作控制器組成,它是發佈命令的“決策機構”,即完成協調和指揮整個計算機系統的操作

23、假設有關係模式R(A,B,C,D),其數據依賴集:F={(A,B)- >C,C->D},則關係模式R的規範化程度最高達到:()
A.1NF
B.2NF
C.3NF
D.BCNF

這個也不太會,同學說選擇應該是B。

24.以下爲一段瀏覽器中可運行的Javascript 代碼,則運行該段Javascript代碼的頁面彈出框中顯示的結果是:()
Var obj = { “key”:”1”,”value”:2};
Var newObj = obj;
newObj.value += obj.key;
alert(obj.value);
A、2           B、12          C、3         D、21

javascript的題目,答案是D...我還以爲是考引用的...???


25.有足夠量的2分、5分、1分硬幣,如果想湊齊一元錢,可以有()種方法
A、541    B、270   C、1024    D、128

說明:看成50個2分和20個5分構成小於一元,不夠的用1分來補。當20個5分,2分0個共1種;當19個5分時,2分可能有:0,1,2共3種;。。。。。。當有2個5分時,2分可能有0,1,2...45共46種;當有一個5分時,2分可能有:0,1,2...47共48種;當有0個5分,2分可能有:0,1,2...50共51種。所以共有1+3+...+48+51=(1+48)+(3+46)+...+(23+26)+51=49*(20/2)+51=541  

28.在一個採用頁式虛擬存儲管理的系統中,有一用戶作業,它依次要訪問的也沒序列是1,2,3,4,1,2,5,1,2,3,4,5.假定分配給該作業的頁數爲3且作業初始時未裝載頁面,那麼採用FIFO調度算法產生的缺頁中斷數爲(),採用LRU調度算法產生的缺頁中斷數爲()
9,10,當時寫了一個6,7,錯在初始未裝載

29.

 

複製代碼
#include <stdio.h>
class Base
{
public:
virtual int foo(int x){return x*10;}
int foo(char x[14]){return sizeof(x)+10;}
};
class Derived:public Base
{
int foo(int x){return x*20;}
virtual int foo(char x[10]){return sizeof (x)+20;}
};
int main(void)
{
Derived  stDerived;
Base * pstBase=& stDerived;
char x[10];
printf(“%d\n”,pstBase->foo(100)+pstBase->foo(x));
return 0;
}
複製代碼

 

在32位環境下,以上程序的輸出結果是()
2014, 蠻經典的考到兩點,1)虛函數,基類指着指向派生類時,如果調用的是基類已經聲明過的虛函數,動態綁定,如果不是虛函數,那麼基類指針將會體現裁割的性質,就是隻能指向派生類對象的基類部分;2)數組在傳遞給函數時退化成了指針,當數組作爲非引用類型的形參時,編譯器不會檢查數組大小,x就是指針,只有當引用傳遞數組纔會檢查傳遞的數組大小,傳遞的不再是數組的指針而是數組的引用本身

A. 珠寶商甲需要去鑑定一批41克以下的寶石(可能是41克以下不包括41克的任意重量),他只能攜帶一個天平和四個砝碼去稱重,請問他會攜帶那些重量的砝碼?  1 3 9 27  

說明:我第一反應有兩種思路。1、由上往下嘗試,假設需要40/2=20,轉化爲有3個發嗎解決1-20的問題,發現走不通;2、然後嘗試由下往上,首先以2倍爲步長,明顯不行,再以3倍爲步長1,3,9,27,短暫嘗試發現確實可以經過加減構造出任意1-40.  

阿里

32位編譯器:

      char :1個字節
      char*(即指針變量): 4個字節(32位的尋址空間是2^32, 即32個bit,也就是4個字節。同理64位編譯器)
      short int : 2個字節
      int:  4個字節
      unsigned int : 4個字節
      float:  4個字節
      double:   8個字節
      long:   4個字節
      long long:  8個字節
      unsigned long:  4個字節

  64位編譯器:

      char :1個字節
      char*(即指針變量): 8個字節
      short int : 2個字節
      int:  4個字節
      unsigned int : 4個字節
      float:  4個字節
      double:   8個字節
      long:   8個字節
      long long:  8個字節
      
unsigned long:  8個字節


2.64位系統上,定義的變量int*a[2][3]佔據的——字節

A、4      B、12      C、24    D、48

參考答案 D。int *a[2][3]表示的是定義一個二維數組指針,指針指向整型數據。數組裏有2*3=6個指針變量。在32位系統中爲指針變量分配4個字節,在64位系統中爲指針變量分配8個字節。指針存的是一個地址,在32位操作系統裏面,最大尋址空間位0~2^32-1,即4個字節(32位)就可以表示,相應的在64位操作系統環境中用8個字節表示指針。指針本身所佔空間大小與所指對象所佔空間大小無關,只與操作系統能夠有關。

3.Linux中使用df-h/homedu-sh/home所查看到的已使用的磁盤容量不同,可能的原因是——

A、命令不同,所以結果肯定不同   B、兩個命令參數有問題

C、運行中的進程打開的文件被刪除導致 DLinux的特性導致的

參考答案 C。df——Disk Free。du——Disk Usage。當一個文件被刪除後,在文件系統目錄中已經不可見了,所以du就不會再統計它了。然而如果此時還有運行的進程持有這個已經被刪除了的文件的句柄,那麼這個文件就不會真正在磁盤中被刪除,分區超級塊中的信息也就不會更改。這樣df仍舊會統計這個被刪除了的文件。


3. linux使用df -h /home和du -sh /home所查看到的已使用的磁盤容量不同的原因

1. 如何記憶這兩個命令

du-Disk Usage

df-Disk Free

2. df 和du 的工作原理

2.1 du的工作原理

du命令會對待統計文件逐個調用fstat這個系統調用,獲取文件大小。它的數據是基於文件獲取的,所以有很大的靈活性,不一定非要針對一個分區,可以跨越多個分區操作。如果針對的目錄中文件很多,du速度就會很慢了。

2.2 df的工作原理

df命令使用的事statfs這個系統調用,直接讀取分區的超級塊信息獲取分區使用情況。它的數據是基於分區元數據的,所以只能針對整個分區。由於df直接讀取超級塊,所以運行速度不受文件多少影響。

3 du和df不一致情況模擬

常見的df和du不一致情況就是文件刪除的問題。當一個文件被刪除後,在文件系統目錄中已經不可見了,所以du就不會再統計它了。然而如果此時還有運行的進程持有這個已經被刪除了的文件的句柄,那麼這個文件就不會真正在磁盤中被刪除,分區超級塊中的信息也就不會更改。這樣df仍舊會統計這個被刪除了的文件。

4 工作中需要注意的地方

(1)當出現du和df差距很大的情況時,考慮是否是有刪除文件未完成造成的,方法是lsof命令,然後停止相關進程即可。
(2)可以使用清空文件的方式來代替刪除文件,方式是:echo > myfile.iso。
(3)對於經常發生刪除問題的日誌文件,以改名、清空、刪除的順序操作。
(4)除了rm外,有些命令會間接的刪除文件,如gzip命令完成後會刪除原來的文件,爲了避免刪除問題,壓縮前先確認沒有進程打開該文件。

8.char str[] = "hello";
sizeof(str)             //6
char *p = str;
sizeof(p)               //4
sizeof(*p)              //1

char str[sizeof("hello")];//6,strlen("hello") = 5
strcpy(str,"hello");//賦值也必須有足夠空間,不然錯誤

11. 度爲4的樹中,有度爲4的節點20個,度爲3的節點10個,度爲2的節點1個,度爲1的節點10個,求有多少個葉子節點
設N爲總的節點數!總的入度=20*4+10*3+1*2+10*1=122=N-1,所以N=123。而N又=20+10+1+10+n(n爲度爲0的點,即葉子)即n=82


最大流算法。解題時,每找出一條路徑算出流量後,該路徑上各段線路上的流量應扣除已經算過的流量,形成剩餘流量。剩餘流量爲0的線段應將其刪除(斷開)。這種做法比較簡單直觀。

17. 2^100 mod 7 = 2
2^100=2^99*2=8^33*2=(7+1)^33*2=(7^33+33*7^32+……+33*7+1)*2=2*7^33+2*33*7^32+……+2*33*7+2
前面的項都是7的倍數
最後是2
所以餘數是2
18. 某公司在華東和華南兩大區域開展業務,年底彙總業績的時候發現,兩大區域的月度客戶轉化率(=成爲會員的客戶數/訪問店鋪的客戶數)分別提高了10%和5%,以下描述中正確的是       。 
A.儘管各自的月度轉化率都有提高,但公司的整體月度轉化率仍有可能降低 B.市場對業務認可度提高,越來越多訪問店鋪的客戶成爲會員 
C.華東區的客戶更容易被轉化,該公司應該把業務重點放在這個區域 D.華南區的客戶更需要提高轉化,該公司應該把業務重點放在這個區域
不會做
參考答案:B。

20. 某國家非常重男輕女,若一戶人家生了一個女孩,便再要一個,直到生下男孩爲止,假設生男生女概率相等,請問平均每戶人家有       個女孩。

A. 0.5    B. 2/3     C. 1      D. 4/3

我用的概率做的  每戶人家有女孩是一個期望值,S = 求和 i(1/2)^i,S -  2S  = (1/2)的等比數列,近似爲1
停時是一個隨機變量。你給定一個條件,讓這個過程在某個時刻停下。這個停下的時間就是停時。
比如我要在時間t=5時停下,那麼這個停時就永遠是5。從概率論的角度來講這個停時就是一個定義在trivial sigma algebra上的隨機變量。
比如我要在這個過程達到10的時候停下,那麼因爲這個過程是隨機的,所以這個停時也是個隨機變量。因爲這個過程在什麼時候達到10是隨機的。
但是要注意一個停時只能定義在在這個停時之前的時間所關聯的sigma域上。比如你可以讓一個過程在它第一次達到10的時候停下,這個時間是一個停時。但是你不能讓一個過程在它最後一次達到10的時候停下。因爲你永遠不知道這一次停下是不是最後一次。因此它就不是一個停時。

停時定理就是說如果一個鞅滿足特定條件(這些條件基本就是要求停時和過程本身almost surely bounded)那麼這個鞅在任何停時的期望值等於它在零時刻的期望值

21. 以下有關C語言的說法中,錯誤的是       

A.內存泄露一般是隻程序申請了一塊內存,使用完後,沒有及時將這塊內存釋放,從而導致程序佔用大量內存。

B.無法通過malloc(size_t)函數調用申請超過該機器物理內存大小的內存塊。

C. 無法通過內存釋放函數free(void *)直接將某塊已經使用完的物理內存直接歸還給操作系統

D. 可以通過內存分配函數malloc(size_t)直接申請物理內存。

A:在計算機科學中,內存泄漏指由於疏忽或錯誤造成程序未能釋放已經不再使用的內存。內存泄漏並非指內存在物理上的消失,而是應用程序分配某段內存後,由於設計錯誤,導致在釋放該段內存之前就失去了對該段內存的控制,從而造成了內存的浪費。

B,C,D 虛擬內存的存在


22.下面關於二叉搜索樹的正確說法包括——

A、待刪除結點有左子樹和右子樹時,只能使用左子樹的最大值結點替換待刪除結點。

B、給定一棵二叉搜索樹的前序和後序結果,無法確定這棵二叉樹

C、給定一棵二叉搜索樹,根據節點值大小排序所需時間複雜度是線性的

D、給定一棵二叉搜索樹,可以在線性時間複雜度內轉化爲平衡二叉搜索樹

A,C

23.被稱爲中國雨人的周瑋,僅僅使用1分鐘的時間就可以對16位數字開14次方。那麼,以下數字鐘,不可能成爲其候選答案的是——

A11.0 B12.0C13.0D14.0E15.0

參考答案ADE。最小數字1000000000000000開14次方,得到11.7,最大數字9999999999999999開14次方,得到13.8。

25.某電子眼睛分辨率640*360;(省略一段廢話)。藍牙4.0最大帶寬24Mbps,請問能否通過該技術將每秒50幀真彩(24bit)畫面傳輸至它的屏幕。如果是,請說明原因,如果否,說明理論上大約多久才能傳送一幀。

參考答案:不能,640*360*24*50=2.76*10^8>24*1024*1024=2.5*10^7

傳輸速率是指集線器的數據交換能力,也叫“帶寬”,單位是Mbps(兆位/秒)


26.N條長度爲M的有序鏈表進行合併,合併以後的鏈表也保持有序,時間複雜度爲——M*logN

26題:不是M*N?26題當然是堆排序啊.

歸併問題?兩兩歸併,先1 2歸併,3 4歸併,在重複就可以了,時間複雜度是NMlog(N)。總共logN次歸併每次NM,爲NMlog(N)。

也可以用堆來做,結果一樣,將N個鏈表頭放入堆中,每次取出頂端節點插入,NM個元素都要進入堆堆排序複雜度是log(n)、而後取出堆中元素。入堆的是鏈表,不是每個元素。我的思路是,一般的堆排序,一般是每個元素是一個數字,這裏是每個元素一個鏈表。當前的值是鏈表頭。每次選出來一個值是log(N),一共N*M個數,故是M*NlogN。只是不同的做法而已...結果一樣很正常啊。

我覺得可以理解成兩兩歸併,兩兩歸併,複雜度容易算。我覺得用堆要好理解些 ,更直接。


29.跳躍鏈表:(MIT麻省理工-算法導論公開課-12講:跳躍表http://v.163.com/movie/2010/12/7/S/M6UTT5U0I_M6V2TTJ7S.html)

設當前在第i層第j列那個節點上。
i)如果第j列恰好只有i層(對應插入這個元素時第i次調用隨機化模塊時所產生的B決策,概率爲1-p),則當前這個位置必然是從左方的某個節點向右跳過來的。
ii)如果第j列的層數大於i(對應插入這個元素時第i次調用隨機化模塊時所產生的A決策,概率爲p),則當前這個位置必然是從上方跳下來的。(不可能從左方來,否則在以前就已經跳到當前節點上方的節點了,不會跳到當前節點左方的節點)
設C(k)爲向上跳k層的期望步數(包括橫向跳躍)
有:
C(0) = 0
C(k) = (1-p)(1+向左跳躍之後的步數)+p(1+向上跳躍之後的步數)
     = (1-p)(1+C(k)) + p(1+C(k-1))
C(k) = 1/p + C(k-1)
C(k) = k/p
    而跳躍表的高度又是logn級別的,故查找的複雜度也爲logn級別




微軟

1.死鎖的條件:

1.互斥資源 2.不可剝奪 3.環路等待 4.請求與保持

1.mutual exclusion, 2.No preemption,4.hold and wait


2.TCP avoid congestion collapse:

A.Slow-start 

B.sliding window

C.fast retransmit

D.fast recovery

慢開始,擁塞窗口,快重傳,快恢復


5. 20^13 mod 7 = 20^12*20 = (21-1)^12*20 , 6


7.28.5625 -》四進制 

每次將小數部分乘以對應的進制,相應的整數部分就是對應的數字
小數部分一直乘以4,直到小數部分爲0結束
比如此例,整數部分就不說了,小數部分是:
0.5625 * 4 = 2.25                // (0.2)4            // 整數部分爲2,第一位小數就是2
0.25 * 4 = 1                         // (0.21)4          // 整數部分爲1,第二位小數就是1

(0.5625)10 = (0.21)4

測試名稱

測試內容

Black box黑盒測試

把軟件系統當作一個“黑箱”,無法瞭解或使用系統的內部結構及知識。從軟件的行爲,而不是內部結構出發來設計測試.

White box白盒測試

設計者可以看到軟件系統的內部結構,並且使用軟件的內部知識來指導測試數據及方法的選擇。

Gray box.  灰盒測試

介於黑盒和白盒之間

 

總結:   實際工作中,對系統的瞭解越多越好。目前大多數的測試人員都是做黑盒測試,很少有做白盒測試的。 因爲白盒測試對軟件測試人員的要求非常高,需要有很多編程經驗。做.NET程序的白盒測試你要能看得懂.NET代碼。做JAVA程序的測試,需要你能看懂JAVA的代碼。 如果你都能看懂了,你還會做測試麼


10.同一臺機器上的進程怎樣分享一個數據最高效

A.memory mapped file

B.Socket

C.semaphore

D.file

E.signal

C??

1   文件映射
  文件映射(Memory-Mapped Files)能使進程把文件內容當作進程地址區間一塊內存那樣來對待。因此,進程不必使用文件I/O操作,只需簡單的指針操作就可讀取和修改文件的內容。文件映射是在多個進程間共享數據的非常有效方法,有較好的安全性。但文件映射只能用於本地機器的進程之間,不能用於網絡中,而開發者還必須控制進程間的同步。

2  共享內存
  Win32 API中共享內存(Shared Memory)實際就是文件映射的一種特殊情況。進程在創建文件映射對象時用0xFFFFFFFF來代替文件句柄(HANDLE),就表示了對應的文件映射對象是從操作系統頁面文件訪問內存,其它進程打開該文件映射對象就可以訪問該內存塊。由於共享內存是用文件映射實現的,所以它也有較好的安全性,也只能運行於同一計算機上的進程之間。

3  匿名管道
  管道(Pipe)是一種具有兩個端點的通信通道:有一端句柄的進程可以和有另一端句柄的進程通信。管道可以是單向-一端是隻讀的,另一端點是隻寫的;也可以是雙向的一管道的兩端點既可讀也可寫。
  匿名管道(Anonymous Pipe)是 在父進程和子進程之間,或同一父進程的兩個子進程之間傳輸數據的無名字的單向管道。通常由父進程創建管道,然後由要通信的子進程繼承通道的讀端點句柄或寫 端點句柄,然後實現通信。父進程還可以建立兩個或更多個繼承匿名管道讀和寫句柄的子進程。這些子進程可以使用管道直接通信,不需要通過父進程。
  匿名管道是單機上實現子進程標準I/O重定向的有效方法,它不能在網上使用,也不能用於兩個不相關的進程之間。
4  命名管道
  命名管道(Named Pipe)是服務器進程和一個或多個客戶進程之間通信的單向或雙向管道。不同於匿名管道的是命名管道可以在不相關的進程之間和不同計算機之間使用,服務器建立命名管道時給它指定一個名字,任何進程都可以通過該名字打開管道的另一端,根據給定的權限和服務器進程通信。
  命名管道提供了相對簡單的編程接口,使通過網絡傳輸數據並不比同一計算機上兩進程之間通信更困難,不過如果要同時和多個進程通信它就力不從心了。

9 動態連接庫
  Win32動態連接庫(DLL)中的全局數據可以被調用DLL的所有進程共享,這就又給進程間通信開闢了一條新的途徑,當然訪問時要注意同步問題。
  雖然可以通過DLL進行進程間數據共享,但從數據安全的角度考慮,我們並不提倡這種方法,使用帶有訪問權限控制的共享內存的方法更好一些。

12 Sockets
  Windows Sockets規範是以U.C.Berkeley大學BSD UNIX中流行的Socket接口爲範例定義的一套Windows下的網絡編程接口。除了Berkeley Socket原有的庫函數以外,還擴展了一組針對Windows的函數,使程序員可以充分利用Windows的消息機制進行編程。
  現在通過Sockets實現進程通信的網絡應用越來越多,這主要的原因是Sockets的跨平臺性要比其它IPC機制好得多,另外WinSock 2.0不僅支持TCP/IP協議,而且還支持其它協議(如IPX)。Sockets的唯一缺點是它支持的是底層通信操作,這使得在單機的進程間進行簡單數據傳遞不太方便,這時使用下面將介紹的WM_COPYDATA消息將更合適些。

Linux下的進程間通信機制大致包括:管道、信號(在Windows上成爲消息)、信號隊列(實際是消息鏈表)、共享內存、信號量、套接字。

 

共同點

 由上面的分析可以看出兩個操作系統共有的且用的較多的進程間通信機制有:管道、消息、共享內存和套接字。簡介如下:

  管道(Pipe)及有名管道(named pipe):管道可用於具有親緣關係進程間的通信,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關係進程間的通信。

   信號或者消息(Signal):信號是比較複雜的通信方式,用於通知接受進程有某種事件發生,除了用於進程間通信外,進程還可以發送信號給進程本身。

   共享內存:使得多個進程可以訪問同一塊內存空間,是最快的可用IPC形式。是針對其他通信機制運行效率較低而設計的。往往與其它通信機制,如信號量結合使用,來達到進程間的同步及互斥。

   套接口(Socket):更爲一般的進程間通信機制,可用於不同機器之間的進程間通信。


臨界區,互斥量,信號量,事件的區別
===================================
四種進程或線程同步互斥的控制方法
1、臨界區:通過對多線程的串行化來訪問公共資源或一段代碼,速度快,適合控制數據訪問。
2、互斥量:爲協調共同對一個共享資源的單獨訪問而設計的。
3、信號量:爲控制一個具有有限數量用戶資源而設計。
4、事 件:用來通知線程有一些事件已發生,從而啓動後繼任務的開始。




臨界區(Critical Section)(同一個進程內,實現互斥)
===================================
保證在某一時刻只有一個線程能訪問數據的簡便辦法。在任意時刻只允許一個線程對共享資源進行訪問。如果有多個線程試圖同時訪問臨界區,那麼在有一個線程進入後其他所有試圖訪問此臨界區的線程將被掛起,並一直持續到進入臨界區的線程離開。臨界區在被釋放後,其他線程可以繼續搶佔,並以此達到用原子方式操作共享資源的目的。




互斥量(Mutex)(可以跨進程,實現互斥)
===================================
互斥量跟臨界區很相似,只有擁有互斥對象的線程才具有訪問資源的權限,由於互斥對象只有一個,因此就決定了任何情況下此共享資源都不會同時被多個線程所訪問。當前佔據資源的線程在任務處理完後應將擁有的互斥對象交出,以便其他線程在獲得後得以訪問資源。互斥量比臨界區複雜。因爲使用互斥不僅僅能夠在同一應用程序不同線程中實現資源的安全共享,而且可以在不同應用程序的線程之間實現對資源的安全共享。
互斥量與臨界區的作用非常相似,但互斥量是可以命名的,也就是說它可以跨越進程使用。所以創建互斥量需要的資源更多,所以如果只爲了在進程內部是用的話使用臨界區會帶來速度上的優勢並能夠減少資源佔用量。




信號量(Semaphores)(主要是實現同步,可以跨進程)
===================================
信號量對象對線程的同步方式與前面幾種方法不同,信號允許多個線程同時使用共享資源,這與操作系統中的PV操作相同。它指出了同時訪問共享資源的線程最大數目。它允許多個線程在同一時刻訪問同一資源,但是需要限制在同一時刻訪問此資源的最大線程數目。一般是將當前可用資源計數設置爲最大資源計數,每增加一個線程對共享資源的訪問,當前可用資源計數就會減1,只要當前可用資源計數是大於0的,就可以發出信號量信號。但是當前可用計數減小到0時則說明當前佔用資源的線程數已經達到了所允許的最大數目,不能在允許其他線程的進入,此時的信號量信號將無法發出




事件(Event)(實現同步,可以跨進程)
===================================
事件對象也可以通過通知操作的方式來保持線程的同步。並且可以實現不同進程中的線程同步操作。

11.數據庫外鍵

12.編譯器從源文件產生可執行二進制文件的過程

C語言編譯全過程


    編譯的概念:編譯程序讀取源程序(字符流),對之進行詞法和語法的分析,將高級語言指令轉換爲功能等效的彙編代碼,再由彙編程序轉換爲機器語言,並且按照操作系統對可執行文件格式的要求鏈接生成可執行程序。
    編譯的完整過程:C源程序-->預編譯處理(.c)-->編譯、優化程序(.s、.asm)-->彙編程序(.obj、.o、.a、.ko)-->鏈接程序(.exe、.elf、.axf等)


14.c++的構造函數

注意點:

A.轉換構造函數(conversion constructor)
可用單個實參調用的非explicit構造函數。隱式使用轉換構造函數將實參的類型轉換爲類類型。
B.編譯器生成的默認拷貝構造函數,實現的是淺拷貝
C.只要程序員自定義了一個構造函數,編譯器都不會再生成默認構造函數
D.從一個構造函數去調用另一個構造函數,可以避免代碼重複,是好的(錯誤)
題目如下:問下列代碼的打印結果爲0嗎?

#include <stdlib.h>
#include 
<iostream>
using namespace std;

struct
 CLS
{
    
int
 m_i;
    CLS( 
int
 i ) : m_i(i){}
    CLS()
    {
        CLS(
0
);
    }
};
int
 main()
{
    CLS obj;
    cout 
<< obj.m_i <<
 endl;

    system(
"PAUSE"
);
    
return 0
;
}
打印結果是不定的,不一定爲0

代碼奇怪的地方在於構造函數中調用了自己的另一個構造函數

我們知道,當定義一個對象時,會按順序做2件事情:
1)分配好內存(非靜態數據成員是未初始化的)
2)調用構造函數(構造函數的本意就是初始化非靜態數據成員)

顯然上面代碼中,CLS obj;這裏已經爲obj分配了內存,然後調用默認構造函數,但是默認構造函數還未執行完,卻調用了另一個構造函數,這樣相當於產生了一個匿名的臨時CLS對象,它調用CLS(int)構造函數,將這個匿名臨時對象自己的數據成員m_i初始化爲0;但是obj的數據成員並沒有得到初始化。於是obj的m_i是未初始化的,因此其值也是不確定的

從這裏,我們歸納如下:
1)在c++裏,由於構造函數允許有默認參數,使得這種構造函數調用構造函數來重用代碼的需求大爲減少
2)如果僅僅爲了一個構造函數重用另一個構造函數的代碼,那麼完全可以把構造函數中的公共部分抽取出來定義一個成員函數(推薦爲private),然後在每個需要這個代碼的構造函數中調用該函數即可
3)偶爾我們還是希望在類的構造函數裏調用另一個構造函數,可以按下面方式做:
在構造函數裏調用另一個構造函數的關鍵是讓第二個構造函數在第一次分配好的內存上執行,而不是分配新的內存,這個可以用標準庫的placement new做到:

    先看看標準庫中placement new的定義

inline void *__cdecl operator new(size_t, void *_P)
{
    
return
 (_P); 

可見沒有分配新的內存。

正確的方式:

struct CLS
{
    
int
 m_i;
    CLS( 
int
 i ) : m_i(i){}
    CLS()
    {
        
new (this)CLS(0
);
    }
};

 


另: 若構造函數調用自身,則會出現無限遞歸調用,是不允許的


15. In a multiple-thread process ???
A. When one thread crashes, the other won't be affected
B. One thread can't share memory with other threads
C. Process to process communication is required between different threads
D. All threads share the same address space

趨勢
1.SQL join

首先都是基於cross join(笛卡爾乘積),然後是inner join,在笛卡爾乘積的結果集中去掉不符合連接條件的行。

left outer join 是在inner join的結果集上加上左表中沒被選上的行,行的右表部分每個字段都用NUll填充。

right outer join 是在inner join的結果集上加上右表中沒被選上的行,行的左表部分全用NULL填充。


2.網絡層的協議 RIP BGP都是網關協議
3.子網掩碼,c類分給7個公司。。。。??
4.可以解決IP地址不足的措施???
VLSM, CIDR, NAT, IPV6
5. LRU是Least Recently Used的縮寫,即最近最少使用頁面置換算法
9.具體的黑盒測試用例設計方法包括等價類劃分法、邊界值分析法、錯誤推測法、因果圖法、判定表驅動法、正交試驗設計法、功能圖法、場景法等。
11. web安全中xss的全稱是:XSS 全稱(Cross Site Scripting) 跨站腳本攻擊, 是Web程序中最常見的漏洞。
12.c++中不能被重載的運算符
算術運算符:+,-,*,/,%,++,--;
位操作運算符:&,|,~,^(位異或),<<(左移),>>(右移)
邏輯運算符:!,&&,||;
比較運算符:<,>,>=,<=,==,!=;
賦值運算符:=,+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>=;
其他運算符:[],(),->,,(逗號運算符),new,delete,new[],delete[],->*。 

不能重載的5個運算符
.  
?: 
siezof 
::     
.*     
15. 構造函數 ,是一種特殊的方法 。主要用來在創建對象時初始化對象, 即爲對象成員變量賦初始值,總與new運算符一起使用在創建對象的語句中 
發佈了43 篇原創文章 · 獲贊 6 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章