一
但是在linux中,將狀態細分到了六種。
R運行狀態(running): 並不意味着進程一定在運行中,它表明進程要么是在運行中要么在運行隊列里。
S睡眠狀態(sleeping): 意味着進程在等待事件完成(這里的睡眠有時候也叫做可中斷睡眠(interruptible sleep))。
D磁盤休眠狀態(Disk sleep):有時候也叫不可中斷睡眠狀(uninterruptible sleep),在這個狀態的進程通常會等待IO的結束。
T停止狀態(stopped): 可以通過發送 SIGSTOP 信號給進程來停(T)進程。這個被暫停的進程可以通過發送 SIGCONT 信號讓進程繼續運行。
X死亡狀態(dead):這個狀態只是一個返回狀態,你不會在任務列表里看到這個狀態
Z僵死狀態(Zombies) :進程已經退出了但是資源還沒有完全被釋放的一種狀態。
進程的概念
僵屍進程
這里的有一種特殊的狀態值得一提,就是僵死狀態
當子進程退出的時候,如果父進程沒有讀取到子進程的返回值,這時就進入了僵死狀態。
這時就處於一個很尷尬的局面,子進程實際上已經退出了,但是父進程認為它還在執行,所以並沒有釋放它的資源,所以子進程會一直卡在進程表中,等待父進程讀取退出狀態代碼。
TCP擁塞控制
提高網絡利用率,降低丟包率,並保證網絡資源對每條數據流的公平性,這就是擁塞控制。
擁塞控制包括四部分:慢啟動、擁塞避免、快速重傳、快速恢復

TCP流量控制
如果發送端發送數據太快,接收端來不及接收,可能會丟失數據。所以流量控制是讓發送端不要發送太快,要讓接收端來得及接收
流量控制是通過大小可變的滑動窗口實現的。

二
linux啟動時我們會看到許多啟動信息。
Linux系統的啟動過程並不是大家想象中的那么復雜,其過程可以分為5個階段:
- 內核的引導。【首先是BIOS開機自檢,按照BIOS中設置的啟動設備(通常是硬盤)來啟動。讀取/boot】
- 運行 init。【init 程序首先是需要讀取配置文件 /etc/inittab。】
- 系統初始化。【調用執行了/etc/rc.d/rc.sysinit】
- 建立終端 。
- 用戶登錄系統。
我們用crontab -e進入當前用戶的工作表編輯,是常見的vim界面。每行是一條命令。
crontab的命令構成為 時間+動作,其時間有分、時、日、月、周五種,操作符有
- * 取值范圍內的所有數字
- / 每過多少個數字
- - 從X到Z
- ,散列數字
實例1:每1分鍾執行一次myCommand
* * * * * myCommand
實例2:每小時的第3和第15分鍾執行
3,15 * * * * myCommand
這個方法的原理就是再執行一次/etc/profile shell腳本
深拷貝,包含對象里面的自對象的拷貝,所以原始對象的改變不會造成深拷貝里任何子元素的改變
copy淺拷貝,沒有拷貝子對象,所以原始數據改變,子對象會改變
常用引擎:
InnoDB(重點)
MyISAM
BLACKHOLE(黑洞引擎)
CSV(數據文件可以使用excel打開)
MySQL 整個查詢執行過程,總的來說分為 5 個步驟 :
- 客戶端向 MySQL 服務器發送一條查詢請求
- 服務器首先檢查查詢緩存,如果命中緩存,則立刻返回存儲在緩存中的結果,否則進入下一階段
- 服務器進行 SQL解析、預處理、再由優化器生成對應的執行計划
- MySQL 根據執行計划,調用存儲引擎的 API來執行查詢
- 將結果返回給客戶端,同時緩存查詢結果
一、Nginx負載均衡算法
1、輪詢(默認)
每個請求按時間順序逐一分配到不同的后端服務,如果后端某台服務器死機,自動剔除故障系統,使用戶訪問不受影響。
2、weight(輪詢權值)
weight的值越大分配到的訪問概率越高,主要用於后端每台服務器性能不均衡的情況下。或者僅僅為在主從的情況下設置不同的權值,達到合理有效的地利用主機資源。
3、ip_hash
每個請求按訪問IP的哈希結果分配,使來自同一個IP的訪客固定訪問一台后端服務器,並且可以有效解決動態網頁存在的session共享問題。
4、fair
比 weight、ip_hash更加智能的負載均衡算法,fair算法可以根據頁面大小和加載時間長短智能地進行負載均衡,也就是根據后端服務器的響應時間 來分配請求,響應時間短的優先分配。Nginx本身不支持fair,如果需要這種調度算法,則必須安裝upstream_fair模塊。
5、url_hash
按訪問的URL的哈希結果來分配請求,使每個URL定向到一台后端服務器,可以進一步提高后端緩存服務器的效率。Nginx本身不支持url_hash,如果需要這種調度算法,則必須安裝Nginx的hash軟件包。
正反向解析事兩個不同得名稱空間,是兩顆不同得解析樹;
正向:ip---》主機名
反向:主機名---》ip

1、在瀏覽器中輸入www.baidu.com域名,操作系統會先檢查自己本地的hosts文件是否有這個網址映射關系,如果有,就先調用這個ip地址映射,完成域名解析。
2、如果hosts里沒有這個域名的映射,則會查找本地DNS解析器緩存,是否有這個網址映射關系,如果有,直接返回,完成域名解析。
3、如果hosts與本地DNS解析器緩存都沒有相應的網址映射關系,首先會找TCP/IP參數中設置的首選DNS服務器,在此我們叫它本地DNS服務器,此服務器收到查詢時,如果要查詢的域名,包含在本地配置區域資源中,則返回解析記過給客戶端,完成域名解析,此解析具有權威性。
4、如果要查詢域名,不由本地DNS服務器區域解析,但該服務器已緩存了此網址映射關系,則調用這個IP地址映射,完成域名解析,此解析不具有權威性。
5、如果本地DNS服務器本地區域文件與緩存解析都失效,則根據本地DNS服務器的設置(是否設置轉發器)進行查詢,如果未用轉發模式,本地DNS就把請求發至13台根DNS,根DNS服務器收到請求后會判斷這個域名(.com)是誰來授權管理,並會返回一個負責該頂級域名服務器的一個IP。本地DNS服務器收到IP信息后,將會聯系負責.com域的這台服務器。這台負責.com域的服務器收到請求后,如果自己無法解析,它就會找一個管理.com域的下一級DNS服務器地址(baidu.com)給本地DNS服務器。當本地DNS服務器收到這個地址后,就會找baidu.com域服務器,重復上面的動作,進行查詢,直至找到www.baidu.com主機。
6、如果用的是轉發模式,此DNS服務器就會把請求轉發至上一級DNS服務器,由上一級服務器進行解析,上一級服務器如果不能解析,或找根DNS或把請求轉至上上級,以此循環。不管是本地DNS服務器用是轉發,還是根提示,最后都是把結果返回給本地DNS服務器,由此DNS服務器再返回給客戶機。
從上圖可以知道,客戶端到本地DNS服務器是屬於遞歸查詢,而DNS服務器之間的交互查詢就是迭代查詢
遞歸查詢與迭代查詢
遞歸,只發送一次請求,得到一次准確結果(消耗資源)
迭代,發送多次請求,得到參考結果
三
一面面試官問了好多網絡的問題,比如tcp協議,還問我如果不想要一個ip,如何釋放,如何重新獲取一個ip, 問了linux 的命令和Windows 的dos 命令,之后給我介紹了一下公司的運維結構,然后等二面
二面是系統運維的面試官,又問了tcp 協議,如果服務器100M帶寬,客戶機10M帶寬,服務器向客戶機發發數據,為什么速度提不到它該有的帶寬,問了redis 的數據類型,python 原類,stp生成樹作用,介紹一下它,還有現在企業還需要stp嗎?其他的記不太清了
四
1.內存中的堆棧
內存空間在邏輯上分為三部分:代碼區、靜態數據區和動態數據區,動態數據區又分為棧區和堆區。
代碼區:存儲方法體的二進制代碼。高級調度(作業調度)、中級調度(內存調度)、低級調度(進程調度)控制代碼區執行代碼的切換。
靜態數據區:存儲全局變量、靜態變量、常量,常量包括final修飾的常量和String常量。系統自動分配和回收。
棧區:存儲運行方法的形參、局部變量、返回值。由系統自動分配和回收。
例如 int method(int a){int b;}棧中存儲參數a、局部變量b、返回值temp。
堆區:new一個對象的引用或地址存儲在棧區,指向該對象存儲在堆區中的真實數據。由程序員分配和回收(Java中由JVM虛擬機的垃圾回收機制自動回收)。
例如 Class Student{int num; int age;} main方法中Student stu = new Student();分配堆區空間中存儲的該對象的num、age,變量stu存儲在棧中,里面的值是對應堆區空間的引用或地址。
2.數據結構中的堆棧
棧:是一種連續存儲的數據結構,特點是存儲的數據先進后出。
堆:是一棵完全二叉樹結構,特點是父節點的值大於(小於)兩個子節點的值(分別稱為大頂堆和小頂堆)。它常用於管理算法執行過程中的信息,應用場景包括堆排序,優先隊列等。
五
建議:
六
項目相關
- 如何防止緩存擊穿
- 如何打散熱點數據
- xxx有沒有設計容錯的機制
- xxx有沒有使用多線程開發
- 對象存儲的實現原理
- 項目中數據庫表設計
基礎知識
- Docker 原理
- dockerfile 一些配置參數
- docker-compose 一些配置參數
- Linux 下怎么查看進程/CPU/內存的信息
- Linux 下怎么調試 Go 程序
bn面試:
docker - 集群 - 遷移服務器 - django框架
python 開發的集群工具
