免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234
最近访问板块 发新帖
楼主: ljoolj
打印 上一主题 下一主题

[NetBSD] 一个在内存跑进程和文件系统有什么关系? [复制链接]

论坛徽章:
0
31 [报告]
发表于 2006-04-19 16:13 |只看该作者
下面分别是4.4BSD-Lite2和FreeBSD6.0的vrele()函数,单从这个函数来看,还是NetBSD要传统一点。。。

4.4BSD-Lite2
  1. /*
  2. * Vnode release.
  3. * If count drops to zero, call inactive routine and return to freelist.
  4. */
  5. void
  6. vrele(vp)
  7.     struct vnode *vp;
  8. {
  9.     struct proc *p = curproc;    /* XXX */

  10. #ifdef DIAGNOSTIC
  11.     if (vp == NULL)
  12.         panic("vrele: null vp");
  13. #endif
  14.     simple_lock(&vp->v_interlock);
  15.     vp->v_usecount--;
  16.     if (vp->v_usecount > 0) {
  17.         simple_unlock(&vp->v_interlock);
  18.         return;
  19.     }
  20. #ifdef DIAGNOSTIC
  21.     if (vp->v_usecount < 0 || vp->v_writecount != 0) {
  22.         vprint("vrele: bad ref count", vp);
  23.         panic("vrele: ref cnt");
  24.     }
  25. #endif
  26.     /*
  27.      * insert at tail of LRU list
  28.      */
  29.     simple_lock(&vnode_free_list_slock);
  30.     TAILQ_INSERT_TAIL(&vnode_free_list, vp, v_freelist);
  31.     simple_unlock(&vnode_free_list_slock);
  32.     if (vn_lock(vp, LK_EXCLUSIVE | LK_INTERLOCK, p) == 0)
  33.         VOP_INACTIVE(vp, p);
  34. }
复制代码


FreeBSD6.0
  1. /*
  2. * Vnode put/release.
  3. * If count drops to zero, call inactive routine and return to freelist.
  4. */
  5. void
  6. vrele(vp)
  7.         struct vnode *vp;
  8. {
  9.         struct thread *td = curthread;        /* XXX */

  10.         KASSERT(vp != NULL, ("vrele: null vp"));

  11.         VI_LOCK(vp);

  12.         /* Skip this v_writecount check if we're going to panic below. */
  13.         VNASSERT(vp->v_writecount < vp->v_usecount || vp->v_usecount < 1, vp,
  14.             ("vrele: missed vn_close"));

  15.         if (vp->v_usecount > 1 || ((vp->v_iflag & VI_DOINGINACT) &&
  16.             vp->v_usecount == 1)) {
  17.                 v_decr_usecount(vp);
  18.                 return;
  19.         }
  20.         if (vp->v_usecount != 1) {
  21. #ifdef DIAGNOSTIC
  22.                 vprint("vrele: negative ref count", vp);
  23. #endif
  24.                 VI_UNLOCK(vp);
  25.                 panic("vrele: negative ref cnt");
  26.         }
  27.         /*
  28.          * We want to hold the vnode until the inactive finishes to
  29.          * prevent vgone() races.  We drop the use count here and the
  30.          * hold count below when we're done.
  31.          */
  32.         v_decr_useonly(vp);
  33.         /*
  34.          * We must call VOP_INACTIVE with the node locked. Mark
  35.          * as VI_DOINGINACT to avoid recursion.
  36.          */
  37.         if (vn_lock(vp, LK_EXCLUSIVE | LK_INTERLOCK, td) == 0) {
  38.                 VI_LOCK(vp);
  39.                 vinactive(vp, td);
  40.                 VOP_UNLOCK(vp, 0, td);
  41.         } else
  42.                 VI_LOCK(vp);
  43.         vdropl(vp);
  44. }
复制代码

论坛徽章:
0
32 [报告]
发表于 2006-04-20 11:13 |只看该作者
难得老大这么热心耐心,感动萦

论坛徽章:
0
33 [报告]
发表于 2006-04-20 11:16 |只看该作者
原帖由 ljoolj 于 2006-4-20 11:13 发表
难得老大这么热心耐心,感动萦


“老大”也是在和你的讨论过程中学习知识,
这个问题深究下去是很有意思的,能够把虚存管理和文件系统关联起来,同时也可以顺便对比一下FB和NB的设计差异。

论坛徽章:
0
34 [报告]
发表于 2006-04-20 16:26 |只看该作者
我的理解是这样的---

文件系统上的文件是进程的广义的“交换区”,进程运行时,内存的部分和文件部分对应。不是读入内存运行就和磁盘上文件无关了,而是时刻存在着“影射---MAPPING”。你UMOUNT了FS,当然立即GAME OVER了。

rm一个进程的文件,文件的内容并没有真正被删除。只有等进程结束了,inode的什么count才减为0,这是才删除。MAPPING没有受到影响,进程会继续。




我删掉执行文件,相关进程不会死掉(会不会有隐蔽问题,我不知道)但umount 掉相关内存盘,进程马
上就game over
感觉进程和文件系统有相当大的关系。不过一般资料都只介绍进程和内存管理方面的东西。

论坛徽章:
0
35 [报告]
发表于 2006-04-20 17:06 |只看该作者
原帖由 思一克 于 2006-4-20 16:26 发表
只有等进程结束了,inode的什么count才减为0,这是才删除。 ...


应该是inode的vnode引用计数,当这个计数为0时,就会在VOP_INACTIVE例程中释放inode。

论坛徽章:
0
36 [报告]
发表于 2006-04-20 17:11 |只看该作者
所以,这样理解就简单了

论坛徽章:
0
37 [报告]
发表于 2006-04-20 17:19 |只看该作者
原帖由 思一克 于 2006-4-20 17:11 发表
所以,这样理解就简单了


承蒙高手点拨!多谢多谢!

论坛徽章:
0
38 [报告]
发表于 2006-04-20 17:25 |只看该作者
to YSFP,

什么高手低手的。都是共同学习。另外,实在不敢到FBSD来,因为连见都没见过。
但这个问题和LINUX是共同的

论坛徽章:
0
39 [报告]
发表于 2006-04-20 17:35 |只看该作者
原帖由 思一克 于 2006-4-20 17:25 发表
to YSFP,

什么高手低手的。都是共同学习。另外,实在不敢到FBSD来,因为连见都没见过。
但这个问题和LINUX是共同的


BSD研究最便捷的方法就是借助于Linux的大量高手和文档资料,在互相比较中探索前进。俺桌上的Linux书就比BSD的书多,因为BSD的书总共也没几本,
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP