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

原创 2003年08月31日 10:49:00

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

大家好,我们接着来看过程mfree,上次说过,这个过程算法有点复杂,或许应该说,代码写的不太明朗。我们来具体的看看它:

 

/*

 *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;

     /*一个空循环……(1)*/

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

/* 判断、回收开始 */

     if (bp>mp && (bp-1)->m_addr+(bp-1)->m_size == a) {/*这里判断的是什么?(2)*/

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

         if (a+size == bp->m_addr) {/* 这里呢?(3)*/

              (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 {/* 这里是什么样的情况?(4)*/

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

              bp->m_addr =- size;

              bp->m_size =+ size;

         } else if (size) do {/* 下面的过程呢?(5)*/

              t = bp->m_addr;

              bp->m_addr = a;

              a = t;

              t = bp->m_size;

              bp->m_size = size;

              bp++;

         } while (size = t);

     }

}

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

 

在上次说到malloc过程,想必大家可以看出,mp表有效部分(未分配区)的结束的标志是:

bp->m_size==0 为真,

这次,我们先说说UNIX存储管理的回收机制。一个待回收的地址和大小作为参数传递给mfree后,UNIX将把对应该地址和大小的一个存储区返回给mp指定的“资源图”。

只是,要注意的是,如果该区在前后有有效的存储区时,要注意将它们合并,则还有mp表的重整,也是随之而来的问题。

 

我们来看看,比如可能的一种情况是这样:

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

a之前有有效存储区可合并:

           (bp-1)->m_addr+(bp-1)->m_size == a 为真,

这就是我们的(2)的作用。则操作为:

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

但同时,我们要注意和后一有效存储区的合并,即

a+size == bp->m_addr 为真,

这是(3)的作用。如果应该合并,则操作为:

          (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;

              }

但是,如果不可与前边的有效存储区合并,而可与其后的合并,则可能是这个情况:

则可通过:

       a+size == bp->m_addr && bp->m_size,

来判断,这是(4)的作用。若如此,则操作为:

             bp->m_addr =- size;

              bp->m_size =+ size;

那么,还有一种情况,即与前与后都无法合并,可能是这个样子:

这个需要一些复杂的过程。但我要首先向您说明的是,不仅这种情况可以是前与后均不可合并,您来看看这种可能的情况:

这就是说,一直到有效存储区结束,还没有到达a。此时判断为:

                bp->m_size==0 为真,

您来细细的看这个操作:

              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);

尤其要注意t的用途,它首先做地址的中间变量,然后做空间大小的中间变量。这就是(5)的过程。我问您,最后当调整结束后,若指向结束处,bp->m_size==0 为真可曾满足?

 

现在您回头看看,就会明白空循环体(1)的作用,只有当

           bp->m_addr<=a && bp->m_size!=0 为真,

不满足时,我们就到达了回收操作的时机了。可是,如果不看懂后边的代码,又如何明白它呢?

所以说这个算法的实现有点不明朗,但好处就是,效率很高,几乎不可能再提高了!

 

现在您回头看看整个文件,是不是感觉代码很优美?哦,这些日子我感觉有些心伤(因为觉得自己好笨,有太多不懂的,又问自己是不是又浪费时间了,感觉略微迷茫)。可是,在看这些代码,又觉得了渴望的萌动,我们也要努力哦,创造这样优美的代码与软件!

 

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

 暑期在校,每天看些数学和外语,得不到时间正经的写程序。恰好有莱昂氏的UNIX版本6的内核代码分析,考虑到学校从没有训练我们“阅读理解代码”的课程,就决定读下去。这一下子,发现这代码竟如诗句一般,简练...
  • PercyLee
  • PercyLee
  • 2003年08月15日 18:22
  • 1894

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

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

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

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

内核阅读之浅析Linux2.6.34内核路由数据转发(一)

路由数据抓发总体调用逻辑图:
  • Robin_FJ
  • Robin_FJ
  • 2015年11月30日 20:42
  • 444

Linux实验二:Linux 内核模块测试

一、实验目的 对Linux内核模块进行了解。 二、实验内容 创建一个内核模块,在加载和卸载模块时在内核中打印相关信息。 三、背景知识: 一、什么是内核模块?        内核模块是L...
  • longteng1116
  • longteng1116
  • 2013年04月10日 16:31
  • 2859

操作系统与操作系统内核

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

《深入理解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
  • 392

操作系统接口shell

百度上关于shell的回答,觉得讲的不错,特此收藏! 操作系统与外部最主要的接口就叫做shell。shell是操作系统最外面的一层。shell管理你与操作系统之间的交互:等待你输入,向操作系...
  • quyuedage
  • quyuedage
  • 2016年07月06日 14:16
  • 519

UNIX操作系统类型

UNIX操作系统类型 由于Unix操作系统众所周知的稳定性、可靠性,用来提供各种Internet服务的计算机运行的操作系统占很大比例的是Unix及Unix类操作系统。目前比较常见的运行在PC机上的U...
  • zxxSsdsd
  • zxxSsdsd
  • 2014年03月26日 11:27
  • 2162
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:操作系统(UNIX内核代码笔记之malloc.c 二)
举报原因:
原因补充:

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