提纲
提到网络,基本上都能把DNS给扯上去。为啥呢,今天我们来一探究竟。
1 Chrome浏览器原理
还记得面试过程中被问了千百遍的"输入URL后发生了什么"这个经典问题吗,因为这个问题覆盖了太多的知识点,其中包括计算机网络,操作系统,数据结构等一些列问题,对于面试官和面试者来说都更方便后续面试的进展。想必很多小伙伴都做过web开发,或多或少都会和各种浏览器联系在一起,最终做测试的时候也会多种浏览器测试保证能很好地兼容。那么现在我们先从Chrome浏览器说起。
我们先想想一个问题,我们打开一个微信或者一个XX音乐,一个网页,到底会开几个进程。
我们实验看看,打开一个网页到底开了几个进程,又分别有什么作用
打开浏览器使用的 进程数
从上图我们发现,打开一个网页,使用了四个进程,分别为GPU进程,Network Service进程,当前网页进程和浏览器。我们先复习进程与线程。
假设现在有这样几行伪代码,我们看看应该怎么去执行,可能分为四步
示例伪代码
- 计算X=5+2
- 计算y=8/4
- 计算z=2*5
- 显示出最后的结果
这也是采用串行的方式运行,也可说为单线程方式执行了四个任务,其好处是不用考虑诸如多线程的同步等问题。但是如果采用多线程
- 启动三个线程分别处理前面三个任务
- 最后一个线程显示结果
从上面这个小实验,我们可以知道使用多线程只需要两步就完成,但是单线程却使用了四步,可知使用多线程大大的提升了性能,记住:并不是多线程就一定会比单线程好,还需要从cpu使用率,IO磁盘等多个因素考虑。
进程
进程是是一个程序的运行实体,在上面我们比较直观的感受到了多线程并行处理提高性能的优点。一个进程可以包含多个线程,但是一个线程只能归属于一个进程,那么一个进程到底是什么样子呢(ps 下面是在Linux中执行的代码,道理差不多)
创建进程
在Linux中使用fork创建进程,返回进程id。通过id的不同让父子进程各干其事,然后使用execvp执行具体任务
创建进程
创建主函数来使用上面的函数,看看会出现什么情况
主函数
好了,现在主函数和执行函数都写完了,但是这还只是文本文件,对于计算机而言只喜欢"01"组合,cpu执行的命令需要是二进制,所以需要进行「编译」,但是二进制也得有一定的格式,不然定会乱套,在Linux中这种格式是"ELF"Executeableand Linkable Format)。其具体的样子如下所示
文本文件到二进制
现在编译两个程序
编译
在编译的过程中,第一步预处理,将头文件直接嵌入到文件正文中,将定义的相关宏展开,最终编译为.o文件(可重定文件),那么ELF是什么样子呢
ELF头部
上图给大家准备了几个高频面试题目(哪些在代码段,数据段。。)
那么在Linux中如何查看呢(readelf)
可重定位什么意思呢?
字面意思是可以随时放在其他位置。对的,目前我们只是编译了文件,将来会被加载到内存里面,也就是加在某一个位置。可惜现在还是.o文件(代码片段),不具备可执行的权限,它以后想变为函数库,哪里需要就在哪里去完成任务,搬到了哪里就重新定位了位置。要让它可重用,就得成为库文件,这个文件分为静态链接库(.a)和动态链接库,它能将一系列的.o文件归档为文件。怎么创建呢
ar
这个时候其他开发人员准备使用这个功能,加上参数连接过去就好了
上面命令中"-L"代表默认在当前目录寻找.a文件,然后取出.o文件和creteprocess.o做连接形成二进制执行文件 staticcreateprocess。
一旦静态链接库连接出去,它的代码和变量的section合并,一次程序运行不再依赖这个库。这就出问题,如果同样的代码段被多个程序使用,就会导致在内存中出现多份的情况,而且代码一旦更新,二进制文件也需要重新编译才能及时的更新。所以出现了动态链接库(10)
说的有点远了,回来回来。刚才我