首页 > 其他分享 >12.18

12.18

时间:2024-12-18 16:08:48浏览次数:3  
标签:程序 单元 线程 内存 执行 高速缓存 12.18

任何运行于现代操作系统中的程序都会与同时运行的其他程序、检查磁盘或者新的 Java 和
Flash 版本的定期维护进程以及控制网络接口、磁盘、声音设备、加速器、温度计和其他
外设的操作系统的各个部分共享计算机。每个程序都会与其他程序竞争计算机资源。

程序不会过多在意这些事情。它只是会运行得稍微慢一点而已。不过有一个例外,那就是
当许多程序一齐开始运行,互相竞争内存和磁盘时。为了性能调优,如果一个程序必须在
启动时执行或是在负载高峰期时执行,那么在测量性能时也必须带上负载。
在 2016 年早期,台式计算机有多达 16 个处理器核心。手机和平板电脑中的微处理器也有
多达 8 个核心。但是,快速地浏览下 Windows 的任务管理器、Linux 的进程状态输出结果
和 Android 的任务列表就可以发现,微处理器所执行的软件进程远比这个数量大,而且绝
大多数进程都有多个线程在执行。操作系统会执行一个线程一段很短的时间,然后将上下
文切换至其他线程或进程。对程序而言,就仿佛执行一条语句花费了一纳秒,但执行下一
条语句花费了 60 毫秒

 

切换上下文究竟是什么意思呢?如果操作系统正在将一个线程切换至同一个程序的另外一
个线程,这表示要为即将暂停的线程保存处理器中的寄存器,然后为即将被继续执行的线
程加载之前保存过的寄存器。现代处理器中的寄存器包含数百字节的数据。当新线程继续
执行时,它的数据可能并不在高速缓存中,所以当加载新的上下文到高速缓存中时,会有
一个缓慢的初始化阶段。因此,切换线程上下文的成本很高。
当操作系统从一个程序切换至另外一个程序时,这个过程的开销会更加昂贵。所有脏的高
速缓存页面(页面被入了数据,但还没有反映到主内存中)都必须被刷新至物理内存中。
所有的处理器寄存器都需要被保存。然后,内存管理器中的“物理地址到虚拟地址”的内
存页寄存器也需要被保存。接着,新线程的“物理地址到虚拟地址”的内存页寄存器和处
理器寄存器被载入。最后就可以继续执行了。但是这时高速缓存是空的,因此在高速缓存
被填充满之前,还有一段缓慢且需要激烈地竞争内存的初始化阶段。
当一个程序必须等某个事件发生时,它甚至可能会在这个事件发生后继续等待,直至操作
系统让处理器为继续执行程序做好准备。这会导致当程序运行于其他程序的上下文中,竞
争计算机资源时,程序的运行时间变得更长和更加难以确定。
为了能够达到更好的性能,一个多核处理器的执行单元及相关的高速缓存,与其他的执行
单元及相关的高速缓存都是或多或少互相独立的。不过,所有的执行单元都共享同样的主
内存。执行单元必须竞争使用那些将可以它们链接至主内存的硬件,使得在拥有多个执行
单元的计算机中,冯 • 诺依曼瓶颈的限制变得更加明显。
当执行单元写值时,这个值会首先进入高速缓存内存。不过最终,这个值将被写入至主内
存中,这样其他所有的执行单元就都可以看见这个值了。但是,这些执行单元在访问主内
存时存在着竞争,所以可能在执行单元改变了一个值,然后又执行几百个指令后,主内存
中的值才会被更新。
因此,如果一台计算机有多个执行单元,那么一个执行单元可能需要在很长一段时间后才
能看见另一个执行单元所写的数据被反映至主内存中,而且主内存发生改变的顺序可能与
指令的执行顺序不一样。受到不可预测的时间因素的干扰,执行单元看到的共享内存字中
的值可能是旧的,也可能是被更新后的值。这时,必须使用特殊的同步指令来确保运行于
不同执行单元间的线程看到的内存中的值是一致的。对优化而言,这意味着访问线程间的
共享数据比访问非共享数据要慢得多。

标签:程序,单元,线程,内存,执行,高速缓存,12.18
From: https://www.cnblogs.com/xscya/p/18615224

相关文章

  • 大二打卡(12.18)
    今天做了什么:在期末考试的那一天,早早地来到了考场,准备迎接这场挑战。考试铃声响起,老师开始逐一发放试卷。深吸一口气,开始认真地审题。说实话,经过这么长时间的练习,已经对这类题目驾轻就熟了。建立表、编写页面、编写Java文件,这些步骤几乎成了肌肉记忆,几乎不需要思考就能完成。考......
  • 上周热点回顾(12.18-12.24)
    热点随笔:· 【故障公告】疑似未知知名搜索引擎蜘蛛来袭,一台负载均衡带宽跑满 (博客园团队)· 如何快速优化几千万数据量的订单表 (程序员济癫)· 微软官方发布的C#开源、免费、实用的Windows工具箱 (追逐时光者)· 2023年最后一波工具安利「GitHub热点速览」 (削微寒)......
  • 12.18
    写数据结构作业 7-1哈夫曼树哈夫曼编码输入一组整型权值,构建哈夫曼树,实现哈夫曼编码,并输出带权路径长度。输入格式:第一行输入叶子结点个数,接着依次输入权值。若叶子数为0或1,则输出error输出格式:输出哈夫曼编码,输出带权路径长度。输入样例:在这里给出一组输入。例如:8......
  • #9 2023.12.18
    怎么做题速度单调递减了。464.THUPC2024Pre省流:我是演员。M我过的题。K我过的题。暴力打表就行了,我在本地打了三分钟就出答案了!很快。J我过的题。考虑\(v\)什么时候对\(len=k\)没有贡献。那就是\(v\)把序列分成了若干区间\([l,r]\),\(ban\)掉的区间就是\([......
  • 2023.12.18
    点击查看代码#include<bits/stdc++.h>#definefifirst#definesesecondusingstd::cin;usingstd::min;usingstd::max;usingstd::cout;usingstd::vector;constexprintM=2e6+5;constexprintINF=0x3f3f3f3f,mod=998244353;......
  • 12.18日
      终于迎来了王老师的最终测试,早上也是进行了最后的准备和测试。中午先去到了505教室,但是在教室里发现了几张熟悉的面孔——人工智能的同学,经询问得知他们在505上电工基础课程。而后经调整我们去往了512进行考试,看见王老师的一瞬间也是心安了。王老师总是给人一种稳重成熟的感......
  • 2023.12.18——每日总结
    学习所花时间(包括上课):9h代码量(行):0行博客量(篇):1篇今天,上午学习,下午学习;我了解到的知识点:1.JFinal明日计划:学习......
  • 12.18每日总结
    软件设计模式简单分类我们在未正式学习设计模式之前先去简单了解一下设计模式的主要三种分类:创建型模式用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。书中提供了单例、原型、工厂方法、抽象工厂、建造者等5种创建型模式。结构型模式用于描述如......
  • 闲话12.18
    上午打了一场模拟赛,垫底了。T1傻逼,不会,不可做。T2傻逼,把我卡爆。T3傻逼,时间全放T1了导致T3没啥时间想了,打了40pts跑路,最后20min想到一个和正解类似的做法,没时间写,哈哈。最终得分:\(0+60+40=100\),被众多人吊打哈哈哈哈哈。下午无聊改题,我记得有个人之前说要有时间了学......
  • 闲话 2023.12.18
    前天晚上打了CodeforcesRound915(Div.2),打的最好的一次,成功实现上大分......