3:动态分区分配
  根据进程的大小动态的分配内存空间,需要为其配置数据结构,分配算法,分区的分配和回收操作。
  数据结构:
  空闲分区表,用于记录空闲分区的大小,起始地址,分区序号等信息
  空闲分区链,在每个分区的起始地址部分设置一个分区信息数据结构,包含前后分区指针,分区尾部设置分区状态和分区大小表目
  分区分配算法:
  a.首次适应算法(first fit)
  在为进程分配分区时,从头到尾查找空闲分区表,若查找到分区的大小大于或者等于要分配的进程大小则为其分配该分区。该算法的倾向于利用内存中的低地址空间,而保留了大部分高地址空间
  优点:为大进程留下了足够的空间。
  缺点:产生很多内存碎块,严重浪费了宝贵的内存资源。
  b.循环首次适应算法(next fit)
  和首次适应算法不同的是,在查找到适应的分区之后,以后再次分配内存空间时,从上次查找的位置开始进行分配。
  优点:使内存使用空间分布的比较均匀,减少了查找空闲空间的时间。
  缺点:这样查找会缺乏大的内存空间
  c.佳适应算法(best fit)
  将空闲分区表按照分区的大小从小到大排好队,每次分配空闲分区时顺序查找,找到适应的分区则分配进程,必然每次都是佳分配。然而在宏观上不一定是佳的,每次分配后都会留下难以利用的内存碎块。
  b.坏适应算法(worst fit)
  将空闲分区表按从大到小的顺序排好队,依次扫描空闲分区表,每次分配给进程时,都将大的内存空间分配之。
  优点:每次残留的内存碎块都不至太小。对中小进程有利,对大进程不利。查找效率高。
  缺点:是内存中缺乏大的内存空间。
  以上四种都称为顺序搜索法。
  e.快适应算法(fast fit)
  该算法也称为分类搜索法,将空闲分区表中大小大体相同的分区单独放到一个空闲分区表中,这样在操作系统中有多个空闲分区表,再建立一个空闲分区索引表,每个索引指向一个空闲分区表,每类空闲分区的大小可以按照2kb,4kb,8kb来划分。当要查找空闲分区时可以通过查找索引来快速查找合适的分区。
  优点:查找效率高,能保留大的分区,满足对大空间的需要,也不会产生内存碎片。
  缺点:在分区归还内存时算法复杂,系统开销大,在分配时一个分区只给一个进程,或多或少存在一定浪费。而且在分区划分越细的情况下,浪费越严重。这是典型的以时间换空间的做法。
  伙伴系统
  伙伴系统是固定分区和动态分区分配的折中方法,在伙伴系统中,不论已经划分的分区还是没有划分的分区大小都统一为2^k次幂,k可以为1,2,3......m 内存的区域小为2^1
  大为2^m次幂,也是整个内存区域。在每次分配内存时分配2^i次幂大小的空间,这样在多次分配后会产生多个不连续的内存空间。将这些大小相同的内存空间分成一类,建立一个空闲分区链表,当要分配内存大小为m时,比较2^i<m<2^i+1的大小,查找链表中是否存在2^i+1,若存在将其分配给进程。若不存在搜索2^i+2,若存在该大小的内存区域,将其分成大小的为2^i+1的两个伙伴,一个用于分配给进程,一个加入2^i+1的空闲链表中。若没有找到,则依次类推。
  在进行内存回收时,如果有2^i空闲区域则查找是否存在相同大小的空间,存在则合并为2^i+1,再搜索是否存在和2^i+1相同的空间若存在则再次合并。.若不存在,则加入2^i中。
  伙伴系统在时间性能方面比分类搜索差,比顺序搜索要优胜。在空间性能方面则相反。在多处理机的系统中得到大量的应用。