百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

关于多线程你知道多少呢?(多线程是干嘛的)

wxin55 2024-10-30 04:36 9 浏览 0 评论


多线程

为了提高CPU的使用效率,将一些需要耗时较多的任务或者涉及到大量I/O操作的程序采用多进程运行,可以提高程序的运行效率。

多线程的概念

  • 程序:指尚未被加载到内存的代码
  • 进程 (Process) : 指正在执行的程序,Operating System (OS) 会分配其所需要的资源,至少存在一个或多个线程,主要包含: Code, Data, Heap, Stack。

Code 存储程序执行的代码

Data可以分为global variable和static variable

Heap 动态分配内存空间给变量和函数

Stack 存储临时性的数据(local variable,function)

  • 线程 (Thread) : 指 OS 分配 CPU 进行运算的基本单位,存在于 Process中。一旦CPU开始执行程序,就会至少有一个Thread运作。
  • 多线程(Multithreading) : 指将一个程序中的任务分配给不同的线程,各个线程平行运作,不互相影响,并且在同一个程序的线程共享内存(shared memory)

不同的程序间没办法共享内存,若有需要互相通讯,唯有依赖特别的设计才能拥有共享内存。


多线程的优点跟缺点

多线程的优点

  1. 提高CPU的使用效率
  2. 当一个线程必须停下来等待与服务器连接或者是需要占据长时间处理的程序,可以放在后台处理,其它线程还是可以继续运行,可以提高处理效率。

多线程的缺点

  1. 如果存在大量的线程就会影响其效能,因为系统需要在它们之间做上下文切换(Context Switch)
  2. 大量的线程需要很多的内存空间
  3. 因为数据是多个线程共享的,因此可能会发生Race Condition的情况


多线程核心机制

上下文切换 (Context Switch) : 指当 CPU 要从一个线程切换至另一个线程时,需要先保存当前线程的状态,再读回将要执行的线程状态。在切换的过程中,需要花费一些时间

Context Switch 的发生的时机 : 因为一颗 CPU 同时只能处理一项程序,OS 就会利用时间轮转的方式,让使用者感觉这些程序都是同时运行。当CPU 认为某线程执行的时间够久時候,就会发出一個中断 (Interrupt) 信号,切换至另一线程去运行

竞争危害 (Race Condition) : 指当一个Thread 修改动作执行到一半时被切换,而另一个 Thread 也正好执行修改同一个地方时,可能会导致内存泄漏 (memory leak)

Race Condition 的发生时机 : 因为程序有时间排程的问题 (发生 Context Switch),在多个线程的情況下,当两个Thread 同时修改一个数据时,可能造成变量的值错误,形成不可预期的结果,便造成了 Race Condition, 解決 Race Condition 的方法就是使用 Critical Section

临界区段 (Critical Section) : 通过对线程的串行化来访问公共资源或一段代码,速度快、适合控制数据的访问。是保证某一时刻只有一个线程访问数据的简便方法。在任何时刻只允许一个线程对共有的资源进行访问。如果有多个线程试图同时访问临界区,那么 在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式操 作共享资源的目的

当线程进入临界区域时,必须使用一些同步机制在临界区域的进入点与离开点实现,以确保这些线程的安全。

  • 同步机制 (Synchronized)有以下集中 : 互斥锁 (Mutex), 信号量 (Semaphore), 条件变量 (Condition Variable), 原子变量 (Atomic), 队列 (Queue), 事件 (Event)

? 但是当這些锁定机制用得不好时,有可能会产生 Deadlock 的状况,所以要特别注意使用

  • 死锁 (Deadlock) : 当两个以上的 Thread,都在互相等待双方停止执行并释放资源,造成循环等待的情況

一旦发生 Deadlock 时,一般没有好的办法可以处理,很多时候只能重启,所以要尽量避免 Deadlock 的状况发生 。

相关推荐

ES6中 Promise的使用场景?(es6promise用法例子)

一、介绍Promise,译为承诺,是异步编程的一种解决方案,比传统的解决方案(回调函数)更加合理和更加强大在以往我们如果处理多层异步操作,我们往往会像下面那样编写我们的代码doSomething(f...

JavaScript 对 Promise 并发的处理方法

Promise对象代表一个未来的值,它有三种状态:pending待定,这是Promise的初始状态,它可能成功,也可能失败,前途未卜fulfilled已完成,这是一种成功的状态,此时可以获取...

Promise的九大方法(promise的实例方法)

1、promise.resolv静态方法Promise.resolve(value)可以认为是newPromise方法的语法糖,比如Promise.resolve(42)可以认为是以下代码的语...

360前端一面~面试题解析(360前端开发面试题)

1.组件库按需加载怎么做的,具体打包配了什么-按需加载实现:借助打包工具(如Webpack的require.context或ES模块动态导入),在使用组件时才引入对应的代码。例如在V...

前端面试-Promise 的 finally 怎么实现的?如何在工作中使用?

Promise的finally方法是一个非常有用的工具,它无论Promise是成功(fulfilled)还是失败(rejected)都会执行,且不改变Promise的最终结果。它的实现原...

最简单手写Promise,30行代码理解Promise核心原理和发布订阅模式

看了全网手写Promise的,大部分对于新手还是比较难理解的,其中几个比较难的点:状态还未改变时通过发布订阅模式去收集事件实例化的时候通过调用构造函数里传出来的方法去修改类里面的状态,这个叫Re...

前端分享-Promise可以中途取消啦(promise可以取消吗)

传统Promise就像一台需要手动组装的设备,每次使用都要重新接线。而Promise.withResolvers的出现,相当于给开发者发了一个智能遥控器,可以随时随地控制异步操作。它解决了三大...

手写 Promise(手写输入法 中文)

前言都2020年了,Promise大家肯定都在用了,但是估计很多人对其原理还是一知半解,今天就让我们一起实现一个符合PromiseA+规范的Promise。附PromiseA+规范地址...

什么是 Promise.allSettled()!新手老手都要会?

Promise.allSettled()方法返回一个在所有给定的promise都已经fulfilled或rejected后的promise,并带有一个对象数组,每个对象表示对应的pr...

前端面试-关于Promise解析与高频面试题示范

Promise是啥,直接上图:Promise就是处理异步函数的API,它可以包裹一个异步函数,在异步函数完成时抛出完成状态,让代码结束远古时无限回掉的窘境。配合async/await语法糖,可...

宇宙厂:为什么前端离不开 Promise.withResolvers() ?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发。1.为什么需要Promise.with...

Promise 新增了一个超实用的 API!

在JavaScript的世界里,Promise一直是处理异步操作的神器。而现在,随着ES2025的发布,Promise又迎来了一个超实用的新成员——Promise.try()!这个新方法简...

一次搞懂 Promise 异步处理(promise 异步顺序执行)

PromisePromise就像这个词的表面意识一样,表示一种承诺、许诺,会在后面给出一个结果,成功或者失败。现在已经成为了主流的异步编程的操作方式,写进了标准里面。状态Promise有且仅有...

Promise 核心机制详解(promise机制的实现原理)

一、Promise的核心状态机Promise本质上是一个状态机,其行为由内部状态严格管控。每个Promise实例在创建时处于Pending(等待)状态,此时异步操作尚未完成。当异步操作成功...

javascript——Promise(js实现promise)

1.PromiseES6开始支持,Promise对象用于一个异步操作的最终完成(包括成功和失败)及结果值的表示。简单说就是处理异步请求的。之所以叫Promise,就是我承诺,如果成功则怎么处理,失败怎...

取消回复欢迎 发表评论: