
正在运行的任务
- WIN+R、msinfo32、正在运行的任务(进程号,优先级,版本号,最大工作集、最小工作集)
进程工作集
win32官方文档
https://learn.microsoft.com/zh-cn/windows/win32/memory/working-set
3
一个进程当前使用的页的集合叫做它的工作集(working set)。如果整个工作集都在内存中,在进入下一个运行阶段之前进程的运行不会引起很多页面故障。如果内存太小无法容纳整个工作集,进程运行将引起大量的页面故障并且速度十分缓慢。一个每隔几条指令就发生一次页面故障的程序被称为是在颠簸。
现代计算机系统中内存的访问速度远远高于外存的访问速度。如果系统中不产生缺页中断,则访问数据的时间约等于内存访问时间。但是如果发生缺页中断,则需要从外存中将该页调入,因此会大大降低系统性能。通过对缺页率的长期研究,Denning提出了工作集理论。由于程序在运行时对页面的访问是不均匀的(即局部性),如果能够预知程序在某段时间内要访问那些页面,并将它们提前调入内存,这将降低缺页率,提高CPU利用率。
进程工作集
因为频繁的调页操作引起的磁盘I/O会大大降低程序的运行效率,因此对每一个进程,虚拟内存管理器都会将其一定量的内存页驻留在物理内存中。并跟踪其执行的性能指标,动态调整这个数量。Win32中驻留在物理内存中的内存页称为进程的"工作集"(workingset),进程的工作集可以通过"任务管理器"查看,其中"内存使用"列即为工作集大小。
工作集是会动态变化的,进程初始时只有很少的代码页和数据页被调入内存。当执行到未被调入内存的代码或者访问到尚未调入内存的数据时,这些代码页或者数据页会被调入物理内存,工作集也随之增长。但工作集不能无限增长,系统为每个进程都定义了一个默认的最小工作集(根据系统物理内存大小,此值可能为20~50 MB)和最大工作集(根据系统物理内存大小,此值可能为45~345 MB)。当工作集到达最大工作集,即进程需要再次调入新页到物理内存中时,虚拟内存管理器会将其原来的工作集中的某些页先置换出内存,然后将需要调入的新页调入内存。
因为工作集的页驻留在物理内存中,因此对这些页的访问不涉及磁盘I/O,相对而言非常快;反之,如果执行的代码或者访问的数据不在工作集中,则会引发额外的磁盘I/O,从而降低程序的运行效率。一个极端的情况就是所谓的颠簸或抖动(thrashing),即程序的大部分的执行时间都花在了调页操作上,而不是代码执行上。
如前所述,虚拟内存管理器在调页时,不仅仅只是调入需要的页,同时还将其附近的页也一起调入内存中。综合这些知识,对开发人员来说,如果想提高程序的运行效率,应该考虑以下两个因素。
(1)对代码来说,尽量编写紧凑代码,这样最理想的情形就是工作集从不会到达最大阀值。在每次调入新页时,也就不需要置换已经载入内存的页。因为根据locality特性,以前执行的代码和访问的数据在后面有很大可能会被再次执行或访问。这样程序执行时,发生的缺页错误数就会大大降低,即减少了磁盘I/O,在图5-6中也可以看到一个程序执行时截至当时共发生的缺页错误次数。即使不能达到这种理想情形,紧凑的代码也往往意味着接下来执行的代码更大可能就在相同的页或相邻页。根据时间locality特性,程序80%的时间花在了20%的代码上。如果能将这20%的代码尽量紧凑且排在一起,无疑会大大提高程序的整体运行性能。
(2)对数据来说,尽量将那些会一起访问的数据(比如链表)放在一起。这样当访问这些数据时,因为它们在同一页或相邻页,只需要一次调页操作即可完成;反之,如果这些数据分散在多个页(更糟的情况是这些页还不相邻),那么每次对这些数据的整体访问都会引发大量的缺页错误,从而降低性能。利用Win32提供的预留和提交两步机制,可以为这些会一同访问的数据预留出一大块空间。此时并没有分配实际存储空间,然后在后续执行过程中生成这些数据时随需为它们提交内存。这样既不浪费真正的物理存储(包括调页文件的磁盘空间和物理内存空间),又能利用locality特性。另外内存池机制也是基于类似的考虑。
此外,工作集和驻留集不同,驻留集指当前在主存中的页面集,而工作集指不久后所需要的页面集。
resident set, In a virtual memory system, a process' resident set is that part of a process' address space which is currently in main memory. If this does not include all of the process' working set, the system may thrash.
working set, The working set of a program or system is that memory or set of addresses which it will use in the near future.This term is generally used when discussing miss rates at some storage level; the time scale of "near future" depends upon the cost of a miss. The working set should fit in the storage level; otherwise the system may thrash.
http://book.51cto.com/art/201006/203597.htm
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/zhuliting/article/details/6118702
4
工作集
@(OS)
工作集是个动态的概念,但也是个经常被忽视的出题点。很多书上就寥寥几句话带过,根本不足以解决像2016年408的一道真题。在后面解释这个问题。
首先为了讲清楚工作集,需要先明白几个替换算法。
局部最佳页面替换算法
类似于全局最佳替换算法,需要事先知道页面的引用串,再根据进程行为改变页面数量。
思想:进程在t时刻访问某页面,如果该页面不在内存中,导致一次缺页。则把该页面装入一个空闲页框。无论是否发生缺页,算法在每一步需要考虑引用串,如果页面再时间间隔未被再次引用,那么就移出内存页面,否则该页被保留到进程的驻留集中,直到再次被引用。是一个系统常量,间隔称作滑动窗口。在任意时刻t,驻留集包含这个窗口中可见的那些页面,即:当前引用的页面,未来次内存访问引用的页面。实际窗口大小是.
这就像我们说的最佳置换算法,是看未来时。实际上无法实现,但可以作为衡量其他替换算法是否优良的标准。
工作集模型和工作集替换算法
工作集替换算法是可实现的算法,只不过不是往前看,而是往后看。驻留集未规定用多少页框,而是动态增长的,当然在实际系统中肯定设置了上限,比如Windows中大概32MB或者其他。对于一个进程来说,不用考虑那么远,看当下如何替换即可。工作集窗口大小是一个时间概念,不是说动态集合分配的页框数。而是过去k次(不含当前)访问的页面记号。比如工作集窗口大小是3,那么一个访问串为:0,2,3,2,1,4
则当访问页面4时,往前看3个,1,2,3在被窗口覆盖,因此驻留集中页面是3,2,1,当然现在4也要加入驻留集,什么时候被踢出去,要看窗口滑动。形象说来就是用一个挖了k个洞的尺子,紧跟在你当前要访问的页面屁股后面,当前的页面并未加入到驻留集,所以窗口还不含当前页面。在窗口内能看到的页面就是当前驻留集的内容。可以是看到2,2,2,2这样重复的,也就是一直访问的是同一个页面,因为驻留集要动态更新,窗口里就只能看到一个页面了,这个情况是OK的。
理解到这里,问题将非常容易解决。
这篇文章的主要出发点就是下面这个题目。
(2016.29)某进程访问页面的序列如下:
若工作集窗口大小是6,则在t时刻的工作集为:A
A. {6,0,3,2}
B. {2,3,0,4}
C. {0,4,3,2,9}
D. {4,5,6,0,3,2}
分析:由上面的理论储备,这题就是简单的小学题了。在t时刻往后看6个,页号是:6,0,3,2,3,2
看到的就是这6个页号,即:6,0,3,2这四个页。那么驻留集就是这四个页。
我想很多很多人会往前数6个不一样的,然后开心的选择D,实际这题就只考察了一个简单的概念:工作集窗口。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/u011240016/article/details/53314170