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

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

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

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

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

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

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