- 原文鏈接-https://github.com/taizilongxu/interview_python
- Python語言特性
- 1 Python的函數參數傳遞
- 2 Python中的元類(metaclass)
- 3 @staticmethod和@classmethod
- 4 類變量和實例變量
- 5 Python自省
- 6 字典推導式
- 7 Python中單下划線和雙下划線
- 8 字符串格式化:%和.format
- 9 迭代器和生成器
- 10
*args
and**kwargs
- 11 面向切面編程AOP和裝飾器
- 12 鴨子類型
- 13 Python中重載
- 14 新式類和舊式類
- 15
__new__
和__init__
的區別 - 16 單例模式
- 17 Python中的作用域
- 18 GIL線程全局鎖
- 19 協程
- 20 閉包
- 21 lambda函數
- 22 Python函數式編程
- 23 Python里的拷貝
- 24 Python垃圾回收機制
- 25 Python的List
- 26 Python的is
- 27 read,readline和readlines
- 28 Python2和3的區別
- 29 super.
__init__
() - 30 range-and-xrange
- 操作系統
- 數據庫
- 網絡
- *NIX
- 數據結構
- 編程題
操作系統
1 select,poll和epoll
其實所有的I/O都是輪詢的方法,只不過實現的層面不同罷了.
這個問題可能有點深入了,但相信能回答出這個問題是對I/O多路復用有很好的了解了.其中tornado使用的就是epoll的.
基本上select有3個缺點:
- 連接數受限
- 查找配對速度慢
- 數據由內核拷貝到用戶態
poll改善了第一個缺點
epoll改了三個缺點.
關於epoll的: http://www.cnblogs.com/my_life/articles/3968782.html
2 調度算法
- 先來先服務(FCFS, First Come First Serve)
- 短作業優先(SJF, Shortest Job First)
- 最高優先權調度(Priority Scheduling)
- 時間片輪轉(RR, Round Robin)
- 多級反饋隊列調度(multilevel feedback queue scheduling)
實時調度算法:
- 最早截至時間優先 EDF
- 最低松弛度優先 LLF
3 死鎖
原因:
- 競爭資源
- 程序推進順序不當
必要條件:
- 互斥條件
- 請求和保持條件
- 不剝奪條件
- 環路等待條件
處理死鎖基本方法:
- 預防死鎖(摒棄除1以外的條件)
- 避免死鎖(銀行家算法)
- 檢測死鎖(資源分配圖)
- 解除死鎖
- 剝奪資源
- 撤銷進程
4 程序編譯與鏈接
推薦: http://www.ruanyifeng.com/blog/2014/11/compiler.html
Bulid過程可以分解為4個步驟:預處理(Prepressing), 編譯(Compilation)、匯編(Assembly)、鏈接(Linking)
以C語言為例:
1 預處理
預編譯過程主要處理那些源文件中的以“#”開始的預編譯指令,主要處理規則有:
- 將所有的“#define”刪除,並展開所用的宏定義
- 處理所有條件預編譯指令,比如“#if”、“#ifdef”、 “#elif”、“#endif”
- 處理“#include”預編譯指令,將被包含的文件插入到該編譯指令的位置,注:此過程是遞歸進行的
- 刪除所有注釋
- 添加行號和文件名標識,以便於編譯時編譯器產生調試用的行號信息以及用於編譯時產生編譯錯誤或警告時可顯示行號
- 保留所有的#pragma編譯器指令。
2 編譯
編譯過程就是把預處理完的文件進行一系列的詞法分析、語法分析、語義分析及優化后生成相應的匯編代碼文件。這個過程是整個程序構建的核心部分。
3 匯編
匯編器是將匯編代碼轉化成機器可以執行的指令,每一條匯編語句幾乎都是一條機器指令。經過編譯、鏈接、匯編輸出的文件成為目標文件(Object File)
4 鏈接
鏈接的主要內容就是把各個模塊之間相互引用的部分處理好,使各個模塊可以正確的拼接。 鏈接的主要過程包塊 地址和空間的分配(Address and Storage Allocation)、符號決議(Symbol Resolution)和重定位(Relocation)等步驟。
5 靜態鏈接和動態鏈接
靜態鏈接方法:靜態鏈接的時候,載入代碼就會把程序會用到的動態代碼或動態代碼的地址確定下來 靜態庫的鏈接可以使用靜態鏈接,動態鏈接庫也可以使用這種方法鏈接導入庫
動態鏈接方法:使用這種方式的程序並不在一開始就完成動態鏈接,而是直到真正調用動態庫代碼時,載入程序才計算(被調用的那部分)動態代碼的邏輯地址,然后等到某個時候,程序又需要調用另外某塊動態代碼時,載入程序又去計算這部分代碼的邏輯地址,所以,這種方式使程序初始化時間較短,但運行期間的性能比不上靜態鏈接的程序
6 虛擬內存技術
虛擬存儲器是指具有請求調入功能和置換功能,能從邏輯上對內存容量加以擴充的一種存儲系統.
7 分頁和分段
分頁: 用戶程序的地址空間被划分成若干固定大小的區域,稱為“頁”,相應地,內存空間分成若干個物理塊,頁和塊的大小相等。可將用戶程序的任一頁放在內存的任一塊中,實現了離散分配。
分段: 將用戶程序地址空間分成若干個大小不等的段,每段可以定義一組相對完整的邏輯信息。存儲分配時,以段為單位,段與段在內存中可以不相鄰接,也實現了離散分配。
分頁與分段的主要區別
- 頁是信息的物理單位,分頁是為了實現非連續分配,以便解決內存碎片問題,或者說分頁是由於系統管理的需要.段是信息的邏輯單位,它含有一組意義相對完整的信息,分段的目的是為了更好地實現共享,滿足用戶的需要.
- 頁的大小固定,由系統確定,將邏輯地址划分為頁號和頁內地址是由機器硬件實現的.而段的長度卻不固定,決定於用戶所編寫的程序,通常由編譯程序在對源程序進行編譯時根據信息的性質來划分.
- 分頁的作業地址空間是一維的.分段的地址空間是二維的.
8 頁面置換算法
- 最佳置換算法OPT:不可能實現
- 先進先出FIFO
- 最近最久未使用算法LRU:最近一段時間里最久沒有使用過的頁面予以置換.
- clock算法
9 邊沿觸發和水平觸發
邊緣觸發是指每當狀態變化時發生一個 io 事件,條件觸發是只要滿足條件就發生一個 io 事件
數據庫
1 事務
數據庫事務(Database Transaction) ,是指作為單個邏輯工作單元執行的一系列操作,要么完全地執行,要么完全地不執行。
2 數據庫索引
推薦: http://tech.meituan.com/mysql-index.html
聚集索引,非聚集索引,B-Tree,B+Tree,最左前綴原理
3 Redis原理
4 樂觀鎖和悲觀鎖
悲觀鎖:假定會發生並發沖突,屏蔽一切可能違反數據完整性的操作
樂觀鎖:假設不會發生並發沖突,只在提交操作時檢查是否違反數據完整性。
5 MVCC
6 MyISAM和InnoDB
MyISAM 適合於一些需要大量查詢的應用,但其對於有大量寫操作並不是很好。甚至你只是需要update一個字段,整個表都會被鎖起來,而別的進程,就算是讀進程都無法操作直到讀操作完成。另外,MyISAM 對於 SELECT COUNT(*) 這類的計算是超快無比的。
InnoDB 的趨勢會是一個非常復雜的存儲引擎,對於一些小的應用,它會比 MyISAM 還慢。他是它支持“行鎖” ,於是在寫操作比較多的時候,會更優秀。並且,他還支持更多的高級應用,比如:事務。
網絡
1 三次握手
- 客戶端通過向服務器端發送一個SYN來創建一個主動打開,作為三路握手的一部分。客戶端把這段連接的序號設定為隨機數 A。
- 服務器端應當為一個合法的SYN回送一個SYN/ACK。ACK 的確認碼應為 A+1,SYN/ACK 包本身又有一個隨機序號 B。
- 最后,客戶端再發送一個ACK。當服務端受到這個ACK的時候,就完成了三路握手,並進入了連接創建狀態。此時包序號被設定為收到的確認號 A+1,而響應則為 B+1。
2 四次揮手
注意: 中斷連接端可以是客戶端,也可以是服務器端. 下面僅以客戶端斷開連接舉例, 反之亦然.
- 客戶端發送一個數據分段, 其中的 FIN 標記設置為1. 客戶端進入 FIN-WAIT 狀態. 該狀態下客戶端只接收數據, 不再發送數據.
- 服務器接收到帶有 FIN = 1 的數據分段, 發送帶有 ACK = 1 的剩余數據分段, 確認收到客戶端發來的 FIN 信息.
- 服務器等到所有數據傳輸結束, 向客戶端發送一個帶有 FIN = 1 的數據分段, 並進入 CLOSE-WAIT 狀態, 等待客戶端發來帶有 ACK = 1 的確認報文.
- 客戶端收到服務器發來帶有 FIN = 1 的報文, 返回 ACK = 1 的報文確認, 為了防止服務器端未收到需要重發, 進入 TIME-WAIT 狀態. 服務器接收到報文后關閉連接. 客戶端等待 2MSL 后未收到回復, 則認為服務器成功關閉, 客戶端關閉連接.
3 ARP協議
地址解析協議(Address Resolution Protocol),其基本功能為透過目標設備的IP地址,查詢目標的MAC地址,以保證通信的順利進行。它是IPv4網絡層必不可少的協議,不過在IPv6中已不再適用,並被鄰居發現協議(NDP)所替代。
4 urllib和urllib2的區別
這個面試官確實問過,當時答的urllib2可以Post而urllib不可以.
- urllib提供urlencode方法用來GET查詢字符串的產生,而urllib2沒有。這是為何urllib常和urllib2一起使用的原因。
- urllib2可以接受一個Request類的實例來設置URL請求的headers,urllib僅可以接受URL。這意味着,你不可以偽裝你的User Agent字符串等。
5 Post和Get
GET和POST有什么區別?及為什么網上的多數答案都是錯的 知乎回答
get: RFC 2616 - Hypertext Transfer Protocol -- HTTP/1.1 post: RFC 2616 - Hypertext Transfer Protocol -- HTTP/1.1
6 Cookie和Session
Cookie | Session | |
---|---|---|
儲存位置 | 客戶端 | 服務器端 |
目的 | 跟蹤會話,也可以保存用戶偏好設置或者保存用戶名密碼等 | 跟蹤會話 |
安全性 | 不安全 | 安全 |
session技術是要使用到cookie的,之所以出現session技術,主要是為了安全。
7 apache和nginx的區別
nginx 相對 apache 的優點:
- 輕量級,同樣起web 服務,比apache 占用更少的內存及資源
- 抗並發,nginx 處理請求是異步非阻塞的,支持更多的並發連接,而apache 則是阻塞型的,在高並發下nginx 能保持低資源低消耗高性能
- 配置簡潔
- 高度模塊化的設計,編寫模塊相對簡單
- 社區活躍
apache 相對nginx 的優點:
- rewrite ,比nginx 的rewrite 強大
- 模塊超多,基本想到的都可以找到
- 少bug ,nginx 的bug 相對較多
- 超穩定
8 網站用戶密碼保存
- 明文保存
- 明文hash后保存,如md5
- MD5+Salt方式,這個salt可以隨機
- 知乎使用了Bcrypy(好像)加密
9 HTTP和HTTPS
狀態碼 | 定義 |
---|---|
1xx 報告 | 接收到請求,繼續進程 |
2xx 成功 | 步驟成功接收,被理解,並被接受 |
3xx 重定向 | 為了完成請求,必須采取進一步措施 |
4xx 客戶端出錯 | 請求包括錯的順序或不能完成 |
5xx 服務器出錯 | 服務器無法完成顯然有效的請求 |
403: Forbidden 404: Not Found
HTTPS握手,對稱加密,非對稱加密,TLS/SSL,RSA
10 XSRF和XSS
- CSRF(Cross-site request forgery)跨站請求偽造
- XSS(Cross Site Scripting)跨站腳本攻擊
CSRF重點在請求,XSS重點在腳本
11 冪等 Idempotence
HTTP方法的冪等性是指一次和多次請求某一個資源應該具有同樣的副作用。(注意是副作用)
GET http://www.bank.com/account/123456
,不會改變資源的狀態,不論調用一次還是N次都沒有副作用。請注意,這里強調的是一次和N次具有相同的副作用,而不是每次GET的結果相同。GET http://www.news.com/latest-news
這個HTTP請求可能會每次得到不同的結果,但它本身並沒有產生任何副作用,因而是滿足冪等性的。
DELETE方法用於刪除資源,有副作用,但它應該滿足冪等性。比如:DELETE http://www.forum.com/article/4231
,調用一次和N次對系統產生的副作用是相同的,即刪掉id為4231的帖子;因此,調用者可以多次調用或刷新頁面而不必擔心引起錯誤。
POST所對應的URI並非創建的資源本身,而是資源的接收者。比如:POST http://www.forum.com/articles
的語義是在http://www.forum.com/articles
下創建一篇帖子,HTTP響應中應包含帖子的創建狀態以及帖子的URI。兩次相同的POST請求會在服務器端創建兩份資源,它們具有不同的URI;所以,POST方法不具備冪等性。
PUT所對應的URI是要創建或更新的資源本身。比如:PUT http://www.forum/articles/4231
的語義是創建或更新ID為4231的帖子。對同一URI進行多次PUT的副作用和一次PUT是相同的;因此,PUT方法具有冪等性。
12 RESTful架構(SOAP,RPC)
推薦: http://www.ruanyifeng.com/blog/2011/09/restful.html
13 SOAP
SOAP(原為Simple Object Access Protocol的首字母縮寫,即簡單對象訪問協議)是交換數據的一種協議規范,使用在計算機網絡Web服務(web service)中,交換帶結構信息。SOAP為了簡化網頁服務器(Web Server)從XML數據庫中提取數據時,節省去格式化頁面時間,以及不同應用程序之間按照HTTP通信協議,遵從XML格式執行資料互換,使其抽象於語言實現、平台和硬件。
14 RPC
RPC(Remote Procedure Call Protocol)——遠程過程調用協議,它是一種通過網絡從遠程計算機程序上請求服務,而不需要了解底層網絡技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,為通信程序之間攜帶信息數據。在OSI網絡通信模型中,RPC跨越了傳輸層和應用層。RPC使得開發包括網絡分布式多程序在內的應用程序更加容易。
總結:服務提供的兩大流派.傳統意義以方法調用為導向通稱RPC。為了企業SOA,若干廠商聯合推出webservice,制定了wsdl接口定義,傳輸soap.當互聯網時代,臃腫SOA被簡化為http+xml/json.但是簡化出現各種混亂。以資源為導向,任何操作無非是對資源的增刪改查,於是統一的REST出現了.
進化的順序: RPC -> SOAP -> RESTful
15 CGI和WSGI
CGI是通用網關接口,是連接web服務器和應用程序的接口,用戶通過CGI來獲取動態數據或文件等。 CGI程序是一個獨立的程序,它可以用幾乎所有語言來寫,包括perl,c,lua,python等等。
WSGI, Web Server Gateway Interface,是Python應用程序或框架和Web服務器之間的一種接口,WSGI的其中一個目的就是讓用戶可以用統一的語言(Python)編寫前后端。
官方說明:PEP-3333
16 中間人攻擊
在GFW里屢見不鮮的,呵呵.
中間人攻擊(Man-in-the-middle attack,通常縮寫為MITM)是指攻擊者與通訊的兩端分別創建獨立的聯系,並交換其所收到的數據,使通訊的兩端認為他們正在通過一個私密的連接與對方直接對話,但事實上整個會話都被攻擊者完全控制。
17 c10k問題
所謂c10k問題,指的是服務器同時支持成千上萬個客戶端的問題,也就是concurrent 10 000 connection(這也是c10k這個名字的由來)。 推薦: http://www.kegel.com/c10k.html
18 socket
推薦: http://www.360doc.com/content/11/0609/15/5482098_122692444.shtml
Socket=Ip address+ TCP/UDP + port
19 瀏覽器緩存
推薦: http://www.cnblogs.com/skynet/archive/2012/11/28/2792503.html
304 Not Modified
20 HTTP1.0和HTTP1.1
推薦: http://blog.csdn.net/elifefly/article/details/3964766
- 請求頭Host字段,一個服務器多個網站
- 長鏈接
- 文件斷點續傳
- 身份認證,狀態管理,Cache緩存
21 Ajax
AJAX,Asynchronous JavaScript and XML(異步的 javascript 和 XML), 是與在不重新加載整個頁面的情況下,與服務器交換數據並更新部分網頁的技術。
*NIX
unix進程間通信方式(IPC)
- 管道(Pipe):管道可用於具有親緣關系進程間的通信,允許一個進程和另一個與它有共同祖先的進程之間進行通信。
- 命名管道(named pipe):命名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關系進程間的通信。命名管道在文件系統中有對應的文件名。命名管道通過命令mkfifo或系統調用mkfifo來創建。
- 信號(Signal):信號是比較復雜的通信方式,用於通知接受進程有某種事件發生,除了用於進程間通信外,進程還可以發送信號給進程本身;linux除了支持Unix早期信號語義函數sigal外,還支持語義符合Posix.1標准的信號函數sigaction(實際上,該函數是基於BSD的,BSD為了實現可靠信號機制,又能夠統一對外接口,用sigaction函數重新實現了signal函數)。
- 消息(Message)隊列:消息隊列是消息的鏈接表,包括Posix消息隊列system V消息隊列。有足夠權限的進程可以向隊列中添加消息,被賦予讀權限的進程則可以讀走隊列中的消息。消息隊列克服了信號承載信息量少,管道只能承載無格式字節流以及緩沖區大小受限等缺
- 共享內存:使得多個進程可以訪問同一塊內存空間,是最快的可用IPC形式。是針對其他通信機制運行效率較低而設計的。往往與其它通信機制,如信號量結合使用,來達到進程間的同步及互斥。
- 內存映射(mapped memory):內存映射允許任何多個進程間通信,每一個使用該機制的進程通過把一個共享的文件映射到自己的進程地址空間來實現它。
- 信號量(semaphore):主要作為進程間以及同一進程不同線程之間的同步手段。
- 套接口(Socket):更為一般的進程間通信機制,可用於不同機器之間的進程間通信。起初是由Unix系統的BSD分支開發出來的,但現在一般可以移植到其它類Unix系統上:Linux和System V的變種都支持套接字。
數據結構
1 紅黑樹
紅黑樹與AVL的比較:
AVL是嚴格平衡樹,因此在增加或者刪除節點的時候,根據不同情況,旋轉的次數比紅黑樹要多;
紅黑是用非嚴格的平衡來換取增刪節點時候旋轉次數的降低;
所以簡單說,如果你的應用中,搜索的次數遠遠大於插入和刪除,那么選擇AVL,如果搜索,插入刪除次數幾乎差不多,應該選擇RB。