操作系统(UNIX内核代码笔记之malloc.c 一)

原创 2003年08月15日 18:22:00

 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

暑期在校,每天看些数学和外语,得不到时间正经的写程序。恰好有莱昂氏的UNIX版本6的内核代码分析,考虑到学校从没有训练我们“阅读理解代码”的课程,就决定读下去。这一下子,发现这代码竟如诗句一般,简练而优美。不忍独享,也不知大家可有时间来细分辨这一行一行的“诗”,就想着间或拿出来一点,关系到算法而又不难懂的,与大家共同学习。

 

这次,我们看一看操作系统存储管理的部分内容。

内存的空间在分配给进程的时候,有几个算法可以为新创建或换进的进程分配空间。当然,我们假设存储管理程序知道要分配的内存大大小。

最简单的算法是首先适配算法(first fit)。存储管理程序沿着内存段链表搜索,直到找到第一个足够大的空闲区,除非空闲区大小和要分配的空间大小正好一样,否则将该区分为两个部分,把一部分分配给进程使用,另一部分仍是未分配区。

下次适配算法(next fit)是对首先适配算法的一个小小改动而来。它的工作方式与首先适配算法相同,不同的是,每次找到合适的空闲区时都记录当时的位置,下次寻找空闲区时就从上次结束的地方开始搜索,而不从头开始。

还有几个算法是常用的。一个是最佳适配算法(best fit),它找出恰好够用的最小的空闲区来分配。当然,如果每次找出够用的最大的空闲区,那就是另外一种算法了。还有一种,就是快速适配算法(quick fit),它给那些常用到的长度的空闲区设立单独的链表。

 

记得在学操作系统的时候,眼睛都是盯着后面的算法。想实际的操作系统中,使用的应该是它们吧?现在明白了,算法在于实用,简单高效才是最好。

我们看UNIX的内核代码,呵呵,看一看实际的操作系统之算法实现程序。

如下:

 

/*percy说明:

 *此文件乃 malloc.c ,主要过程为 malloc 和 mfree ,

 *以对存储资源进行管理。

 *编排方式遵照 莱昂氏UNIX版本6内核源代码 编排方式,

 *为原 2500行 至 2599行。

 *此次编辑器是VS.NET内置编辑器。

 *                               2003/8/15

 */

 

#

/*

 */

 

/*

 *Structrue of the coremap and swapmap

 *arrays.Consists of non-zero count

 *and base address of that many

 *contiguous units.

 *(The coremap unit is 64 bytes,

 *the swapmap unit is 512 bytes)

 *The addresses are increasing and

 *the list is terminated with the

 *first zero count.

 */

struct map

{

     char *m_size;

     char *m_addr;

};

/*------------------------------      */

 

/*

 *Allocate size units from the siven

 *map.Return the base of the allocated

 *space.

 *Algorithm is first fit.

 */

malloc(mp,size)

struct map *mp;

{

     register int a;

     register struct map *bp;

 

     for (bp=mp; bp->m_size; bp++) {

         if (bp->m_size >= size) {

               a = bp->m_addr;

               bp->m_addr =+ size;

              if ((bp->m_size =- size) == 0)

                   do {

                        bp++;

                        (bp-1)->m_addr = bp->m_addr;

                   } while((bp-1)->m_size = bp->m_size);

              return(a);

         }

     }

     return(0);

}

/*------------------------------      */

 

/*

 *Free the previously allocated space aa

 *of size units into the specified map.

 *Sort aa into both map and combine on

 *one or both ends if possible.

 */

mfree(mp,size,aa)

struct map *mp;

{

     register struct map *bp;

     register int t;

     register int a;

 

     a = aa;

    for (bp = mp; bp->m_addr<=a && bp->m_size!=0; bp++);

     if (bp>mp && (bp-1)->m_addr+(bp-1)->m_size == a) {

          (bp-1)->m_size =+ size;

         if (a+size == bp->m_addr) {

              (bp-1)->m_size =+ bp->m_size;

              while (bp->m_size) {

                   bp++;

                   (bp-1)->m_addr = bp->m_addr;

                   (bp-1)->m_size = bp->m_size;

              }

         }

     } else {

         if (a+size == bp->m_addr && bp->m_size) {

              bp->m_addr =- size;

              bp->m_size =+ size;

         } else if (size) do {

              t = bp->m_addr;

              bp->m_addr = a;

              a = t;

              t = bp->m_size;

              bp->m_size = size;

              bp++;

         } while (size = t);

     }

}

/*-----------------------------------         */

 

我们选的两个过程,这一次详细看看malloc,您来看一下,这是个首先适配算法的实现。

 

for (bp=mp; bp->m_size; bp++) {

         if (bp->m_size >= size) {

               a = bp->m_addr;

               bp->m_addr =+ size;

/*----------------------------------------------------*/

/* 如果这里判断不为0 ……*/

              if ((bp->m_size =- size) == 0) 

                   do {

                        bp++;

                        (bp-1)->m_addr = bp->m_addr;

                   } while((bp-1)->m_size = bp->m_size);

             /*----------------------------------------------------*/

              return(a);

         }

     }

     return(0);

 

如果那里判断不为0,说明寻到的空闲区比要分配的空间大,在内存中可能是这个情况:

 

则执行的是:

a = bp->m_addr;

               bp->m_addr =+ size;

              /*事实上还有这一句,在if判断里的,您可不要忘了*/

               bp->m_size =- size;

              return(a);

如果空闲区和要分配的空间一样大,那么有点麻烦了,因为mp链表就需要您来整理了,内存中的情况可能如下:

 

看操作(do-while):

if ((bp->m_size =- size) == 0) 

                   do {

                        bp++;

                        (bp-1)->m_addr = bp->m_addr;

                   } while((bp-1)->m_size = bp->m_size);

 

这样才算把这一空间分配出去。

 

这一段程序,想有点c语言基础的都能看的明白,可是,您若想修改它,那可不容易。就这个算法来讲,写的几乎已无可改处。可是,它又在整个系统中(UNIX6),扮演如此重要的角色。我常常的想,如果我写程序能如此,则有何憾?!

另外的一个过程,是mfree,就有点麻烦了,我们下次就说说它;可是现在,您能动手分析一下它吗?

 

最后要说的是,您不妨准备准备,咱们来修改一下操作系统的内核。呵呵,分配算法就改为最佳适配算法(best fit)吧,这个程序应该如何写呢?

 

操作系统(UNIX内核代码笔记之malloc.c 二)

 大家好,我们接着来看过程mfree,上次说过,这个过程算法有点复杂,或许应该说,代码写的不太明朗。我们来具体的看看它: /* *Free the previously allocated space...
  • PercyLee
  • PercyLee
  • 2003年08月31日 10:49
  • 1176

操作系统μC/OS-Ⅱ读书笔记(2)

第3章μC/OS-Ⅱ中的任务 3.1任务的基本概念 ☆μC/OS-Ⅱ操作系统内核的主要工作就是对任务进行管理和调度 ☆任务 ☆μC/OS-Ⅱ就是能对小任务的运行进行管理和调度的多任务操作系统 ...
  • Echo_Ana
  • Echo_Ana
  • 2016年09月11日 16:50
  • 770

类unix系统中的内核错误Kernel Panic简介

1.Kernel Panic         内核错误(英语:Kernel Panic)是指操作系统在监测到内部的致命错误,并无法安全处理此错误时采取的动作。这个概念主要被限定在Unix以及类Uni...
  • wangjianno2
  • wangjianno2
  • 2016年07月11日 01:52
  • 552

操作系统与操作系统内核

总的说来,一个操作系统包含了内核(是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件)以及其他计算机系统所必须的组件(如函数库、编译器、调式工具、文本编辑器、网站服务器,以及一个Unix...
  • qq_26849233
  • qq_26849233
  • 2017年07月06日 10:39
  • 172

《深入理解Linux内核(第三版)》 §1.6 Unix 内核概述

§1.2  硬件的依赖性 支持的硬件平台(略) §1.3  Linux 版本 一直到2.5版本的内核,Linux 都通过简单的编号来区别内核的稳定版和开发版。每个版本号用三个数字描述,由圆点分隔。前两...
  • zhangxinrun
  • zhangxinrun
  • 2010年05月14日 17:42
  • 1159

Linux内核启动流程分析之编译体验

Linux源码编译过程: 1,解压 2,打补丁; 方法 : patch -p 补丁文件名 3,配置,配置有三种方法: 一、直接使用make menuconfig,从头到尾每一项...
  • PZ0605
  • PZ0605
  • 2016年11月22日 11:33
  • 386

操作系统——实验一.进程管理

#include "conio.h"                           #include "stdio.h" #include "stdlib.h"               ...
  • huoyahuoya
  • huoyahuoya
  • 2016年10月10日 23:11
  • 1538

UNIX操作系统类型

UNIX操作系统类型 由于Unix操作系统众所周知的稳定性、可靠性,用来提供各种Internet服务的计算机运行的操作系统占很大比例的是Unix及Unix类操作系统。目前比较常见的运行在PC机上的U...
  • zxxSsdsd
  • zxxSsdsd
  • 2014年03月26日 11:27
  • 2154

UNIX操作系统

Unix最为流行的三个版本:Solaris、AIX和HP-UX操作系统。 1.   Sun的Solaris操作系统 Solaris操作系统是Sun的Unix版本,它实际...
  • zhengshibo56
  • zhengshibo56
  • 2012年04月20日 23:52
  • 2503

Unix操作系统发展历史

以下内容总结自《鸟哥的Linux私房菜 -- 基础学习篇(第三版)》 1965年前后,贝尔实验室、MIT、GE共同发起Multics项目,目的是让大型主机可以同时供300台以上的终端机连接使...
  • njchina
  • njchina
  • 2015年08月14日 14:08
  • 1032
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:操作系统(UNIX内核代码笔记之malloc.c 一)
举报原因:
原因补充:

(最多只允许输入30个字)