最初,我们在学习进程和线程的时候都是和操作系统的知识相关的,但是我们前端菜鸟除了面试的时候很少用到他们,所以我们还是从前端常见的场景来详细的学习进程和线程吧。
在前端提到关于进程和线程的概念主要有以下几个场景
(1)js 是单线程的编程语言
也就是说在任何事和,js 引擎只能执行一个任务(或者说一个线程),也就是不支持并发。
这也就意味着js 代码在执行的时候只有一个主线程。
什么语言支持并发呢? Java、C#、C++、Python,都是后端的语言,哈哈,不用学习了。
你不会不知道 js 引擎是啥吧?js 引擎就是可以执行js代码的软件或程序,比如我们常见的浏览器和node,浏览器里面都有一个核心的js引擎,比如 chrome 浏览器是 大名鼎鼎的 V8引擎。
(2)浏览器提供两个独立线程分别是 web worker 和 service worker
因为 js 是单线程的变成语言,在运行时不能并发,但是浏览器提供了两个可以实现并发操作的worker,那就是 web worker 和service worker 。
(1)web worker 使用独立的线程后台运行脚本,不会阻塞主线程。
web worker 使用postmessage 和onmessage 和主线程通信
(2)service worker 使用独立的线程,可以拦截网络请求,也不会阻塞主线程。
service worker 需要先注册 navigator.serviceWorker.register,然后再监听install 事件
注意到没有, 关于 javascript 相关的描述都是用的线程。
(3)js 单线程模型和异步编程
js 是单线程模型是没有问题的,这意味着同一时间只能执行一个任务,但是使用异步编程模型,可以使 js 在等待某些操作完成的同时执行其他任务。
异步编程的方法
- 回调函数
- 事件循环
- promise
- async await
(4) 浏览器是多进程的模型
对于浏览器来说,就变成进程了,浏览器是多进程的。这也会是一个面试题,浏览器的进程主要包括:
- 浏览器进程 【也就是主进程,负责浏览器界面功能】
- 网络进程【负责网络请求】
- 渲染进程【对每个标签页渲染 dom 解析等功能,也是我们常说的浏览器的内核】
- 插件进程【浏览器插件】
- GPU 进程【图形处理单元(graphics processing unit)独立的进程,负责页面合成和动画】
- 扩展进程
- 沙盒进程
反正主要的就是1-5个,一定要详细背诵。
其实很好记忆的,你就跟着【浏览器输入url 到页面有返回】的整个过程来记忆就行了,浏览器主要不就是用来浏览网页的么?
(1)查询资料,输入URL【浏览器进程】 =>
(2)发起网络请求【网络进程】=>
(3)页面返回【渲染进程】=>
(4)页面有广告,我用浏览器拦截广告插件拦截一下【插件进程】=>
(5)页面很好看,有花里胡哨的动画【GPU进程】
貌似前端关于进程和线程相关的描述场景就这几个,当然可能有我没有想到的,欢迎补充。
线程(Thread)和进程(Process)是操作系统中用于实现并发执行的两个基本概念,它们之间有密切的关系。
定义:
- 进程: 进程是程序的执行实例,是操作系统进行资源分配和调度的基本单位。一个进程可以包含多个线程。
- 线程: 线程是进程中的一个执行单元,是操作系统进行调度的最小单位。一个进程中的多个线程共享相同的进程资源,包括代码段、数据段和打开的文件等。
关系:
- 一个进程可以包含多个线程: 在多线程的环境下,一个进程可以同时运行多个线程,这些线程共享相同的资源,可以更高效地完成任务。
- 线程共享进程的资源: 线程之间共享相同的进程上下文,包括进程的地址空间、文件描述符和其他资源。
- 线程更轻量级: 相比于进程,线程更为轻量级,因为它们共享大部分的资源,不需要像进程那样维护独立的地址空间。
通信与同步:
- 进程通信: 不同进程之间通信较为复杂,通常需要使用进程间通信(IPC)机制,如消息队列、管道等。
- 线程通信: 由于线程共享同一进程的地址空间,它们可以通过共享的内存空间直接进行通信。但这也需要一些同步机制来确保数据的一致性,避免竞态条件等问题。
独立性:
- 进程独立性: 不同进程拥有独立的地址空间,一个进程的崩溃通常不会影响其他进程。
- 线程共享: 线程共享相同的地址空间,一个线程的错误可能会影响到同一进程中的其他线程。
总的来说,线程是在进程内部执行的一组指令,它们共享进程的资源,能够更有效地完成并发任务。在多核系统中,多线程的使用可以更好地利用系统资源,提高程序的执行效率。然而,由于线程共享资源,需要谨慎处理同步和互斥,以避免产生竞态条件等问题
其他的题目,比如进程和线程的关系和区别,都是通用的知识了。
- 线程是不能单独存在的,他是由进程来启动和管理的。
- 一个进程就是一个程序的运行实例
- 线程是依附于进程的,进程中使用多线程并行处理能提升效率
- 进程中任意一个线程执行出错,都会导致整个进程奔溃
- 线程之间共享资源
- 进程之间相互独立
- 一个进程关闭后,操作系统会回收进程占用的内存