当我面完「腾讯」才知道真正的「DNS」是啥(长文预警)

 

提纲

提纲

提到网络,基本上都能把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头部

ELF头部

上图给大家准备了几个高频面试题目(哪些在代码段,数据段。。)

那么在Linux中如何查看呢(readelf)

可重定位什么意思呢?

字面意思是可以随时放在其他位置。对的,目前我们只是编译了文件,将来会被加载到内存里面,也就是加在某一个位置。可惜现在还是.o文件(代码片段),不具备可执行的权限,它以后想变为函数库,哪里需要就在哪里去完成任务,搬到了哪里就重新定位了位置。要让它可重用,就得成为库文件,这个文件分为静态链接库(.a)和动态链接库,它能将一系列的.o文件归档为文件。怎么创建呢

ar

ar

这个时候其他开发人员准备使用这个功能,加上参数连接过去就好了

 

上面命令中"-L"代表默认在当前目录寻找.a文件,然后取出.o文件和creteprocess.o做连接形成二进制执行文件 staticcreateprocess。

一旦静态链接库连接出去,它的代码和变量的section合并,一次程序运行不再依赖这个库。这就出问题,如果同样的代码段被多个程序使用,就会导致在内存中出现多份的情况,而且代码一旦更新,二进制文件也需要重新编译才能及时的更新。所以出现了动态链接库(10)

说的有点远了,回来回来。刚才我

  • 13
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值