
该进程必须在内存中才能执行. 但是,该过程可以暂时从内存交换到备份存储,并在再次执行时转移回内存(图1). 交换可能会使所有进程的总物理地址空间超过实际系统的物理地址空间,从而增加系统的多程序程度.

图1使用磁盘作为存储仓库交换两个过程

标准交换标准交换在内存和备份存储之间移动进程. 备份存储通常是快速磁盘. 它应足够大以容纳所有用户的所有内存映像的副本,并且应提供对这些内存映像的直接访问. 访问.
系统维护一个可以运行的所有进程的就绪队列,它们的映像位于备份存储或内存中. 当CPU调度程序决定执行进程时,它将调用调度程序. 调度程序检查队列中的下一个进程是否在内存中. 如果不是,并且没有可用的内存区域,则调度程序将换出内存中当前存在的进程并交换所需的进程,然后重新加载寄存器并将控制权转移到所选进程.
此交换系统的上下文切换时间非常长. 为了理解上下文切换时间的概念,让我们以一个示例为例,假设用户进程的大小为100MB,而备份存储为标准硬盘,传输速度为50MB / S. 100MB进程传输内存的时间为:

100MB / 50MBps = 2s
交换时间为2000毫秒. 由于我们应该交换并交换,所以总交换时间约为4000毫秒. (这里,我们忽略了其他磁盘性能问题)
请注意,交换时间的主要部分是传输时间. 总传输时间与交换的内存大小成正比. 如果我们有这样的计算机系统,则其内存空间为4GB,而常驻操作系统为1GB,则用户进程的最大大小为3GB. 但是,许多用户进程可能比这个要小得多,例如100MB. 相比之下,一个100MB的进程可以在2s内换出,而换出3GB则需要60s. 显然,了解用户进程真正需要的内存空间而不是可能需要的内存空间非常有用.

因此,只需要交换实际使用的内存,就可以减少交换时间. 为了有效地使用此方法,用户需要告知系统其内存要求. 因此,具有动态内存需求的进程需要通过系统调用(request_memory()和release_memory())来通知操作系统其内存需求的变化.
交换也受到其他因素的限制. 如果要交换一个进程,则应确保该进程完全空闲. 特别值得关注的是任何等待I / O的情况. 当某个进程需要换出以释放内存时,该进程可能正在等待I / O操作. 但是,如果I / O异步访问用户内存的I / O缓冲区,则该进程无法调出. 假设由于设备繁忙,所以I / O操作正在排队等待. 如果我们需要换出进程P1和换入进程P2,则I / O操作可能会尝试使用现在是进程P2一部分的内存. 解决此问题的主要方法有两种: 不交换等待进程I / O的进程;不交换进程以等待进程I / O. I / O操作只能使用操作系统缓冲区执行. 仅当交换进程时,才可以在操作系统缓冲区和进程内存之间执行数据传输. 请注意,这种双重缓冲本身会增加开销. 现在,我们需要再次将数据从内核内存复制到用户内存,然后用户进程才能访问它.
现代操作系统现在不使用标准交换. 要提供合理的内存管理解决方案,它的交换时间太多,执行时间也很少.

但是,某些交换变体用于许多系统中,包括UNIX,Linux和Windows. 常用的变体是: 通常,禁止交换;当可用内存(操作系统或进程未使用的内存)低于某个阈值时,启用交换. 当可用内存量增加时,交换将停止.
另一个变种是交换过程的一部分(而不是整个过程)以减少交换时间. 通常,这些交换的变体通常与虚拟内存一起使用.
移动系统的交换尽管大多数PC和服务器的操作系统都支持某些交换形式,但移动系统通常不支持任何形式的交换.
移动设备通常使用闪存而不是较大的硬盘作为永久存储. 由此产生的空间限制是移动操作系统设计人员避免交换的原因之一. 其他原因包括: 限制闪存写入次数以及内存和闪存之间的吞吐量差异.
当可用内存降至某个阈值以下时,Apple的iOS不会使用交换功能,而是要求应用程序自愿放弃分配的内存. 如有必要,可以从系统中删除只读数据(例如代码),然后再从闪存中重新加载. 修改后的数据(例如堆栈)将不会被删除. 但是,操作系统可以终止无法释放足够内存的任何应用程序.
Android不支持交换,并使用类似于iOS的策略. 如果没有足够的可用内存什么是内存的覆盖和对换技术,则可以终止该过程. 但是,在终止该过程之前,Android会将其应用程序状态写入闪存,以便可以快速重启.
由于这些限制什么是内存的覆盖和对换技术,移动系统的开发人员应仔细分配和释放内存,以确保其应用程序不会使用过多的内存或遭受内存泄漏. 请注意,iOS和Android支持分页,因此它们确实具有内存管理功能.
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-275083-1.html
x)全新回归#
美国得继续付出才行