1. 程式人生 > >騰訊後臺開發面試記錄

騰訊後臺開發面試記錄

AI崗的競爭實在是太激烈了,想轉開發,中午投了騰訊沒想到這麼快就筆試+面試……自己完全沒有準備好,痛定思痛,就從這次記錄開始。

筆試部分:
1、實現C++中的memcpy函式
2、兩個有序的單鏈表,將它們合併
3、一個雙鏈表,實現刪除功能
4、有編號1-300000的員工,現在有rand()函式可以生成[0, 65535]的隨機數,如何在30w人中抽出10w箇中獎使用者

面試部分:
1、TCP三次握手,TCP和UDP的區別
2、講講程序和執行緒
3、程序通訊的方式
4、用過epoll沒有
5、C++中vector和list的區別
6、使用者如何呼叫核心

1、memcpy實現

void
*memcpy(void *dest, const void *src, size_t count) { char *d; const char *s; if (dest > (src+count)) || (dest < src)) { d = dest; s = src; while (count--) *d++ = *s++; } else /* overlap */ { d = (char *)(dest + count - 1); /* offset of pointer is from 0 */
s = (char *)(src + count -1); while (count --) *d-- = *s--; } return dest; }

要注意地址可能有重複的情況,此時從高位往低位拷貝
2、合併連結串列

class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
    {
        if (pHead1 == NULL)
            return pHead2;
        if (pHead2 ==
NULL) return pHead1; if (pHead1 -> val <= pHead2 -> val) { pHead1 -> next = Merge(pHead1 -> next, pHead2); return pHead1; } else { pHead2 -> next = Merge(pHead2 -> next, pHead1); return pHead2; } } };

注意考慮節點為NULL的情況
3、雙鏈表刪除節點

void remove(struct LinkNode *todelete) {
    LinkNode * tmp = head;
    if (tmp == NULL) {
        return;
    }
    if (todelete == head) {
        tmp.next.prev = NULL;
        delete head;
        return;
    }
    while (tmp.next != todelete) {
        tmp = tmp.next;
    }
    tmp.next = todelete.next;
    todelete.next.prev = tmp;
    delete todelete;
    return;
}

這裡也是要注意討論節點為NULL和刪除的節點為頭結點的情況
4、暫時還沒想到特別好的方法,# TODO

1、TCP的三次握手

第一次:客戶端傳送syn包(syn=j)到伺服器端,並進入SYN_SENT狀態,等待伺服器確認。syn:同步序列號
第二次:伺服器端接收到syn包,必須確認客戶的syn(ack=j+1),同時自己也傳送一個syn包(syn=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀態
第三次:客戶端接收到syn+ack包,向伺服器傳送ack包(ack=k+1),此包傳送完畢,客戶端和伺服器進入ESTABLISHED狀態,完成握手
TCP與UDP的區別
1、基於連線與非連線
2、基於流模式和資料報模式
3、TCP要求系統資源較多,UDP要求較少
4、TCP保證資料正確性,UDP不保證
5、TCP保證資料順序,UDP不保證
6、UDP沒有擁塞控制,因此網路出現擁塞不會使源主機發送速率降低
7、TCP首部開銷20位元組,UDP首部開銷8位元組
8、TCP的邏輯通訊通道是全雙工的可靠通道,UDP的是半雙工的不可靠通道
9、TCP只能一對一,UDP可以一對一,一對多,多對一,多對多

具體程式設計時的區別
1、socket()的引數不同
2、UDP server不需要呼叫listen和accept
3、UDP收發用sendto和recvfrom函式
4、TCP地址資訊在connect / accept時確定
5、UDP在sendto和recvfrom函式中每次都需要指定地址資訊
6、UDP:shutdown函式無效

TCP:
TCP程式設計的伺服器端一般步驟是:
  1、建立一個socket,用函式socket();
  2、設定socket屬性,用函式setsockopt(); * 可選
  3、繫結IP地址、埠等資訊到socket上,用函式bind();
  4、開啟監聽,用函式listen();
  5、接收客戶端上來的連線,用函式accept();
  6、收發資料,用函式send()和recv(),或者read()和write();
  7、關閉網路連線;
  8、關閉監聽;

TCP程式設計的客戶端一般步驟是:
  1、建立一個socket,用函式socket();
  2、設定socket屬性,用函式setsockopt();* 可選
  3、繫結IP地址、埠等資訊到socket上,用函式bind();* 可選
  4、設定要連線的對方的IP地址和埠等屬性;
  5、連線伺服器,用函式connect();
  6、收發資料,用函式send()和recv(),或者read()和write();
  7、關閉網路連線;

UDP:
與之對應的UDP程式設計步驟要簡單許多,分別如下:
  UDP程式設計的伺服器端一般步驟是:
  1、建立一個socket,用函式socket();
  2、設定socket屬性,用函式setsockopt();* 可選
  3、繫結IP地址、埠等資訊到socket上,用函式bind();
  4、迴圈接收資料,用函式recvfrom();
  5、關閉網路連線;

UDP程式設計的客戶端一般步驟是:
  1、建立一個socket,用函式socket();
  2、設定socket屬性,用函式setsockopt();* 可選
  3、繫結IP地址、埠等資訊到socket上,用函式bind();* 可選
  4、設定對方的IP地址和埠等屬性;
  5、傳送資料,用函式sendto();
  6、關閉網路連線;

2、程序和執行緒

參考這篇部落格
- 定義
程序:具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程序是系統進行資源分配和排程的一個獨立單位
執行緒:程序的一個實體,是CPU進行資源分配和排程的基本單位,它是比程序更小的能獨立執行的基本單位,執行緒自己基本上不擁有系統資源,只擁有一點在執行中必不可少的資源(如程式計數器,一組暫存器和棧),但是它可與同一程序下的執行緒共享程序的所有資源
- 關係
一個執行緒可以建立和撤銷另一個執行緒,同一個程序的多個執行緒之間可以併發執行
相對程序而言,執行緒是一個更加接近於執行體的概念,它可以與同進程中的其他執行緒共享資料,但擁有自己的棧空間,擁有獨立的執行序列
- 區別
程序和執行緒的主要區別在於它們是不同的作業系統資源管理方式。程序有獨立的地址空間,一個程序崩潰後,在保護模式下不會對其他程序產生影響,而執行緒只是一個程序中的不同執行路徑。執行緒有自己的堆疊和區域性變數,但執行緒之間沒有單獨的地址空間,一個執行緒死掉就等於整個程序死掉,所以多程序的程式要比多執行緒的程式健壯,但在程序切換時,資源消耗大,效率差一些。但對於某些要求同時進行又需要共享變數的併發操作,只能用執行緒,不能用程序
1)簡而言之,一個程式至少有一個程序,一個程序至少有一個執行緒
2)執行緒的劃分尺度小於程序,使得多執行緒程式的併發性高
3)程序在執行過程中擁有獨立的記憶體單元,而多個執行緒共享記憶體,從而極大地提高了程式的執行效率
4)執行緒在執行過程中與程序是有區別的。每個獨立的執行緒有一個程式執行的入口、順序執行序列和程式的出口。但是執行緒不能獨立執行,必須依存於應用程式中,由應用程式提供多個執行緒執行控制
5)從邏輯角度看,多執行緒的意義在於一個應用程式中,有多個執行部分可以同時執行。但作業系統並沒有將多個執行緒看做多個獨立的應用,來實現程序的排程和管理以及資源分配。這就是程序和執行緒的重要區別
- 優缺點
執行緒執行開銷小,但不利於資源的管理和保護,程序正好相反
執行緒適合在SMP機器上執行,而程序則可以跨機器遷移

3、程序間的通訊方式

參考這篇部落格

(1)管道

通常指無名管道,是UNIX系統IPC最古老的形式
特點:
- 它是半雙工的,也就是說資料只能在一個方向上流動,具有固定的讀端和寫端
- 它只能用於具有親緣關係的程序之間通訊,也就是父子程序或兄弟程序
- 它可以看成是一種特殊的檔案,對於它的讀寫也可以使用普通的read、write函式,但它不是普通的檔案,並不屬於任何檔案系統,只存在於記憶體中

(2)FIFO

也稱為命名管道,它是一種檔案型別
特點:
- 它可以在無關的程序間交換資料,與無名管道不同
- 它有路徑名與之關聯,以一種特殊裝置的形式存在於檔案系統中

(3)訊息佇列

是訊息的連結表,存放在核心中。一個訊息佇列由一個識別符號(即佇列ID)來標識。
特點:
- 訊息佇列是面向記錄的,其中的訊息具有特定的格式和特定的優先順序
- 訊息佇列獨立於傳送與接受程序,程序終止時訊息佇列及其內容不會刪除
- 訊息佇列可以實現訊息的隨機查詢,不一定要先進先出,也可以按型別查詢

(4)訊號量

訊號量(semaphore)與已經介紹過的 IPC 結構不同,它是一個計數器。訊號量用於實現程序間的互斥與同步,而不是用於儲存程序間通訊資料
特點:
- 訊號量用於程序間同步,若要在程序間傳遞資料需要結合記憶體共享
- 訊號量基於作業系統的PV操作,程式對訊號量的操作都是原子操作
- 每次對訊號量的操作不限於加一或減一,可以加減任意正數
- 支援訊號量組

(5)共享記憶體

指兩個或多個程序共享一個給定的儲存區
特定:
- 共享記憶體是最快的一種IPC,因為程序是直接對記憶體進行讀取
- 因為多個程序可以同時操作,所以需要同步
- 訊號量+共享記憶體通常結合在一起使用,訊號量用來同步對共享記憶體的訪問

總結

1.管道:速度慢,容量有限,只有父子程序能通訊

2.FIFO:任何程序間都能通訊,但速度慢

3.訊息佇列:容量受到系統限制,且要注意第一次讀的時候,要考慮上一次沒有讀完資料的問題

4.訊號量:不能傳遞複雜訊息,只能用來同步

5.共享記憶體區:能夠很容易控制容量,速度快,但要保持同步,比如一個程序在寫的時候,另一個程序要注意讀寫的問題,相當於執行緒中的執行緒安全,當然,共享記憶體區同樣可以用作執行緒間通訊,不過沒這個必要,執行緒間本來就已經共享了同一程序內的一塊記憶體

4、epoll

等看完再補充 # TODO

5、C++的vector和list的區別

vector和陣列類似,擁有一段連續的儲存空間,並且起始地址不變
因此能高效地進行隨機存取,時間複雜度為O(1)
但因為記憶體是連續的,所以在進行插入和刪除操作時會造成記憶體塊的拷貝,時間複雜度為O(n)
另外,當陣列中記憶體不夠時,會重新申請一塊記憶體空間並進行記憶體拷貝

list是由雙向連結串列實現的,記憶體空間不連續
只能通過指標訪問list的元素,所以list的隨機存取很沒有效率,時間複雜度為O(n)
但由於連結串列的特點,插入刪除非常方便,時間複雜度為O(1)

vector擁有一段連續的記憶體空間,能很好的支援隨機存取,
因此vector<int>::iterator支援“+”,“+=”,“<”等操作符。
list的記憶體空間可以是不連續,它不支援隨機訪問,
因此list<int>::iterator則不支援“+”、“+=”、“<”等
vector<int>::iteratorlist<int>::iterator都過載了“++”運算子。
總之,如果需要高效的隨機存取,而不在乎插入和刪除的效率,使用vector;
如果需要大量的插入和刪除,而不關心隨機存取,則應使用list。

6、使用者態切換到核心態的方法

  • 系統呼叫
    這是使用者態程序主動要求切換到核心態的一種方式,使用者態程序通過系統呼叫申請使用作業系統提供的服務程式完成工作,比如前例中fork()實際上就是執行了一個建立新程序的系統呼叫。而系統呼叫的機制其核心還是使用了作業系統為使用者特別開放的一箇中斷來實現,例如Linux的int 80h中斷
  • 異常
    當CPU在執行執行在使用者態下的程式時,發生了某些事先不可知的異常,這時會觸發由當前執行程序切換到處理此異常的核心相關程式中,也就轉到了核心態,比如缺頁異常
  • 外圍裝置的中斷
    當外圍裝置完成使用者請求的操作後,會向CPU發出相應的中斷訊號,這時CPU會暫停執行下一條即將要執行的指令轉而去執行與中斷訊號對應的處理程式,如果先前執行的指令是使用者態下的程式,那麼這個轉換的過程自然也就發生了由使用者態到核心態的切換。比如硬碟讀寫操作完成,系統會切換到硬碟讀寫的中斷處理程式中執行後續操作等

三種方式中,系統呼叫是主動的,異常和外圍裝置中斷是被動的

相關推薦

後臺開發面試記錄

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

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

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

後臺開發社招記錄(電話面試

天吶,我又進行了騰訊電話面試,真的是一個面試官一個風格呀,和之前的面試官相比,覺得之前面試官太好了,問的問題很簡單,很少,最起碼電面通過還給了我去現場面試的機會,而且是在毫無準備的狀況下的,這次從上週五到週一,又從週一到今天,週末還準備了下,而今天的面試官估計不會再給我機會了,涼涼呀。。。。 上次面試15分

[2017/06/02]後臺開發實習生面試總結

————————–6月2號更—————————– 現在才被面試,都是因為自己zz。。四月份網申的時候寫的遠端面試,忘了改面試地點,於是成功GG錯過面試。誰知五月份的時候超凡學長突然告訴我鵝廠有實習生補招,要了我最新的簡歷。本來覺得沒什麼希望,結果前幾天突然收到

2019年8月面試前端開發實習生記錄

  昨天在BOSS直聘三投了騰訊燈塔專案的前端開發實習生崗位,通過簡歷後第二天就安排電話面試了,起先以為是人事面,沒想到直接是技術面,有點意外,準備的不是很充分,可以說整個過程都有點懵哈哈哈。 然後面試小哥根據那邊的崗位技術需求和我這邊簡歷上寫的技術棧問了一系列問題(努力記起),我做記錄如下。這次面

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

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

2018.9.21攜程後臺開發面試記錄

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

2018年後臺開發技術崗社招面經-順利拿到offer

       公眾號:內推派,歡迎大家一起學習交流。作者從事後臺web伺服器開發,主要在linux上使用C語言程式設計。畢業後在公司負責CDN快取元件開發,2.5年工作經驗。文章介紹了在騰訊面試過程和心得,希望對相關工作的小夥伴有所幫助,大家一起學習進步。本文主要分以下3個部

後臺開發面試題及答案

簡單歸納:fd只是一個整數,在open時產生。起到一個索引的作用,程序通過PCB中的檔案描述符表找到該fd所指向的檔案指標filp。 檔案描述符的操作(如: open)返回的是一個檔案描述符,核心會在每個程序空間中維護一個檔案描述符表, 所有開啟的檔案都將通過此表中的檔案描

測試開發面試總結

昨天接到了秋招以來的第一場面試,面試了騰訊的測試開發崗,自己感覺不是特別好,寫此片部落格只為總結下此次面試。 以前自己總覺得自己還不錯,秋招應該可以找到一份工作,但此次面試對我猶如當頭一棒!人不可驕傲,學習是一件終身去完成的事,不要以為自己學會了,就可以做自己可以做的事。記

後臺開發』實習生技能要求

一、作業系統方面 1. 多執行緒相關與執行緒之間同步技術 熟練使用(但不侷限於)以下linux API linux下的執行緒建立、等待、獲取執行緒id int pthread_create(pthread_t *thread, const pthread_attr_t

後臺開發實習生1面+2面

本來以為一面就掛了,然後懶得寫面經了;後來收到了二面通知,雖然也掛了,但是還是總結一波吧!! #######筆試 筆試的題目由選擇題+2道問答題+2道程式設計題組成; 選擇題主要還是圍繞後臺開發的一些

面經筆記+來自後臺開發內推2019

執行緒裡面有什麼是獨立的? 程序包含程式碼資料檔案,這個是程序內的所有執行緒共享,但是執行緒有自己的執行緒ID、程式計數器、暫存器和棧獨立的資源。 一個程序一定要有一個執行緒嗎?沒有執行緒的程序是什麼? 協程是什麼? 協程是線上程之上由“使用者”

後臺開發面經+答案

C++: 1 :C++多型的實現方式,虛擬函式的底層實現細節。 2:繼承類呼叫建構函式順序和解構函式順序,什麼時候要將 解構函式定義為虛擬函式。 3:引用與指標區別 4:new 與 malloc的異同處。 5:結構體記憶體對齊方式。 演算法與資料結構: 1:給一個正整數n,

18C++後臺實習面試記錄(已拿到offer)

一波三折的提前批騰訊(IEG)(TEG)(MIG)實習面試。最終拿到MIG 後臺開發(c++)實習生offer。 985小碩。水平菜的離譜。 3月18日投遞簡歷。投遞的部門是IEG(互娛)   方向:後臺開發 簡歷完整度百分之85. 簡歷在內推群裡發了ID

後臺面試過程

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

python面試測試開發工程師

今天面試了騰訊的測試開發工程師崗位,總體感覺一般,問的問題都還是比較基礎性的東西,當然也問了很多實習期間做的專案,各佔一半吧。下面基礎部分的東西總結一下: 1、假定我有100M的一個文字資料,但是我的電腦記憶體只有10M,我怎麼在有限的資源條件的情況下,找出這個文字中出現次數最多的那一行字串

有n根長度不同的木棒,隨意選取三根湊一個合法的三角形,求總拼湊方案的數量(2018軟體開發-後臺開發方向秋招補考試題第三題)

題目: 有n根長度不同的木棒,隨意選取三根湊一個合法的三角形,求總拼湊方案的數量。對於兩個方案,只要有一根木棒的長度不同,則視為不同拼湊方案。 輸入描述 第一行為正數t(0 <= t <= 10),表示測試用例數 接下來每兩行一個測試資料,第一行一個整數n

記錄實習生遠端面試

大家好啊!第一次寫部落格,請多關照。先簡單的介紹一下我自己,大三黨一枚,普通一本院校,方向前端。自打3月份開始,網際網路的春招就如火如荼的展開了,本人也是投了很多簡歷,各種網申。但是一直沒有得到訊息,就在昨天,也就是20

2016年android開發工程師面試題目

1、 Android dvm的程序和Linux的程序, 應用程式的程序是否為同一個概念   DVM指dalivk的虛擬機器。每一個Android應用程式都在它自己的程序中執行,都擁有一個獨立的Dalvik虛擬機器例項。而每一個DVM都是在Linux 中的一個程序,所以說可