面試大廠應該注意哪些問題?算法太TM重要了

前言

很多次小伙伴問到學習方法,我也很想寫這樣的一篇文章來跟大家討論下關于學習方法這件事情。

其實學習方法這個事情,我沒啥發言權,因為我自己本身都是沒啥方法可言的,就瞎折騰那種,但是大家想看這樣的一篇文章,我就結合身邊比較優秀的仔,那就聊一下這個事情吧。

寫這個文章的的時候我構思了很多種寫法,因為考慮我讀者很多大學生,也有很多畢業的仔,想照顧所有的群體,那我整個文章會從讀書時候的一些學習方法,還有就是工作之后的工作學習方法去寫,這個思路應該也ok。

基于Linux的pc啟動過程

我們都知道,所有的程序軟件包括操作系統都是運行在內存中的,然而我們的操作系統一般是存放在硬盤上的,當我們按下開機鍵的時候,此時內存中什么程序也沒有,因此需要借助某種方式,將操作系統加載到內存中,而完成這項任務的就是 BIOS

裝過系統的人一定知道BIOS這個東西,那么它究竟是什么呢?

BIOS:Basic Input/Output System(基本輸入輸出系統),在IBM PC兼容系統上,是一種業界標準的固件接口(來自維基百科)。有點難以理解,其實BIOS是我們電腦啟動時加載的第一個程序,這個程序不是由Java語言編寫也不是由C語言編寫,一般是匯編程序。

BIOS程序固化在主板上的一塊芯片上,是連接計算機硬件與操作系統的橋梁,它保存著計算機最重要的基本輸入輸出的程序、開機后自檢程序和系統自啟動程序。

那么問題來了,BIOS程序又是怎么啟動的?BIOS的啟動,是由硬件完成的,Intel 80x86系列的cpu的硬件都設計為加電(即開機瞬間)就進入16位實模式狀態運行,此時將cpu的硬件邏輯設計為強行將CS的值設置為0xFFFF,IP的值設置為0x0000,這樣CS:IP就指向了0xFFFF0這個位置,而這個位置就是BIOS程序的入口地址。

因此這是一個硬件廠商之間的約定,所有的BIOS程序入口地址均為0xFFFF0,這樣在開機的時候,就找到這個地址,如果該地址并沒有代碼段,那么計算機將會死機,如果這個地址處有代碼段,將會執行這個代碼段,并由此執行下去,即BIOS程序開始啟動。

補充:
**CS:**代碼段寄存器,存在于CPU中,指向CPU當前執行代碼在內存中所在的區域。
**IP:**指令寄存器,存在于CPU中,記錄將要執行的指令在代碼段內的偏移地址,與CS組合即為將要執行的指令的內存地址。

當BIOS程序啟動時,就會檢測硬件設備,比如我們的顯卡、內存等信息。BIOS會在內存中建立中斷向量表和中斷服務程序。中斷向量表中有256個中斷向量,每個中斷向量占4個字節,每個中斷向量指向一個中斷服務程序,這些中斷服務程序完成了將操作系統由硬盤加載到內存中的任務.
基于linux的操作系統而言,計算機將分三批逐次加載操作系統的代碼,第一批由BIOS中斷int 0x19將 第一扇區bootsect的內容加載到內存;第二批和第三批在bootsect的指揮下,分別加載后面扇區的內容到內存中。

**經過執行一系列的BIOS代碼后,計算機完成了自檢等操作,**計算機硬件體系會與BIOS聯合操作,讓cpu接收到一個int 0x19中斷,cpu接收到這個中斷后,會立即在中斷向量表中找到int 0x19中斷向量,此時會找到對應的中斷服務程序,并由該中斷服務程序將硬盤中第一個扇區的引導程序加在到內存中的指定位置。

**隨后,在引導程序的作用下,陸續將操作系統的其他程序載入內存,**完成實模式到保護模式的轉變,為執行操作系統的入口函數main做準備,后面就是操作系統的初始化工作了,最后完成計算機的啟動。

Android手機的啟動過程

Android系統雖然也是基于linux系統的,但是由于Android屬于嵌入式設備,并沒有像pc那樣的BIOS程序。

取而代之的是Bootloader ——系統啟動加載器。它類似于BIOS,在系統加載前,用以初始化硬件設備,建立內存空間的映像圖,為最終調用系統內核準備好環境。

在Android里沒有硬盤,而是ROM ,它類似于硬盤存放操作系統,用戶程序等。ROM跟硬盤一樣也會劃分為不同的區域,用于放置不同的程序,在Android中主要劃分為一下幾個分區:

  • /boot:存放引導程序,包括內核和內存操作程序
  • /system:相當于電腦c盤,存放Android系統及系統應用
  • /recovery:恢復分區,可以進入該分區進行系統恢復
  • /data:用戶數據區,包含了用戶的數據:聯系人、短信、設置、用戶安裝的程序
  • /cache:安卓系統緩存區,保存系統最常訪問的數據和應用程序
  • /misc:包含一些雜項內容,如系統設置和系統功能啟用禁用設置
  • /sdcard:用戶自己的存儲區,可以存放照片,音樂,視頻等文件

那么Bootloader是如何被加載的呢?我們可以想到,應該跟pc一樣,當開機加電的時候,cpu會從cpu制造廠商預設的地址上取指令,這個地址是各廠商約定俗稱的,類似于上面80x86架構里的0xFFFF0地址,因此Android手機會將固態存儲設備ROM預先映射到該地址上,當開機加電的時候,cpu就會從該地址執行/boot分區下的Bootloader程序,載入linux內核到RAM中。

當linux內核啟動后會初始化各種軟硬件環境,加載驅動程序,掛載根文件系統,并開始執行根文件系統的init程序,init程序是Android啟動過程中最重要的核心程序。

init進程是Android系統中用戶進程的鼻祖進程。init進程會啟動各種系統本地服務,如:Media Server、Service Manager、bootanim(開機動畫)等。init進程會在解析init.rc文件后fork出Zygote,而Zygote是所有Java進程的父進程,我們的App都是由Zygote fork出來的。
Zygote進程主要包含:

  • 加載ZygoteInit類,注冊Zygote Socket服務端套接字;
  • 加載虛擬機;
  • 預加載Android核心類
  • 預加載系統資源

隨后Zygote進程會fork出System Server進程,System Server進程負責啟動和管理整個framework,包括Activity Manager,PowerManager等服務。

當System Server將系統服務啟動就緒后,就會通知ActivityManager啟動首個Android程序Home即我們看到的桌面程序。

至此,從Android手機開機到看到桌面程序所有過程分析完了。

結尾

最后,針對上面談的內容,給大家推薦一個Android資料,應該對大家有用。

首先是一個知識清單:(對于現在的Android及移動互聯網來說,我們需要掌握的技術)

泛型原理丶反射原理丶Java虛擬機原理丶線程池原理丶
注解原理丶注解原理丶序列化
Activity知識體系(Activity的生命周期丶Activity的任務棧丶Activity的啟動模式丶View源碼丶Fragment內核相關丶service原理等)
代碼框架結構優化(數據結構丶排序算法丶設計模式)
APP性能優化(用戶體驗優化丶適配丶代碼調優)
熱修復丶熱升級丶Hook技術丶IOC架構設計
NDK(c編程丶C++丶JNI丶LINUX)
如何提高開發效率?
MVC丶MVP丶MVVM
微信小程序
Hybrid
Flutter

接下來是資料清單:(敲黑板!!!

領取通道在這里給你們擺上了~

點擊我的GitHub免費獲取

1.數據結構和算法

2.設計模式

3.全套體系化高級架構視頻;七大主流技術模塊,視頻+源碼+筆記

4.面試專題資料包(怎么能少了一份全面的面試題總結呢~)

不論遇到什么困難,都不應該成為我們放棄的理由!共勉~

如果你看到了這里,覺得文章寫得不錯就給個贊唄?如果你覺得那里值得改進的,請給我留言。一定會認真查詢,修正不足。謝謝。


為我們放棄的理由!共勉~

如果你看到了這里,覺得文章寫得不錯就給個贊唄?如果你覺得那里值得改進的,請給我留言。一定會認真查詢,修正不足。謝謝。

[外鏈圖片轉存中…(img-yIQiPwlz-1618646889368)]

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/news/386676.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/386676.shtml
英文地址,請注明出處:http://en.pswp.cn/news/386676.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring Boot 與 Java 對應版本,以下表格由官方網站總結。

Spring Boot 與 Java 對應版本,以下表格由官方網站總結。 官網:https://spring.io/projects/spring-boot#learn https://docs.spring.io/spring-boot/docs/{verion}/reference/htmlsingle/ Go to [9. System Requirements] Sping BootSpring Framew…

Java開發環境之RabbitMQ

查看更多Java開發環境配置,請點擊《Java開發環境配置大全》 捌章:RabbitMQ安裝教程 1)下載安裝Erlang 官網下載:http://www.erlang.org,有時比較難訪問進去 Windows版下載:http://www.erlang.org/download/…

Linux下GitLab的安裝及使用

一、初始GitLab GitLab是利用Ruby on Rails一個開源的版本管理系統,實現一個自托管的Git項目倉庫,可通過Web界面進行訪問公開的或者私人項目。 與Github類似,GitLab能夠瀏覽源代碼,管理缺陷和注釋。可以管理團隊對倉庫的訪問&a…

面試大廠應該注意哪些問題?隔壁都饞哭了

前言 說起程序員人們的第一印象就是工資高、加班兇、話少錢多頭發少。再加上現在科技互聯網公司太吃香,bat、華為小米等公司程序員加班情況被廣泛傳播,程序員用生命在敲代碼的印象刻在了很多人的心里。 與其它行業一樣,凡是有高級和普通&…

元類(metaclass)

目錄 一、引言二、什么是元類三、為什么用元類四、內置函數exec(儲備)五、class創建類5.1 type實現六、自定義元類控制類的創建6.1 應用七、__call__(儲備)八、__new__(儲備)九、自定義元類控制類的實例化一十、自定義元類后類的繼承順序十一、練習一、引言 元類屬于python面向…

Linux環境下使用rpm包安裝GitLab

1.安裝依賴環境 [rootgitlab ~]# yum install curl openssh-server postfix cronie 2.下載安裝GitLab包 我安裝的環境是Red Hat Enterprise Linux Server release 7.4 (Maipo) GitLab下載地址:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7 以上是清華大學開源…

面試字節跳動Android工程師該怎么準備?深度解析,值得收藏

前言 Android高級架構師需要學習哪些知識呢? 下面總結一下我認為作為一個資深開發者需要掌握的技能點。 1.Android開發的幾個階段 我的10年開發生涯中,有9年都是做Android相關開發,以我個人的經歷來看,Android開發市場分為以下…

以JSONobject形式提交http請求

總結一下設置圖標的三種方式: (1)button屬性:主要用于圖標大小要求不高,間隔要求也不高的場合。 (2)background屬性:主要用于能夠以較大空間顯示圖標的場合。 (3&#xf…

阿里巴巴Android面試都問些什么?系列篇

Google 為了幫助 Android 開發者更快更好地開發 App,推出了一系列組件,這些組件被打包成了一個整體,稱作 Android Jetpack,它包含的組件如下圖所示: 老的 support 包被整合進了 Jetpack,例如上圖 Foundatio…

安裝容器編排工具 Docker Compose

安裝容器編排工具 Docker Compose curl -L https://get.daocloud.io/docker/compose/releases/download/1.22.0/docker-compose-uname -s-uname -m > /usr/local/bin/docker-compose 授權: chmod x /usr/local/bin/docker-compose 查看安裝結果 docker-com…

docker-compose安裝elk7.1.1版本

在用docker-compose編排elk三個服務時,碰到了很多坑,網上很多資料編排的版本都不是最新的版本,我們這里用的 elasticsearch,logstash,kibana全都是elastic官方提供的目前最新版本7.1.1,高版本和低版本的一些…

阿里P8成長路線!我的頭條面試經歷分享,吊打面試官系列!

正式加入字節跳動,分享一點面試小經驗 今天正式入職了字節跳動。工號超吉利,尾數是3個6。然后辦公環境也很好,這邊一棟樓都是辦公區域。公司內部配備各種小零食、飲料,還有免費的咖啡。15樓還有健身房。而且公司包三餐來著。下午…

實驗十一:圖形界面二

實驗程序如下:import java.awt.*;import java.awt.event.*;import javax.swing.*;public class Example1 extends JFrame { private int add1,sub2,mul3,div4; private int op0; boolean ifOp; private String output"0"; private Button[] jbanew Button…

Docker安裝部署ELK教程 (Elasticsearch+Kibana+Logstash)

Elasticsearch 是個開源分布式搜索引擎,它的特點有:分布式,零配置,自動發現,索引自動分片,索引副本機制,restful風格接口,多數據源,自動搜索負載等。 Logstash 是一個完…

阿里P8面試官都說太詳細了,面試資料分享

背景 知乎客戶端中有一個自己維護的 Hybrid 框架&#xff0c;在此基礎上開發了一些 Hybrid 頁面&#xff0c;當需要前端或者客戶端開發接口的時候&#xff0c;就涉及到聯調的問題。 和一般的 前端 <> 服務端&#xff0c;或者 客戶端 <> 服務端 類似&#xff0c;前…

virtual和override

偶然間看到的題&#xff0c;借此記錄。 class Program{static void Main(string[] args){D d new D(); //第一個D是申明類&#xff0c;第二個D是實例類A a d;B b d;C c d;a.F();b.F();c.F();d.F();}class A{public virtual void F() { Console.WriteLine("A.F")…

阿里內部資料!如何試出一個Android開發者真正的水平?系列教學

前言 馬爸爸總結了一句話&#xff1a;跳槽&#xff0c;要么是錢不到位&#xff0c;要么是受了委屈。 我給自己這次的跳槽經歷做了一個分析&#xff0c;希望能對那些想換工作的朋友有所幫助。 許多朋友想換工作&#xff0c;但是對“換工作”的理解可能僅限于寫簡歷、投簡歷、…

CentOS7 linux下yum安裝redis以及使用

CentOS7 linux下yum安裝redis以及使用 1.安裝redis數據庫 1 yum install redis 2.下載fedora的epel倉庫 yum install epel-release 3.啟動redis服務 systemctl start redis 4.查看redis狀態 systemctl status redis systemctl stop redis 停止服務 systemctl restart r…

Codeforces 1182A Filling Shapes

題目鏈接&#xff1a;http://codeforces.com/problemset/problem/1182/A 思路&#xff1a;n為奇數時不可能完全填充&#xff0c;ans 0。發現若要完全填充&#xff0c;每倆列可產生倆種情況&#xff0c;所以為 ans 2n/2 AC代碼&#xff1a; 1 #include<bits/stdc.h>2 us…

阿里大神最佳總結Flutter進階學習筆記,技術詳細介紹

開頭 很多人工作了十年&#xff0c;但只是用一年的工作經驗做了十年而已。 高級工程師一直是市場所需要的&#xff0c;然而很多初級工程師在進階高級工程師的過程中一直是一個瓶頸。 移動研發在最近兩年可以說越來越趨于穩定&#xff0c;因為越來越多人開始學習Android開發&…