C#并行编程(1):理解并行

什么是并行

并行是指两个或者多个事件在同一时刻发生。

在程序运行中,并行指多个CPU核心同时执行不同的任务;对于单核心CPU,严格来说是没有程序并行的。并行是为了提高任务执行效率,更快的获取结果。

与并发的区别:

并发是指两个或者多个事件在同一时段发生。

相对于并行,并发强调的是同一时段,是宏观上的同时发生。实际上,同一时刻只有一个任务在被执行,多个任务是分时地交替执行的。并发是为了更合理地分配资源。

640?wx_fmt=png

如何实现并行

并行编程中我们只关注应用层面的并行,CPU的指令并行技术(指令流水等)不在我们的考虑范围。

从并行的意义来看,并行编程的目的无非是让多个CPU核心同时执行不同业务逻辑,获取优良的性能。但是,要怎样实现并行呢?实现并行,我们要借助进程线程

为了更好地管理计算机中运行的程序,计算机操作系统引入进程

狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)。

广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。

——百度百科

由于进程拥有计算机资源,在创建、切换和撤销的过程中开销较大,这就限制了进程的并发程度;多核CPU的日渐普及的环境下,为提高并行粒度和并行计算的效率,引入了一种轻型的进程——线程

线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。

——百度百科

线程包含于进程,同一进程的线程共享该进程的资源。线程出现后,线程取代进程作为操作系统调度和分派的基本单位,极大地减少了进程切换带来的性能损失,使得更细粒度和更高性能的并行得以实现。

进程的调度

一台计算机会运行很多程序,这些程序进程的数量多会大于CPU的核心数量。每个CPU核心同一时间只能执行一个进程,那操作系统是如何管理这些进程的呢?

当启动一个程序的实例时,操作系统将创建一个进程用来调度该程序实例。一个进程主要包含以下的信息:

  • 进程控制块PCB,用于操作系统控制该程序实例

    • 进程标识信息,如PID、名称等

    • 现场信息,存放进程运行时处理器现场信息

    • 控制信息,存放操作系统用于管理和调度进程的信息

  • 专有的虚拟地址空间

  • 句柄列表

  • 程序实例的代码和数据,被映射到进程私有虚拟地址空间

  • 程序状态字信息

进程的状态模型,如下图:

640?wx_fmt=png

操作系统按照进程状态进行程序调度。

  • 启动程序时,操作系统创建进程,此时进程为新建

    • 运行资源充足时,操作系统提交进程到就绪状态,等待CPU选择或者抢占CPU执行

    • 运行资源不足,如主存不够,操作系统会挂起进程,进程状态改为就绪挂起,等待操作系统的恢复

  • 就绪状态的进程

    • CPU空闲时,会选择执行就绪状态的进程,被选中的进程进入运行状态

    • 进程优先级高时,将抢占当前正在执行进程的CPU资源,自身进入运行状态

    • 操作系统会根据当前的可用资源,把就绪状态的进程挂起

  • 就绪挂起的进程

    • 当前没有就绪的进程,或者就绪挂起的某个进程具有较高的优先级,操作系统会将就绪挂起的进程恢复到就绪状态

  • 运行状态的进程

    • 进程自然结束、被强制终结或者出现无法解决的异常,将进入终止状态,终止的线程不再参与进程调度

    • 进程到达运行的时间片或者出现优先级高的进程抢占了CPU,进程会回到就绪状态等待调度

    • 进程等待资源、I/O或者信号时,会进入阻塞状态

    • 优先级较高的进程抢占CPU,而此时系统资源不足,则正在运行的线程会被转入就绪挂起状态

  • 阻塞状态的进程

    • 进程阻塞的条件被满足,如等待的资源到位、I/O完成或收到信号,会进入就绪状态

    • 进程在等待资源、I/O或者信号时,若系统检测到运行资源不足,会将阻塞的进程挂起进入阻塞挂起状态

  • 阻塞挂起的进程

    • 当被挂起的进程具有较高优先级,同时由于其他进程的退出使资源充裕,进程会被转为阻塞状态

    • 挂起的阻塞进程得到资源、I/O完成或者收到信号后,被转入就绪挂起状态

上述便是进程的调度过程,其中挂起的进程不占有任何资源。进程的调度很大程度是依赖于运行资源的;进程的优先级也是影响进程调度的重要因素;此外进程的调度还会涉及进程间的通信和同步问题,这里不做展开。

实际上,相对于进程,在并行编程中我们更关心线程,因为线程才是系统调度的基本单位。

线程的调度

在Windows系统中,每个进程至少有一个线程,每个线程都包含下面的内容:

  • 线程内核对象,包含线程上下文(包含CPU寄存器信息的内存块)

  • 线程环境块,包含线程的异常处理链首、本地存储数据等

  • 用户模式栈,存储传给方法的局部变量和实参

  • 内核模式栈,线程调用操作系统内核函数时,所传实参从用户模式栈复制到内核模式栈

  • DLL线程连接和分离,线程创建和销毁时,所依赖的DLL需要收到通知才能执行相关资源的初始化和清理

从线程所含内容,我们可以知道线程的创建和销毁是有着时间和空间开销的,虽然这些开销相较于进程来说小了很多,但仍是影响程序效率的重要因素。特别是在并行处理的时候,线程的频繁创建和销毁将对并行性能产生极为严重的影响。

系统同一时间只给一个CPU核心分配一个线程,CPU执行该线程达一个时间片后,系统会给该CPU核心分配另一个线程。系统分配线程至CPU核心的过程就是线程的上下文切换过程,此间,系统将执行3个动作:

  1. 把CPU寄存器的值保存到正在运行的线程上下文中

  2. 从现有线程集合中选取一个线程准备分配

  3. 把选中线程上下文中保存的CPU寄存器值加载到CPU寄存器中

线程上下文切换会对程序性能带来很严重的影响,特别是切换到一个新进程的新线程时,很可能需要从RAM中加载代码和数据,大家知道RAM相对于CPU高速缓存太慢了。

线程的创建、切换及销毁都是有着不可忽视的开销,在追求高性能的程序中,我们应尽量少地线程,最优性能的线程数是机器CPU的核心数。当然,性能只是程序的一个方面,响应性和可靠性也是要关注的重点。

小结

并行在进程层面依赖于系统可用系统资源和CPU核心数,单核CPU的程序并行,实质上是并发;在线程层面则主要依赖于CPU核心数以及我们安排线程的方式。

后续将以.NET为例总结并发编程。

:本文关于进程和线程的相关内容以Windows操作系统为参考。

原文地址:https://www.cnblogs.com/chenbaoshun/p/10535374.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 
640?wx_fmt=jpeg

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

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

相关文章

P2163 [SHOI2007]园丁的烦恼(二维数点模板题)

P2163 [SHOI2007]园丁的烦恼 题意: 在一个二维平面内有一些点,给你一个左上角和右下角的点,问这个范围内有多少点 题解: 二维数点模板题 我们设F(a,b)表示以(0,0)为左下角,(a,b)为右上角的矩阵内有多少点 如图不难…

[CQOI2017] 小Q的表格(分块 + 整除分块 + 数学 + 前缀和)

problem luogu-P3700 solution f(a,b)f(b,a)f(a,b)f(b,a)f(a,b)f(b,a) 意味着我们只用考虑半个棋盘的信息。 b∗f(a,ab)(ab)∗f(a,b)b*f(a,ab)(ab)*f(a,b)b∗f(a,ab)(ab)∗f(a,b) 会发现修改 f(a,b)f(a,b)f(a,b) 就影响 f(a,ab)f(a,ab)f(a,ab) 进而影响 f(a,a2b)…f(a,a2b)\…

Orleans MultiClient 多个Silo复合客户端

介绍Orleans.MultiClient 是一个 Orleans 复合客户端,只需要简单配置就可以简单高效连接和请求 Orleans 服务。Orleans.MultiClient 可以轻松连接多个不同服务的 Orleans 服务,在请求 Orleans 时会根据请求的接口自动寻找 Orleans 客户端,使用者无需关心…

[kuangbin]各种各样的题单

[kuangbin]各种各样的题单 专题1 简单搜索 POJ 1321 POJ 2251 POJ 3278 POJ 3279 POJ 1426 POJ 3126 POJ 3087 POJ 3414 FZU 2150 UVA 11624 POJ 3984 HDU 1241 HDU 1495 HDU 2612 专题2 搜索进阶 HDU 1043 HDU 3567 HDU 2181 HDU 3533 HDU 1560 ZOJ 2477 HDU 3085 HDU 1067 HD…

[CQOI2017] 小Q的棋盘(贪心 / 树形dp)

problem luogu-P3698 solution1-贪心 显然我们想尽可能地少走回头路,即一直往下走。 所以我们可以都会有个初步地猜测是走最长链。 但很快就会想到万一这是一条单链,链中的点都是二度点,走得越深回头浪费的步数也越多。 然后就可能直接…

ASP.NET Core 进程内(InProcess)托管(6)《从零开始学ASP.NET CORE MVC》:

本文出自《从零开始学ASP.NET CORE MVC》推荐文章:ASP.NET Core 中的 Main方法ASP.NET Core 进程内(InProcess)托管在这个视频中我们将讨论在ASP.NET Core中的进程内(InProcess)托管模型什么是Kestrel服务器当一个 ASP.NET Core 应用程序执行的时候,.NET…

约会安排 HDU - 4553

约会安排 HDU - 4553 题意: 题意又丑又长就不叙述了 题解: 这个题一开始理解错了。。。题目相当于是有三种情况占据时间,分别是学习,女神和屌丝,我们用不同的lazy来表示女神和屌丝,根据优先级去更新状态…

ML.NET机器学习、API容器化与Azure DevOps实践(一):简介

打算使用几篇文章介绍一下.NET下的机器学习框架ML.NET的具体应用,包括一些常用的业务场景、算法的选择、模型的训练以及RESTful API的创建、机器学习服务容器化,以及基于Azure DevOps的容器化部署等等相关的内容。如果你从来没有玩过机器学习&#xff0c…

[TJOI2011] 书架(线段数优化dp + 单调栈)

problem luogu-P1295 首先可以列出一个暴力 dpdpdp 转移。 设 f(i):f(i):f(i): 到 iii 为止划分若干组,每组最大值的和 的最小值。 然后枚举最后一组,即 iii 所在组的开头 jjj,则 f(i)min⁡{f(j−1)max⁡j≤k≤i{ak}}f(i)\min\Big\{f(j-1…

Picture POJ - 1177(矩形周长并))

Picture POJ - 1177 题目: 多个矩阵相交在一起,问新图形的周长是多少 题解: 参考题解 周长分为两部分:横线和竖线 横线计算方法:现在总区间被覆盖的长度和上一次总区间被覆盖的长度之差的绝对值 那么我们只需要从…

聊一聊C# 8.0中的await foreach

很开心今天能与大家一起聊聊C# 8.0中的新特性-Async Streams,一般人通常看到这个词表情是这样.简单说,其实就是C# 8.0中支持await foreach.或者说,C# 8.0中支持异步返回枚举类型async Task<IEnumerable<T>>.好吧,还不懂?Good,这篇文章就是为你写的,看完这篇文章,你…

【学习笔记】同余最短路

同余最短路是用来解决一类 ∑i1naixi∈[L,R]\sum_{i1}^n a_ix_i\in[L,R]∑i1n​ai​xi​∈[L,R] 问题的方法。 其中 L,RL,RL,R 值非常大&#xff0c;而 nnn 不是很大&#xff0c;大概是接受 O(n2)O(n^2)O(n2) 的范围&#xff0c;xix_ixi​ 是自定义的系数。 先差分一下&#…

Codeforces Round #738 (Div. 2)

Codeforces Round #738 (Div. 2) 文章目录A题解&#xff1a;代码&#xff1a;B题意&#xff1a;题解&#xff1a;代码&#xff1a;C题意&#xff1a;题解&#xff1a;代码&#xff1a;D1题意&#xff1a;题解&#xff1a;代码:题号题目知识点AMocha and MathBMocha and Red and…

ASP.NET Core 实现带认证功能的Web代理服务器

引言最近在公司开发了一个项目&#xff0c;项目部署架构图如下&#xff1a;思路如图中文本所述&#xff0c;公司大数据集群不允许直接访问外网&#xff0c;需要一个网关服务器代理请求&#xff0c;本处服务器A就是边缘代理服务器的作用。通常技术人员最快捷的思路是在服务器A上…

[ZJOI2010] 排列计数(dp + 组合数)

problem luogu-P2606 solution 我们对 i−⌊i2⌋i-\lfloor\frac i2\rfloori−⌊2i​⌋ 远没有 i−2∗i,2∗i1i-2*i,2*i1i−2∗i,2∗i1 敏感&#xff0c;这其实就是个二叉树&#xff0c;而且是个小根堆。 每个点的值都小于左右儿子的值&#xff08;如果有左右儿子&#xff0…

Unfair contest(个人做法)

Unfair contest 题意&#xff1a; 两个人参赛&#xff0c;n个评委打分&#xff0c;去掉s个最高分&#xff0c;去掉t个最低分&#xff0c;剩下分求平均分&#xff0c;平均分大的获胜。你是第n个评委&#xff0c;此时已知前n-1个评委所打分数&#xff0c;现在轮到你打分&#x…

ASP.NET Core 进程外(out-of-process)托管(7)《从零开始学ASP.NET CORE MVC》

本文出自《从零开始学ASP.NET CORE MVC》推荐文章&#xff1a;ASP.NET Core 进程内(InProcess)托管ASP.NET Core 进程内(InProcess)托管我们先简单回顾下 ASP.NET Core 中,要配置InProcess的服务器&#xff0c;需要在项目文件中添加< AspNetCoreHostingModel >元素&#…

[CQOI2017] 老C的键盘(树形dp + 组合数)

problem luogu-P3757 solution observation:\text{observation}:observation: hi/2−hih_{i/2}-h_ihi/2​−hi​ 的大小关系&#xff0c;其实就是个二叉树的大小关系。 这很类似之前的排列 dpdpdp &#xff0c;迁移过来&#xff0c;我们尝试 f(i,j):if(i,j):if(i,j):i 在子树…

Educational Codeforces Round 112 (Rated for Div. 2)

Educational Codeforces Round 112 (Rated for Div. 2) 题号题目知识点APizzaForcesBTwo TablesCCoin RowsDSay No to PalindromesEBoring Segments尺取线段树FGood GraphLCT(未补)

eShopOnContainers 知多少[10]:部署到 K8S | AKS

1. 引言断断续续&#xff0c;感觉这个系列又要半途而废了。趁着假期&#xff0c;赶紧再更一篇&#xff0c;介绍下如何将eShopOnContainers部署到K8S上&#xff0c;进而实现大家常说的微服务上云。2. 先了解下 Helm读过我上篇文章ASP.NET Core 借助 K8S 玩转容器编排的同学&…