在理解程序和執行緒概念之前首選要對併發有一定的感性認識,如果伺服器同一時間內只能服務於乙個客戶端,其他客戶端都再那裡傻等的話,可見其效能的低下估計會被客戶罵出翔來,因此併發程式設計應運而生,併發是網路程式設計中必須考慮的問題。實現併發的方式有多種:比如多程序、多執行緒、io多路復用。
程序是資源(cpu、記憶體等)分配的基本單位,它是程式執行時的乙個例項。程式執行時系統就會建立乙個程序,並為它分配資源,然後把該程序放入程序就緒佇列,程序排程器選中它的時候就會為它分配cpu時間,程式開始真正執行。
linux系統函式fork()
可以在父程序中建立乙個子程序,這樣的話,在乙個程序接到來自客戶端新的請求時就可以複製出乙個子程序讓其來處理,父程序只需負責監控請求的到來,然後建立子程序讓其去處理,這樣就能做到併發處理。
# -*- coding:utf-8 -*-
import os
print('當前程序:%s 啟動中 ....' % os.getpid())
pid = os.fork()
if pid == 0:
print('子程序:%s,父程序是:%s' % (os.getpid(), os.getppid()))
else:
print('程序:%s 建立了子程序:%s' % (os.getpid(),pid ))
輸出結果:
當前程序:27223 啟動中 ....
程序:27223 建立了子程序:27224
子程序:27224,父程序是:27223
fork函式會返回兩次結果,因為作業系統會把當前程序的資料複製一遍,然後程式就分兩個程序繼續執行後面的**,fork分別在父程序和子程序中返回,在子程序返回的值pid永遠是0,在父程序返回的是子程序的程序id。
執行緒是程式執行時的最小單位,它是程序的乙個執行流,是cpu排程和分派的基本單位,乙個程序可以由很多個執行緒組成,執行緒間共享程序的所有資源,每個執行緒有自己的堆疊和區域性變數。執行緒由cpu獨立排程執行,在多cpu環境下就允許多個執行緒同時執行。同樣多執行緒也可以實現併發操作,每個請求分配乙個執行緒來處理。
老外的原話是這麼說的 —-《unix網路程式設計》:
一道面試題
一道面試題 射擊運動員10發打中90環有多少種可能,請編寫程式計算出來,並列印出結果,0環和10環均有效。打中90環就是沒打中10環,所以打中90環跟打中10環的可能性是一樣的。然後開始遞迴狂打槍,一到10就記錄 if params i 10 在迴圈的控制中已經排除了大於10的可能性 i 10 pa...
一道面試題
前些時候在找工作,就在準備結束此次找工作歷程的時候,去了一家公司面試,去了之後技術經理直接帶到一台電腦旁,給了一張紙條,上面是這樣的題目 用c或c 來實現 1 建立一棵樹,該樹的深度是隨機的,每個節點的位元組點數是隨機的。2 給每個節點分配一段隨機大小的記憶體空間,給每個節點賦乙個隨機數。3 遍歷這...
一道面試題
如果n為偶數,則將它除以2,如果n為奇數,則將它加1或者減1。問對於乙個給定的n,怎樣才能用最少的步驟將它變到1。例如 n 61 n 60 n 2 30 n 2 15 n 16 n 2 8 n 2 4 n 2 2 n 2 1 public class myclass public static vo...