1. 程式人生 > >我也是一個執行緒,為什麼每天累得像狗一樣?

我也是一個執行緒,為什麼每天累得像狗一樣?

我的編號是0x7954,我以為世界上的人都和我一樣,一出生就忙碌個不停,一直忙到世界的毀滅。

我每天與CPU阿甘為伍,忙著讀寫記憶體,一刻不得閒,阿甘這傻小子的速度實在是太快,指令週期都是按納秒計算的,他經常對我說的一句話就是:快點兒,跟上!

我就納悶了,這程式設計師都是996,至少有一天可以休息,我這怎麼得7*24工作啊,每天累得像狗一樣!

不過讀寫記憶體這個活是老大分配給我的,我認命。

有一天深夜,工作很少,我終於可以稍微休息一下,和CPU阿甘聊了一會兒,他無意中提起一件事:“這個機器原來安裝過一個叫Tomcat的軟體,這Tomcat執行起來以後,會啟動很多執行緒,他們的日常工作就是處理各種各樣的包裹。”

“還存在這樣的世界?有多少執行緒啊?” 我很驚訝, 為什麼老大隻安排我一個人幹活? 孤零零的。

“沒錯,Tomcat有個執行緒池,具體有多少個執行緒我也不清楚,這些執行緒在處理包裹的時候,有些就是執行一下簡單的業務邏輯程式碼,馬上返回,有些需要訪問資料庫,有些需要讀寫檔案,有些還要通過網路來訪問別的系統,這個時候就可以阻塞休息了, 對了,其中有個叫做0x3074的執行緒特別出名。”

CPU給我講了一下0x3704的故事,都在《我是一個執行緒》當中。

聽完後我心情低落,十分委屈,我也是一個執行緒,人家的生活多麼豐富多彩,執行緒還會阻塞,一夥人可以聚在一起喝茶、聊天、打牌。哪像我,像個驢子一樣每時每刻都在轉圈拉磨。

“後來Tomcat去哪裡了?”  我十分憧憬,幻想著自己也能成為其中的一個執行緒,和0x3704談天說地。

“程式設計師把他們關閉了,然後搬了家,到另外一臺機器上啟動了,才把這個機器單獨留給了你們老大: Redis,現在專門用來快取資料。你每秒處理上萬次的快取讀寫請求, 也許就有0x3704發過來的。”

原來如此! 這世界上不止我一個執行緒,還有很多執行緒在訪問我們Redis快取。

我算是明白了老大為什麼要我把放到牆內,這一旦瞭解了外邊的花花世界,心就野了,每天帶著怨氣工作,屢屢出錯。

Redis老大看到我狀態不佳,趕緊跑來慰問:“0x7954,最近是怎麼回事啊!”

我沒聲好氣地說:“為什麼只有我一個執行緒在幹活!”

“誰說只有你一個? 做持久化的時候,比如RDB的bgsave,那不是有別的執行緒在幹活嘛!”

“我說的是讀寫記憶體中快取資料的執行緒!為什麼只有我一個? ”看到老大想轉移矛盾,我趕緊把他拉回來,“人家Tomcat能弄個執行緒池,裡邊很多執行緒,大家都可以阻塞休息,我們為什麼不能這麼做?!”

Redis老大聽到我這麼說,就知道外邊的世界無法對我隱藏了, 只好對我解釋:“我做出這麼一個決定是有原因的,最主要的原因就是我們負責的業務和Tomcat不同!”

老大從懷裡掏出一張圖,小心翼翼地遞給我:“這可是寶貝,別弄壞了:”

看到滿紙的英文,我真是後悔為什麼不把四級學好。

不過我還是看出了端倪,這CPU阿甘最快,一個時鐘週期是0.3納秒,記憶體訪問需要120納秒,固態硬碟訪問需要50-150微秒,傳統硬碟訪問需要1-10毫秒, 網路訪問最慢,需要幾十到上百毫秒。

如果CPU阿甘的一個時鐘週期按1秒算,那記憶體訪問就是6分鐘,固態硬碟是2-6天,傳統硬碟是1-12個月,網路訪問就是幾年了!

(1秒= 1000毫秒= 1000,000 微秒 = 1000,000,000納秒)

都是人類製造的電腦裝置,這速度差異怎麼如此之大! 可是這和我有什麼關係?

Redis老大說:“ 我們負責的業務主要是和記憶體打交道,你每天就是讀寫記憶體的那些資料結構,像string ,hash, set, list等等,記憶體的速度是很快的。我們來假設一個場景, 有10萬個請求發給了我們Redis, 假設你10微秒處理一個,那這10萬個請求,你1秒內就輕鬆搞定!但是如果同樣多的請求發給Tomcat,它的執行緒需要讀寫檔案,訪問硬碟,甚至網路,速度那是非常非常慢的,假設平均處理時間是10毫秒,你算算需要多長時間?”

我稍加計算,嚇了一跳,需要1000秒才能搞定,這實在是太慢了,人類是萬萬等不及的。

Redis老大說:“所以嘛,那Tomcat肯定要建立一個執行緒池,裡邊養一堆執行緒來幹活嘍。並且,一個Tomcat還不夠,需要多個Tomcat組成叢集來分擔壓力,他是不得已而為之。”

原來如此,看來業務不同,這工作模式也大為不同啊!  可是不對啊,這麼多的網路請求肯定是很慢的啊!

“這個不用你操心,我們是非阻塞的I/O,使用了epoll作為I/O多路複用的實現,我還有一個自己的事件處理模型,不會在網路I/O上浪費時間。 ” Redis老大深思熟慮,早就考慮到了這一點。

“單執行緒還有一個重要的好處就是,不用給資源加鎖,所有的命令都會放到一個佇列中,你只要從佇列中取出指令,逐個執行就可以了,根本不用考慮鎖的問題,非常安全。”

“最後還有一點,由於只有你一個執行緒,也沒有執行緒切換開銷了,你一個人獨霸CPU阿甘。”(確切來說,只能用一個CPU 核心)

老大一口氣說了這個麼多好處,我無語了,資本家真壞,看來我這輩子就是勞累命。

不過不能就這麼算了,我還得提出那個關鍵問題:“我7*24小時工作,也該長點兒工資了!”

“沒問題,等到張大胖給我們加了記憶體,我就給你發雙份工資!”