免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2067 | 回复: 3
打印 上一主题 下一主题

请教:一个读文件问题 和 一个可否休眠问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-02-23 20:59 |只看该作者 |倒序浏览
小弟初学,最近有两个问题,请大家指点一下:

1. 在系统发起一个sys_read调用后,经过VFS,到具体文件系统,再到mpage_readpage,在提交完bio之后就返回了,请问一个读磁盘操作在什么地方被阻塞?然后又是在哪里被唤醒? 想知道具体的代码在那个文件。

2.另外一个问题是:在linux device drivers一书的第五章并发和竞态中提到,信号量保护的区域中可用进入休眠,而在自旋锁保护的区域中却不能休眠。为什么呢?(感觉互斥信号量和自旋锁没有太大的区别) 就算是自旋锁保护的区域也应该可用休眠吧,不就是有些进程需要等待这个自旋锁而已,反正进程又不会被饿死,为什么自旋锁保护的区域不能休眠而信号量却行呢?

感激不尽,谢谢!!

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
2 [报告]
发表于 2008-02-23 22:16 |只看该作者
1) 提交BIO后就会睡眠,还在xxx_readpage之中,主动wait_on_page.
  唤醒是在buffer_head的回调函数中

2) 有一种特殊情.
  CPU_A和CPU_B.process_a,process_b和process_c都需要spinlock.
  假设process_c得到了spinlock,而后睡眠,
  process_a和process_b分别运行于CPU_A和CPU_B.这时,process_a和process_b发现不能获得spinlock,于是不停自旋. 
  换言之,CPU_A和CPU_B被占死了,process_c即使被一个中断唤醒,也根本不会得到运行的机会,也就无法释放spinlock.
  于是,就这样一直占死下去.

论坛徽章:
0
3 [报告]
发表于 2008-02-23 22:29 |只看该作者
原帖由 pennyliang 于 2008-2-23 20:59 发表
小弟初学,最近有两个问题,请大家指点一下:

1. 在系统发起一个sys_read调用后,经过VFS,到具体文件系统,再到mpage_readpage,在提交完bio之后就返回了,请问一个读磁盘操作在什么地方被阻塞?然后又是在 ...

1. 补充一下:

  1. mm/filemap.c
  2. readpage:
  3.                 /* Start the actual read. The read will unlock the page. */
  4.                 error = mapping->a_ops->readpage(filp, page);

  5.                 if (unlikely(error)) {
  6.                         if (error == AOP_TRUNCATED_PAGE) {
  7.                                 page_cache_release(page);
  8.                                 goto find_page;
  9.                         }
  10.                         goto readpage_error;
  11.                 }

  12.                 if (!PageUptodate(page)) {
  13.                         lock_page(page) //HERE XXXXXXXXXXXXXXXXXXXX
  14.                         if (!PageUptodate(page)) {
  15.                                 if (page->mapping == NULL) {
  16.                                         /*
  17.                                          * invalidate_inode_pages got it
  18.                                          */
  19.                                         unlock_page(page);
  20.                                         page_cache_release(page);
  21.                                         goto find_page;
  22.                                 }
  23.                                 unlock_page(page);
  24.                                 error = -EIO;
  25.                                 shrink_readahead_size_eio(filp, &ra);
  26.                                 goto readpage_error;
  27.                         }
  28.                         unlock_page(page);
  29.                 }

  30.                 /*
复制代码

注释标出的lock_page有睡眠进程的作用。在这段代码之前,read_page()被调用前已经调用过lock_page,执行到注释处时表示用于读数据的page的PG_update标志仍然没被设上,于是对一个已经lock的page再次调用lock_page将使进程睡眠。

2. 如塑料袋兄所说,要考虑多处理器情况。

[ 本帖最后由 zx_wing 于 2008-2-23 22:31 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2008-02-23 23:41 |只看该作者
谢谢两位!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP