linux内核如何支持多核cpu,现在的多核CPU,Linux操作系统是否能够实现单个进程(多线程)的多核调度(跨CPU核心调度)?...
现在的多核CPU,Linux操作系统是否能够实现单个进程(多线程)的多核调度(跨CPU核心调度)?
关注:106 答案:2 mip版
解决时间 2021-02-02 01:11
提问者你說、你愛我
2021-02-01 10:18
如果能,那么线程之间的同步怎么样实现?怎么样保证指令的同步。如果不能,那么多核的意义何在,只是提高单个机器上能够运行的进程总数吗?那么对于进程而言,多核与单核有什么区别呢,求大神?
最佳答案
二级知识专家那年仲夏
2021-02-01 11:56
现在的技术,还是一个线程只能运行在一个 CPU 上。多核心,必须用多线程/进程来运行才能实现最大化。当然,你可以单个线程不停的在所有的 CPU 上来回跳。但是效率会很低很低。
因为 CPU 有寄存器和缓存的问题。如果你切换 CPU 运行,所有的数据都要进行一次传递。非常浪费时钟(在 CPU 上,程序执行不是一个时钟马上就能任意执行一个指令,而是流水线作业,一个指令需要很多个时钟才能处理完,数据存取也都要等)。
这也因为程序原本就都是顺序执行的。你没办法让一个程序的后面的结果可以跳过前面的结果而得出。
当然,现在 CPU 确实有这种技术,叫做乱序执行。也就是当前面的过程还没有计算时,后面的指令先计算。但是这种事情是要靠猜测的,而且这也仅仅是分支预测,依然不能预测某个计算的结果。即便猜的再准确,也有错的时候。奔腾4 最老的版本就有这个问题,流水线太长。计算后发现错了。整条流水线需要清空重新计算。有严重性能问题的奔腾4 CPU ,流水线长度是 31 级。也就是一个程序至少 31 个时钟周期才能从推到流水线后到真正执行。直接浪费了 31 个时钟周期。
所以目前的技术来说,单线程多核新协同计算,技术上不可能实现。
提高性能,就是整理数据处理的算法,把多次重复计算的过程,拆成多条线程分别计算。从而保证 CPU 多核新的效率最大化。每个线程可以共享同一块数据,自己读取自己的数据计算使可以的。不过,这时候就有另外一个问题,数据寻址和传递的性能问题。
全部回答
1楼趁我还喜欢
2021-02-01 12:46
linux下的单进程多线程的程序,要实现每个线程平均分配到多核cpu,主要有2个方法
1:利用linux系统自己的线程切换机制,linux有一个服务叫做irqbalance,这个服务是linux系统自带的,默认会启动,这个服务的作用就是把多线程平均分配到cpu的每个核上面,只要这个服务不停止,多线程分配就可以自己实现。但是要注意,如果线程函数内部的有某个循环,且该循环内没有任何系统调用的话,可能会导致这个线程的cpu时间无法被切换出去。也就是占满cpu现象,此时加个系统调用,例如sleep,线程所占的cpu时间就可以切换出去了。
2:利用pthread库自带的线程亲和性设置函数,来设置线程在某个cpu核心上跑,这个需要在程序内部实现。同时注意不要和进程亲和性设置搞混淆了
int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize,
const cpu_set_t *cpuset);
int pthread_getaffinity_np(pthread_t thread, size_t cpusetsize,
cpu_set_t *cpuset);
从函数名以及参数名都很明了,唯一需要点解释下的可能就是cpu_set_t这个结构体了。这个结构体的理解类似于select中的fd_set,可以理解为cpu集,也是通过约定好的宏来进行清除、设置以及判断:
//初始化,设为空
void cpu_zero (cpu_set_t *set);
//将某个cpu加入cpu集中
void cpu_set (int cpu, cpu_set_t *set);
//将某个cpu从cpu集中移出
void cpu_clr (int cpu, cpu_set_t *set);
//判断某个cpu是否已在cpu集中设置了
int cpu_isset (int cpu, const cpu_set_t *set);
我要举报
如以上问答内容为低俗/色情/暴力/不良/侵权的信息,可以点下面链接进行举报,我们会做出相应处理,感谢你的支持!
→点此我要举报以上信息!←
推荐资讯
大家都在看
linux内核如何支持多核cpu,现在的多核CPU,Linux操作系统是否能够实现单个进程(多线程)的多核调度(跨CPU核心调度)?...相关推荐
- linux内核支持浮点吗,【转】Linux内核浮点计算支持
00000000 __divdf3 references this function // 这里有调用__divdf3地址 So what is happenin ...
- 龙芯linux内核,最新龙芯3A2000/3B2000爆发!Linux内核官方支持
据龙芯开源社区消息,龙芯3A2000/3B2000处理器的支持代码已经加入了Linux官方内核,会在最新的版本发布时正式采用. linux-mips官方Git代码库 据介绍,龙芯3A2000/3B20 ...
- linux内核支持硬盘,Intel 10nm桌面版还是来了:Linux内核已支持
Intel 10nm工艺处理器目前仅用于笔记本移动平台,而且只有U系列低功耗版.Y系列超低功耗版,甚至在此领域仍需要14nm产品来作为补充,再加上Ice Lake处理器频率偏低,初代10nm Cann ...
- Linux内核将支持HyperBus
Linux内核正在接收对HyperBus的支持,HyperBus是一种高性能DDR总线接口,用于将处理器/控制器/ASIC连接到"HyperFlash"闪存或"Hyper ...
- Linux 内核已支持苹果
2019独角兽企业重金招聘Python工程师标准>>> 导读 妙控板2(Magic Trackpad 2)是苹果推出的一款支持多指触控以及触控力度感应的无线/有线触控板,其触控面积比 ...
- linux内核是否支持nfs,嵌入式命令:查看设备是否支持nfs
1:查看设备是否支持nfs功能 命令: cat /proc/filesystems 若有一行为 nodev nfs,则开发板Linux内核支持NFS,反之需要配置内核 同样方法查看Linux主机内核是 ...
- 95后大学生利用漏洞免费吃肯德基获刑;Linux内核初步支持苹果M1;Android Studio 4.2 发布|极客头条...
「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews ...
- linux内核长期支持版本,Linux Kernel 3.12长期支持分支迎来第63个维护版本
今天,Linux内核开发者Jiri Slaby宣布长期支持分支Linux Kernel 3.12迎来第63个维护更新版本.在Linux Kernel 3.12.63版本中共计对104份文件进行了调整, ...
- linux内核采取,采用动态加载模块的方式Linux内核编译
Linux内核是一种单体内核,但是通过动态加载模块的方式,使它的开发非常灵活方便.那么,它是如何编译内核的呢?我们可以通过分析它的Makefile入手.以下是一个简单的hello内核模块的Makefi ...
最新文章
- 200行代码,一行行教你自制微信机器人
- 人脑如何模拟NLP?
- 认真对待学习(2月反思)
- 海量数据库解决方案2011032301
- idea permission denied 权限分配问题解决方案
- Android之水平ProgressBar多彩背景颜色
- Qt Creator 窗体控件自适应窗口大小布局
- 前端学习(2532):Vuex中action
- 投入100亿,一所新“交通大学”选址定了!校名却让网友吵翻…
- 动手学深度学习(PyTorch实现)(十二)--批量归一化(BatchNormalization)
- C++基础知识(二)命名空间
- Unity Android 使用UnityWebRequest Post 数据后,没有获得服务器返回的数据
- 商城项目html pc,Vue实战篇(PC端商城项目)
- Postgresql使用技巧
- 小赛毛游C记——分支和循环语句(2)
- 「 神器 」强大的系统清理工具
- IK 分词器空格支持
- 【论文笔记】课堂学习行为测量系统的设计与实现
- 盘点经典免费录屏软件,短视频创作必备
- 最近火爆的chatgpt,程序员如何使用其进行代码开发
热门文章
- 用Excel写个摸球模拟器玩玩
- 扫拖一体洗地机实用吗、扫拖一体洗地机哪个品牌好,看完就知道
- FHE、MPC、zk-SNARK有何不同
- 游戏攻略 Re:LieF ~親愛なるあなたへ~ (relief给挚爱的你)
- vue 安装(看图就够了,皮卡皮卡)
- s905各种型号的区别_工具柜规格型号
- dell笔记本指示灯闪烁_DELL笔记本电脑指示灯在电脑关闭后仍然闪烁是什么原因?...
- CASS中基于高程点并生成等高线的方法
- Windows 10 uefi引导模式 GPT+UEFI Ghost系统备份还原步骤
- 火山快手伪原创视频热门