- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
想很好的理解并行开发,需要了解的知识还是有很多的,下边就简单罗列几个概念.
基准速度 。
就是处理器晶体管打开和关闭的速率,也就是 CPU 运作的参考速度。听起来像是速度越快越好,但是也有一定的局限性,也需要合适体量的内核才能发挥效用,另外速度的提高也伴随着更高的能耗.
插槽 。
指的是主机支持插入几个物理 CPU.
内核 。
又叫物理内核,一个物理 CPU 可以包含多个物理内核.
逻辑处理器 。
即逻辑 CPU,一个物理内核可以包含多个逻辑 CPU。计算机设备管理器中显示的处理器个数对应的就是逻辑处理器的个数.
举个例子:
如下图,因为只有一个插槽,所以就只能装机一个物理 CPU,然后一个物理 CPU 包含 6 个物理内核,一个内核中包含两个逻辑处理器,即 1 x 6 x 2 = 12.
进程-Process 。
指的是程序的一次执行的过程,是一个动态概念,也是程序在执行过程中分配和管理资源的基本单位.
线程 。
是 CPU 调度和分派的基本单位,它可与同属一个进程的其他的线程共享进程所拥有的全部资源。每个进程都会有一个主线程(Main Thread).
进程、线程、逻辑处理器之间的关系 。
线程是进程的一部分,一个线程只能属于一个进程,而一个进程有一个到多个线程.
进程和线程的根本区别: 进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位.
逻辑处理器 的个数,代表计算机同时能有同样个数的 线程 在工作.
硬件线程也叫逻辑处理器或逻辑内核,同样的,一个物理内核就可以包含多个硬件线程.
软件线程(Software Thread)就是我们常提到的线程.
Windows 将每一个硬件线程识别为一个可调度的逻辑处理器,每一个逻辑处理器可以运行软件线程代码,运行多个软件线程的进程可以充分发挥硬件线程和物理内核的优势,并行地运行指令.
Windows 会给每一个可用的硬件线程分配一块块的处理时间,并通过这种方式运行上百个千个软件线程.
并发:关键是你 有 处理多个任务的 能力 , 不 一定要 同时 .
并行:关键是你有 同时处理多个任务 的能力.
所以区别它们最关键的点就是: 是否是“同时” 。可见,能够“同时”的并行,效率相对更高.
举例:假如你吃饭吃到一半,电话来了,然后:
单线程 。
就是一个进程只有一个线程。程序执行时,所走的程序路径 按照连续顺序排下来 ,前面的必须处理好,后面的才会执行.
多线程 。
就是一个进程有多个线程。在程序执行时,所有线程会 交替执行 。后面的线程不用等待前面的线程处理完毕.
多线程根据并行和并发又有不同的情况.
使用场景的区别:
CPU 通过 时间片轮转算法 来循环执行线程任务,每次执行并不是直接将任务完成。这种切换用时很短,从而使各个程序的运行从表面上看是同时进行的。切换时 会保存之前的线程任务状态 ,当切换到该线程任务的时候,会 重新加载该线程的任务状态 。而这个 从保存到加载的过程 称之为上下文切换.
比如我们拿了两本书,一本中英文词典,一本英文书,在读英文书时发现某个单词不认识,于是便打开中英文词典看单词的汉译,但是放下英文书之前,大脑必须记下这本书读到了多少页的多少行,等查询完单词之后,能够继续读这本书。但这样的切换是会影响读书效率的,同样上下文切换也会影响多线程的执行速度.
由于线程的状态保存和加载都是耗时的,所以在执行串行化代码时,多线程相比单线程效率低.
异步编程 。
是并发的一种形式,老式的异步编程采用回调的机制,以避免创建不必要的线程。异步编程的核心概念是异步操作,即启动的操作会在一定时间后才能完成,这个操作正在执行,却并不会阻塞原来的线程,启动了这个操作的线程还可以继续执行其他任务,等操作完成时,它会调用回调函数,已让程序知道操作已经结束了.
同步编程 。
它和单线程的效果类似,进程之间的关系不是相互排斥临界资源的关系,而是相互依赖的关系。即前一个进程的输出作为后一个进程的输入,当第一个进程没有输出时第二个进程必须等待。具有同步关系的一组并发进程相互发送的信息称为消息或事件。其中并发又有伪并发和真并发,伪并发是指单核处理器的并发,真并发是指多核处理器的并发.
响应编程 。
是另一种形式的并发编程,它基于异步事件,而不是异步编程中的异步操作,异步操作有一个开始执行的概念,但是异步事件可以在任何时间发生,并且可以发生多次,大概类似于用户响应事件的概念。它是一种声明式的编程模式,程序在该模式中对事件做出与之对应的响应.
函数式编程 。
大多数并发编程,其本质都是函数式的,函数式编程有两个原则,一个是简洁,有非常清晰的输入和输出,而且尽可能的避免全局或者共享变量。另一个原则就是不变性,指一段数据不能被修改,程序永远不需要对这些数据进行同步,就是非常简单的输入数据,输出数据.
部分参考: 并行编程相关概念 C#并发编程相关名词解释 单线程和多线程? 异步,多线程和并行的区别? 并发与并行的区别是什么? 。
注:个人整理,难免有疏漏,请大方的指正或补充,博主也会第一时间进行修改或补充。后续如果博主发现有需要补充的也会持续更新.
最后此篇关于关于并行开发的一些概念整理的文章就讲到这里了,如果你想了解更多关于关于并行开发的一些概念整理的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 10年前关闭。 Improve this qu
我正在开发一个 Android 应用程序。在此应用程序中, Logo 栏显示在所有页面( Activity )上,或者我们可以说它在所有页面上都有标题。这个 Logo 栏有几个图标,如主页、登录、通知
我正在使用 hadoop 使用开源接口(interface) HVPI 处理视频。然而,inputsplit 的实现,更准确地说是在 isSplitableobContext (context, Pa
1. 是什么? MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System
有没有办法使用 c++20s 的概念来检查一个值是否满足某些要求? 假设我正在编写某种使用分页的容器,并且我想让页面大小成为模板参数。 template class container; 我可以使用带
如何在 ArrayList 中循环遍历 ArrayList? 例如,如果我有一个名为 Plants of Plant 对象的 ArrayList。每个 Plant 对象内部都有一个随机数量的花名。我如
如何在UML类图中绘制C++概念? 具体来说,我有以下代码: template concept Printable = requires(T a, std::ostream &where) {
我有兴趣制作一个网站,在访问者访问时闪现整个网络历史记录。我计划使用 JavaScript 来获取每个观看者计算机上的历史记录,并根据他们拥有的内容以不同的速度对其进行动画处理。我的想法是使用 his
有一个模板定义,例如: template void foo( void ) { /* ... */ } 如何定义一个概念,以便N必须为非零正值(N> = 1)? 就像是: template con
封装是信息隐藏还是导致信息隐藏? 正如我们所说,封装将数据和函数绑定(bind)在单个实体中,因此它为我们提供了对数据流的控制,并且我们只能通过一些定义良好的函数来访问实体的数据。因此,当我们说封装导
下面有一个简单的代码片段,它使用以下方式进行编译: g++-9 -std=c++2a -fconcepts 这是试图定义一个需要存在函数的概念。我希望输出是"is",但事实并非如此……知道为什么吗?谢
我有一个普通二元运算符的概念 template concept is_binary_operation = requires (const T& t1, const T& t2) // e.g
我正在c++ 20中实现具有启发式功能的搜索算法。 我试图用类似这样的概念来约束我的算法可以使用的功能: template concept Heuristic = requires(SelfType
我需要了解 SAS 如何读取/执行数据步骤。当我查找有关 SAS 如何读取数据步骤的信息时,我似乎只找到有关它如何读取以进行合并的信息,我不了解与常规数据步骤相关的信息。比方说,我有这行代码: dat
最近我看到一个关于“框架”的问题,如果“框架”有不同的类型或概念。那么,存在不同“类型”的“框架”吗? 例如:NodeJS 是一种“类型”(概念),而 Hibernate ORM 是另一种“类型”(概
如何使用任何技术禁用或清除客户端浏览器 Cookie 我认为使用 javascript 可以用于任何技术 最佳答案 var cookies = document.cookie.split(";");
我正在使用 target = "_blank" 单击链接时生成新选项卡。但是,浏览器会将焦点移至该选项卡。 有没有办法让焦点保持在当前标签页上? 回答摘要 基本上,只需发送一个模拟控件点击的当前事件。
我正在尝试在我的 android/firebase(cloud firestore) 应用程序上添加一项需要其他用户批准/拒绝的功能。例如,当 Air&BnB 上的用户想要预订一个地方时,所有者必须批
这个问题在这里已经有了答案: mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows etc... expec
public class MyClass { public static void main(String[] args) { System.out.println("Hell
我是一名优秀的程序员,十分优秀!