基于php技術(shù)的網(wǎng)站建設關(guān)鍵詞優(yōu)化推廣公司
1.并發(fā)
并發(fā):邏輯流在時間時重疊
構(gòu)造并發(fā)程序:
進程:每個邏輯控制流是一個進程,由內(nèi)核調(diào)度和維護
進程有獨立的虛擬地址空間,想要通信,控制流必須使用某種顯式的進程間通信機制(IPC)
I/O多路復用:程序在一個進程的上下文顯式地調(diào)度自己的邏輯流
邏輯流被模型化為狀態(tài)機,數(shù)據(jù)到達文件描述符后,主程序顯式地從一個狀態(tài)轉(zhuǎn)換到另一個狀態(tài)
程序是一個單獨的進程,所有的流共享同一個地址空間
線程:運行在單一進程上下文的邏輯流,由內(nèi)核調(diào)度
像進程流一樣由內(nèi)核調(diào)度,像I/O多路復用一樣共享同一個地址空間
2.基于進程
在父進程中接受客戶端連接請求,創(chuàng)建新的子進程提供服務
共享文件表,但不共享用戶地址空間

3.基于I/O多路復用
使用select函數(shù),要求內(nèi)核掛起進程,只有在I/O事件發(fā)生后,才將控制返回給程序
select處理描述符集合,看成一個大小為n的位向量
select函數(shù)會一直阻塞,直到讀集合中至少有一個描述符準備好可以讀
當且僅當一個從該描述符讀取一個字節(jié)的請求不會阻塞時,描述符k就表示準備好可以讀了
狀態(tài)機就是一組狀態(tài)、輸入事件、轉(zhuǎn)移
粒度:每個邏輯流每個時間片執(zhí)行的指令數(shù)量

基于I/O多路復用的事件驅(qū)動程序:
每個邏輯流都能訪問該進程的全部地址空間
4.基于線程(thread)
線程是運行在進程上下文的邏輯流
程序是由每個進程中一個線程組成的
每個線程都有自己獨立的線程上下文,包括線程ID、棧、棧指針、PC、CC、通用目的寄存器值
每個線程和其他線程共享進程上下文的剩余部分,包括整個用戶虛擬地址空間,由只讀文本、讀/寫數(shù)據(jù)、堆、所有的共享庫代碼和數(shù)據(jù)區(qū)域組成
線程共享打開文件的集合
一個線程的上下文比進程的更小,切換更快
主線程和其他對等線程的區(qū)別僅在于它總是進程中第一個運行的線程
每個對等線程都能讀寫相同的共享數(shù)據(jù)
線程的代碼和本地數(shù)據(jù)被封裝在一個線程例程中

pthread_create函數(shù)創(chuàng)建線程
pthread_join函數(shù)會阻塞,直到線程終止
可結(jié)合的線程:能被其他線程回收和殺死,在被其他線程回收前,它的內(nèi)存資源(棧)不釋放
分離的線程:不能被其他線程回收和殺死,內(nèi)存資源在它終止時由系統(tǒng)自動釋放
寄存器從不共享,虛擬內(nèi)存總是共享
若一個線程得到了一個指向其他線程的棧的指針,則它可以讀寫這個棧的任何部分
變量是共享的,當且僅當它的一個實例被一個以上的線程引用
5.用信號量同步線程
共享變量引入了同步錯誤的可能性
互斥:臨界區(qū)不應該與其他進程的臨界區(qū)交替執(zhí)行

信號量s是非負整數(shù)的全局變量,初始化為1,只能由兩種操作處理
P(s)測試:若s非0則減1,若s為0則掛起
V(s)增加:s加1
以提供互斥為目的的二元信號量稱為互斥鎖,P為加鎖,V為解鎖
生產(chǎn)者-消費者問題:

插入和取出項目都涉及更新共享變量,必須保證對緩沖區(qū)的訪問互斥和調(diào)度
緩沖區(qū):減少抖動
讀者-寫者問題:
寫者必須有對對象獨占的訪問,讀者可以和無限多個讀者共享對象
饑餓:一個線程無限期阻塞,無法進展
基于預線程化的并發(fā)服務器

6.競爭、死鎖
競爭:一個程序的正確性依賴于一個線程要在另一個線程到達y點之前,到達它的控制流中的x點
程序員假定線程將按照某種特殊的軌跡線穿過執(zhí)行空間,而忘記:多線程的程序必須對任何可行的軌跡線都正確工作
死鎖:一組進程被阻塞了, 等待一個永遠不會為真的條件