并发和并行及多线程基本概念

并发(Concurrent)

在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。

并发,本质上是一个物理CPU(也可以是多个)在若干个程序(或进程)之间多路复用,并发性是对有限物理资源强制为多用户共享,以提高效率;

并行(Parallel)

指两个或多个事件(线程)在同一时刻发生,在不同的CPU资源上,同时执行

在操作系统中,一组程序按独立异步的速度执行,无论从微观还是宏观,程序都是一起执行的。

所以,并行不存在竞争、等待等概念;

并发和并行

并行需要两个或两个以上的线程跑在不同的处理器上,并发可以跑在一个处理器上通过时间片进行切换。

在单CPU系统中,系统调度在某一时刻只能让一个线程运行,虽然这种调试机制有多种形式(大多数是时间片轮巡为主),但无论如何,要通过不断切换需要运行的线程让其运行的方式就叫并发(concurrent)。而在多CPU系统中,可以让两个以上的线程同时运行,这种可以同时让两个以上线程同时运行的方式叫做并行(parallel)。

不论是并发还是并行,都能提高程序对CPU资源的利用率;

一个形象的描述,咖啡机模型:
并行&并发

二、异步与多线程
1)基本概念
1. 并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行。其中两种并发关系分别是同步和互斥
2. 互斥:进程间相互排斥的使用临界资源的现象,就叫互斥。
3. 同步:进程之间的关系不是相互排斥临界资源的关系,而是相互依赖的关系。进一步的说明:就是前一个进程的输出作为后一个进程的输入,当第一个进程没有输出时第二个进程必须等待。具有同步关系的一组并发进程相互发送的信息称为消息或事件。
其中并发又有伪并发和真并发,伪并发是指单核处理器的并发,真并发是指多核处理器的并发。
4. 并行:在单处理器中多道程序设计系统中,进程被交替执行,表现出一种并发的外部特种;在多处理器系统中,进程不仅可以交替执行,而且可以重叠执行。在多处理器上的程序才可实现并行处理。从而可知,并行是针对多处理器而言的。并行是同时发生的多个并发事件,具有并发的含义,但并发不一定并行,也亦是说并发事件之间不一定要同一时刻发生。
5. 多线程:多线程是程序设计的逻辑层概念,它是进程中并发运行的一段代码。多线程可以实现线程间的切换执行。
6. 异步:异步和同步是相对的,同步就是顺序执行,执行完一个再执行下一个,需要等待、协调运行。异步就是彼此独立,在等待某事件的过程中继续做自己的事,不需要等待这一事件完成后再工作。线程就是实现异步的一个方式。异步是让调用方法的主线程不需要同步等待另一线程的完成,从而可以让主线程干其它的事情。

异步和多线程并不是一个同等关系,异步是最终目的,多线程只是我们实现异步的一种手段。异步是当一个调用请求发送给被调用者,而调用者不用等待其结果的返回而可以做其它的事情。实现异步可以采用多线程技术或则交给另外的进程来处理。

异步和同步的区别, 在IO等待的时候,同步不会切走,浪费了时间。

多线程的好处,比较容易的实现了 异步切换的思想, 因为异步的程序很难写的。多线程本身程还是以同步完成,但是应该说比效率是比不上异步的。
而且多线很容易写, 相对效率也高。

2)深层次理解

多线程和异步操作的异同

多线程和异步操作两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性。甚至有些时候我们就认为多线程和异步操作是等同的概念。但是,多线程和异步操作还是有一些区别的。而这些区别造成了使用多线程和异步操作的时机的区别。

异步操作的本质

所有的程序最终都会由计算机硬件来执行,所以为了更好的理解异步操作的本质,我们有必要了解一下它的硬件基础。 熟悉电脑硬件的朋友肯定对DMA这个词不陌生,硬盘、光驱的技术规格中都有明确DMA的模式指标,其实网卡、声卡、显卡也是有DMA功能的。DMA就是直接内存访问的意思,也就是说,拥有DMA功能的硬件在和内存进行数据交换的时候可以不消耗CPU资源。只要CPU在发起数据传输时发送一个指令,硬件就开始自己和内存交换数据,在传输完成之后硬件会触发一个中断来通知操作完成。这些无须消耗CPU时间的I/O操作正是异步操作的硬件基础。所以即使在DOS这样的单进程(而且无线程概念)系统中也同样可以发起异步的DMA操作。

线程的本质

线程不是一个计算机硬件的功能,而是操作系统提供的一种逻辑功能,线程本质上是进程中一段并发运行的代码,所以线程需要操作系统投入CPU资源来运行和调度。

异步操作的优缺点

因为异步操作无须额外的线程负担,并且使用回调的方式进行处理,在设计良好的情况下,处理函数可以不必使用共享变量(即使无法完全不用,最起码可以减少共享变量的数量),减少了死锁的可能。当然异步操作也并非完美无暇。编写异步操作的复杂程度较高,程序主要使用回调方式进行处理,与普通人的思维方式有些初入,而且难以调试。

多线程的优缺点
  多线程的优点很明显,线程中的处理程序依然是顺序执行,符合普通人的思维习惯,所以编程简单。但是多线程的缺点也同样明显,线程的使用(滥用)会给系统带来上下文切换的额外负担。并且线程间的共享变量可能造成死锁的出现。

适用范围

在了解了线程与异步操作各自的优缺点之后,我们可以来探讨一下线程和异步的合理用途。我认为:当需要执行I/O操作时,使用异步操作比使用线程+同步I/O操作更合适。I/O操作不仅包括了直接的文件、网络的读写,还包括数据库操作、Web Service、HttpRequest以及.Net Remoting等跨进程的调用。
  而线程的适用范围则是那种需要长时间CPU运算的场合,例如耗时较长的图形处理和算法执行。但是往往由于使用线程编程的简单和符合习惯,所以很多朋友往往会使用线程来执行耗时较长的I/O操作。这样在只有少数几个并发操作的时候还无伤大雅,如果需要处理大量的并发操作时就不合适了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313869.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

XUnit 依赖注入

XUnit 依赖注入Intro现在的开发中越来越看重依赖注入的思想,微软的 Asp.Net Core 框架更是天然集成了依赖注入,那么在单元测试中如何使用依赖注入呢?本文主要介绍如何通过 XUnit 来实现依赖注入, XUnit 主要借助 SharedContext 来…

P3711 仓鼠的数学题(伯努利数)

P3711 仓鼠的数学题 有关伯努利数的知识可以看我的上一篇题解链接(写的超详细)。 F(x)∑k0nSk(x)ak原本定义的Sk(x)∑i0xik根据伯努利数的定义Sk′(x)∑i0x−1ik则我们求F(x)∑k0nSk′(x)ak,答案即为F(x1)考虑先求F(x)∑k0nak1k1∑i0kCk1iBixk−i1∑k0n…

程序员自家种水果,新鲜包邮配送!

点击上面“蓝字”关注我们!上次猕猴桃的活动一经推出,得到了广大粉丝的支持,我感到十分欣慰,非常感谢大家对我的信任。好多小伙伴,买了一箱尝过后又下单了好几箱。事实证明,品质才是销量的最佳保证。有些粉…

实现一个简单的基于码云(Gitee) 的 Storage

实现一个简单的基于码云(Gitee) 的 StorageIntro上次在 asp.net core 从单机到集群 一文中提到存储还不支持分布式,并立了一个 flag基于 github 或者 开源中国的码云实现一个 storage于是这两天就来填坑了。。实现了一个简单的基于开源中国的码云的 storage准备工作…

Java多线程的4种实现方式

** Java多线程的4种实现方式 ** 1:继承Thread并重写run方法,并调用start方法 /*** Java实现多线程的方式1* 继承Thread类,重写run方法* author hongbo.zhao 2019年4月12日 上午7:12:35*/ class MyThread extends Thread {Overridepublic …

采蘑菇的克拉莉丝(树链剖分)

采蘑菇的克拉莉丝 一个有点意思的树链剖分的题。 题意: 一棵树,有两种操作: ①:在点vvv放xxx个蘑菇。 ②:将起点变为vvv。 每次计算收集所有蘑菇的代价。 收集蘑菇的代价为,起点到所在蘑菇的路径上的…

HDU 6428 Problem C. Calculate(积性函数)

Problem C. Calculate ϕϕ∗ϵϕ∗μ∗Iϕ(n)∑d∣n(ϕ∗μ)(d)设g(n)∑d∣n(ϕ∗μ)(d)∑i1A∑j1B∑k1Cϕ(gcd(i,j2,k3))∑i1A∑j1B∑k1C∑d∣i,d∣j2,d∣k3(ϕ∗μ)(d)∑d1A(ϕ∗μ)(d)∑i1A∑j1B∑k1C[d∣i,d∣j2,d∣k3]\phi \phi * \epsilon \phi * \mu * I\\ \phi(n) …

Java线程的6种状态

线程的概念,以及线程的创建方式,见我之前写的博文 本篇文章主要讲Java线程的6种状态 6种状态:初始状态(new) 、可运行状态(Runnable)、运行状态(Running)、阻塞状态&am…

C. Goodbye Souvenir(CDQ 或 树套树)

C. Goodbye Souvenir ∑iLRi−preAi[preAi≥L]\sum\limits_{i L} ^{R} i - pre_{A_i} [pre_{A_i} \geq L]iL∑R​i−preAi​​[preAi​​≥L],进一步考虑即∑i−preAi[i≤R,preAi≥L]\sum i - pre_{A_i}[i \leq R, pre_{A_i} \geq L]∑i−preAi​​[i≤R,preAi​​…

.NET Core 微信小程序支付——(统一下单)

最近公司研发了几个电商小程序,还有一个核心的电商直播,只要是电商一般都会涉及到交易信息,离不开支付系统,这里我们统一实现小程序的支付流程(与服务号实现步骤一样)。目录1、开通小程序的支付能力2、商户…

P4768 [NOI2018] 归程(kruskal 重构树)

P4768 [NOI2018] 归程 给定一个nnn个点,mmm条边的无向联通图,边的描述为[u,v,l,a][u, v, l, a][u,v,l,a],表示uuu,vvv连有一条长度为lll,海拔为aaa的边, 有QQQ个询问,每次给出一个出发点uuu和…

用.NET写“算命”程序

前言“算命”,是一种迷信,我父亲那一辈却执迷不悟,有时深陷其中,有时为求一“上上签”,甚至不惜重金,向“天神”保佑。我曾看到过有些算命网站,可以根据人的生辰八字,来求得这个人一…

Java线程调度

线程调度指的是系统为线程分配CPU使用权的方式。主要有协同式线程调度和抢占式线程调度。 协同式线程调度(Cooperative Threads-Scheduling) 在多线程系统中,线程的执行时间由线程自身控制,执行结束后要主动通知系统切换到另一线…

#3551. [ONTAK2010]Peaks加强版(kruskal 重构树 + 主席树)

#3551. [ONTAK2010]Peaks加强版 我们要求从一个点出发经过困难值小于等于xxx的路径所能到达的山峰中第kkk高的是什么。 考虑按照边权升序,建议kruskalkruskalkruskal重构树,然后倍增向上跳,找到困难值小于等于xxx的深度最小的节点uuu&#…

ASP.NET Core 3.0 迁移避坑指南

一.前言.NET Core 3.0将会在 .NET Conf 大会上正式发布,截止今日发布了9个预览版,改动也是不少,由于没有持续关注,今天将前面开源的动态WebApi项目迁移到.NET Core 3.0还花了不少时间踩坑,给大家分享一下我在迁移过程中…

kruskal 重构树(讲解 + 例题)

kruskal重构树 如何建树 模仿kruskalkruskalkruskal,先将所有边排序。 依次遍历每一条边,如果这条边的两个节点(u,vu, vu,v)不在同一个连通块里面, 则新建一个nodenodenode节点,更新fa[u]fa[v]nodefa[u…

打不死我的,终将使我强大!DevOps黑客马拉松参赛心得

(IDCF DevOps黑客马拉松到底是个啥活动?)长得丑活得久、长得帅也惹人爱!大家好,我是刘威。隆正信息的业务架构师-花名逸云。非常荣幸可以参加在北京举办的第一届DevOps黑客马拉松比赛。黑客马拉松不是突然冒出来的&…

Java线程池面试题

1、什么是线程池 java.util.concurrent.Executors提供了一个 java.util.concurrent.Executor接口的实现用于创建线程池 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。 假设一个服…

F. Cheap Robot(kruskal 重构树)

F. Cheap Robot 给定一个无向连通图,每条边有边权,路过需要消耗对应的电量(边权),有kkk个中心点, 问从a−>ba-> ba−>b,我们最少需要带多少电,设最小为CCC,当…

「标签管理」使用标签管理有道云笔记资料

因着大家对文件标签化比较高难道,需要熟悉一个标签工具软件,所以今天暂时来介绍个简单一些的网络资料的标签化管理,使用有道云笔记作为落地工具,同理在OneNote、印象笔记上原理类似。有道云笔记免费功能够用为了选择哪个笔记产品&…