1. 程式人生 > >後臺開發面試 linux os

後臺開發面試 linux os

參考文章

引文及相關資料

linux和os:

netstat tcpdump ipcs ipcrm (如果這四個命令沒聽說過或者不能熟練使用,基本上可以回家,通過的概率較小 ^_^ ,這四個命令的熟練掌握程度基本上能體現面試者實際開發和除錯程式的經驗)

cpu 記憶體 硬碟 等等與系統性能除錯相關的命令必須熟練掌握,設定修改許可權 tcp網路狀態檢視 各程序狀態 抓包相關等相關命令 必須熟練掌握

awk sed需掌握

共享記憶體的使用實現原理(必考必問,然後共享記憶體段被對映進程序空間之後,存在於程序空間的什麼位置?共享記憶體段最大限制是多少?)

共享記憶體

每個共享記憶體區域對應特殊檔案系統shm中的一個檔案。

注:shmget的內部實現包含了許多重要的系統V共享記憶體機制;shmat在把共享記憶體區域對映到程序空間時,並不真正改變程序的頁表。當程序第一次訪問記憶體對映區域訪問時,會因為沒有物理頁表的分配而導致一個缺頁異常,然後核心再根據相應的儲存管理機制為共享記憶體對映區域分配相應的頁表。

通過shmat將這個記憶體區對映到本程序的虛擬地址空間。

在/proc/sys/kernel/目錄下,記錄著系統V共享記憶體的一下限制,如一個共享記憶體區的最大位元組數shmmax,系統範圍內最大共享記憶體區識別符號數shmmni等,可以手工對其調整,但不推薦這樣做。

c++程序記憶體空間分佈(注意各部分的記憶體地址誰高誰低,注意棧從高道低分配,堆從低到高分配)

ELF是什麼?其大小與程式中全域性變數的是否初始化有什麼關係(注意.bss段)

ELF(Executable Linkable Format)

使用過哪些程序間通訊機制,並詳細說明(重點)

Python中可以使用mutiprocessing ,裡面提供queue和pipe等進行通訊。

makefile編寫,雖然比較基礎,但是會被問到

make命令執行時,需要一個makefile檔案,來告訴make命令怎樣去編譯和連結程式。
比如說如下的規則:

  • 如果這個工程沒有編譯過,那麼就要把所有的c檔案編譯和連結。
  • 如果編譯過了,如果有些c檔案被修改,那就要重新編譯這些c檔案然後連結
  • 如果修改了一些h檔案,那就要重新編譯引用這些h檔案的c檔案並連結。

gdb除錯相關的經驗,會被問到

Python用到了pdb
c是用gdb
用GDB除錯程式(一)

  • 在gcc的時候加上-g,把除錯資訊加到可執行檔案中。
  • l 列出程式碼
  • break 16 在16行設定斷點
  • r run執行
  • n next 執行下一條
  • s step 有函式的話step in
  • c 繼續執行到下一個斷點
  • p 列印變數
  • i local info檢視local變數
  • set var i = 1修改變數
  • q quit 退出
  • display 查看錶達式的值

如何定位記憶體洩露?

說了半天結果說讓看wiki
mtrace

動態連結和靜態連結的區別

靜態連結就是在生成exe的時候已經把程式碼連結進去程式中,因此程式比較大,但是因為不需要動態連結所以效率比較高。

動態連結是在程式執行的時候需要的時候再引入dll,生成的exe比較小,如果缺失dll,程式就無法運行了。

32位系統一個程序最多多少堆記憶體

windows原來規定作業系統佔2GB,剩下2GB可以申請。

但是微軟又允許在boot.init加入/3GB引數,於是可以申請3GB記憶體。

32位作業系統每個程序4G虛擬記憶體,由上圖可知:0x00000000-0xbfffffff,使用者空間3G;0xc0000000-0xffffffff,核心空間1G

多執行緒和多程序的區別(重點 面試官最最關心的一個問題,必須從cpu排程,上下文切換,資料共享,多核cup利用率,資源佔用,等等各方面回答,然後有一個問題必須會被問到:哪些東西是一個執行緒私有的?答案中必須包含暫存器,否則悲催)

寫一個c程式辨別系統是64位 or 32位

判斷一個指標的size,如果是4則是32位,如果是8則是64位。

寫一個c程式辨別系統是大端or小端位元組序

訊號:列出常見的訊號,訊號怎麼處理?

常見訊號:

SIGHUP 終端掛起。使用者推出shell的時候,由該程序啟動的所有程序都會收到這個訊號,預設動作為終止程序。

SIGINT 鍵盤中斷。 CTRL+C。使用者終端向正在執行的程式發出這個訊號,預設動作為終止程序。

SIGQUIT CTRL+D CTRL+\ 退出。 終止程序。

SIGFPE 計算錯誤時終止程序併產生core檔案。

SIGKILL 強制退出。不做清理和暫存。

SIGALRM 定時器超時。

SIGTERM 與SIGKILL的不同是,可以被阻塞。程式在終止前可以儲存檔案和清理臨時檔案。

i++是否原子操作?並解釋為什麼???????

i++在兩個執行緒裡邊分別執行100次,能得到的最大值和最小值分別是多少?

最小值:假設A執行緒的暫存器是ra,B執行緒的暫存器是rb,假設以下步驟:

  1. 執行緒A第一次i++,ra=i=0,ra++, ra=1, 但是還沒寫回去i。
  2. 執行緒B完整執行99次i++,i=99。
  3. 執行緒A將ra的值寫回去i,i=ra=1。
  4. 執行緒B讀i的值,寫進去暫存器,rb=1, 自增,rb++, rb = 2, 但還沒寫回去。
  5. 執行緒A執行完了所有的i++。
  6. 執行緒B把rb的結果寫回去i,i=2。

最大值:

  1. 執行緒A全部執行完了,i=100。
  2. 輪到執行緒B執行100次i++, i=200。

說出你所知道的各類linux系統的各類同步機制(重點),什麼是死鎖?如何避免死鎖(每個技術面試官必問)

  1. 原子操作,不會被任何事務給打斷,通常用於資源計數,引用計數。TCP/IP協議棧的IP碎片計數。
  2. 訊號量。就像一個房間有好幾把鑰匙,拿到鑰匙就能進去訪問。設定為1的時候變為了mutex。絕大部分情況下作為互斥鎖使用。
  3. 讀寫訊號量。可以允許多個讀,一個寫。一旦有人在寫,就大家都不能讀。但是如果沒人在寫,就可以允許很多一起讀。
  4. 自旋鎖。自旋鎖與互斥鎖的區別在於不會導致睡眠,如果自旋鎖被其他執行單元持有了,那麼呼叫者就一直自旋在那迴圈地看持有者是否已經釋放,而不睡眠。在持有時間短的情況下使用會比互斥鎖高效。
  1. 大核心鎖。
  2. 讀寫鎖,一種特殊的自旋鎖。
  3. 大讀者鎖。高效能的讀寫鎖。實現機制:每個CPU都有一個讀者鎖寫者鎖,讀者只需要獲取本地CPU的讀者鎖,寫者鎖要獲取所有CPU的鎖。
  4. RCU(Read-Copy-Update)讀不需要獲取鎖,寫的話是先拷貝當前的檔案,然後對副本修改,最後找時機(沒有其他執行單元在讀)使用回撥函式把修改儲存回去。如果多個寫,需要寫程序之間本身做好同步。
  5. 順序鎖(seqlock)讀者可以在寫的時候讀,寫者也可以在讀的時候寫,但是寫與寫之間還是互斥的。利用了一個序號,寫的時候要對序號加1,這樣讀的人可以知道讀的期間有沒有人寫。

死鎖。就是幾個程序申請資源,出現了無限迴圈等待的現象。

四個必要條件

  1. 資源是互斥的
  2. 不可搶佔
  3. 佔有且申請
  4. 迴圈等待

A、B程序都需要印表機和CDROM。現在A佔有了印表機,B佔有了CDROM。
1. 印表機和CDROM都是互斥的,印表機一個時間只能讓一個程序使用,CDROM也是。
2. A程序不能要求B程序放棄它擁有的CDROM,B程序也不能要求A放棄它所擁有的印表機。
3. A佔有了印表機還去申請CDROM,B佔有了CDROM還去申請印表機。
4. A等待B,B也在等待A。

解決方案也從這四個條件來著手。
1. 資源的互斥是客觀的,要改變的話不現實。
2. 申請資源不可滿足的時候釋放已經申請到的資源。
3. 只有在全部資源都可以得到的情況下才一次性分配。
4. 資源有序分配。給所有資源編號,程序對資源的請求必須是嚴格遞增的序列,只有在佔有了小號資源的情況下才能申請了大號資源。(假設印表機是小號資源,CDROM是大號資源)

列舉說明linux系統的各類非同步機制

在IO方面,有非同步IO。

在程序間通訊方面,有訊號。

exit() _exit()的區別?

exit()要呼叫終止處理程式清除IO快取後再退出

_exit()是“立即”終止程式。

如何實現守護程序?

daemon

daemon的函式原型是

daemon(int nochdir, int noclose)
nochdir = 0,說明要變換目錄到/
noclose = 0,說明要將標準輸入、標準輸出、標準錯誤重定向到/dev/null

因此直接呼叫這個函式就可以實現守護程序了。

如果想自己實現守護程序。要做以下步驟:
1. fork()出子程序,父程序退出
2. 子程序建立新的session,呼叫setsid()
3. 子程序呼叫chdir,變換目錄到/
4. 子程序設定檔案建立掩膜
5. 子程序關閉不需要的檔案描述符

linux的記憶體管理機制是什麼?

首先,nowcoder上的題目指出,實體記憶體小於2G,交換分割槽應該為實體記憶體的2倍。實體記憶體大於2G,交換分割槽應該為實體記憶體+2G。

linux採用分頁管理。每個頁的大小是4KB。

程序執行時,先分配虛擬的頁表,而不把資料和程式碼載入到實體記憶體。如果在訪問時發現數據或者程式碼在虛擬頁表中而不在實體記憶體中,則發生缺頁錯誤,然後把資料和程式碼載入到實體記憶體中。如果實體記憶體滿了,則採用頁面置換演算法置換。

linux的任務排程機制是什麼?

首先,任務排程可以經過兩個過程:選擇演算法(使用goodness函式計算權值,選取優先順序高的)和上下文切換。

另外,任務排程可以分為主動排程(因為要等待輸入而掛起等)和被動排程(被強佔)

標準庫函式和系統呼叫的區別?

很多庫函式是對系統呼叫的簡單封裝。

系統呼叫是跟作業系統相關的,可移植性不好。
標準庫函式與作業系統無關,可移植性好。

系統呼叫是核心空間和核心時間。
標準庫函式是使用者空間和使用者時間。

如果使用者直接使用系統呼叫,需要在使用者空間和核心空間之間切換,開銷比較大。比如說讀寫檔案,如果直接用系統呼叫,會因為反覆的切換而開銷大。使用庫函式,可以利用緩衝區,等往緩衝區寫完了,再系統呼叫一次性把資料寫入到硬體媒介。

補充一個坑爹坑爹坑爹坑爹的問題:系統如何將一個訊號通知到程序?(這一題哥沒有答出來)

核心給程序傳送訊號,是在程序所在的程序表項的訊號域設定對應的訊號的位。

程序檢查訊號的時機是:程序即將從核心態返回使用者態時。如果程序睡眠了,要看睡眠能不能被中斷,如果能被中斷則喚醒。

程序有一個連結串列的資料結果,維護一個未決訊號的連結串列。

訊號在程序中註冊,其實就是把該訊號加入到這個未決訊號連結串列當中。

可靠訊號不管連結串列中是否已經有這個訊號了,還是會加進去。不可靠訊號,如果連結串列中已經有這個訊號了,就會忽略。

程序處理訊號的時機就是從核心態即將返回使用者態度的時候。

執行使用者自定義的訊號處理函式的方法很巧妙。把該函式的地址放在使用者棧棧頂,程序從核心返回到使用者態的時候,先彈出訊號處理函式地址,於是就去執行訊號處理函數了,然後再彈出,才是返回進入核心時的狀態。

被遮蔽的訊號,取消遮蔽後還會被檢查。

相關推薦

後臺開發面試 linux os

參考文章 引文及相關資料 linux和os: netstat tcpdump ipcs ipcrm (如果這四個命令沒聽說過或者不能熟練使用,基本上可以回家,通過的概率較小 ^_^ ,這四個命令的熟練掌握程度基本上能體現面試者實際開

Linux C++後臺開發面試題目彙總

資料庫: 1.資料庫中什麼是事務?事務的隔離級別?事務的四個特性?什麼事髒讀、幻讀、不可重複讀? 事務是一種手段,通過事務,我們可以將一系列的資料庫操作組合在一起作為一個整體進行操作

Linux】C++後臺開發面試

本文將講述(Linux)伺服器後臺開發崗位的要求,包含了大部分會遇到的面試題目。掌握文中提到的技術,也算少許入門水平了,此文既是面經,也是後臺開發的入門手冊。無論社招還是校招,都可作為一個參考。 本文內容收集自知乎和其他部落格,在此整理成章。 校招:以C++基礎為主,資料

面試總結:鵝廠Linux後臺開發面試筆試C++知識點參考筆記

> 文章每週持續更新,各位的「三連」是對我最大的肯定。可以微信搜尋公眾號「 後端技術學堂 」第一時間閱讀(一般比部落格早更新一到兩篇) 文章是由自己筆試面試騰訊的筆記整理而來,整理的時候又回顧了一遍,中間工作忙斷斷續續整理了半個月,才完成現在的樣子。主要是針對面試的C++後臺開發崗位,涵蓋了大部分C++相關

後臺開發面試問題整理

最近實習招聘又開始了,被一些師弟問了面試會問到的問題,於是想把之前實習、校招被問過的問題整理出來,希望對需要的人有幫助。雖然下面很多問題,但面試時可以問的問題是一個無限集,而且因人而異,只能作為一定的參考,如果把所有知識面都掌握得很牢固那問什麼都沒問題 :)這裡的問題也不是說要所有都能答

2019秋招後臺開發面試記錄(阿里巴巴螞蟻金服、百度、360、美團點評)

螞蟻金服二面 1、自我介紹 2、專案 3、10億數字找最大100個數,不考慮記憶體問題,問的很細 4、索引 B+樹和二叉樹 5、騰訊可以留嗎?給你offer了嗎?你是不是要優先選擇騰訊 5、其他的個人問題聊了很多,哎前面都快被懟死了。。建議我考研之類的。。感覺都涼透了。。最後又給我說,面試表現還

C++後臺開發面試常考

一、C/C++方面 1、說說C++中的多型及其實現; 2、volatile關鍵字; volatile提醒編譯器它後面所定義的變數隨時都有可能改變 ,因此編譯後的程式每次需要儲存或讀取這個變數的時候 ,都會直接從變數地址中讀取資料。如果沒有volatile關鍵字,

2018.9.21攜程後臺開發面試記錄

一面感覺挺隨便的,就是一大群人和一大群面試官在一個大房間然後一對一面試,儼然一個菜市場……也不知道有沒有二面,面試官有些問題也沒答上來,作為第一次面試還是好好記錄一下,積累面試的套路經驗 1、上來當然還是自我介紹 2、看簡歷,讓我講一下模仿天貓的專案用了什麼技術

2015年Java後臺開發面試問題分享彙總(主流網際網路公司面試經歷)

不同面試官面試風格一定不同,我這裡就是總結這些天面試Java開發過程中的大多數問題,綜合分類有Java基礎,框架,多執行緒,網路通訊,Linux,資料庫,設計模式,演算法,快取等幾個模組,由於問題太多,下面先列出問題,之後有時間在寫文章解答,或者網上有很多答案,可以自行搜尋。一、Java基礎1.String類

Java後臺開發面試

面試題:Java中for和foreach區別在哪裡?什麼時候用for?什麼時候用foreach? 從Java 5 之後,Java提供另一種更簡單的迴圈:foreach迴圈,這種迴圈遍歷陣列和集合更加簡潔。使用foreach迴圈遍歷陣列和集合元組時,無須獲得陣列

騰訊後臺開發面試記錄

AI崗的競爭實在是太激烈了,想轉開發,中午投了騰訊沒想到這麼快就筆試+面試……自己完全沒有準備好,痛定思痛,就從這次記錄開始。 筆試部分: 1、實現C++中的memcpy函式 2、兩個有序的單鏈表,將它們合併 3、一個雙鏈表,實現刪除功能 4、有編號1

騰訊後臺開發面試總結,原創,吐血推薦!!

前段時間專心面過騰訊,經過了N輪的技術面,結果還是掛了,但沒掛在技術面,比較欣慰,回來之後寫一點總結,以供有夢想進入騰訊做後臺伺服器開發的同學參考,本文章為胡成精心總結,胡成原創,copy和轉載請通知。ps:()之內的文字由作者點評,非面試題文字。 Linux和os:

平安科技Java後臺開發面試

記得是10月10日晚上9點到10點半做的筆試題,做完還覺得挺簡單的,不過因為時間的關係,最後一道程式設計題沒寫...可能是選擇題做得挺好的,11號中午就收到了面試通知。還挺有意思的,面試時間可以自己選擇,然後為了提前好好準備一哈,我就選了12號下午4點半的面試。今天(12號)

網際網路公司Java後臺開發面試經歷

不同面試官面試風格一定不同,我這裡就是總結這些天面試Java開發過程中的大多數問題,綜合分類有Java基礎,框架,多執行緒,網路通訊,Linux,資料庫,設計模式,演算法,快取等幾個模組,由於問題太多,下面先列出問題,之後有時間在寫文章解答,或者網上有很多答案,可以自行搜尋

C++後臺開發面試常見問題彙總

一、extern關鍵字作用1、extern用在變數或者函式的宣告前,用來說明“此變數/函式是在別處定義的,要在此處引用”。extern宣告不是定義,即不分配儲存空間。也就是說,在一個檔案中定義了變數和函式, 在其他檔案中要使用它們, 可以有兩種方式:使用標頭檔案,然後宣告它們

【C++後臺開發面試】STL六大元件(一)

1.六大元件及其關係 Container(容器) 各種基本資料結構 Adapter(介面卡) 可改變containers、Iterators或Function object介面的一種元件 Algorithm(演算法) 各種基本演算法如sort、search…

c++後臺開發面試常見知識點總結(一)c++基礎

指標和引用的區別 extern,const,static,volatile關鍵字 #define 和const的區別 關於typedef和#define; C++程式中記憶體使用情況分析(堆和棧的區別) new 與 malloc的異同處,new和delete是如何實現的。 C和C++的區別 C++中的過載,

後臺開發知識點總結(一、LinuxOS

  偶然在知乎上看到想要從事linux後臺開發需要的能力集錦,總結的挺全面的,鑑於自己貧弱的記憶力,還是在這裡總結一下供以後檢視,順便檢驗一下自己。   1、 命令:netstat tcpdump ipcs ipcrm 這四個命令的熟練掌握程度基本上能體現實際開發和除錯程式的

Linux 後臺開發常用命令

linux exclude onf 安裝包 word count class span logs 1、automake編譯 autoreconf -isv ./configure make 2、遠程獲取代碼 rsync -aPvr --exclude=*/log/

抖音後臺開發社招面試

分段 後臺開發 操作 https 分頁 需要 系統進程 實現 set # 抖音面試 (給大家講個故事當笑話) ## 一面 (一個帥氣的小哥哥) - 你面臨過的最大的問題是什麽 - 100Mbps的帶寬三個人使用,每人50Mbps,tcp怎麽保證速度的 - tcp四次揮手