-
2020-02-23 11:32:33
“并发”与“并行”的区别
并发 指两个或多个事件在同一时间间隔内发生,看似都在向前推进;
- 在微观上不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。好比CPU你用完了我接着用,我用完了下一个进程接着用,重在交替。
- 从宏观外来看,在一段时间内,所有程序都在向前推进,好像是这些进程都在执行。
- 由于处理器的速度很快,因而从宏观上来看,这些程序都在向前推进,仿佛每个进程都拥有一个属于自己的处理器,即所谓的虚处理器。
并行 指两个或多个事件在同一时刻内在不同的物理设备上发生;
- 无论在微观还是宏观上都是在同时进行。
- 每个事件在同一时刻真正的同时进行。
- 在单CPU中无法实现进程与进程之间的并行。
- 可以实现不同物理设备上的并行。
举个栗子
- 背景: 将CPU比做成铲子,然后每个进程事件就是人去种树,然后现在有小明和小红都要种一颗小树,假设小明小红的能力属性一致。
- 种树流程: 拿铲子挖坑 → 丢铲子取树苗 → 拿铲子将树苗种起来。
- 并发种树: 小明先抢到铲子然后就开始挖坑,小红就在旁边等小明用完铲子。小明挖完坑后把铲子给小红去拿树苗,然后小红就开始拿着铲子挖坑。等小明将树苗拿回来时候也许还需要等一小段时间(一直等到小红把坑挖好,或者她中途不挖坑把铲子丢下去干其他事情),然后小红挖完坑后丢下铲子去拿树苗的时候小明就拿起铲子将树苗种在土里,小明的任务就完成了。小红拿完树苗回来的时候也拿起铲子将树埋起来完成了任务。
- 并行种树: 有两把铲子,小明和小红同时去挖坑、取树苗和种树,一段时间后小明小红都种完了树。
- 解释: 并发的种树由于资源的限制只有一把铲子,所以各自只是在不断的换铲子来挖坑种树,在一段时间后两人交替的完成了任务,宏观上看似都在种树。而并行的种树就是真正意义上的同时种树,同时完成任务。
理解“宏观上并发,微观上串行”
- 宏观上并发就是指在同一时间段内,CPU高速处理不同任务,看似每个程序都在向前推进。微观上,单CPU中在高速不断的切换进程执行。
- 比如有A和B两个事件,先在CPU上处理A事件,随后A需要用到输出设备,CPU就开始去执行B事件,然后B需要用到输入设备,CPU又回过来处理A事件,最后处理完A事件后又处理完B。从微观上来讲A和B事件在CPU中是在不断的交替执行的。而在宏观上来看,AB事件都在同时向前推进,仿佛每个事件都有一个专门的处理器。即宏观上并发,微观上交替执行即串行。
资料参考:
- 并发和并行的区别?
- 《计算机操作系统教程》(第四版 编著:左万利 王英 )
更多相关内容 -
引入多道程序的目的在于什么
2021-07-17 00:23:39引入多道程序的目的在于充分利用CPU,减少CPU等待时间。...(操作系统知识分享:windows)所谓多道程序设计是指允许多个程序同时进入一个计算机系统的主存储器并启动进行计算的方法。也就是说,计算机内存中...引入多道程序的目的在于充分利用CPU,减少CPU等待时间。多道程序技术是在计算机内存中同时存放几道相互独立的程序,使它们在管理程序控制下相互穿插运行两个或两个以上的程序,这些程序共享计算机系统资源。
引入多道程序的目的在于充分利用CPU,减少CPU等待时间。
(操作系统知识分享:windows)
所谓多道程序设计是指允许多个程序同时进入一个计算机系统的主存储器并启动进行计算的方法。也就是说,计算机内存中可以同时存放多道(两个以上相互独立的)程序,它们都处于开始和结束之间。从宏观上看是并行的,多道程序都处于运行中,并且都没有运行结束;从微观上看是串行的,各道程序轮流使用CPU,交替执行。
引入多道程序设计技术的根本目的是为了提高CPU的利用率,充分发挥计算机系统部件的并行性,现代计算机系统都采用了多道程序设计技术。
多道程序:
多道程序设计技术是在计算机内存中同时存放几道相互独立的程序,使它们在管理程序控制下,相互穿插运行,两个或两个以上程序在计算机系统中同处于开始到结束之间的状态, 这些程序共享计算机系统资源。与之相对应的是单道程序,即在计算机内存中只允许一个的程序运行。
对于一个单CPU系统来说,程序同时处于运行状态只是一种宏观上的概念,他们虽然都已经开始运行,但就微观而言,任意时刻,CPU上运行的程序只有一个。
mac系统教程:macos
-
操作系统之多道程序设计
2020-06-22 22:42:40发展历程 早期的批处理系统中,I/O设备和CPU仍然是串行工作的,CPU时间浪费巨大,浪费了CPU...多道程序设计:允许多个程序(作业)同时进入一个计算机系统的内存并启动进行交替计算的方法,也就是,计算机中可以同时存发展历程
早期的批处理系统中,I/O设备和CPU仍然是串行工作的,CPU时间浪费巨大,浪费了CPU的处理能力。操作系统中只有一个可执行程序,一个任务执行时,必须CPU执行完,I/O才能执行,两者不可并行。
随着CPU速度迅速提高而I/O设备速度却提高不多,导致CPU和I/O设备之间的速度不匹配,矛盾越来越突出。
为了解决这个问题,多道程序的概念被提出。
多道程序设计的概念与相应的问题
多道程序设计:允许多个程序(作业)同时进入一个计算机系统的内存并启动进行交替计算的方法,也就是,计算机中可以同时存放多道程序,从宏观上来看它们是并行的,多道程序都同时处于运行过程中,但都未运行结束,但是微观上是串行的,轮流占用CPU交替执行,引入多道程序设计技术的根本目的是提高CPU的利用率,充分发挥计算机系统部件的并行性。
多道程序设计需要考虑的一些问题
交替执行的多道程序设计理念,能够提高系统的效率,增加单位时间的处理能力,但是对于单道程序来说,却延长了计算时间。所以,要明白,多道程序设计提高资源利用率和系统吞吐率是以牺牲用户的作业周转时间为代价的,而一些无法延迟的计算,也是多道程序设计需要考虑的问题。
在多道程序设计中,道的数量是需要衡量的,因为道数的多少和系统效率不是完全正相关的(比如CPU的切换也是需要时间的),它通常由系统的资源和用户的要求而定。而且,内存的容量以及用户的响应时间也是影响多道程序道数的重要因素。
总结利弊
-
提高了CPU的利用率
-
提高了内存和I/O设备的利用率
-
改进了系统的吞吐率
-
充分发挥了系统的并行性
-
主要缺点是延长了作业周转时间
多道程序设计与多重处理系统
多道程序设计系统与多重处理系统有差别,后者是指配置了多个物理CPU,从而,能真正同时执行多道程序的计算机系统。要有效地使用多重处理系统,必须采用多道程序设计技术,反过来,多道程序设计不是必须要有多重处理系统支持。
实现多道程序设计必须妥善地解决三个问题:存储保护与程序浮动;处理器的管理和分配;系统资源的管理和调度;
在多道程序设计中,内存是由几道程序所共享,因此,硬件需要提供一定的功能,使得内存中的各道程序只能访问它自己的区域,以避免相互干扰。特别是当一道程序发生错误的时候,不致影响到其它的程序,更不能影响系统程序,这就是存储保护。
在多道程序设计系统里,如果系统仅配置一个物理处理器,那么,多个程序必须轮流占有处理器,这就涉及到处理器的调度,程序在执行中处于三种状态:
-
运行态,当一个程序占有处理器时;
-
等待态,当一个程序等待某个事件发生时,就处于等待态,比如等待I/O;
-
就绪态,当一个等待的条件已满足可以运行而未占用处理器时;
所以,一道程序在执行中总是处于运行、就绪、等待三种状态之一,一道程序在执行过程中,它的程序状态是变化的,从运行态到等待态的转换是在发生了某种事件时产生的,从等待态转换成就绪态是在等待的某个事件完成时产生的
-
-
一种实现微观单线程,宏观上多线程的方法
2018-08-06 22:53:00纵所周知的是,C语言是顺序程序设计的,那么在一些MCU中,例如STM32,Atmega168等等,在微观上程序都是单线程的,那么应该如何实现微观上的多线程呢?这个用到两个东西:一是中断,二是switch语句。听老夫为你细细道...1.
纵所周知的是,C语言是顺序程序设计的,那么在一些MCU中,例如STM32,Atmega168等等,在微观上程序都是单线程的,那么应该如何实现微观上的多线程呢?这个用到两个东西:一是中断,二是switch语句。听老夫为你细细道来。
2.
举个例子来说,比如我想要实现的是:MCU每2秒通过6个USART向外发送数据。一般大家首先想到的是,配置一个定时器,每2S进入一个中断函数,然后中断函数里面写入:
USART0(); //启动串口0发送 USART1(); //启动串口1发送 USART2(); //启动串口2发送 USART3(); //启动串口3发送 USART4(); //启动串口4发送 USART5(); //启动串口5发送
但是这样会存在一个问题呀。首先我可以把启动串口发送到发送数据成功分为几个部分:
1. 拉高串口读写控制端I/O,使其变为发送模式; 2. 准备要发送的数据,对数据进行组包,这一步是很耗时间的; 3. 检测串口数据是否发送完成 ; 4.在串口发送完成的时候,拉低串口读写控制端I/O,使其变为接收模式
仅仅在串口发送的就会有两个while(1),如下图所示,这无疑拖慢了CPU的运行速度,那么应该如何优化呢?
//--------------------启动发送-----------------------------// UART0_TX; //使串口处于发送状态 i=0; while(i<30) //一共发送30个字节 { while(!(UCSR0A & (1<<UDRE0))); //等待 “准备数据接收” UDR0 = *(TX_buf_MCU+(i++)); //开始发送数据 while( !( UCSR0A & (1<<TXC0)) ); //等待“发送完成” UCSR0A |= (1<<TXC0); //发送完成后清除中断标志位 } UART0_RC; //发送完毕,再次使串口处于接收状态
3.
先贴出代码,再详细说出
void PollingSending() { for (uint8_t i = 0;i < 7;i ++) //6个通道轮询发送,故循环6次 { switch(ComState[i]) //ComState[i]表示第i个串口所处的状态 { case 0: if (PollingSending_Flag == 1) //当2S到,PollingSending_Flag置1 { ComState[i] = 1; //跳到状态1 } break; case 1: PollingSending_Flag = 0; //清除2S标志位 prepareData(i); //准备待发送数据包 RS485_out(i); //拉高IO口,准备发数据 ComState[i] = 2; break; case 2: USARTSendStart(i); //第i个串口开始发送,此时会进入串口发送函数 ComState[i] = 3; break; case 3: if (TxComplete[i] == 1) //发送完成 { RS485_in(i); //拉低I0口,变为待接收状态 ComState[i] = 0; } break; } } } ISR(USART0_TXC_vect) //串口0的中断发送函数 { if (TxLen[i] < 6) //发送6个字节 { USART0_UDR0 = txbuf[TxLen]; //发送一个字节后会进入发送中断,进而发送另外一个字节 TxLen[chn]++; } else { TxLen[i] = 0; TxComplete[i] = 1; //发送完毕 } } int main(void) { sysinit(); //初始化 while(1) { wdt_reset(); //复位看门狗 PollingSending(); } }
此程序的优点所在是:每一个串口都有4种状态,比如
USART0:ComState[0]=0 准备发送数据
USART1:ComState[1]=3 发送完成状态
USART2:ComState[2]=2 正在发送状态
即单线程系统每次走一步,但这一步可能USART0再走,也有可能USART1拿去了。且之前也提过了,是中断发送,系统有可能处在USART1配置发送数据包的时候,这时 USART0的UCSR0A & (1<<UDRE0) == 1 了; //等待 “准备数据接收” 准备好了,那么系统就去发送USART0的数据了,关键在于,若下一时刻( UCSR0A & (1<<TXC0)) ; //等待“发送完成” 还没发送完,则系统可以不用一直在while( !( UCSR0A & (1<<TXC0)) ); //等待“发送完成”,系统可以跳出中断函数,走主程序,即继续配置USART1的数据包,这样就实现了微观上单线程,而宏观上多线程的目的。
-
多道程序设计有哪些新特性呢?它又是如何实现程序的并发执行的呢?
2020-01-13 16:58:45采用多道程序设计可以提高处理器的利用率。...程序是一个在时间上按严格次序前后相继的操作序列,这些操作是机器指令或高级语言编写的语句。人们习惯的传统程序设计方法是顺序程序设计,计算机也是以... -
多道程序系统
2017-07-10 20:10:36我们讨论其中的多道程序系统 多道程序设计技术是在计算机内存中同时存放几道相互独立的程序...对于一个单CPU系统来说,程序同时处于运行状态只是一种宏观上的概念,他们虽然都已经开始运行,但就微观而言,任意时刻,C -
关于多核CPU和多个进程的问题
2021-10-11 22:32:18一、多核CPU可以同时执行多个进程。 扩展了说,单核CPU就可以“同时”执行多个进程。先普及两个概念,并发和并行。 二、并发 当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,... -
分时操作系统和多道程序操作系统的区别
2015-10-26 17:44:49分时操作系统和多道程序操作系统的区别 多道程序系统是在计算机内存中同时存放几道相互独立的程序,使... 多道程序设计指的是允许多个程序同时进入一个计算机系统的主存储器并启动进行计算的方法。也就是说,计算 -
如何创建一个最简单的Windows桌面应用程序 (C++)
2017-02-07 13:23:49如何创建一个最简单的Windows桌面应用程序 (C++) 最近刚开始学习C/C++开发Windows应用程序,这里将会以零基础的视角把学习过程完全记录下来。如果你也刚刚起步,那本文一定非常适合你。 进入正题,本文讨论... -
多线程是同时执行多个线程的吗
2020-03-26 18:25:50相信多线程各位大佬都用过,不管是在单核cpu还是多核cpu上都可以执行,但是多线程是同时执行多个线程的吗? 并发和并行: 并发: 解释1:当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一... -
进程的初步认识(程序与进程、并发、单道程序设计、多道程序设计、CPU、MMU)
2018-12-23 18:19:59程序:是指编译好的二进制文件,存放在磁盘上,并不占用系统资源(系统资源包括CPU、内存、打开的文件、设备、锁…) 进程:是一个抽象的概念,与操作系统原理密切相关。进程是活跃的程序,占用系统资源。在内存中... -
如何快速看懂一个大型程序
2018-12-18 15:40:30为什么以及要有的态度: 不要消极的去阅读别人的...(2)先整体再局部,先宏观再微观,先流程再细节。从上而下了解,先不关心内部细节。 注意:从上而下了解,先不关心内部细节。 (3)阅读代码有两种模式:t... -
编写一个JAVA程序,定义一个学生类Student,属性包含姓名,年龄,性别,根据该类分别创建五个学生对象...
2021-04-12 20:14:45从宏观上介绍一下Java虚拟机的工作原理。从最初编写的Java源文件(.java文件)是如何一步步执行的,如下图所示,首先Java源文件经过前端编译器(javac或ECJ)将.java文件编译为Java字节码文件,...C语言提供了几个标准... -
手把手第十篇:FinClip、mPaaS、Unisdk 小程序解决方案对比
2022-02-21 10:59:13其实不然,市面上已经有几家厂商提供了这种能力,其中有代表性的主要有以下三个解决方案: Finclip小程序开放平台 阿里mpaas移动开发平台 UniSDK 这三个解决方案都可以帮助你在自有 App 上跑起来小程序,但他们各自... -
微信小程序:三个月学习开发实录
2018-08-10 16:08:41这是一个我从未接触过的领域,在这之前,我是从事 C++ 桌面端开发的,对于前端知识可以说是一无所知的,不仅仅对于 Html、CSS 没有一个宏观上的概念,甚至于 JavaScript 都没有相对深入的了解。 一方面来源于兴趣,... -
【操作系统】习题汇总
2020-06-26 10:57:19应用程序 正确答案:C. 计算机资源 从用户的观点看,操作系统是( )。 A. 用户与计算机之间的接口 B. 控制和管理计算机资源的软件 C. 合理的组织计算机工作流程的软件 D. 由若干层次的程序按一定的结构组成的... -
在Linux下写一个简单的驱动程序
2018-10-09 10:09:13本文首先描述了一个可以实际测试运行的驱动实例,然后由此去讨论Linux下驱动模板的要素,以及Linux上应用程序到驱动的执行过程。相信这样由浅入深、由具体实例到抽象理论的描述更容易初学者入手Linux驱动的大门。 ... -
利用多核多线程进行程序优化
2019-03-28 13:19:40样例程序 程序功能:求从1一直到APPLE_MAX_VALUE (100000000)相加累计的和,并赋值给 apple 的a和b;求 orange 数据结构中的 a[i]+b[i ] 的和,循环ORANGE_MAX_VALUE(1000000)次。 说明: 由于样例程序是从实际... -
什么是多道程序?
2015-07-14 13:05:101.什么是多道程序? -
数据结构-从宏观上理解数据结构
2016-07-02 13:23:10从宏观上理解数据结构 很多时候我们一直在埋头苦干,却不知道为什么这样...... 工作一年之后,重新回想一下大学里学的数据结构,发现所剩的寥寥无几,当提起某一种数据结构脑海中大体也只剩下了简单的定义,如... -
计算机组成原理笔记——程序查询方式和程序中断方式
2020-06-07 15:34:19一次中断处理过程大致分为:中断请求,中断判优,中断响应,中断服务和中断返回等五个阶段。 程序中断方式的接口电路 1.配置中断请求触发器和中断屏蔽触发器 INTR为“1”时,表示该设备向CPU提出中断请求。但是设备... -
程序化生成(PCG)算法的改进——基于以地学为主的多基础学科
2020-03-20 23:25:15如题,为了申请关于程序化生成算法的大创,自己翻译了一些相关论文并且进行了总结归纳,做成了...(而且因为很多内容并不是翻译得来,在原创/翻译上犯了难,先当原创好了。。。) 一、Procedural content generat... -
JVM - 程序计数器
2022-01-25 23:10:57JVM - 程序计数器 -
嵌入式编程中的多任务与单任务,以及单任务的软件设计流程
2019-03-16 15:11:12执行多个任务。 多任务的并发执行通常依赖于一个多任务操作系统(OS),多任务OS的核心是系统调度器,它使用任务控制块(TCB)来管理任务调度功能。TCB包括任务的当前状态、优先级、要等待的事件或资源、任务程序码... -
MapReduce程序运行流程
2019-03-08 21:15:06MapReduce程序运行流程 参考:https://blog.csdn.net/alex_bean/article/details/51469630 作者:数据分析玩家 一直以来虽然都在学习hadoop,也打算写一篇关于MapReduce程序运行流程的博客文章,但是一直没有... -
微信小程序的开发:通过微信小程序看前端
2016-09-27 09:33:41前言2016年9月22日凌晨,微信官方通过“微信公开课”公众号发布了关于微信小程序(微信应用号)的内测通知。整个朋友圈瞬间便像炸开了锅似的,各种揣测、介绍性文章在一夜里诞生。而真正收到内测邀请的公众号据说... -
多线程(并发执行)
2020-08-02 15:06:54一、概念区分 1、并行与并发 并行 当系统有一个以上CPU时,同一时刻,当一个CPU在执行一个任务时,另一个CPU在执行另一个任务,两个任务互不抢占CPU资源,...并行是某一时刻,真正有多个程序在运行;并发是在一段时 -
处理器管理及并发进程-多道程序设计
2016-09-13 19:54:26Ii表示第i个程序的输入;Pi表示第i个程序的计算处理;Oi表示第i个程序的打印输出 对于一个要解决的问题,往往需要按一定的顺序执行,典型的是输入,计算,然后进行打印输出。 顺序程序设计方式的一些特点 (1...