linux和os:
netstat :顯示網絡狀态
tcpdump:主要是截獲通過本機網絡接口的資料,用以分析。能夠截獲目前所有通過本機網卡的資料包。它擁有靈活的過濾機制,可以確定得到想要的資料。
ipcs:檢查系統上共享記憶體的配置設定
ipcrm:手動解除系統上共享記憶體的配置設定
awk sed
共享記憶體的使用實作原理
(必考必問,然後共享記憶體段被映射進程序空間之後,存在于程序空間的什麼位置?共享記憶體段最大限制是多少?)
預設32M
kern.ipc.shmmax
cd /proc/sys/kernel
vi shmmax
共享記憶體的原理:同一塊實體記憶體被映射到程序A、B各自的程序位址空間。程序A可以即時看到程序B對共享記憶體中資料的更新,反之亦然。
c++程序記憶體空間分布
(注意各部分的記憶體位址誰高誰低,注意棧從高到低配置設定,堆從低到高配置設定)
1棧,局部變量、函數參數等。
2. 堆,new配置設定的記憶體塊,delete。如果程式員沒有釋放掉,程式結束後,作業系統會自動回收。
3.自由存儲區,malloc等配置設定的記憶體塊,和堆是十分相似的,用free來結束自己的生命的。
4.全局/靜态存儲區,全局變量和靜态變量被配置設定到同一塊記憶體中,在以前的C語言中,全局變量又分為初始化的和未初始化的,在C++裡面沒有這個區分了,他們共同占用同一塊記憶體區。
5.常量存儲區,這是一塊比較特殊的存儲區,他們裡面存放的是常量,不允許修改(當然,你要通過非正當手段也可以修改,而且方法很多)
ELF是什麼?其大小與程式中全局變量的是否初始化有什麼關系(注意未初始化的資料放在bss段)
二進制、可執行、目标代碼、共享庫和核心轉儲的标準檔案格式
可執行檔案:包含了代碼和資料。具有可執行的程式。
可重定位檔案:包含了代碼和資料(這些資料是和其他重定位檔案和共享的
object檔案一起連接配接時使用的)
共享object檔案(又可叫做共享庫):包含了代碼和資料(這些資料是在連接配接
時候被連接配接器ld和運作時動态連接配接器使用的)。
使建立共享庫容易,使動态裝載和共享庫的結合更加容易。在ELF下,在C++
中,全局的構造函數和析構函數在共享庫和靜态庫中用同樣方法處理。
程序間通訊同步機制,并詳細說明
信号,信号量、管道,匿名管道,共享記憶體,套接字
linux命名管道的原理
由于基于fork機制,是以管道隻能用于父程序和子程序之間,或者擁有相同祖先的兩個子程序之間 (有親緣關系的程序之間)。為了解決這一問題,Linux提供了FIFO方式連接配接程序。FIFO又叫做命名管道(named PIPE)。
FIFO (First in, First out)為一種特殊的檔案類型,它在檔案系統中有對應的路徑。當一個程序以讀(r)的方式打開該檔案,而另一個程序以寫(w)的方式打開該檔案,那麼核心就會在這兩個程序之間建立管道,是以FIFO實際上也由核心管理,不與硬碟打交道。之是以叫FIFO,是因為管道本質上是一個先進先出的隊列資料結構,最早放入的資料被最先讀出來,進而保證資訊交流的順序。
線程同步
條件變量 互斥鎖 信号量機制
linux的如何實作1G映射到4G
虛拟存儲技術,局部性原理
makefile編寫,雖然比較基礎,但是會被問到
mkdir mf
cd mf
vim makefile
hello.o:hello.c hello.h
gcc –c hello.o -Lm
make
./hello
1 目标可以是一個或多個,可以是Object File,也可以是執行檔案
2 需要的條件就是生成目标所需要的檔案或目标
3 指令就是生成目标所需要執行的腳本
gdb調試相關的經驗,會被問到
如何定位記憶體洩露?
New完沒有delete, malloc沒有free
動态連結和靜态連結的差別
動态連結指生成可執行檔案不将所有程式用的函數連結到一個檔案,程式運作時作業系統的動态連結庫找
靜态連結就是把所有用到的函數全部連結到可執行檔案中。
32位系統一個程序最多有多少堆記憶體
多線程和多程序的差別
對比次元 | 多程序 | 多線程 | 總結 |
資料共享、同步 | 資料共享複雜,需要用IPC;資料是分開的,同步簡單 | 因為共享程序資料,資料共享簡單,同步複雜 | 各有優勢 |
記憶體、CPU | 占記憶體多,切換複雜,CPU使用率低 | 占記憶體少,切換簡單,CPU利率高 | 線程優 |
建銷毀、切換 | 建立銷毀、切換複雜,速度慢 | 建立銷毀、切換簡單,速度很快 | 線程優 |
程式設計調試 | 程式設計簡單,調試簡單 | 程式設計複雜,調試複雜 | 程序優 |
可靠性 | 程序間不會互相影響 | 一個線程挂掉将緻整個程序挂掉 | 程序優 |
分布式 | 适應于多核、多機分布式;如果一台機器不夠,擴充到多台機器比較簡單 | 适應于多核分布式 | 程序優 |
線程私有的 棧 程式計數器 寄存器
寫一個c程式辨識系統是16位or32位
int k=~0;
if((unsigned int)k >63356) cout<<"at least 32 bits"<
else cout<<"16 bits"<
寫一個c程式辨識系統是大端or小端位元組序
用聯合體:如char類型的,可以看他輸出的是int的高位元組還是低位元組
信号:列出常見的信号,信号怎麼處理?
kill -l
信号集及信号集操作
sigfillset(sigset_t *set); 設定所有的信号到set信号集中;
sigemptyset(sigset_t *set); 從set信号集中清空所有信号;
sigaddset(sigset_t *set,int sig);在set信号集中加入sig信号;
sigdelset(sigset_t *set,int sig);在set信号集中删除sig信号;
阻塞信号相關函數
int sigprocmask(int how,const sigset_t *set,sigset_t *set); 根據how值,設定阻塞信号集,或釋放阻塞的信号集
int sigpending(sigset_t *set); 擷取在阻塞中的所有信号;
int sigsuspend(const sigset_t *set); 類似于 pause()函數!
i++是否原子操作?并解釋為什麼?
不是 記憶體到寄存器、寄存器自增、寫回記憶體;三個階段中間都可以被中斷分離開.
什麼是死鎖?如何避免死鎖(每個技術面試官必問)
死鎖的條件。
(互斥條件(Mutual exclusion):
1、資源不能被共享,隻能由一個程序使用。
2、請求與保持條件(Hold and wait):已經得到資源的程序可以再次申請新的資源。
3、非剝奪條件(No pre-emption):已經配置設定的資源不能從相應的程序中被強制地剝奪。
4、循環等待條件(Circular wait):系統中若幹程序組成環路,該環路中每個程序都在等待相鄰程序正占用的資源。
處理死鎖的政策:
1.忽略該問題。
2.檢測死鎖并且恢複。
3.仔細地對資源進行動态配置設定,以避免死鎖。
4.通過破除死鎖四個必要條件之一,來防止死鎖産生。)
列舉說明linux系統的各類異步機制
磁盤IO
同步就是你叫我去吃飯,我聽到了就和你去吃飯;如果沒有聽到,你就不停的叫,直到我告訴你聽到了,才一起去吃飯。
異步就是你叫我,然後自己去吃飯,我得到消息後可能立即走,也可能等到下班才去吃飯。
1、tcp和udp差別
Tcp提供可靠資料傳輸,UDP不
TCP 有确認、序列号、逾時重傳
2、tcp如何實作流量控制
利用滑動視窗機制,
設A向B發送資料。在連接配接建立時,B告訴了A:“我的接收視窗是 rwnd = 400 ”
5、c++多态、多态的實作原理(虛函數)
C++的多态性用一句話概括就是:在基類的函數前加上virtual關鍵字,在派生類中重寫該函數,運作時将會根據對象的實際類型來調用相應的函數。如果對象類型是派生類,就調用派生類的函數;如果對象類型是基類,就調用基類的函數。
6、如何實作手機通訊錄的查找時候的提示功能
TextWatcher 監聽字母變化後 動态改變 listview
B-樹
是一種多路搜尋樹(并不是二叉的):
1.定義任意非葉子結點最多隻有M個兒子;且M>2;
2.根結點的兒子數為[2, M];
3.除根結點以外的非葉子結點的兒子數為[M/2, M];
4.每個結點存放至少M/2-1(取上整)和至多M-1個關鍵字;(至少2個關鍵字)
5.非葉子結點的關鍵字個數=指向兒子的指針個數-1;
6.非葉子結點的關鍵字:K[1], K[2], …, K[M-1];且K[i] < K[i+1];
7.非葉子結點的指針:P[1], P[2], …, P[M];其中P[1]指向關鍵字小于K[1]的子樹,P[M]指向關鍵字大于K[M-1]的子樹,其它P[i]指向關鍵字屬于(K[i-1], K[i])的子樹;
8.所有葉子結點位于同一層;
7、B+樹
B+樹是B-樹的變體,也是一種多路搜尋樹:
1.其定義基本與B-樹同,除了:
2.非葉子結點的子樹指針與關鍵字個數相同;
3.非葉子結點的子樹指針P[i],指向關鍵字值屬于[K[i], K[i+1])的子樹(B-樹是開區間);
5.為所有葉子結點增加一個鍊指針;
6.所有關鍵字都在葉子結點出現;
8、hash表
a、如果讓我實作hashtable,需要考慮什麼
如何解決沖突
b、解決沖突的方法,原理,應用場景
10、mysql的引擎
mysql> show engines
11、如果從查詢等層面,MyIsam和InnoDB的差別
ISAM和MyISAM引擎不支援事務處理(transaction process)也不支援外來鍵。
盡管要比ISAM和 MyISAM引擎慢很多,但是InnoDB對事務處理和外來鍵支援
MyISAM适合:(1)做很多count 的計算;(2)插入不頻繁,查詢非常頻繁;(3)沒有事務。
InnoDB适合:(1)可靠性要求比較高,或者要求事務;(2)表更新和查詢都相當的頻繁,并且表鎖定的機會比較大的情況
linux分析apache日志擷取最多通路的前10個IP
awk '{a[$1] += 1;} END {for (i in a) printf("%d %s\n", a[i], i);}' 日志檔案 | sort -n | tail
const的含義及實作機制,比如:const int i,是怎麼做到i隻可讀的?
編譯器相關,優化時直接代替為常量
valitale的含義
告訴編譯器此處必須得從位址去取,不得作相關優化
OFFSETOF(s, m)的宏定義,s是結構類型,m是s的成員,求m在s中的偏移量
#define OFFSETOF(s, m) ({s s1;(void*)(&s1)-(void*)(&s1->m);})
設計一個洗牌的算法,并說出算法的時間複雜度
日志裡面有ip,如何統計出日志中出現最多的10個ip···top k問題
一定要對自己的項目非常熟悉:比如遇到的問題、解決的思路、瓶頸、架構的優化、細節的優化等等
最後:補充一個最最重要,最最坑爹,最最有難度的一個題目:一個每秒百萬級通路量的網際網路伺服器,每個通路都有資料計算和I/O操作,如果讓你設計,你怎麼設計?