多核编程 与 单核多线程编程的区别

2023-11-04

一,首先声明

并行:两件(多件)事情在同一时刻一起发生,
 并发:两件(多件)事情在同一时刻只能有一个发生,由CPU快速切换,从而给人的感觉是同时进行

      使用多线程来实现并行计算来缩短计算时间时,只要在多核CPU下才行,单核CPU下启用多线程最终总的计算计算一样,因为CPU在同一时间,只能服务于一个线程,

在单核CPU下运用多线程仅仅能实现快速响应用户的请求,避免因io或网络阻塞而导致界面停留卡顿。

二 ,线程分解和执行的区别

对单核CPU,对客户端软件,采用多线程,主要是 创建多线程将一些计算放在后台执行,而不影响用户交互操作。(用户界面 & 其他计算 并行进行)提高用户的操作性能!


多核中,分别出多个线程,不再限于将用户界面操作和其他计算分离。分解多个线程使为了让计算分配到各CPU上执行。执行线程数量与CPU核数有关!如果线程数小于核数,某些CPU肯定处于空闲状态。



一,多核编程与单核多线程的区别


1, 锁竞争导致的串行化的区别

在单核系统中如果某个线程获取了锁,那么这个线程将获取CPU的运行时间,其他线程将被阻塞。但CPU始终处于运行状态,影响计算时间的其实只是加锁和解锁的时间。并不会发生CPU空闲的现象。

但多核系统中情况发生了本质的变换,如果线程A和B使用同一把锁,但运行在不同的CPU上,如果A得到了锁,那么A线程所在CPU则处于运行状态,线程B处于阻塞状态,B线程所在CPU则处于空闲状态。我们浪费了一个CPU的运算时间。

图示:

cpu_lock_diam



2, 线程分解与执行的区别

在单核CPU中,对于客户端软件而言,采用多线程方式通常都是创建线程并将其放在后台执行,避免阻塞客户界面操作,提高性能。而在多CPU中,线程的分解将不再局限与此。多核CPU分解多线程是为了让计算分配到各个CPU核上去执行。大幅度提高工作效率。


3, CPU负载均衡的区别

在单核CPU中,并不需要考虑CPU间负载均衡的问题,因为无论线程如何切换,CPU始终处于工作状态,它并不会影响程序运行的总时间。但对于多核CPU,则一定要考虑负载均衡的问题,避免出现负载小的CPU出现空闲等待的现象。

加速比(speedup),是同一个任务在单处理器系统和并行处理器系统中运行消耗的时间的比率,用来衡量并行系统或程序并行化的性能和效果。

一个简单加速比的例子:

一个4核CPU有4个任务,各任务分别耗时 20ms,5ms,3ms,2ms


diam_1


diam_2


优化负载后个任务时间为  10ms,8ms,6ms,6ms


diam_3

多核CPU的效率变为75%,提高的幅度还是很大的。


4, 任务调度策略的区别

在单核中,任务调度的主要工作是为个任务间取得一定的分时效果,简单的说就是保证优先级高的线程可以抢占CPU时间,先运行。在这种情况下程序员更多的是需要考虑任务的优先级。

在多核程序中,不单是要考虑任务的优先级,也要考虑各个任务的耗时,使负载均衡,提高加速比和CPU效率。在多核程序中,操作系统并不清楚我们任务的耗时,所以无法采用对我们程序最优化的调度策略来使负载均衡,因此,任务调度策略的选择也是程序员要考虑的问题。


5, CPU Cache存取的区别

在单核系统中,同一时刻只有一个硬件线程在执行,因此单核CPU是不存在Cache存储问题的。但在多核CPU中,情况则发生了变化。问题主要是因为CPU读取Cache时是以行为单位,如果两个硬件线程同时执行时,会造成两个硬件线程写同一Cache的问题,造成竞争降低效率。


6,任务优先级抢占的区别

在单核CPU情况下,优先级抢占调度是一种常见的调度策略。在多核CPU中,由于有多个任务可以同时在不同的核中运行,优先级在局部发生了变化,有可能发生低优先级的任务先完成的现象。在多核系统中需要重新考虑任务的调度策略。
例如:任务 T1,T2,T3,T4, 优先级为 T4 > T3 > T2 = T1,图示将表示出单核与多核在任务调度时的区别。
图示:


diam_1


diam_2



从图中表示情况是虽然T4的优先级高于T3,但T4并没有像单核CPU中先于T3完成而是基本时间相差不大。


二,多核编程与多机分布式编程的区别

1,共享存储与分布式存储的区别

在多机分布式环境中,每台计算机都有自己独立的存储器,它的内存不共享,如果要进行全局的共享数据,必须依赖于计算机间的通信来完成。在多核环境中,内存是共享的,对全局数据的共享不存在数据搬迁的问题,但是存在锁保护的问题。
因此多核环境在存储方面主要是锁竞争,分布式系统主要的问题是在通信开销方面。

2,分布式计算的区别

分布式计算中多机分布环境和多核环境面临同样的问题:负载均衡。
多机分布环境的负载均衡包括计算负载均衡和存储负载均衡,通常会涉及到负载搬迁的问题,通信开销较大。
多核环境中因为负载搬迁只是相当于指针的移动代价较小,可以忽略。

3,编程环境的区别

多机分布环境中一般使用消息传递编程模型,使用消息传递数据,入MPI;
多核环境中使用共享存储编程环境,入OpenMP等,当然也可以使用消息传递数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多核编程 与 单核多线程编程的区别 的相关文章

随机推荐

  • 解决Flutter PageView页面切换时数据刷新问题

    首先补充一下 之前我没有写是在切换pageView页面的主页面写还是展示的子页面写 这里我说一下 一定要在切换的子页面里面使用这个方法 否则不生效 例如使用了PageView组件 每次切换页面时都会走initState 和dispose 方
  • TCP/IP详解 卷1:协议 学习笔记 第二十六章 Telnet和Rlogin:远程登录

    TCP IP网络上 有两种应用提供远程登录功能 1 Telnet 几乎每个TCP IP的实现都提供这个功能 它能够运行在不同操作系统的主机之间 Telnet通过客户进程和服务器进程之间的选项协商机制 从而确定通信双方可以提供的功能特性 2
  • [JAVA数据结构]HashMap

    目录 1 HashMap 1 1Map的常用方法 1 2HashMap的使用案例 1 HashMap 基于哈希表的实现的Map接口 Map底层结构 HashMap 底层结构 哈希桶 插入 删除 查找时间复杂度 O 1 是否有序 无序 线程安
  • 了解 z-index 层叠等级属性的使用

    当对多个元素同时设置定位时 定位元素之间有可能会发生重叠 接下来我会用代码来进行演示和讲解层叠的效果和使用 代码如下
  • provider模式学习——simpledemo

    1 首先建立一个类库项目 Provider Demo 添加如下类 并要添加引用System Configuration 1 1 创建ParentProvider类继承自provider的基类 namespace provider Provi
  • 如何做好项目的需求与业务调研?

    1 调研工作如何组织 很多人认为调研工作极难 水平最高的人才能做好一次调研 软件工程中也强调需求获取是最难的事情 有的人要么认为不过如此 甚至是一个普通技术支持都可以做的工作 现在有很多企业上管理软件之前都希望软件公司派人来了解情况 提出针
  • 搭建游戏环境

    搭建游戏环境 安装docker curl fsSL https get docker com bash s docker mirror Aliyun 安装docker compose curl L https github com dock
  • 标准模板库(STL)

    STL 标准模板库 Standard Template Library STL 是一个基于模板的容器类库 可用STL创建一个类 为任意数据类型定义矢量 链表 队列和栈等操作 STL中的泛型算法 generic algorithm 和函数对象
  • Python——— 面向对象

    一 初识面向对象 Python完全采用了面向对象的思想 是真正面向对象的编程语言 完全支持面向对象的基本功能 例如 继承 多态 封装等 Python 支持面向过程 面向对象 函数式编程等多种编程范 式 Python 中 一切皆对象 我们在前
  • 使用pickle模块序列化数据,优化代码

    使用pickle模块序列化数据 优化代码 pickle是Python标准库中的一个二进制序列化和反序列化库 可以以二进制的形式将数据持久化保存到磁盘文件中 可以将数据和代码分离 提高代码可读性和优雅度 一 pickle模块介绍 pickle
  • lstm神经网络_机器翻译与高级循环神经网络LSTM,GRU

    No 1 机器翻译概述 机器翻译就是将一种语言翻译为另一种语言 所有机器翻译系统本质上都是基于统计的 我们将总尝试使用非常大的语料库 一般称为平行语料库 在语料库中 有许多句子或段落以不同语言表述 No 2 深度学习出现之前的机器翻译模型
  • linux内核之双向链表实现原理

    1 内核中双向链表结构 Linux内核中广泛使用了一种称为循环双链 Circular Doubly Linked 链表的数据结构 即每个节点都有一个向前和向后的链接 而且首尾节点也相互连接 使用这样的链表 你可以很方便地访问任何一个元素的上
  • Android调用手机系统自带录音功能实现语音录制与播放

    首先调用手机系统自带的录音功能需要相关权限以及读写SD卡的权限
  • linux下C程序查看内存剩余大小

    嵌入式linux中很多内存资源都比较小 所以很多程序中在malloc时就需要提前知道内存剩余的大小 下面是一种调用 sysinfo接口来实现 示例代码如下 include
  • java--基础--16.8--IO流--打印流

    java 基础 16 8 IO流 打印流 1 介绍 1 1 分类 字节流打印流 PrintStream 字符打印流 PrintWriter 1 2 特点 只有写数据的 没有读取数据 只能操作目的地 不能操作数据源 可以操作任意类型的数据 如
  • 东北大学acm训练第四周(搜索)

    include
  • 在mac上配置vue开发环境

    1 在mac上安装brew brew 是 Mac 下的一个包管理工具 没有安装brew 检测用 brew v 则执行下面的命令安装 usr bin ruby e curl fsSL https raw githubusercontent c
  • sqli-18

    1 1 updatexml 1 concat 0x5c select group concat table name from information schema tables where table schema security
  • springMvc自定义校验注解

    spring 自定义注解 翻看公司代码 看到了自定义的注解 查了查 再次记录一下 还是太菜 下面是我的实现 1 自定义注解 package com test import javax validation Constraint import
  • 多核编程 与 单核多线程编程的区别

    一 首先声明 并行 两件 多件 事情在同一时刻一起发生 并发 两件 多件 事情在同一时刻只能有一个发生 由CPU快速切换 从而给人的感觉是同时进行 使用多线程来实现并行计算来缩短计算时间时 只要在多核CPU下才行 单核CPU下启用多线程最终