老生常谈问题之——进程和线程的关系和区别

2024-01-04 12:20

本文主要是介绍老生常谈问题之——进程和线程的关系和区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最初,我们在学习进程和线程的时候都是和操作系统的知识相关的,但是我们前端菜鸟除了面试的时候很少用到他们,所以我们还是从前端常见的场景来详细的学习进程和线程吧。

在前端提到关于进程和线程的概念主要有以下几个场景

(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 在等待某些操作完成的同时执行其他任务。

异步编程的方法

  1. 回调函数
  2. 事件循环
  3. promise
  4. async await

(4) 浏览器是多进程的模型

对于浏览器来说,就变成进程了,浏览器是多进程的。这也会是一个面试题,浏览器的进程主要包括:

  1. 浏览器进程 【也就是主进程,负责浏览器界面功能】
  2. 网络进程【负责网络请求】
  3. 渲染进程【对每个标签页渲染 dom 解析等功能,也是我们常说的浏览器的内核】
  4. 插件进程【浏览器插件】
  5. GPU 进程【图形处理单元(graphics processing unit)独立的进程,负责页面合成和动画】
  6. 扩展进程
  7. 沙盒进程

反正主要的就是1-5个,一定要详细背诵。

其实很好记忆的,你就跟着【浏览器输入url 到页面有返回】的整个过程来记忆就行了,浏览器主要不就是用来浏览网页的么?

(1)查询资料,输入URL【浏览器进程】 =>

(2)发起网络请求【网络进程】=>

(3)页面返回【渲染进程】=>

(4)页面有广告,我用浏览器拦截广告插件拦截一下【插件进程】=>

(5)页面很好看,有花里胡哨的动画【GPU进程】

貌似前端关于进程和线程相关的描述场景就这几个,当然可能有我没有想到的,欢迎补充。 

线程(Thread)和进程(Process)是操作系统中用于实现并发执行的两个基本概念,它们之间有密切的关系。

  1. 定义:

    • 进程: 进程是程序的执行实例,是操作系统进行资源分配和调度的基本单位。一个进程可以包含多个线程。
    • 线程: 线程是进程中的一个执行单元,是操作系统进行调度的最小单位。一个进程中的多个线程共享相同的进程资源,包括代码段、数据段和打开的文件等。
  2. 关系:

    • 一个进程可以包含多个线程: 在多线程的环境下,一个进程可以同时运行多个线程,这些线程共享相同的资源,可以更高效地完成任务。
    • 线程共享进程的资源: 线程之间共享相同的进程上下文,包括进程的地址空间、文件描述符和其他资源。
    • 线程更轻量级: 相比于进程,线程更为轻量级,因为它们共享大部分的资源,不需要像进程那样维护独立的地址空间。
  3. 通信与同步:

    • 进程通信: 不同进程之间通信较为复杂,通常需要使用进程间通信(IPC)机制,如消息队列、管道等。
    • 线程通信: 由于线程共享同一进程的地址空间,它们可以通过共享的内存空间直接进行通信。但这也需要一些同步机制来确保数据的一致性,避免竞态条件等问题。
  4. 独立性:

    • 进程独立性: 不同进程拥有独立的地址空间,一个进程的崩溃通常不会影响其他进程。
    • 线程共享: 线程共享相同的地址空间,一个线程的错误可能会影响到同一进程中的其他线程。

总的来说,线程是在进程内部执行的一组指令,它们共享进程的资源,能够更有效地完成并发任务。在多核系统中,多线程的使用可以更好地利用系统资源,提高程序的执行效率。然而,由于线程共享资源,需要谨慎处理同步和互斥,以避免产生竞态条件等问题

其他的题目,比如进程和线程的关系和区别,都是通用的知识了。 

  1.  线程是不能单独存在的,他是由进程来启动和管理的。
  2. 一个进程就是一个程序的运行实例
  3. 线程是依附于进程的,进程中使用多线程并行处理能提升效率
  4. 进程中任意一个线程执行出错,都会导致整个进程奔溃
  5. 线程之间共享资源
  6. 进程之间相互独立
  7. 一个进程关闭后,操作系统会回收进程占用的内存

这篇关于老生常谈问题之——进程和线程的关系和区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/569320

相关文章

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

mybatis和mybatis-plus设置值为null不起作用问题及解决

《mybatis和mybatis-plus设置值为null不起作用问题及解决》Mybatis-Plus的FieldStrategy主要用于控制新增、更新和查询时对空值的处理策略,通过配置不同的策略类型... 目录MyBATis-plusFieldStrategy作用FieldStrategy类型每种策略的作

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了

pip install jupyterlab失败的原因问题及探索

《pipinstalljupyterlab失败的原因问题及探索》在学习Yolo模型时,尝试安装JupyterLab但遇到错误,错误提示缺少Rust和Cargo编译环境,因为pywinpty包需要它... 目录背景问题解决方案总结背景最近在学习Yolo模型,然后其中要下载jupyter(有点LSVmu像一个

解决jupyterLab打开后出现Config option `template_path`not recognized by `ExporterCollapsibleHeadings`问题

《解决jupyterLab打开后出现Configoption`template_path`notrecognizedby`ExporterCollapsibleHeadings`问题》在Ju... 目录jupyterLab打开后出现“templandroidate_path”相关问题这是 tensorflo

如何解决Pycharm编辑内容时有光标的问题

《如何解决Pycharm编辑内容时有光标的问题》文章介绍了如何在PyCharm中配置VimEmulator插件,包括检查插件是否已安装、下载插件以及安装IdeaVim插件的步骤... 目录Pycharm编辑内容时有光标1.如果Vim Emulator前面有对勾2.www.chinasem.cn如果tools工

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明