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

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

相关文章

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

解决RocketMQ的幂等性问题

《解决RocketMQ的幂等性问题》重复消费因调用链路长、消息发送超时或消费者故障导致,通过生产者消息查询、Redis缓存及消费者唯一主键可以确保幂等性,避免重复处理,本文主要介绍了解决RocketM... 目录造成重复消费的原因解决方法生产者端消费者端代码实现造成重复消费的原因当系统的调用链路比较长的时

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

kkFileView启动报错:报错2003端口占用的问题及解决

《kkFileView启动报错:报错2003端口占用的问题及解决》kkFileView启动报错因office组件2003端口未关闭,解决:查杀占用端口的进程,终止Java进程,使用shutdown.s... 目录原因解决总结kkFileViewjavascript启动报错启动office组件失败,请检查of

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

Java中的xxl-job调度器线程池工作机制

《Java中的xxl-job调度器线程池工作机制》xxl-job通过快慢线程池分离短时与长时任务,动态降级超时任务至慢池,结合异步触发和资源隔离机制,提升高频调度的性能与稳定性,支撑高并发场景下的可靠... 目录⚙️ 一、调度器线程池的核心设计 二、线程池的工作流程 三、线程池配置参数与优化 四、总结:线程

Python错误AttributeError: 'NoneType' object has no attribute问题的彻底解决方法

《Python错误AttributeError:NoneTypeobjecthasnoattribute问题的彻底解决方法》在Python项目开发和调试过程中,经常会碰到这样一个异常信息... 目录问题背景与概述错误解读:AttributeError: 'NoneType' object has no at

WinForm跨线程访问UI及UI卡死的解决方案

《WinForm跨线程访问UI及UI卡死的解决方案》在WinForm开发过程中,跨线程访问UI控件和界面卡死是常见的技术难题,由于Windows窗体应用程序的UI控件默认只能在主线程(UI线程)上操作... 目录前言正文案例1:直接线程操作(无UI访问)案例2:BeginInvoke访问UI(错误用法)案例

一文解密Python进行监控进程的黑科技

《一文解密Python进行监控进程的黑科技》在计算机系统管理和应用性能优化中,监控进程的CPU、内存和IO使用率是非常重要的任务,下面我们就来讲讲如何Python写一个简单使用的监控进程的工具吧... 目录准备工作监控CPU使用率监控内存使用率监控IO使用率小工具代码整合在计算机系统管理和应用性能优化中,监

Spring的RedisTemplate的json反序列泛型丢失问题解决

《Spring的RedisTemplate的json反序列泛型丢失问题解决》本文主要介绍了SpringRedisTemplate中使用JSON序列化时泛型信息丢失的问题及其提出三种解决方案,可以根据性... 目录背景解决方案方案一方案二方案三总结背景在使用RedisTemplate操作redis时我们针对