0 min

0 min

0 min

分布式系统 特点 资源共享: 分布式系统可以共享硬件,软件或数据 并行处理: 多台机器可以同时处理同一功能 支持拓展: 当扩充到其他计算机时,计算和处理能力可以按需进行扩展 错误检测: 可以更方式的检测故障 公开透明: 节点可以访问系统中其他节点并与之通信 参考: 什么是分布式系统? | Atlassian

1 min

参考: 微服务架构设计 - 微服务架构设计 (gitbook.io) «微服务设计»Sam Newman «微服务设计模式»克里斯·理查森

1 min

0 min

0 min

0 min

0 min

交换技术 如果计算机物理内存足够大,可以保存所有进程,那么之前提及的所有方案都或多或少是可行的。但实际上,所有进程所需的RAM数量总和通常要远远超出存储器能够支持的范围。因此,把所有进程一直保存在内存中需要巨大的内存,如果内存不够,就做不到这一点。 内存超负载的通用方法 最简单的策略是交换技术,即把一个进程完成调入内存,使该进程运行一段时间,然后把它存回磁盘。空闲进程主要存储在磁盘上,所以当它们不运行时就不会占用内存(尽管它们的一些进程会周期性的被唤醒以完成相关工作,然后就又进入睡眠状态)。 虚拟内存 ,该策略甚至能使程序在只有一部分被调入内存的情况下运行。 ![[Pasted image 20220730185051.png]] 交换在内存中产生了多个空闲区(也称为空洞),通过把所有进程尽可能的向下移动,有可能将这些小的空闲区合并成一个大块。该技术称为内存紧缩。这个操作通常不进行,因为它要消耗大量的CPU时间。例如: 一台1GB的计算机可以每20ns复制4个字节,它紧缩全部内存大约要花费5s。 如何分配进程的内存 有一个问题值得注意,即当进程被创建或换入时应该分配多大的内存。若进程创建时其大小固定且不再改变,则分配很简答,操作系统准确的按其需要的大小进行分配,不多也不少。 但是实际上这是不可能的。例如: 很多程序设计语言都允许从堆中动态的分配内存,那么当进程空间试图增长时,就会出现问题。若干该进程与一个空闲区相邻,那么可把该空闲区分配给该进程让它在这空闲区增大。另一方面,若进程相邻的时另一个进程,那么要么把需要增长的进程移到内存中一个足够大的区域中,要么把一个或多个进程交换出去,以便生成一个足够大的空闲空间。若一个进程在内存中不能增长,并且磁盘上的交换区都满了,那么这个进程只有挂起直到一些空间空闲,或者将其杀掉。 进程的两种内存配置 如果大部分进程在运行时都要增长,为了减少因内存区域不够而引起的进程交换和移动所产生的开销,一种可用的方法是,当换入或移动进程时为它分配一些额外的内存。然而,当进程被换出到磁盘上时,应该只交换进程实际上使用的内存中的内容,将额外的内存交换出去是一种浪费。在图3-5a中读者可以看到一种已为两个进程分配了增长空间的内存配置。 ![[Pasted image 20220731173850.png]] 如果进程有两个可增长的段,例如,供变量动态分配和释放的作为堆使用的一个数据段,以及存放普通局部变量与返回地址的一个堆栈段,则可使用另一种安排,如图3-5b所示。在图中可以看到所示进程的堆栈段在进程所占内存的顶端并向下增长,紧接在程序段后面的数据段向上增长。在这两者之间的内存可以供两个段使用。如果用完了,进程或者必须移动到足够大的空闲区中(它可以被交换出内存直到内存中有足够的空间),或者结束该进程。 空闲内存管理 在动态分配内存时,操作系统必须对其进行管理。一般而言,有两种方式跟踪内存使用情况∶位图和空闲链表。 位图 将内存划分成小到几个字或大到几千字节的分配单元。每个分配单元对应于位图的一个位,0表示空闲,1表示占用。 空闲链表 另一种记录内存使用情况的方法是,维护一个记录已分配内存段和空闲内存段的链表。其中链表中的一个结点或者包含一个进程,或者是两个进程间的一个空的空闲区。 内存分配算法 1. 首次适配: 存储管理器沿着段链表进行搜索,直到找到一个足够大的空闲区,除非空闲区大小和要分配的空间大小正好一样,否则将该空闲区分为两部分,一部分供进程使用,另一部分形成新的空闲区。首次适配算法是一种速度很快的算法,因为它尽可能少地搜索链表结点。对首次适配算法进行很小的修改就可以得到下次适配(next fit)算法。 2. 下次适配: 它的工作方式和首次适配算法相同,不同点是每次找到合适的空闲区时都记录当时的位置。以便在下次寻找空闲区时从上次结束的地方开始搜索,而不是像首次适配算法那样每次都从头开始。Bays(1977)的仿真程序证明下次适配算法的性能略低于首次适配算法。 3. 最佳适配: 最佳适配算法搜索整个链表(从开始到结束),找出能够容纳进程的最小的空闲区。最佳适配算法试图找出最接近实际需要的空闲区,以最好地区配请求和可用空闲区,而不是先拆分一个以后可能会用到的大的空闲区。 因为每次调用最佳适配算法时都要搜索整个链表,所以它要比首次适配算法慢。让人感到有点意外的是它比首次适配算法或下次适配算法浪费更多的内存,因为它会产生大量无用的小空闲区。一般情况下,首次适配算法生成的空闲区更大一些。 4. 快速适配: 它为那些常用大小的空闲区维护单独的链表。例如.有一个n项的表,该表的第一项是指向大小为4KB的空闲区链表表头的指针,第二项是指向大小为8KB的空闲区链表表头的指针,第三项是指向大小为12KB的空闲区链表表头的指针,以此类推。像21KB这样的空闲区既可以放在20KB的链表中,也可以放在一个专门存放大小比较特别的空闲区的链表中。快速适配算法寻找一个指定大小的空闲区是十分快速的,但它和所有将空闲区按大小排序的方案一样都有一个共同的缺点,即在一个进程终止或被换出时,寻找它的相邻块,查看是否可以合并的过程是非常费时的。如果不进行合并,内存将会很快分裂出大量的进程无法利用的小空闲区。

1 min