Linux下C++后台服務器開發


1. 前言

  最近正在准備秋招,目標崗位是C++后端開發工程師,這個崗位對開發者的要求也比較高,需要的基礎知識非常多,我在剛剛開始准備的時候,感覺也是不知從何入手,現在經過了一段時間的學習,感覺比剛開始的時候好了一些,但是在很多方面還有欠缺,所以寫下這篇博客,進行一個總結,也希望能幫助到和我一樣在這條路上不斷前行的人。

2. 服務器開發與后台開發的聯系和區別

  服務器是一種高性能的計算機,相對於普通的個人電腦,它的性能往往更強,但是功能也更加單一。服務器開發,就是在服務器上面開發應用程序。服務器開發包括兩部分,一是服務器上基礎應用的開發,例如搜索引擎等,二是對業務流程在服務器上的相關應用開發。一般來說,企業里招第二類比較多。從業務的角度來看,服務器中的應用程序會接收來自客戶端的業務請求,將其所需的數據處理以后,返回給客戶端。后台開發不像前台開發一樣,有清晰的可視化界面,它在整個業務中往往處於幕后的位置,所以被稱為后台開發。下面這張圖可以大致體現后台開發的流程:

  

 

這張圖是客戶端和服務器一種最簡單的描述,但是這里面有很多問題如果真的研究起來就會很復雜,涉及很多基礎知識。

1. 客戶端的請求如何表示?對它的回答又如何表示?
2. 服務器和客戶端之間的連接該如何建立呢?
3. 服務器和數據庫之間又怎么進行交互?
4. 圖中一台服務器只面向一台客戶端,可是現實當中服務器通常需要接收多個客戶端的請求。那么怎么分配這些請求?如果有非常多的客戶端向服務器發送請求,服務器怎么樣才能保證性能?
以上是服務器開發的一些基本問題,要解決這些問題,就要學習非常多的基礎知識。帶着這些問題,可以讓我們把知識點串起來,對Linux下的服務器開發有一個更好的理解。

3. 涉及知識點

3.1 編程語言

  既然是C++后台開發,那么首先我們要掌握C++語言。C++的知識浩如煙海,而且包含了很多不同的思想,例如,它即繼承了C面向過程的語法,又包含了面向對象的思想,要想精通真的很難。我的想法是將C++分成多個組成部分,然后分別學習。學習C++之后,簡單總結了一些要點:

  • 基礎數據類型和運算符:C++的基礎數據類型,如int,double。要機制它們的分別占用的內存大小,以及它們之間的轉換規則。其中尤其要掌握指針和引用。
  • 基礎語法:基礎的條件語句,順序語句,循環語句,是必須要掌握的。
  • C++關鍵字:C++中包含了很多關鍵字,例如static,const,extern等,學習的時候要注意它們的特點,以及應用場景。
  • C++內存管理:內存管理非常重要,要記住C++程序內存有幾個區,它們之間存放的數據;另一個關鍵點是C++的內存泄露的發生原因和避免方法。
  • C++函數:函數是面向過程的體現,重點包括函數參數,返回值。如果再深入研究,還要知道函數的調用過程等。
  • 面向對象:主要就是面向對象的三大特性,封裝,繼承和多態,以及實現這三大特性的一系列手段,如類,虛函數等。
  • 泛型編程:C++中的泛型編程主要是模板編程,包括函數模板,類模板,模板泛化,模板特化這些知識。
  • STL標准庫:STL主要要掌握各種容器和泛型算法。最好能對它們的底層實現有所了解。
  • C++11新特性:C++11作為C++的經典版本,有一些新特性需要學習者好好掌握,例如智能指針等。

除了C/C++以外,你還需要掌握至少一門腳本語言,例如python/shell。腳本語言可能不會是你開發的主語言,但是它可以作為程序的“粘合劑”,完成一些輕量級的工作。

3.2  Linux基礎

  現在大多數服務器都運行的是Linux系統,作為一個后端開發,少不了要和Linux打交道。對於初學者來說,可以先從下載一個帶圖形界面的發行版本,如Ubuntu,CentOS等,邊玩邊學。我們首先要具備操作Linux的能力,也就是了解Linux的基本結構,掌握基礎的Linux命令,會用一些Linux上的工具。再升入一點,Linux和Windows的開發環境有區別,要熟悉Linux下的開發環境。如果這樣還學有余力,可以研究一下Linux的底層原理,例如Linux的進程通信是如何實現的。Linux甚至允許你修改它的源碼,當然這是很高的要求。

Linux下的常用基礎命令:

  • 文件處理命令
  • 網絡管理命令
  • 用戶管理命令

Linux下的常用工具

  • gdb
  • git
  • vim
  • putty

Linux原理

  • Linux進程
  • Linux文件系統
  • Linux內存系統

 

3.3 計算機網絡

  后台開發少不了要和網絡編程打交道,要想成為一個優秀的后端開發,就要打好計算機網絡的基礎。計算機網絡的知識比較抽象,我在本科期間也沒有學好,后來我聽從網上大佬的建議,從計算機網絡數據傳輸的角度出發,思考數據如何經過計算機網絡的多層服務進行傳送的,感覺對計算機網絡有了更深的了解。傳統的OSI七層模型是在比較復雜。現在我們實際上使用更多的是TCP/IP四層模型(應用層,傳輸層,網絡層和數據鏈路層)。后台開發對傳輸層和應用層的要求非常高,所以對這兩層要好好理解

傳輸層要點:

  • TCP和UDP:TCP和UDP是傳輸層最重要的兩個協議,掌握的越詳細越好,要了解它們的差異,以及差異形成的原因。
  • TCP是如何建立連接的:主要就是三次握手和四次揮手的內容,包括連接過程,各種連接狀態等。除了要成功的情況外,還要考慮失敗的情況。
  • 流量控制和擁塞控制:流量控制是為了防止發送方發送數據過快,接收方來不及接收;擁塞控制是為了防止網絡上數據量太大,造成網絡阻塞。要了解它們的原理和實現方法。

 應用層要點:

  • HTTP:http是應用層最重要的協議,http需要理解的知識很多,如請求報文,請求方法,狀態碼等。向瀏覽器的地址欄中輸入URL得到相應頁面,這里就包含了http請求的過程。
  • HTTPs:https是http和ssl(安全套接字)的組合,可以在http的基礎上實現加密傳輸和用戶認證。重點應該關注https的流程和實現數據安全的方式。
  • DNS協議:DNS是應用層另一個非常重要的協議,用來實現域名和IP地址的轉換,這個協議的要點在於它具體的解析過程(即如何通過域名得到IP)。

3.4 操作系統

  除了計算機網絡以外,另一門Linux下C++開發需要掌握的基礎是操作系統。相比Java等語言,C++本身就是一門更加偏重底層的語言,所以它的效率更高,而且C++不太有Java中SpringBoot這種大而全的框架,這更加要求我們理解操作系統原理,以便於自己實現對應的功能。操作系統的抽象程度比計算機網絡更高,學習起來更有難度,總結下來,操作系統主要在管理計算機的四種資源:

  • 進程管理:即對CPU資源的管理。主要內容包括進程和線程,進線程調度算法,同步與互斥,死鎖等。這部分內容是操作系統的重中之重。
  • 內存管理:內存分為物理內存和虛擬內存。其中對虛擬內存是內存管理的中心,要點包括分頁存儲管理,分段存儲管理,頁面置換算法。
  • 文件管理:文件系統,即文件的屬性和組織方式的相關內容。
  • 設備管理:計算機系統如何和與外設交互,發生中斷和響應

 

3.5 網絡編程和系統編程

這一部分是上兩個部分的具體實現,也就是我們怎么利用學到的原理知識,去解決實際問題。在這方面,我們可能會自己實現一些高效的數據結構,也可能直接調用現成的庫函數。主要內容包括:

 

Socket編程:Socket是對傳輸層的抽象,它提供給我們一些具體的API,而不需要關注其中的具體實現

  • 相關API:connect(),socket(),bind(),listen()等。
  • socket建立連接的過程

I/O多路復用:一個進程復用多路I/O,是實現高並發的利器。三種經典的多路復用方法是select,poll和epoll。對這三種方式的區別和實現方式應該有具體了解。

  • select,poll,epoll的實現方式和區別。
  • reactor和preactor的實現方式和區別。
  • ET和LT觸發模式的區別

多線程/多線程編程:多進程多線程編程是實現高並發服務器的利器,非常重要

  • 相關API:fork(),pthread_create()等函數。
  • 線程池的實現:通過提前創建線程減小切換開銷。
  • 進程線程間通信方法:共享變量,消息隊列,鎖等。

 

3.6 數據庫

數據庫是存儲數據的倉庫,也是后端必備技能之一。在開源的數據庫中,MySQL因為其強大的性能被廣泛引用。除了關系型數據庫之外,因為現在的業務往往涉及到高並發和分布式,所以在傳統的關系型數據庫以外,企業還要求掌握非關系型數據庫,如Redis。

MySQL數據庫要點

  • 基礎語法:基礎的CRUD語法
  • 數據庫引擎:目前MySQL主要的引擎有InnoDB和MyISAM,要知道它們各自特點的區別。
  • 索引:索引的使用方法,還有實現它們的數據結構(hashmap和BTree)。
  • 鎖:數據庫中常見的鎖,如行鎖,表鎖,悲觀鎖,樂觀鎖,以及它們各自的使用場景。
  • 事務:事務的四大特性(ACID),以及四大隔離級別。
  • 數據庫優化方法:常見的優化方法又SQL語句優化,分表,讀寫分離。

Redis數據庫

  • 基礎數據類型:Redis五大基本數據類型包括字符串,鏈表,字典,集合,排序集合。
  • 配置文件:Redis配置文件可以配置內存淘汰策略等一系列設置。
  • 緩存:Redis被廣泛應用於緩存方向,可能會發生緩存相關的問題,如緩存穿透,緩存雪崩等

3.7 數據結構和算法

如果我們不想當一個只會調包,只會簡單增刪改查的碼農,那么我們就需要掌握算法和數據結構,常言道:數據結構+算法=程序,高效的數據結構和精巧的算法能提升程序的效率,對於后台開發來說,效率非常重要。當然我們不需要掌握非常高難度的算法,可是掌握基礎的算法和數據結構是必須的,下面是一些基礎的數據結構和算法

常用數據結構:

  • 數組
  • 棧和隊列
  • 鏈表
    • 單向鏈表
    • 雙向鏈表
    • 循環鏈表
    • 二叉樹
    • 二叉搜索樹
    • 二叉平衡樹
    • 紅黑樹
    • 有向圖
    • 無向圖
    • KMP

常用算法:

  • 分治法
  • 動態規划
  • 遞歸和回溯
  • 排序
    • 快速排序
    • 歸並排序
  • 查找
    • 二分查找
  • 樹算法圖算法
    • 樹的前,中,后序,層次遍歷(遞歸和非遞歸寫法)
    • 圖的遍歷
    • 最小生成樹
    • 迪傑斯特拉

算法和數據結構的就像是武俠小說中的內功,是每一個想成為高手的人必須要修煉的。修煉的過程是數以年記的,這個過程需要我們保持耐心和恆心。

3.8 設計模式

設計模式是軟件工程師們針對軟件設計模式總結出的經驗,如果說前述的內容還處在'術'的階段,設計模式已經有了'道'的感覺,好的設計模式能幫助工程師創造出高質量的軟件。工程師總結了23種常用的設計模式。在23種設計模式中,有幾種設計模式是重中之重,要好好掌握,例如:

  • 單例模式:一個類只能有一個對象。
  • 工廠模式:封裝對象的創建,讓子類決定創建的對象。
  • 觀察者模式:定義對象的一對多關系。

3.9 其他常用技能

除了上面這些基礎內容,還有一些也要掌握,例如

  • Makefile的編寫
  • Linux下常用工具的使用,例如vim,git,gdb等

另外,在社招中,企業可能會提一些更高的要求,例如分布式,容器,中間件什么的,如果學有余力,也可以進一步的去了解。

4. 總結

  總的來說,Linux下C++服務器開發的知識還是很多的,如果想要找到一份好的工作,或者對這個領域有深入理解,還是需要投入很多的時間精力的。對於這上面列出的知識,我也有很多沒掌握的地方,但我相信通過系統的學習,不斷迭代更新自己的知識,一定能取得進步。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM