做公司網(wǎng)站需要會(huì)什么一鍵優(yōu)化表格
一、IO多路復(fù)用與多線程
IO多路復(fù)用,IO Multiplexing,其實(shí)就是在IO上進(jìn)行監(jiān)聽(tīng)處理導(dǎo)致線程被阻塞(如果非阻塞就必須不斷的輪詢,仍然是占用此線程),如果一個(gè)IO對(duì)應(yīng)一個(gè)線程是不是太浪費(fèi)了。而且在諸如網(wǎng)絡(luò)IO這種可以多達(dá)成千萬(wàn)的情況下使用多線程對(duì)應(yīng)幾乎是一場(chǎng)災(zāi)難。所以,可不可以提供一個(gè)技術(shù)實(shí)現(xiàn)在一個(gè)線程(進(jìn)程)同時(shí)對(duì)多路IO進(jìn)行監(jiān)聽(tīng)處理呢?這就是IO多路復(fù)用。它的優(yōu)勢(shì)非常明顯就是解決了線程(進(jìn)程)膨脹的問(wèn)題。
這就是說(shuō),IO操作是目的,多線程是實(shí)現(xiàn)的手段或者說(shuō)方法。但線程是有上限有代價(jià)的,所以,就必須從IO處著手解決這個(gè)問(wèn)題,從而提出了IO多路復(fù)用的技術(shù)。
二、同步異步與阻塞和非阻塞
說(shuō)到同步異步這種老生常談的東西其實(shí)非常理解,很多開(kāi)發(fā)者或初學(xué)者總想搞清楚某個(gè)技術(shù)到底是同步還是異步。而某些框架或庫(kù)在提供給外面文檔上說(shuō),某某技術(shù)是異步的,但明明在書(shū)本或者其它網(wǎng)上看到它是同步的,就非常困惑。其實(shí)這個(gè)可以理解,很多人對(duì)框架或庫(kù)的理解或者應(yīng)用其實(shí)非常淺。并沒(méi)有深入到其內(nèi)部進(jìn)行分析,有可能甚至都沒(méi)有看過(guò)幾行代碼,都是人云亦云。
包括阻塞和非阻塞這兩個(gè)概念,很多開(kāi)發(fā)者一直就分不清楚他們和同步異步有什么不同。包括一些老的程序員都會(huì)在多線程和IO操作中亂叫,導(dǎo)致新手更是一頭霧水。其實(shí)可以簡(jiǎn)單的理解成線程間處理的叫同步或異步,IO的操作稱為阻塞或非阻塞。他們之間既可以單獨(dú)分開(kāi)使用,也可以組合一起使用。
舉一個(gè)例子,epoll本身是同步的,但其上層的封裝庫(kù)就可以用線程實(shí)現(xiàn)異步的操作。epoll操作的網(wǎng)絡(luò)句柄Socket雖然一般設(shè)置成非阻塞,但并不代表其不可以修改成阻塞。一切都是為效率和應(yīng)用 。需要重點(diǎn)強(qiáng)調(diào)的,socket設(shè)置為阻塞和非阻塞并不影響epoll接口(如epoll_wait等)的操作,它影響是和其相關(guān)的Accept,Recv,Send等相關(guān)的函數(shù)接口。
因此,在真正應(yīng)用一項(xiàng)技術(shù)前,要把其相關(guān)的接口和底層實(shí)現(xiàn),基本要搞清楚,不要想當(dāng)然。
三、二者的結(jié)合
其實(shí)說(shuō)到這里大家應(yīng)該明白得差不多了,現(xiàn)實(shí)世界中,哪里有什么一個(gè)單純的方法通解決復(fù)雜的問(wèn)題。正如人們吃藥,大多數(shù)情況下,要吃幾種藥一起來(lái)控制病情。即使某種藥是特效的,醫(yī)生也會(huì)囑咐病人要注意飲食,適當(dāng)運(yùn)動(dòng)等等。這些其實(shí)都是一種組合的方式來(lái)解決問(wèn)題的思路。
而在計(jì)算機(jī)的世界亦也如此。除了一些過(guò)小的或過(guò)一專項(xiàng)的應(yīng)用,大多還是需要多種技術(shù)整合在一起解決問(wèn)題。比如網(wǎng)絡(luò)編程,不同的系統(tǒng)不同的平臺(tái)可能提供的底層機(jī)制就有不同,比如Windows的IOCP,Linux的epoll。它們的底層本身就有不同,而上層的設(shè)計(jì)更是可以有多種形式。解決問(wèn)題的思路不止一個(gè),實(shí)現(xiàn)思路的手段更是多種,不要強(qiáng)求哪種技術(shù)是最牛的。
仍然是那句話,最合適的就是最優(yōu)的。要立足實(shí)際情況,用最簡(jiǎn)單方便的手段解決問(wèn)題,就是成功。
四、總結(jié)
這篇文章本來(lái)不想寫(xiě)的??墒?#xff0c;在網(wǎng)上經(jīng)??吹接腥藛?wèn)這個(gè)是異步還是同步,甚至有的還會(huì)因?yàn)檫@個(gè)互相杠。其實(shí)沒(méi)有意義,是與不是,多看看源碼??赡懿煌陌姹?#xff0c;或者同一版本在不同的OS上,都有所不同。不必非要糾結(jié)是同步還是異步,達(dá)到目的即可。真正想明白同步異步,還是要明白適用的場(chǎng)景和設(shè)計(jì)的目的以及思想。不要光盯著學(xué)習(xí)資料或者書(shū)本,深入到源碼中去,自然就明白了。這正是“從代碼中來(lái),到代碼中去”。