本文已参与「新人创作礼」活动,一起开启掘金创作之路。
进程和线程
进程
进程就是一个程序的运行实例,简单来说当我们启动一个程序的时候,操作系统就需要为这个程序分配一片内存,这个内存中包含了代码,运行时的数据和一个主线程。这样的一个运行环境就可以称之为进程。
线程
线程是操作系统能够运行运算调度的最小单位。
二者关系
我们可以把进程看作一个作坊,线程是作坊里的工人,作坊(进程)为工人(线程)提供工作环境(运行环境),一个作坊(进程)内可以有多个工人(线程)-多线程,工人(线程)需要借助作坊(进程)这个环境来进行生产(运算或一些其他操作)。不过这个例子也有不太恰当的地方,作坊中一个工人的罢工不会导致整个作坊的停产,但是进程中的任意一个线程出错都会导致整个进程的崩溃。总而言之,进程与线程间的关系可以分为以下四条:
- 进程间的任一线程出错,都会导致整个进程的崩溃
- 进程中的线程可以共享进程中的数据
- 当一个进程关闭时,操作系统会将该进程的内存回收掉
- 进程间的内容相互隔离,不可随便访问,访问其余进程的内容需要通过进程间协议IPC
早期的chrome浏览器
早期的chrome浏览器是单进程的,这也就意味着浏览器中对于网络资源的下载操作,页面渲染操作以及插件等都是运行在同一个进程里的,这样其实会导致几个问题
- 浏览器中的插件是很容易出现问题导致线程出错的,线程一出错线程所在的进程就会崩溃,而由于浏览器本身单进程的特点,就会导致整个浏览器崩溃
- 安全性问题,对于下载的插件和下载的一些网络资源,其余可能含有一些恶意代码,这些恶意代码可以直接读取操作系统的数据,也可以向操作系统写入数据。可能会造成操作系统出现重大问题。
如今的多进程chrome浏览器
经过不断地发展,现在的chrome浏览器已经是多进程的了,页面的渲染被单独放在了渲染进程里,插件被放在了单独的插件进程里,网络资源的下载也有一个单独的网络进程。接下来可以看一下早期的单进程浏览器中的问题是如何被解决的
- 进程间是相互隔离的的,当一个页面或者插件崩溃影响的仅仅时当前的页面进程或者插件进程而不会导致整个浏览器的崩溃。
- 浏览器将插件进程和渲染进程放在了安全沙箱里,可以把安全沙箱理解为一堵墙,这堵墙将内(渲染进程和插进进程)外(操作系统)隔离开,使得沙箱内的进程无法向操作系统进行写入操作,对于一些敏感的数据也限制了沙箱内进程的读取操作。这样保障了操作系统的安全。