面試資料(1)

1、進程和線程的區別?
1)、進程是程序的動態運行,是程序執行時的一個實例。是系統進行資源分配和調度的一個最小單位。
2)、線程是進程的一個實體,是CPU調度和分派的基本單位。
一個進程擁有一個或多個線程,至少擁有一個線程。進程擁有獨立的地址空間,一個進程崩潰後,在保護模式下不會對其它進程產生影響。線程依附與進程存在,是一個進程中的不同執行路徑。線程沒有獨立的地址空間(有自己的堆棧和局部變量),同一進程的所有線程共享該進程的所有資源。一個線程死掉就等於整個進程死掉,所以多進程的程序要比多線程的程序更健壯。但是在程序切換是,進程切換耗費資源更大,效率差些。因此對於一些要求高併發的並且要共享某些變量的程序,只能用線程。
爲什麼要使用多線程而不是多進程?
1)、linux系統下,啓動一個新的進程必需分配給它獨立的地址空間,建立衆多的數據表來維護他的代碼段、堆棧段和數據段,地址空間開銷較大。而運行與一個進程中的多線程,他們彼此之間使用相同的地址空間,共享大部分數據,啓動一個線程所花費的空間遠小於啓動一個進程所花費的空間。而且線程間彼此切換所需時間也遠小於進程間切換所需的時間。
2)、線程間方便的通信機制。對於不同進程來說,他們擁有獨立的數據空間,數據傳遞只能通過通信方式進行,費時、不方便。對於線程,由於多個線程共享的是同一進程下的數據空間,所以一個線程的數據可以直接被其他線程所用,快捷方便。
2、TCP窗口值是做什麼用的?
是來做流量控制的。TCP滑動窗口分爲接受窗口,發送窗口。滑動窗口協議是傳輸層進行流控的一種措施,接收方通過通告發送方自己的窗口大小,從而控制發送方的發送速度,從而達到防止發送方發送速度過快而導致自己被淹沒的目的。對於ack報文,是收到數據後的一個確認報文。包含兩個重要信息,一個是期望受到的下一字節的序號n,代表此前已經受到了n-1字節的數據。另一個是當前窗口大小m,發送方可以根據受到的ack報文中的這兩個數據,計算出還可以發送多少字節數據給對方。(流控的原理)

3、netfilter中的4個表5條鏈?
4個表:raw表、nat表、mangle表、filter表。
5條鏈:prerouting、input、forward、output、postrouting。
5個掛載點:NF_INET_PRE_ROUTING:系統收到數據後,且沒有經過路由
NF_INET_LOCAL_IN:系統收到數據,經過路由後,如果數據的目標地址是本機就經過該點
NF_INET_FORWARD:系統收到數據,經過路由後,如果數據的目標地址是其他地方就經過該點
NF_INET_LOCAL_OUT:系統發送數據時,未經過路由
NF_INET_POST_ROUTING:系統發送數據時,經過了路由階段,馬上就發出去了
如圖:

4、用戶態的幾種鎖?(內核態)
一般地開銷、時間短推薦使用自旋鎖,長期枷鎖或者持鎖睡眠推薦用互斥鎖。
1)、自旋鎖
自旋鎖不應該被長時間持有,原因::浪費cpu時間。
作用:保護臨界區資源;
pthread_spin_init(&lock, 0);

pthread_spin_lock(&lock);
/臨界區資源…/
pthread_spin_unlock(&lock);
pthread_spin_destroy(&lock);
2)、讀-寫自旋鎖
鎖的用途可以明確分爲讀取和寫入兩個場景。對一個鏈表可能既要更新又要檢索。當更新(寫入)連寶石,不能有其他代碼併發地寫或者讀鏈表,寫操作要求完全的護持。另一方面,當對其檢索(讀取)鏈表時,只要求其他程序不對鏈表進行寫操作就行了,可以有多個併發的讀操作。類似於這種情況,就可以通過讀-寫鎖進型保護。
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,
const pthread_rwlockattr_t *restrict attr); //初始化鎖
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock); //加讀鎖
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock); //加寫鎖
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock); //解鎖
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock); //銷燬鎖
3)、互斥鎖
作用:保護臨界資源。
pthread_mutex_init(&mutex);
pthread_mutex_lock(&mutex); //加鎖
/臨界區…/
pthread_mutex_unlock(&mutex); //解鎖

5、爲什麼要內存對齊?
內存對齊的主要作用是:
1、 平臺原因(移植原因):不是所有的硬件平臺都能訪問任意地址上的任意數據的;某些硬件平臺拒絕讀取未對齊數據,否則拋出硬件異常。
2、 性能原因:經過內存對齊後,CPU的內存訪問速度大大提升。

6、Tcp三次握手,四次揮手?
這裏寫圖片描述
TCP三次握手
1)、第一次握手,客戶端發送syn包(syn=j)到服務器,並進入SYN_SENT(表示請求連接狀態),等待服務器端的確認。(SYN:同步序列編號(synchronize sequence number);
2)、第二次握手,服務器收到syn包,必須要確認客戶端的syn(ack=j+1),同時發送自己的syn包(syn=k)即向客戶端發送syn+ack包,進入SYN_RECV狀態;
3)、第三次握手,客戶端收到服務器端的SYN+ACK包,向服務器發送ACK(ACK=K+1),發送完成後,客戶端和服務器端進入連接狀態,完成三次握手。
TCP四次揮手
(1)客戶端調用close函數,此時TCP向服務器發送一個FIN包,表明客戶端發送數據結束;
(2)服務器端接收到FIN段後向客戶端發回ack確認報文,告訴客戶端同意關閉請求;
(3)服務器端向客戶端發送FIN報文請求關閉連接,同時進入last_ack狀態;
(4)客戶端在收到服務器端的FIN報文端後,向服務器端發回ack確認報文並進入TIME_WAIT狀態,服務器端在收到ack確認報文後就關閉連接。客戶端在等待2MSL時間後沒有收到回覆則證明服務器端已關閉,客戶端也關閉連接。

7、聲明和引用
聲明就是告訴編譯器,我這個是使用別人的,你別報錯!到時候連接器會幫我找到的。
引用就是某個目標變量的“別名”(alias),對引用的操作與對變量直接操作效果完全相同。

8、C語言32個關鍵字。
5個基本數據類型、4個數據類型修飾符、5個複雜數據類型、6個存儲級別、12個流控關鍵字。
Void、Char、short、Int 、float、double、long、signed、unsigned、struct、union、enum、auto、register、volatile、static、const、extern、default、typedef、return、sizeof、goto、continue、if、else、break、do、while、for、switch、case

9、大小端問題
大端:高位存在低地址,低位存在高地址;
小端:高位存在高地址,低位存在低地址;(intel的x86,ARM普遍都是屬於小端)
如果我們將0x1234abcd寫入到以0x0000開始的內存中,則結果爲:
big-endian little-endian
0x0000 0x12 0xcd
0x0001 0x23 0xab
0x0002 0xab 0x34
0x0003 0xcd 0x12

10、數組指針問題。
行指針取降爲列指針,列指針取變爲元素;
元素取&變爲列指針,列指針取&變爲行指針。

11、優先級問題
括號成員第一,全體單目第二,乘除餘三加減四;移位五關係六,等於不等排第七。位與異或和位或,三分天下八九十。邏輯或跟與,十二和十一。條件高於賦值,逗號優先級最低。

12、MPLS多協議標籤交換技術
MPLS:多協議標籤交換,是介於2層與3層之間的協議。
MPLS報文數據的結構:
這裏寫圖片描述

MPLS報文的標籤結構:
這裏寫圖片描述

MPLS標籤結構總長度爲32Bit,其中分爲以下幾個域段:
Label:一個固定20bit長度的值,用於標識一組報文的轉發行爲。類似於IP
地址,但功能不像IP地址那麼單一,標籤只是局部有效。
Exp:一個3bit長度的值,用於實現MPLS的QoS,這裏可以實現8 種優先級,
支持語音、視頻、數據的不同服務類型,類似於IP的TOS 域段。
S:本域段只有1bit長度,用於表示當前標籤是否屬於標籤棧底。1:表示是,
0:不是。
TTL:Time-To-Live,8 個bit長度的值,用於防止報文傳輸時的環路,和IP
協議中的TTL相同。

13、進程間通信方式
無名管道、有名管道、信號、信號量、消息隊列、共享內存、socket。
參考資料:https://blog.csdn.net/gatieme/article/details/50908749
14、內存5大分區
1)、棧區 (由編譯器自動分配釋放,存儲函數參數、局部變量);
2)、堆區 (程序動態申請釋放的內存,malloc、new等);
3)、全局區(存放全局變量,靜態變量);
4)、常量區 (字符串、數字等);
5)、代碼區 (存放函數體的二進制代碼);
15、簡述linux啓動過程
1)、上電加載BIOS,BIOS自檢;
2)、從BIOS設置第一個啓動設備中讀取MBR;
3)、bootloader或NTLDR引導啓動內核鏡像;
4)、讀取內核鏡像加載啓動內核;
5)、用戶層init進程啓動,執行不同級別的啓動腳本;
6)、執行/bin/login,進入登錄狀態;
16、原碼、反碼、補碼
原碼:第一位表示符號,其餘位表示值;
反碼:正數的反碼是其自身;負數的反碼是在原碼的基礎上其符號位不變,其餘各位取反;
補碼:正數的補碼就是其本身;負數的補碼是在其原碼的基礎上, 符號位不變, 其餘各位取反, 最後+1。 (即在反碼的基礎上+1)
17、避免頭文件重複包含的方法
方法1:

#ifdef  ARP_H
#define ARP_H
.....
#endif

方法2:

#pragma once 只要在頭文件的最開始加入這條指令就能夠保證頭文件被編譯一次

18、ipv4地址分類
A類ip地址:第一個字節爲網絡地址(最高位固定爲0),剩下三個字節爲主機地址;
範圍:1.0.0.0—126.255.255.255,0和127作爲特殊ip地址;
掩碼:255.0.0.0
B類ip地址:第一字節和第二字節爲網絡地址(最高位固定爲10),剩下兩個字節爲主機地址;
範圍:128.0.0.0—-191.255.255.255
掩碼:255.255.0.0
C類ip地址:第一字節、第二字節和第三字節爲網絡地址(最高位固定爲110),剩下兩個字節爲主機地址;
範圍:192.0.0.0—-223.255.255.255
掩碼:255.255.255.0
D類ip地址:D類地址不分網絡地址和主機地址,它的第1個字節的最高位固定是1110;
範圍:224.0.0.0—-239.255.255.255
用於組播的ip地址,無子網掩碼;
E類ip地址:E類地址也不分網絡地址和主機地址,它的第1個字節的最高位固定是11110;
範圍:240.0.0.0-255.255.255.254

發佈了48 篇原創文章 · 獲贊 34 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章