第20讲 并发描述语句1
- 格式:ppt
- 大小:147.00 KB
- 文档页数:14


并发 并行【详解】
并发(concurrency):把任务在不同的时间点交给处理器进行处理。在同一时间点,任务并不会同时运行。
并行(parallelism):把每一个任务分配给每一个处理器独立完成。在同一时间点,任务一定是同时运行。
并发不是并行。并行是让不同的代码片段同时在不同的物理处理器上执行。并行的关键是同时做很多事情,而并发是指同时管理很多事情,这些事情可能只做了一半就被暂停去做别的事情了。
在很多情况下,并发的效果比并行好,因为操作系统和硬件的总资源一般很少,但能支持系统同时做很多事情。这种“使用较少的资源做更多的事情”的哲学,也是指导 Go语言设计的哲学。
如果希望让 goroutine
并行,必须使用多于一个逻辑处理器。当有多个逻辑处理器时,调度器会将 goroutine
平等分配到每个逻辑处理器上。这会让 goroutine
在不同的线程上运行。不过要想真的实现并行的效果,用户需要让自己的程序运行在有多个物理处理器的机器上。否则,哪怕 Go语言运行时使用多个线程,goroutine
依然会在同一个物理处理器上并发运行,达不到并行的效果。
下图展示了在一个逻辑处理器上并发运行 goroutine
和在两个逻辑处理器上并行运行两个并发的 goroutine
之间的区别。调度器包含一些聪明的算法,这些算法会随着 Go语言的发布被更新和改进,所以不推荐盲目修改语言运行时对逻辑处理器的默认设置。如果真的认为修改逻辑处理器的数量可以改进性能,也可以对语言运行时的参数进行细微调整。
图:并发与并行的区别
Go语言在 GOMAXPROCS 数量与任务数量相等时,可以做到并行执行,但一般情况下都是并发执行。
编程初学者如何理解并发与并行
在编程的世界里,“并发”与“并行”是两个重要的概念。对于初学者来说,这两个概念可能会让人感到困惑,甚至混淆。但其实,只要我们用恰当的方式去理解,它们并没有那么难以捉摸。
首先,让我们来谈谈“并发”。想象一下你正在家里,一边听着音乐,一边在厨房煮着咖啡,同时还时不时地留意着手机上的消息。这就是一个生活中的“并发”场景。在编程中,并发指的是多个任务看起来在同一时间段内同时进行,但实际上它们可能是在交替执行,共享着
CPU 的时间片。
比如说,一个程序中有多个线程,它们可能会在一段时间内交替地获得 CPU 的执行权。就好像一群人在排队等待使用同一个工具,每个人用一会儿,然后让给下一个人。这意味着,在同一时刻,实际上只有一个线程在真正执行,但由于切换速度非常快,给我们的感觉是它们都在同时进行。
再来说说“并行”。如果把前面煮咖啡、听音乐和看手机消息的场景变成有三个人同时分别在做这三件事,这就是“并行”。在编程中,并行指的是多个任务真正地同时在多个 CPU 核心或者多个计算机上同时执行。 举个例子,如果你的电脑有多个 CPU 核心,一个程序可以将不同的任务分配到不同的核心上同时进行计算,这就是并行处理。每个核心都在独立地执行自己的任务,不需要像并发那样交替等待。
那么,并发和并行有什么区别呢?
从执行方式上看,并发是任务在时间上的重叠,通过快速切换来实现“同时进行”的错觉;而并行是任务在物理上的同时执行,多个任务真正地在同一时刻进行。
从资源利用角度来说,并发通常在单个 CPU 核心上通过时间片切换来提高 CPU 的利用率;并行则是利用多个 CPU 核心或多个计算机来同时处理多个任务,从而提高整体的处理速度。
对于编程初学者来说,理解这两个概念的实际应用场景也非常重要。
在网络服务器中,并发处理请求是常见的情况。服务器可能同时接收到多个客户端的请求,但它会通过并发的方式快速切换处理这些请求,以保证每个请求都能得到及时响应。
润乾报表并发数解读
润乾报表提供了两种并发控制方式,静态并发控制和动态并发控制。静态并发以控制同时运算的报表个(张)数避免内存溢出;动态并发则是控制同时运算的单元格数,避免内存溢出的同时又能够让服务器资源得到高效利用。以下将是对这两种并发控制方式的详细解读。
静态并发控制
原理
当用户访问时,首先检查当前任务数是否超过最大并发任务数,若没有,则允许任务运行,否则进行等待。同时系统还需设定任务的最大等待数,在允许该任务等待之前,还会判断一下最大等待数是否超标,如果没有超标才能等待,如果超标了,则直接返回错误信息。
静态并发控制所控制的是同时计算的报表个数,其中包括:数据集运算、报表运算、分页三种,但是分页结束后往硬盘写缓存以及展现输出的过程没有算在并发内。
由于数据集取数已经算进并发了,所以最大等待数可以设置的大一些,因为不用再担心数据库连接池个数问题了。
但由于分页结束后往硬盘写缓存以及展现输出(生成HTML)的过程没有算在并发内,那在这两个阶段可能会出现内存溢出的情况,当有某个任务导致内存溢出时,理论上JVM会立即释放这个任务占用的内存,但是别的任务还可以继续计算。此时如果新任务继续访问,又会导致内存溢出,因此我们设置了一个内存溢出后的最大等待时间,一旦有内存溢出,必须等待这个时间后才能允许下一个任务访问。
配置
相关配置包括:
maxConcurrentForReport
9
maxWaitForReport
99
maxWaitTimeForReport
30
遗留问题
1. 当用户发送了一个请求并等待时,如果此时把ie关闭或者转到其它网页,该任务还会继续等待,并最终执行运算,不会自行终止或关闭
2. 往硬盘写缓存的操作没有算进并发,因此如果出现这种情况:即某个报表的计算时间较短,但是写缓存的时间较长,此时如果模拟很多并发访问,会出现最终由于写缓存而导致的内存溢出,且极有可能由于JVM来不及回收而导致最终需要重起才能恢复。(原理是:缓存没写完,entry就还不是软引用,不会被JVM回收)不过正常情况下,写缓存的时间和报表计算时间是成正比的,不会出现两者差距太大的情况。
2022年山西财经大学计算机应用技术专业《数据库概论》科目期末试卷B(有答案)
一、填空题
1、____________、____________、____________和是计算机系统中的三类安全性。
2、关系模型由______________、______________和______________组成。
3、在SQL语言中,为了数据库的安全性,设置了对数据的存取进行控制的语句,对用户授权使用____________语句,收回所授的权限使用____________语句。
4、数据管理技术经历了______________、______________和______________3个阶段。
5、在SQL Server 2000中,数据页的大小是8KB。某数据库表有1000行数据,每行需要5000字节空间,则此数据库表需要占用的数据页数为_____页。
6、数据库管理系统的主要功能有______________、______________、数据库的运行管理以及数据库的建立和维护等4个方面。
7、某在SQL Server 2000数据库中有两张表:商品表(商品号,商品名,商品类别,成本价)和销售表(商品号,销售时间,销售数量,销售单价)。用户需统计指定年份每类商品的销售总数量和销售总利润,要求只列出销售总利润最多的前三类商品的商品类别、销售总数量和销售总利润。为了完成该统计操作,请按要求将下面的存储过程补充完整。
8、某事务从账户A转出资金并向账户B转入资金,此操作要么全做,要么全不做,为了保证该操作的完整,需要利用到事务性质中的_____性。
9、有两种基本类型的锁,它们是______和______。
10、对于非规范化的模式,经过转变为1NF,______,将1NF经过转变为2NF,______,将2NF经过转变为3NF______。
二、判断题 11、在数据表中,空值表示不确定。( )