面试大厂应该注意哪些问题?算法太TM重要了
前言
很多次小伙伴問到學(xué)習(xí)方法,我也很想寫這樣的一篇文章來跟大家討論下關(guān)于學(xué)習(xí)方法這件事情。
其實(shí)學(xué)習(xí)方法這個(gè)事情,我沒啥發(fā)言權(quán),因?yàn)槲易约罕旧矶际菦]啥方法可言的,就瞎折騰那種,但是大家想看這樣的一篇文章,我就結(jié)合身邊比較優(yōu)秀的仔,那就聊一下這個(gè)事情吧。
寫這個(gè)文章的的時(shí)候我構(gòu)思了很多種寫法,因?yàn)榭紤]我讀者很多大學(xué)生,也有很多畢業(yè)的仔,想照顧所有的群體,那我整個(gè)文章會(huì)從讀書時(shí)候的一些學(xué)習(xí)方法,還有就是工作之后的工作學(xué)習(xí)方法去寫,這個(gè)思路應(yīng)該也ok。
基于Linux的pc啟動(dòng)過程
我們都知道,所有的程序軟件包括操作系統(tǒng)都是運(yùn)行在內(nèi)存中的,然而我們的操作系統(tǒng)一般是存放在硬盤上的,當(dāng)我們按下開機(jī)鍵的時(shí)候,此時(shí)內(nèi)存中什么程序也沒有,因此需要借助某種方式,將操作系統(tǒng)加載到內(nèi)存中,而完成這項(xiàng)任務(wù)的就是 BIOS 。
裝過系統(tǒng)的人一定知道BIOS這個(gè)東西,那么它究竟是什么呢?
BIOS:Basic Input/Output System(基本輸入輸出系統(tǒng)),在IBM PC兼容系統(tǒng)上,是一種業(yè)界標(biāo)準(zhǔn)的固件接口(來自維基百科)。有點(diǎn)難以理解,其實(shí)BIOS是我們電腦啟動(dòng)時(shí)加載的第一個(gè)程序,這個(gè)程序不是由Java語言編寫也不是由C語言編寫,一般是匯編程序。
BIOS程序固化在主板上的一塊芯片上,是連接計(jì)算機(jī)硬件與操作系統(tǒng)的橋梁,它保存著計(jì)算機(jī)最重要的基本輸入輸出的程序、開機(jī)后自檢程序和系統(tǒng)自啟動(dòng)程序。
那么問題來了,BIOS程序又是怎么啟動(dòng)的?BIOS的啟動(dòng),是由硬件完成的,Intel 80x86系列的cpu的硬件都設(shè)計(jì)為加電(即開機(jī)瞬間)就進(jìn)入16位實(shí)模式狀態(tài)運(yùn)行,此時(shí)將cpu的硬件邏輯設(shè)計(jì)為強(qiáng)行將CS的值設(shè)置為0xFFFF,IP的值設(shè)置為0x0000,這樣CS:IP就指向了0xFFFF0這個(gè)位置,而這個(gè)位置就是BIOS程序的入口地址。
因此這是一個(gè)硬件廠商之間的約定,所有的BIOS程序入口地址均為0xFFFF0,這樣在開機(jī)的時(shí)候,就找到這個(gè)地址,如果該地址并沒有代碼段,那么計(jì)算機(jī)將會(huì)死機(jī),如果這個(gè)地址處有代碼段,將會(huì)執(zhí)行這個(gè)代碼段,并由此執(zhí)行下去,即BIOS程序開始啟動(dòng)。
補(bǔ)充:
**CS:**代碼段寄存器,存在于CPU中,指向CPU當(dāng)前執(zhí)行代碼在內(nèi)存中所在的區(qū)域。
**IP:**指令寄存器,存在于CPU中,記錄將要執(zhí)行的指令在代碼段內(nèi)的偏移地址,與CS組合即為將要執(zhí)行的指令的內(nèi)存地址。
當(dāng)BIOS程序啟動(dòng)時(shí),就會(huì)檢測(cè)硬件設(shè)備,比如我們的顯卡、內(nèi)存等信息。BIOS會(huì)在內(nèi)存中建立中斷向量表和中斷服務(wù)程序。中斷向量表中有256個(gè)中斷向量,每個(gè)中斷向量占4個(gè)字節(jié),每個(gè)中斷向量指向一個(gè)中斷服務(wù)程序,這些中斷服務(wù)程序完成了將操作系統(tǒng)由硬盤加載到內(nèi)存中的任務(wù).
基于linux的操作系統(tǒng)而言,計(jì)算機(jī)將分三批逐次加載操作系統(tǒng)的代碼,第一批由BIOS中斷int 0x19將 第一扇區(qū)bootsect的內(nèi)容加載到內(nèi)存;第二批和第三批在bootsect的指揮下,分別加載后面扇區(qū)的內(nèi)容到內(nèi)存中。
**經(jīng)過執(zhí)行一系列的BIOS代碼后,計(jì)算機(jī)完成了自檢等操作,**計(jì)算機(jī)硬件體系會(huì)與BIOS聯(lián)合操作,讓cpu接收到一個(gè)int 0x19中斷,cpu接收到這個(gè)中斷后,會(huì)立即在中斷向量表中找到int 0x19中斷向量,此時(shí)會(huì)找到對(duì)應(yīng)的中斷服務(wù)程序,并由該中斷服務(wù)程序?qū)⒂脖P中第一個(gè)扇區(qū)的引導(dǎo)程序加在到內(nèi)存中的指定位置。
**隨后,在引導(dǎo)程序的作用下,陸續(xù)將操作系統(tǒng)的其他程序載入內(nèi)存,**完成實(shí)模式到保護(hù)模式的轉(zhuǎn)變,為執(zhí)行操作系統(tǒng)的入口函數(shù)main做準(zhǔn)備,后面就是操作系統(tǒng)的初始化工作了,最后完成計(jì)算機(jī)的啟動(dòng)。
Android手機(jī)的啟動(dòng)過程
Android系統(tǒng)雖然也是基于linux系統(tǒng)的,但是由于Android屬于嵌入式設(shè)備,并沒有像pc那樣的BIOS程序。
取而代之的是Bootloader ——系統(tǒng)啟動(dòng)加載器。它類似于BIOS,在系統(tǒng)加載前,用以初始化硬件設(shè)備,建立內(nèi)存空間的映像圖,為最終調(diào)用系統(tǒng)內(nèi)核準(zhǔn)備好環(huán)境。
在Android里沒有硬盤,而是ROM ,它類似于硬盤存放操作系統(tǒng),用戶程序等。ROM跟硬盤一樣也會(huì)劃分為不同的區(qū)域,用于放置不同的程序,在Android中主要?jiǎng)澐譃橐幌聨讉€(gè)分區(qū):
- /boot:存放引導(dǎo)程序,包括內(nèi)核和內(nèi)存操作程序
- /system:相當(dāng)于電腦c盤,存放Android系統(tǒng)及系統(tǒng)應(yīng)用
- /recovery:恢復(fù)分區(qū),可以進(jìn)入該分區(qū)進(jìn)行系統(tǒng)恢復(fù)
- /data:用戶數(shù)據(jù)區(qū),包含了用戶的數(shù)據(jù):聯(lián)系人、短信、設(shè)置、用戶安裝的程序
- /cache:安卓系統(tǒng)緩存區(qū),保存系統(tǒng)最常訪問的數(shù)據(jù)和應(yīng)用程序
- /misc:包含一些雜項(xiàng)內(nèi)容,如系統(tǒng)設(shè)置和系統(tǒng)功能啟用禁用設(shè)置
- /sdcard:用戶自己的存儲(chǔ)區(qū),可以存放照片,音樂,視頻等文件
那么Bootloader是如何被加載的呢?我們可以想到,應(yīng)該跟pc一樣,當(dāng)開機(jī)加電的時(shí)候,cpu會(huì)從cpu制造廠商預(yù)設(shè)的地址上取指令,這個(gè)地址是各廠商約定俗稱的,類似于上面80x86架構(gòu)里的0xFFFF0地址,因此Android手機(jī)會(huì)將固態(tài)存儲(chǔ)設(shè)備ROM預(yù)先映射到該地址上,當(dāng)開機(jī)加電的時(shí)候,cpu就會(huì)從該地址執(zhí)行/boot分區(qū)下的Bootloader程序,載入linux內(nèi)核到RAM中。
當(dāng)linux內(nèi)核啟動(dòng)后會(huì)初始化各種軟硬件環(huán)境,加載驅(qū)動(dòng)程序,掛載根文件系統(tǒng),并開始執(zhí)行根文件系統(tǒng)的init程序,init程序是Android啟動(dòng)過程中最重要的核心程序。
init進(jìn)程是Android系統(tǒng)中用戶進(jìn)程的鼻祖進(jìn)程。init進(jìn)程會(huì)啟動(dòng)各種系統(tǒng)本地服務(wù),如:Media Server、Service Manager、bootanim(開機(jī)動(dòng)畫)等。init進(jìn)程會(huì)在解析init.rc文件后fork出Zygote,而Zygote是所有Java進(jìn)程的父進(jìn)程,我們的App都是由Zygote fork出來的。
Zygote進(jìn)程主要包含:
- 加載ZygoteInit類,注冊(cè)Zygote Socket服務(wù)端套接字;
- 加載虛擬機(jī);
- 預(yù)加載Android核心類
- 預(yù)加載系統(tǒng)資源
隨后Zygote進(jìn)程會(huì)fork出System Server進(jìn)程,System Server進(jìn)程負(fù)責(zé)啟動(dòng)和管理整個(gè)framework,包括Activity Manager,PowerManager等服務(wù)。
當(dāng)System Server將系統(tǒng)服務(wù)啟動(dòng)就緒后,就會(huì)通知ActivityManager啟動(dòng)首個(gè)Android程序Home即我們看到的桌面程序。
至此,從Android手機(jī)開機(jī)到看到桌面程序所有過程分析完了。
結(jié)尾
最后,針對(duì)上面談的內(nèi)容,給大家推薦一個(gè)Android資料,應(yīng)該對(duì)大家有用。
首先是一個(gè)知識(shí)清單:(對(duì)于現(xiàn)在的Android及移動(dòng)互聯(lián)網(wǎng)來說,我們需要掌握的技術(shù))
泛型原理丶反射原理丶Java虛擬機(jī)原理丶線程池原理丶
注解原理丶注解原理丶序列化
Activity知識(shí)體系(Activity的生命周期丶Activity的任務(wù)棧丶Activity的啟動(dòng)模式丶View源碼丶Fragment內(nèi)核相關(guān)丶service原理等)
代碼框架結(jié)構(gòu)優(yōu)化(數(shù)據(jù)結(jié)構(gòu)丶排序算法丶設(shè)計(jì)模式)
APP性能優(yōu)化(用戶體驗(yàn)優(yōu)化丶適配丶代碼調(diào)優(yōu))
熱修復(fù)丶熱升級(jí)丶Hook技術(shù)丶IOC架構(gòu)設(shè)計(jì)
NDK(c編程丶C++丶JNI丶LINUX)
如何提高開發(fā)效率?
MVC丶MVP丶MVVM
微信小程序
Hybrid
Flutter
接下來是資料清單:(敲黑板!!!)
領(lǐng)取通道在這里給你們擺上了~
點(diǎn)擊我的GitHub免費(fèi)獲取
1.數(shù)據(jù)結(jié)構(gòu)和算法
2.設(shè)計(jì)模式
3.全套體系化高級(jí)架構(gòu)視頻;七大主流技術(shù)模塊,視頻+源碼+筆記
4.面試專題資料包(怎么能少了一份全面的面試題總結(jié)呢~)
不論遇到什么困難,都不應(yīng)該成為我們放棄的理由!共勉~
如果你看到了這里,覺得文章寫得不錯(cuò)就給個(gè)贊唄?如果你覺得那里值得改進(jìn)的,請(qǐng)給我留言。一定會(huì)認(rèn)真查詢,修正不足。謝謝。
為我們放棄的理由!共勉~
如果你看到了這里,覺得文章寫得不錯(cuò)就給個(gè)贊唄?如果你覺得那里值得改進(jìn)的,請(qǐng)給我留言。一定會(huì)認(rèn)真查詢,修正不足。謝謝。
[外鏈圖片轉(zhuǎn)存中…(img-yIQiPwlz-1618646889368)]
總結(jié)
以上是生活随笔為你收集整理的面试大厂应该注意哪些问题?算法太TM重要了的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 英雄联盟死亡颂唱者怎么样?
- 下一篇: 面试大厂应该注意哪些问题?隔壁都馋哭了