當前位置:
首頁 > 知識 > 我也是一個線程,為什麼每天累得像狗一樣?

我也是一個線程,為什麼每天累得像狗一樣?



來自:碼農翻身(微信號:coderising)



我的編號是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小時工作,也該長點兒工資了!」




「沒問題,等到張大胖給我們加了內存,我就給你發雙份工資!」





●編號646,輸入編號直達本文



●輸入m獲取文章

目錄

推薦↓↓↓



運維


更多推薦

25個技術類公眾微信


涵蓋:程序人生、演算法與數據結構、黑客技術與網路安全、大數據技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Linux學習 的精彩文章:

diff,Linux下文本比對方法

TAG:Linux學習 |