為何linux作為伺服器端十年不重啟都不卡而安卓用半年就十分卡?
linux內核向來以高效,佔用資源低而著稱。為何同樣使用linux內核的安卓會佔用資源會如此之多?
補充一點。
Linux作為伺服器運行十年不卡,那是運行有限的幾個服務,以確定的方式運行。
Android用半年卡,那是運行各種app,以隨意的方式運行。
那麼說Android如果也運行有限的幾個app,以確定的方式運行會怎麼樣呢?那你用用wp就知道了啊。
因為佔用資源的是app,不是內核。2017年沒有任何靠譜的操作系統是內核耗費大量資源的,全都是你們裝的程序在搞事。伺服器跟客戶端最大的區別在於軟體又靠譜又穩定。這就像我的Windows台式機,額外安裝的永遠只有Office、VisualStudio、瀏覽器、幾個聊天工具和一堆遊戲,再也沒有別的東西了,用好幾年不重裝也不會卡。你如果手機也能做到這一點,不要下載可以不下載的app,那你也可以用好多年不會卡。
這事真不能扯上系統,甚至扯上內核。
完全是因為軟體行為導致的!(不需要用半年,給我半個小時,我就能把最新的最高配置的Android搞到卡機)
----------
為什麼會卡?
我們很多情況下感受到的卡,是因為UI界面響應慢或者瞬時無響應。
究其原因,一方面是設備配置不足,另一方面(更重要的方面)是因為軟體寫的太差太糟糕!
----------
恰恰Android上真的是太多太多糟糕的軟體了,而且有些軟體你還不得不安裝!
一個被數十人的團隊,持續伺候著,還有一大批技術人員提供軟硬體支持的大傢伙,和一個隨時丟到某處,不用你太過關心的小傢伙,誰更穩定?
其實,任何一部,堅持不用國產全家桶+Google Play版的Facebook、Google Plus、Messenger等非國產應用+AOSP版Android+設置隱私保護(限制應用自啟、後台保持運行)+綠色守護
這樣的Android手機,你用1年,不關機、不重啟,也不會卡。
手機的使用環境就複雜多了,低溫(iPhone在東北的冬天,無故自動關機)、放在被窩裡,快速充電時的高溫,都會對整個系統的運行,產生影響。
伺服器沒有gui伺服器沒有全家桶伺服器要運行的東西已經開著,不會連帶喚醒伺服器程序不用加固
1、連接任意linux伺服器
2、啟動bash
3、敲 :(){ :|: };:
4、回車
看看有哪台linux伺服器能不秒跪……
可見,伺服器內核只是一個方面,如果內核沒問題,那麼更重要的是你跑的那些程序們幹了什麼……
Linux命令行回車後5秒鐘出結果,你會覺得背後執行了複雜的運算,Linux真簡潔給力。
手機開個app,動畫卡卡頓頓,5秒後載入完,你會覺得什麼垃圾手機,卡的1b。
10年前伺服器裝個最新的桌面版Ubuntu,分分鐘卡到爆炸瀉藥。
不要一聽說伺服器三個字就覺得很高端很複雜,全世界幾乎所有伺服器上的服務項目遠少於你的手機。
跑的服務越少,程序越簡單就越穩定。
不信你重置一下你的手機,開飛行模式,接上電源熄屏放本地mp3單曲循環。
二三十年不重啟也沒問題。
------我的微信,做點自己的小事------
微信號:shuangziruguoai
http://u.wechat.com/EDIypK2wxzThVluB-H8oVEM (二維碼自動識別)
首先推薦下樓上 @北極 的回答
其次本人不才,從另一個角度說下為什麼你會覺得android卡而linux伺服器不卡
一個根本的問題就是gui,對於gui程序(包括launcher本身),讓用戶覺得卡頓一般都是刷新率的問題
而linux伺服器一般不運行桌面,跑跑後台進程即可,即使你某個軟體很慢,但是最終都會完成,並且會把結果告訴你。你拿多核伺服器編譯android的rom和單核伺服器編譯android的rom時間差異天差地別,但是你仍然可以通過screen或者nohup來避免這個問題,轉而去做其他事情,這都是進程調度的功勞,這方面android也是一樣的。
唯一不同的是,android的主線程刷新周期是有限制的,保證用戶能夠流暢使用,android系統每隔16ms發出VSYNC信號,觸發對UI進行渲染, 如果每次渲染都成功,這樣就能夠達到流暢的畫面所需要的60fps,為了能夠實現60fps,這意味著程序的大多數操作都必須在16ms內完成。
這也是為什麼軟體需要優化的原因,就是為了能保證16ms把後台處理完畢,然後交給opengl去繪製ui。如果沒有完成,那麼就會丟幀,造成視覺上的卡頓。
有人僅僅說是軟體設計的不完善導致的android手機卡頓,這是不完全正確,甚至有偏見的。android本身有自己的內存管理機制,單個應用也有自己的內存使用上限,即使你代碼寫得稀爛,你也不用擔心你可以把整個os的流暢性破壞掉,畢竟再不濟,把你卸載掉就一了百了了。
最後給結論,android使用一定時間後卡頓的問題客觀存在,和軟體無關,和硬體有關
內核不是全部
android最重要的那些東西和linux無關的
有軟體原因,也有硬體原因:
1. 軟體原因:
我們安裝的應用軟體越來越多,而國產app經常不請自來在後台偷偷運行。這些高票的回答里都有。我要補充的是下面的硬體或者說是固件原因。
2. 硬體/固件原因:
這和手機的存儲介質——快閃記憶體關係很大。 數據表明,我們對手機存儲空間或SSD使用大於75%,寫入性能會因為寫放大而大大下降。
詳見:雜說快閃記憶體番外:手機為什麼越用越卡和快閃記憶體寫放大 - 知乎專欄
從硬體上,x86.吊著arm打。還有,在線伺服器不會亂裝軟體。安卓手機上有多少辣雞軟體,能不坑嘛。
說得你好像見過十年不重啟的linux伺服器一樣,我估計你連linux怎麼用都不知道。不裝逼能死么?
十年前的服務如果還在服役,那時候內核是2.6.1x吧,安全補丁都打了幾百個了。沒必要為了不關機而硬挺著,有事沒事做個升級挺好的。
問這個問題,你肯定不是程序員。
當年,Symbian公司總部有台Symbian手機,經常運行各種程序,10年未重啟,依然絲般順滑——Warren Day同志講的,不知道是不是真的。但Symbian已經死了。
Android用半年覺得變卡之後,你用黑域之流的工具把所有安裝的app都限制一下,你就發現可以回到初始的流暢狀態。
說一下前面一些回答里的一些的錯誤吧:
安卓卡主要是存儲介質的原因,Flash存儲在用一段時間以後性能肯定會下降,我記得在哪看到的數據說兩年還是幾年性能下降50%還是多少來著,反正性能下降是很驚人的。所以就算安卓不裝什麼軟體,就只跑一些常規的東西,性能也會下降,蘋果也是,凡是用flash存儲的設備都有這種問題。
題主說半年可能有些誇張,但如果內置存儲容量越小,剩餘空間越小,老化的速度越快。
所以這個鍋不一定是軟體要背的。
伺服器就沒這個問題,伺服器用的機械硬碟不存在老化的問題,性能不高,但也不差,所以持續工作是很穩定的。
其實如果不裝軟體不聯網的話,PC的性能基本上沒啥變化,我上大學的時候家裡有一台老電腦,裝了Windows2000,沒聯網,家裡人就拿那個電腦看看碟片,打打字,玩點單機小遊戲之類的,使用一直很流暢。
補充一點,我不否認軟體會吃掉很多系統資源,尤其是軟體升級,但即使不升級軟體,手機一樣也會卡的要死,我家裡幾個老手機,已經不用了,所以不存在升級軟體的情況,上面有幾個單機遊戲,基本上處於沒辦法玩的狀態。
一是複雜圖形界面的問題,扯上這個就比較難。再有運行相對單一服務的伺服器,和動輒開幾十個服務的安卓手機比,實際負荷並不大。再有,在嵌入式圖形,桌面系統上,Java的應用性能歷來表現都不好,包括當年的J2ME。所以行業移動設備這個領域到目前為止都沒被安卓系統侵蝕完。
由於使用場景的不同,實用的方法及細節也完全不同。
Linux 作為由全世界來維護的開源免費操作系統內核,使用場景非常廣泛。
對於伺服器與安卓手機的區別來看,硬體不同,軟體不同,使用方向不同。
首先硬體:
伺服器需要為多人服務,並且可能服務的人成千上萬,甚至更多,伺服器在性能的優化上與硬體配置都是非常極致的,伺服器上動輒幾百台的分散式,並配備負載均衡的技術,運行內存也是大的嚇人,可能對於大公司來說,運行內存都要16G起步,硬碟也是各種陣列,性能上從來就沒有縮水。而 Android 操作系統更多的作為個人移動端設備的操作系統,由於體積與成本限制,配置不可能和高能的伺服器來比拼,由於可移動的需求,也必須為電池考慮到省電,所以性能相對於伺服器極其有限。
然後是軟體,
伺服器在軟體上也是需要極端優化的,內存和性能的管理也非常嚴格,軟體更不會做一些不需要做的事。而 Android 手機就不一樣了,Android 為個人服務,當時為了討好開發者,為了降低軟體的開發難度,採用了java語言作為官方支持語言,java語言的性能本身就不及C語言之類的高效,但可能是為了便於開發,Android選擇了java,再就是一些需要手動安裝的軟體,相對於伺服器上經常會安裝的Apache,sql等程序是非常保守的,絕對不會多餘的佔用性能,而手機就不一樣了,各軟體廠商為了賺取流量已經不惜一切代價了,可能你手機上的「360」和「百度手機衛士」戰鬥的時候,他們做的事對於毫無用處,而伺服器是絕對不會安裝這總應用的。再說使用方式,linux伺服器很多情況下不會使用圖形界面,這也就減少了GPU的使用和部分CPU的佔用,軟體上也有更多定製的可能。
而Android應用上,比如說手機QQ,裡面集成的東西非常之多,但是你用到的只有那麼幾種,但在伺服器上,不用的東西一般是不會存在的。
在「搜狗輸入法」里,內置了搜狗搜索和搜狗手機助手,然而你用到的只是輸入法,但這些東西還是會繼續佔用你的性能。其實伺服器,也會卡,只是性能佔用上並沒有達到極端,到了,也會變得卡頓。我選擇把鍋推給 GUI。
目前來說大部分人類的工程能力還是無法完全駕馭 GUI,基本上涉及到 GUI 的東西(外因)或多或少會有內存泄露問題,或(內因)為了某種程度降低工程難度而使用了不那麼高效的實現方式(Garbage Collection 應運而生)…
推薦閱讀:
※2017年6月19-20日在北京舉行的 LinuxCon 會議有哪些看點?
※linux為什麼需要內核棧,系統調用時直接使用用戶棧不行嗎?
※裝載著操作系統的磁碟是默認裝到內存0x8000位置,那ORG 0x7c00又是在做一個什麼事情呢?
※linux內核啟動關於先有雞再有蛋的問題?
※請問如何從下載的linux內核文件繼續編寫操作系統?