国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

趣談程序演變的過程

chaz6chez

前言

我是一名后端開發(fā)工程師,目前從事后端開發(fā)有8年的經(jīng)驗,主要以PHP開發(fā)為主,期間有1年時間使用C語言進行PHP拓展的開發(fā)工作,
工作主要圍繞輔助線程及有棧協(xié)程調(diào)度器;還有2年主要使用Golang做一些基礎服務。

這篇文章我會用一些通俗的話來描述一些我所了解的程序的一些點,如 異步、同步、阻塞、非阻塞等;當然,我的經(jīng)驗不算豐富也可能有些理解錯誤的地方,
也希望能夠指正我描述有錯誤的部分。

程序出生了

程序最開始就如同寫文章一般,從上至下,然后伴隨著一個return結束:

#include<stdio.h>

main(){
    return 0;
}

這個程序?qū)τ谙到y(tǒng)來說是一個唯一入口,有點類似于PHP的index.php入口對于PHP zendVM一樣,也是唯一入口:

<?php
    # 啥也沒有
?>

道理是這么一個道理,Golang也一樣,Java也一樣;

這樣的程序其實跟腳本是類似的,從上執(zhí)行到結束、退出;既然這樣的程序和腳本類似,我么就把它比作一張紙,
我們可以在這張紙上胡作非為,寫上A\B\C\D隨便什么都可以,它就會按照從上到下直到結束:

如上圖,這個程序就完成了一個結合了A+B+C+D的業(yè)務邏輯,我們稱它ABCD;

這時候你可能又會想,如果我要完成ABC的業(yè)務邏輯,怎么辦?有兩種辦法:

  • 再寫一個ABC的程序
  • 給這個ABCD豐富一下,加一個判斷

于是我們豐富了一下程序,利用了編程語言基礎的邏輯判斷的特性:

但是我們不滿足于此,因為A\B\C\D都有可能帶來判斷,甚至可能加入E\F\G等等等等……

那么這時候,程序如果按照這樣的發(fā)展趨勢,應該會變成:

CAO!這肯定不是每個程序員想要的結果!

那么為了拯救這樣的情況出現(xiàn),我們索性用多張紙且明確劃分區(qū)域地來完成這樣的復雜的、
多功能的程序,每個紙張上都各自有不同的ABCD或EFGH,這種編寫程序的方式就是面向?qū)ο缶幊蹋?br /> 當然過程對象也可以達到這個效果,只不過需要引入各式各樣的紙張,且不同紙張內(nèi)容可能出現(xiàn)重復,
甚至不符合人的思維邏輯:

它轉起來了!

我們上述的所有程序,都不能自動的反復的執(zhí)行;

這里面包括C、Golang等語言,只要不引入一些庫就純粹的運行來說,它們和腳本是無異的

但是我們在生活中無時不刻的做著重復的事兒,畢竟人類的本質(zhì)是復讀機嘛;那么我們程序怎么做到重復執(zhí)行呢?
有以下兩種辦法:

  • a. 重復幾次就手動執(zhí)行幾次
  • b. 讓程序住在系統(tǒng)里自己執(zhí)行

懶人能推動社會進步,我選B。

那么為了實現(xiàn)這樣的程序,我們該怎么做呢,怎么讓這個程序不斷地重復重復再重復呢?這時候可以利用語言特性:
循環(huán),在循環(huán)的作用下,由上至下的程序則會變成這個樣子:

wocao!它轉起來了,轉起來了!這不就是常駐內(nèi)存的程序嗎?當然,這里面我省略了一些接受系統(tǒng)通知、監(jiān)控的步驟,
那么我們就假設這個圈就是一個系統(tǒng),每個紙張就是程序,循環(huán)飛速的運轉,那么每個程序都可以快速的運轉,
這樣一看,它是不是就變得豐富形象且生動了?

它蛻變了!

我們把這個”系統(tǒng)“的目光收一收,把目光再次聚集到每張紙張上面的A\B\C\D,你會發(fā)現(xiàn)ABCD該順序執(zhí)行的還是順序執(zhí)行,
紙張1沒執(zhí)行完,紙張2就不會到,因為在這個循環(huán)的圈中也是順序執(zhí)行的,怎么辦呢?我能不能把A\B\C\D打散?
把每張紙聚焦在該做的事兒上?可以。

這里我們可以把這些A\B\C\D理解為系統(tǒng)的一些程序,比如文件系統(tǒng)、socket等,我們上層的應用就是使用他們的紙張,
去組合出ABC等一些特性的上層程序,我們的”紙張“和A\B\C\D一樣,也在這個大循環(huán)內(nèi),我們的程序也可以通過一些共享手段與它們通訊/交換信息,
如下圖:

為了避免每個程序一直掛在那里影響循環(huán)后面的其他程序,通常來說都需要合理的分配每個程序執(zhí)行的最大時間,
如果沒執(zhí)行完,那就等下一個循環(huán)接著執(zhí)行(具體可以看看Linux時間片算法,這里不展開說了);假定每個程序最大執(zhí)行時間是1秒,
那么如圖所示的“循環(huán)”去除“等等”部分,轉一圈需要6秒;假設A執(zhí)行一次需要6秒,那么A就需要轉六圈才能完成一輪業(yè)務,其他的同理。

  • 同步阻塞

在“紙張2”需要一直等待結果的情況下(就好比你致電10086詢問你的話費余額,電話那頭告訴你等一下,你就一直拿著電話等她回答你),
我們假設A需要6秒,C需要10秒,那么“紙張2”完成自己的業(yè)務邏輯那么就需要先讓A轉完6圈,再去通知C,然后再等C轉完10圈,最后就是16圈,
那么在第17圈的時候“紙張2”才能拿到所有數(shù)據(jù)。

  • 異步

那么我有沒有辦法做到同時通知兩位,然后在等待呢?有:

  1. “紙張2”開兩個線程(線程和進程的關系這里不展開講,可以自行查閱,因為線程又是另一個“圈”的事兒了),一個通知A,一個通知C;

  2. “紙張2”告訴A:“有結果了就放在門衛(wèi)大爺A那,我去拿”,然后緊接著通知C:“有結果了就放在門衛(wèi)大爺C那,我去拿”;

1號方案和2號方案其實在本質(zhì)上沒太大區(qū)別,因為在linux下面實際上沒有真正的線程,無非就是多了一個循環(huán)的事兒,
即便多了真·線程的概念,實際上運行起來也差不多,反正也是需要切出去再回來的;

“紙張2”除了需要維護一個不斷查詢門衛(wèi)大爺?shù)倪壿嬐?,不需要多余在維護什么,那么這個轉圈的事兒,就可以變換成如下的邏輯:
“紙張2”分別告訴A和C,于是開始轉圈,第一圈的時候A和C都消耗了1秒,直到第6圈A完事兒了,第7圈的時候“紙張2”拿到了A的包裹;
第10圈的時候,C完事兒了,第11圈的時候“紙張2”拿到了C的包裹,程序結束;那么這個程序就執(zhí)行了11圈,比之前的17圈要快一些。

實際上這個邏輯就是linux select/poll的執(zhí)行邏輯,如果算上“紙張2”自己還需要查尋門衛(wèi)大爺?shù)臅r間的話,是不止17圈的,
因為每一圈“紙張2”都需要去問大爺,這里只是做了一個忽略;如果假設詢問大爺需要消耗2圈的話,那么至少要在第19圈才可以拿到結果

還有沒有更快的方案呢?有:
讓A和C完事兒的時候告訴我一聲

這時候“紙張2”是不需要去詢問大爺,只需要在A、C完事兒通知到的時候去大爺那里取,這樣的時間消耗是最接近17圈的。

這種方式就是linux epoll的執(zhí)行方式,也是類似于kqueue或者IOCP的執(zhí)行方式,當然系統(tǒng)不同,時間分配的方式也不同,
整體的執(zhí)行方式也稍微有所調(diào)整

總結

  • 異步至少需要兩個線程/兩個進程
  • 非阻塞需要對應“程序”/“紙張”支持
  • 同步還是異步、阻塞還是非阻塞,需要界定范圍,有可能微觀的看是非阻塞,但宏觀看是阻塞的
  • 世界是個圈,圈里也有圈,怎么維系好自己的圈,做好內(nèi)圈與外圈的聯(lián)系,會讓世界變得更好
  • 如有錯誤請指正??!

暫時想到的只有這么多,如果想到其他的,再說

我的個人網(wǎng)站

5333 10 11
10個評論

沒茅臺

學習中

  • 暫無評論
liziyu

辛苦辛苦,受益了!

發(fā)現(xiàn)大佬的“域名”記不住。哈哈。

  • 暫無評論

文章寫得很好,深入淺出,生動形象

  • 暫無評論
Tinywan

感謝分享!

  • 暫無評論
xiuwang

講得很有意思啊

  • 暫無評論
hongs

謝謝作者分享。

  • 暫無評論
wocall

學習了

  • 暫無評論
macho

文章講的機器號 很容易理解 機器棒

  • 暫無評論
weplus

有意思。哈哈哈哈,我這種沒文化的一看都明白了

  • 暫無評論
深藍

很生動,期待其他文章。

  • 暫無評論
年代過于久遠,無法發(fā)表評論

chaz6chez

5174
積分
0
獲贊數(shù)
0
粉絲數(shù)
2018-11-16 加入
??