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

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

什么是并行

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

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

与并发的区别:

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

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

并行与并发

如何实现并行

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

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

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

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

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

——百度百科

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

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

——百度百科

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

进程的调度

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

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

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

    • 进程标识信息,如PID、名称等
    • 现场信息,存放进程运行时处理器现场信息
    • 控制信息,存放操作系统用于管理和调度进程的信息
  • 专有的虚拟地址空间
  • 句柄列表
  • 程序实例的代码和数据,被映射到进程私有虚拟地址空间
  • 程序状态字信息

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

进程状体模型

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

  • 启动程序时,操作系统创建进程,此时进程为新建
    • 运行资源充足时,操作系统提交进程到就绪状态,等待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操作系统为参考。

作  者:LayShun
出  处:http://cnblogs.com/chenbaoshun/ 。
版权声明:本文原创发表于 博客园,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。

分类: [01]技术沉淀

标签: 并行编程

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
并行编程是使用多个处理器或处理器核心同时执行多个任务或子任务的一种编程技术。它能够显著提高程序的执行效率和性能。 基于C语言的并行编程可以通过使用多线程或OpenMP来实现。多线程是一种在同一进程内创建多个线程并行执行的技术。OpenMP是一种基于共享内存的并行编程模型,通过在代码中插入一些特殊的指令来实现并行。 在实际应用中,我可以使用C语言进行并行编程来加速计算密集型任务,例如图像处理、数据分析或数值计算等。通过将任务分解成多个子任务,并且使用多线程或OpenMP来同时执行这些子任务,能够有效利用多核处理器的优势,从而加速程序的运行。 另外,基于C语言的并行编程还可以用于实现并行的服务器和网络程序。例如,在编写网络服务器时,可以使用多线程来并发处理多个请求,提高服务器的并发能力和吞吐量。 然而,并行编程也带来了一些挑战和注意事项。例如,线程之间的数据共享和同步问题需要仔细处理,以避免出现竞争条件和死锁等并发问题。另外,编写并行程序需要考虑到任务的负载均衡和性能瓶颈等问题,以充分发挥并行计算的优势。 总之,基于C语言的并行编程通过利用多线程或OpenMP等技术,能够提高程序的执行效率和性能。在实际应用中,我们可以将其应用于计算密集型任务加速、并行服务器和网络程序等场景中。然而,在编写并行程序时需要注意解决线程同步和数据共享等问题,以充分发挥并行计算的优势。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值