文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>读书笔记---莱昂氏UNIX源代码分析(三.初始化、进程初始化)

读书笔记---莱昂氏UNIX源代码分析(三.初始化、进程初始化)

时间:2010-09-21  来源:zhaocen

1.文件malloc.c

  此文件仅由两个过程组成:m a l l o c ( 2 5 2 8 ) , m f r e e ( 2 5 5 6 )这两个过程涉及两类存储资源的分配和释放,

  这两类存储资源是:

    • 主存:它以3 2个字( 6 4字节)为单位。

    • 盘交换区(disk swap area):它以2 5 6字( 5 1 2字节)为单位。

  对于这两类资源的每一类,各有一些资源图( c o r e m a p或s w a p m a p )记录可用区列表。

  指向相应资源图的一个指针作为参数传递给“ m a l l o c”和“m f r e e”,于是这两个过程无需了解它们正处理的资源的类型。

  “c o r e m a p”和“s w a p m a p”都是类型为“ m a p”的结构数组,

  “m a p”在2 5 1 5行说明。该结构由两个字符指针,亦即无符号整型组成。

 

struct map
{
    char *m_size;
    char *m_addr;
}

 

 

  对“c o r e m a p”和“s w a p m a p”的说明分别位于0 2 0 3行和0 2 0 4行。

 

0203  int coremap[CMAPSIZ];
0204  int swapmap[SMAPSIZ];

 

 

  在这里,完全忽略了“m a p”结构—这是一种程序设计捷径,由于装入程序并不检测这一点,所以可以进行这种形式的说明。

  在“c o r e m a p”和“s w a p m a p”中的实际列表元素数分别是“C M A P S I Z / 2”和“S M A P S I Z / 2”。

 

源代码:

 

malloc(mp, size)
struct map *mp;
{
    register int a;
    register struct map *bp;
   
 //给bp赋值,并以bp的大小当作循环结束条件(map最后一个区域大小为0)
    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)  //将bp的大小赋值给bp-1区域
             return(a);
        }
    }
    return(0);
}
  /*此过程将一个存储区返回给由“ m p”指定的“资源图”,该区的长度为“ s i z e”,其起始地址为“a a”。此过程的体由一行“ f o r”语句和占多行的一条“ i f”语句组成。*/
2556: mfree(mp, size, aa)
2557: struct map *mp;
2558: {
2559:         register struct map *bp;
2560:         register int t;
2561:         register int a;
2562: 
2563:         a = aa;
                 //bp赋值,循环终止条件为,bp区域的起始地址小于或等于a的起始地址 AND bp的大小不等于0
                  //特别注意for循环最后的;号
2564:         for (bp = mp; bp->m_addr<=a && bp->m_size!=0; bp++);
       //如果正被返回的区域与列表上一区域相邻
2565:         if (bp>mp && (bp-1)->m_addr+(bp-1)->m_size == a) { 
2566:                 (bp-1)->m_size =+ size;   //将上一区域长度加上返回区域长度
          //如果正被返回的区域与列表下一区域相邻
2567:                 if (a+size == bp->m_addr) {
2568:                         (bp-1)->m_size =+ bp->m_size;  //将上一区域长度加上下一区域长度
             //合并一个区域后,循环将后面所有区域向前移动
2569:                         while (bp->m_size) {
2570:                                 bp++;
2571:                                 (bp-1)->m_addr = bp->m_addr;
2572:                                 (bp-1)->m_size = bp->m_size;
2573:                         }
2574:                 }
2575:         } else {
          //如果正被返回区域与下一区域相邻,则合并两个区域
2576:                 if (a+size == bp->m_addr && bp->m_size) {
2577:                         bp->m_addr =- size;
2578:                         bp->m_size =+ size;
2579:                 } else if (size) do {
2580:                         t = bp->m_addr;
2581:                         bp->m_addr = a;
2582:                         a = t;
2583:                         t = bp->m_size;
2584:                         bp->m_size = size;
2585:                         bp++;
2586:                 } while (size = t);
2587:         }
2588: }

2.文件prc.c

 

 

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载