Chinaunix首页 | 论坛 | 博客
  • 博客访问: 177753
  • 博文数量: 69
  • 博客积分: 2627
  • 博客等级: 少校
  • 技术积分: 715
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-24 22:37
文章分类

全部博文(69)

文章存档

2017年(3)

2014年(1)

2013年(4)

2012年(6)

2011年(21)

2010年(15)

2009年(19)

我的朋友

分类: LINUX

2012-03-15 13:04:41

unix操作系统设计笔记(1).

内核把一个缓冲区分配给磁盘块时可能出现的五种典型情况:
1.内核发现该块在它的hash队列中,并且它的缓冲区是空闲的
2.内核在hash队列中找不到该块,因此,它从空闲表中分配一个缓冲区
3.内核在hash队列中找不到该块,并且,在试图从空闲表中分配一个缓冲区(第二种情况)的时候,
  在空闲表中找到一个已标上了“延迟写”标记的缓冲区,内核必须把“延迟写”缓冲区的内容写到磁盘上,并分配另一个缓冲区.
4.内核在hash队列上找不到该块,并且空闲表缓冲区表已空.
5.内核在hash队列上找到该块,但它的缓冲区当前为忙。

搜索算法: getblk
输入: 文件系统号,块号
输出: 现在能被磁盘块使用的上了锁的缓冲区
{
  while(没找到缓冲区){
     if(块在hash队列中){                       

        if(块忙){                              /* 第五种情况 */
           sleep(等候“缓冲区变为空闲”事件);
           continue;
        }

        为缓冲区标记上“忙;                    /* 第一种情况 */
        从空闲表上摘下缓冲区;
        return(缓冲区);

     }else{
        if(空闲表上无缓冲区){                  /* 第四种情况 */
           sleep(等候“缓冲区变为空闲”事件);
           continue;
        }
        
        从空闲表上摘下缓冲区;
 
        if(缓冲区标记着延迟写){                /* 第三种情况 */
           把缓冲区异步写到磁盘上;
           continue;
        }
        从旧hash队列中摘下缓冲区;              /* 第二种情况 */
        把缓冲区放到新的hash队列;
        return(缓冲区);
     }

  } /* while end. */
}         

五种情况处理分为两条线:一条 5->1,  另一条 4 -> 3 -> 2
阅读(1185) | 评论(0) | 转发(0) |
0

上一篇:编译linux0.01

下一篇:rebar使用示例

给主人留下些什么吧!~~