并行处理

并发?还是并行?

安稳与你 提交于 2020-04-07 20:42:27
并发编程不是一个新的概念,但是随着科学技术的发展,多核危机的出现也让并发编程的话题一度成为热门,支持并发也并不是Java语言的独特优势,还有很多优秀的语言,Erlang,Golang,Scala这些语言也能很好的支持并发编程,学习多线程这一块知识也是一个初级程序员成长的必经之路。 正所谓基础不牢,地动山摇,在学习JavaSE部分的知识只有打好基础,才能为后面的学习做好铺垫,这里引出一个问题。 并发?还是并行? 很多情况下容易把并发和并行搞混淆,但实际上一字之差也是有很大差距的。引用一句经典描述: 并发是问题域中的概念,指同一时间应对(dealing with)多件事情的能力; 并行是方法域中的概念,指同一时间动手做(doing)多件事情的能力。 其实从这句话我们也可以看出来,并发侧重于完成事情的主体是单个的,在某一个时刻内只能完成一件事情,但是又可以几乎同时的处理多件事情;而并行是可以有多个主体去完成多个事情,在同一时刻,可以处理不同的事情。 这里引用大师讲的一个生活中的例子来说明并发和并行。 我的妻子是一位教师,与众多教师一样,她善于处理多个任务,他虽然每次只能做一件事情,但是可以同时处理多个任务。 比如,在听一位学生朗读的时候,它可以暂停学生的朗读,维持课堂秩序,或者回答学生的问题,这是并发但不是并行, 因为只有她一个人,某一个时刻只能进行一件事情。 但是假如她有一位助教

摘录:并口

南楼画角 提交于 2020-04-06 05:36:37
VC实现PC并行端口数字信息输入/输出 作者:游志宇 发布时间:2004-12-9 11:25:02 | 四、PC并行口数字输入/输出的VC实现   由于Windows对系统底层操作采取了屏蔽的策略,因而对用户而言,系统变得更为安全,但这却给众多的硬件或者系统软件开发人员带来了不小的困难,因为只要应用中涉及到底层的操作,开发人员就不得不深入到Windows的内核去编写属于系统级的设备驱动程序。对并行口的读写操作就是如此,由于Windows对系统的保护,绝对不允许任何的直接I/O动作发生,所以必须带上*.dll、*.sys或*.vxd文件,这些文件用来让操作系统知道有一个特定的I/O可能会被调用。系统开机后,这些文件中的内容就会加载到内存中,一旦有对应的动作发生,就会引发I/O的实际动作。   本文只是介绍并行口作为数字I/O口的使用,不在于介绍并行I/O口驱动的编写。故本文中直接使用由 Yariv Kaplan 编写的 WinIo 库,它有如下特点:WinIo 库通过使用内核模式下设备驱动程序和 其它一些底层编程技巧绕过 Windows 安全保护机制,允许32位 Windows 程序直接对 I/O 口进行操作。   支持Windows 9x、Windows NT、Windows2000、WindowsXP环境;在Windows NT/2000/XP下,允许非

并发编程简介

冷暖自知 提交于 2020-04-04 09:48:15
什么是并发 计算机术语中的"并发",指的是在单个系统里同时执行多个独立的活动,而不是顺序的一个接一个的执行。 对于单核CPU来说,在某个时刻只可能处理一个任务,但它却不是完全执行完一个任务再执行一个下一任务,而是一直在任务间切换,每个任务完成一点就去执行下一个任务,看起来就像任务在并行发生,虽然不是严格的同时执行多个任务,但是我们仍然称之为 并发(concurrency) 。 真正的并发是在在多核CPU上,能够真正的同时执行多个任务,称为 硬件并发(hardware concurrency) 。 并发并非没有代价,在单核CPU并发执行两个任务需要付出上下文切换的时间代价。如下图: 假设A和B两个任务都被分成10个大小相等的块,单核CPU交替的执行两个任务,每次执行其中一块,其花费的时间并不是先完成A任务再完成成B任务所花费时间的两倍,而是要更多。这是因为系统从一个任务切换到另一个任务需要执行一次 上下文切换 ,这是需要时间的(图中的灰色块)。上下文切换需要操作系统为当前运行的任务保存CPU的状态和指令指针,算出要切换到哪个任务,并为要切换的任务重新加载处理器状态。然后将新任务的指令和数据载入到缓存中。 并发的方式 多进程并发 将应用程序分为多个独立的、单线程的进程,他们可以同时运行。 这些独立的进程可以通过常规的进程间通信机制进行通信,如管道、信号、消息队列、共享内存、存储映射I

OC开发_整理笔记——多线程之GCD

泄露秘密 提交于 2020-04-03 10:22:10
一、进程和线程     二、各种队列!   1、GCD:Grand Central Dispatch   2、串行队列(Serial)     你 可以创建 任意个数的串行队列,每个队列依次执行添加的任务, 一个队列同一时刻只能执行一个任务 (串行),但是各个队列之间不影响,可以并发执行。每个队列中的任务运行在一个由各自串行队列    维护的独立线程上, 一个队列中只有一个线程 。   3、并行队列(Concurrent)     并行队列是 不允许自己创建 的,系统中存在三个不同优先级的并行队列。并行队列依旧按照任务添加的顺序启动任务,但是,后一个任务无须等待前一个任务执行完毕,而是启动第一个任务后,立即启动    下一个任务。至于同一时刻允许同时运行多少个任务由 系统决定 。任务各自运行在并行队列为他们提供的独立线程上, 并行队列中同时运行多少个任务,就必须维护多少个线程 。   4、主调度队列(main dispatch queue)     主调度队列中的任务运行在应用程序 主线程 上,所以,如果你要修改应用程序的界面,他是唯一的选择   5、全局队列(苹果为了方便多线程的设计,提供一个全局队列,供 所有的APP共同使用 ) 三、队列的任务处理   1、串行队列(✅ DISPATCH_QUEUE_SERIAL )的同步任务和异步任务:dispatch_sync 和

Grand Central Dispatch (GCD) 转

北城余情 提交于 2020-04-03 05:31:34
GCD是异步执行任务的技术之一。 GCD使用很简洁的记述方法,实现了极为复杂繁琐的多线程编程。 dispatch_async(queue, ^{ //长时间处理 //例如AR用动画识别 //例如数据库访问 //长时间处理结束,主线程使用该处理结果 dispatch_async( dispatch_get_main_queue(), ^{ //只在主线程可以执行的处理 //例如用户界面更新 }); }); 在NSObject中,提供了两个实例方法来实现简单的多线程技术:performSelectorInBackground:withObject performSelectorOnMainThread。 我们也可以改用performSelector系方法来实现前面使用的GCD。 //NSObject performSelectorInBackground:withObject:方法中执行后台线程 - (void)launchThreadByNSObject_performSelectorInBackground_withObject { [self performSelectorInBackground:@selector(doWork) withObject:nil]; } //后台线程处理方法 - (void)doWork { @autoreleasepool{ //长时间处理,

线程池

对着背影说爱祢 提交于 2020-03-29 12:18:37
线程,是程序执行的最小单元。一个标准的线程由线程ID,当前指令指针,寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。以上概念来自于百度百科。对于开发者来说,线程就是帮我们干实事的伙伴。在Java中,对于线程的基本操作,我们知道在代码中有以下三种写法: (1)自定义一个类,去继承Thread类,重写run方法 (2)自定义一个类,去实现Runnable接口,重写run方法 (3)自定义一个类,实现Callable接口,重写call方法。关于这个Callable,要多提一嘴,首先,Callable规定的方法是call(),而Runnable规定的方法是run().;其次,Callable的任务执行后可返回值,而Runnable的任务是不能返回值的;然后,call()方法可抛出异常,而run()方法是不能抛出异常的;最后,运行Callable任务可拿到一个Future对象。 实现Callable接口 因为线程的基本概念和使用大家基本上都很熟悉,所以这里就点到为止。 关于线程,就不得不提及另外一个经常容易被混淆的概念,那就是并行和并发。 关于并行和并发

并行回顾

故事扮演 提交于 2020-03-28 04:19:26
.net 4中的任务并行库很强劲,突然有些感触。回顾了下很久前的知识,与园内朋友分享 一些有用的资源 some useful resources: msdn 并行博客 : http://msdn.microsoft.com/zh-cn/concurrency/default(zh-cn).aspx 任务并行库TPL(Task Parallel Library) 很明显,库中有两个核心内容: 任务、并行 。 并行(Parallel) 和并发(Concurrent) 在并行程序设计的语境中,并行和并发是两个不同的概念,不能互换。当提到多个软件线程并行执行的时候,即意味着这些活动线程在不同的硬件资源或者处理单元上同时执行,也就是说多个线程在任何时间点都同时执行。当提到多个软件线程并发执行的时候,即意味着这些线程在同一个硬件资源上交替执行的过程,也就是所有活动线程在某段时间内同时执行的状态,但在某个给定的时刻都只有一个线程在执行。要提高并行性就必须利用多个硬件资源上的并发性。 至此我们几很好理解.NET 4中的几个新集合类型的含义了: ConcurrentDictionary ( Of TKey, TValue) ConcurrentQueue ( Of T) ConcurrentStack ( Of T) 挑战并行思维 “一步接一步”的程序设计模式属线性思维的产物—

同步异步并串行并行并发的区别

心不动则不痛 提交于 2020-03-28 04:01:46
同步、异步: 指的是能否开启新的线程。同步不能开启新的线程,异步可以。 串行、并行: 指的是任务的执行方式。串行是指多个任务时,各个任务按顺序执行,完成一个之后才能进行下一个。并行指的是多个任务可以同时执行。异步是多个任务并行的前提条件。 并发和并行其实是异步线程实现的两种形式。并行其实是真正的异步,多核CUP可以同时开启多条线程供多个任务同时执行,互不干扰。但是并发就不一样了,是一个伪异步。在单核CUP中只能有一条线程,但是又想执行多个任务。这个时候,只能在一条线程上不停的切换任务,比如任务A执行了20%,任务A停下里,线程让给任务B,任务执行了30%停下,再让任务A执行。这样我们用的时候,由于CUP处理速度快,你看起来好像是同时执行,其实不是的,同一时间只会执行单个任务。但是当并发是在多个cpu的情况下,那么并行和并发就没多大的区别了。但是在单个cpu的情况下的话,那么就只能并发而不能并行了。 来源: https://www.cnblogs.com/czk666/p/9353160.html

Kafka设计解析(七)Kafka Stream

久未见 提交于 2020-03-24 11:28:31
转载自 技术世界 ,原文链接 Kafka设计解析(七)- Kafka Stream 本文介绍了Kafka Stream的背景,如Kafka Stream是什么,什么是流式计算,以及为什么要有Kafka Stream。接着介绍了Kafka Stream的整体架构,并行模型,状态存储,以及主要的两种数据集KStream和KTable。并且分析了Kafka Stream如何解决流式系统中的关键问题,如时间定义,窗口操作,Join操作,聚合操作,以及如何处理乱序和提供容错能力。最后结合示例讲解了如何使用Kafka Stream。 目录 一、Kafka Stream背景 1. Kafka Stream是什么 2. 什么是流式计算 3. 为什么要有Kafka Stream 二、Kafka Stream架构 1. Kafka Stream整体架构 2. Processor Topology 3. Kafka Stream并行模型 4. KTable vs. KStream 5. State store 三、Kafka Stream如何解决流式系统中关键问题 1. 时间 2. 窗口 3. Join 4. 聚合与乱序处理 5. 容错 四、Kafka Stream应用示例 五、总结 一、Kafka Stream背景 1. Kafka Stream是什么 Kafka Stream是Apache

如何理解:程序、进程、线程、并发、并行、高并发?

回眸只為那壹抹淺笑 提交于 2020-03-22 00:29:24
问题: 如何理解:程序、进程、线程、并发、并行、高并发? 作者:大宽宽 链接:https://www.zhihu.com/question/307100151/answer/894486042 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 在这里你可以了解: 为啥大家说的进程的意思有出入? 为啥并发那么难理解? 为啥高并发不仅仅是“高”+“并发”的意思? 为啥这些概念到了现实当中就不一样了? 进程,和另一种进程   假如你想铺一条长1000m,宽50m的路。为了解决这个问题,你先构想出来假如你自己1个人做,整个过程第一步干什么,第二步干什么等等。这个干活的过程,可以被称作一个【进程】(Process),或者你可以理解为“一个做事的办法/步骤/方案“。进程的英文Process本意就是“过程”的意思,是一个抽象的概念。这个活有没有真得干并不重要,重要的是你已经预先想好了这个活该怎么干, 有了一个可行思路 。注意,这里【进程】仅仅是描述这个方案的。至于这个方案是在脑海里,还是已经被执行了,是不重要的。   把这套铺路的方案用纸张写出来就得到一个【程序】。在软件开发中也是如此,只不过用的不是纸笔,而是键盘+存储器+某种编程语言。   当然,大家更加熟知的进程往往指的是另外一个意思,是指“程序在操作系统中运行的实例“。所谓“实例