免费注册 查看新帖 |

Chinaunix

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

问一下从sys_read到唤醒进程的过程 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-30 18:06 |只看该作者 |倒序浏览
进程A读取文件x并阻塞,进程B读取文件y并阻塞,最后过程是CPU使用读写I/O端口的指令完成读取过程
在I/O指令完成后,要唤醒进程A和B
我的问题是I/O指令显然不知道A读取的x,B读取的y,那究竟是怎样使得读取x后唤醒A,读取y后唤醒B?
我本来想自己看内核代码的函数嵌套过程的,但这个过程对我来说太复杂了,大概到
http://lxr.linux.no/linux+v2.6.27/fs/sysfs/bin.c#L36
这里就不知道怎么往后找了,希望各位能帮我解释一下,谢谢!

[ 本帖最后由 silentfish 于 2008-11-30 19:00 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-11-30 20:29 |只看该作者
最后过程是CPU使用读写I/O端口的指令完成读取过程

文件的读取不是靠CPU的读I/O端口指令完成的,建议LZ看看UKL块设备部分的内容

以下是2.6.11内核读文件的部分代码,进程阻塞由wait_on_page_locked()完成

//////////////////////////////////////读文件//////////////////////////////////////////////
sys_read()->2.6.11
----------------------------VFS层工作---------------------------------------
vfs_read()->
        file->f_op->read()->
----------------------------磁盘文件系统和Page cache工作-------------------------------------------------
                generic_file_read()->//sys_readv()系统调用同样调用这个函数
                        __generic_file_aio_read()->
                                do_generic_file_read()->//完成一个区域的读操作
                                        for(每页)//每次迭代完成读一页数据
                                                调用find_get_page()//从页高速缓存中寻找,如果找到继续读下一页

                                                否则page_cache_alloc_cold()
                                                add_to_page_cache_lru()//将页加入缓存
                                                mapping->a_ops->readpage(filp, page)
                                                        ext3_readpage()->//调用具体文件系统读取一页数据的方法
                                                        ...       
                                                //阻塞进程直到page的PG_locked标志清空,此处即使读进程被阻塞的代码
                                                if (!PageUptodate(page)) {
                                                        wait_on_page_locked(page)
                                                将页面中的内容拷贝的用户空间(此过程可能发生缺页异常),继续读下一页

论坛徽章:
0
3 [报告]
发表于 2008-11-30 20:53 |只看该作者

回复 #2 mars007 的帖子

这就看,先谢谢了!

论坛徽章:
0
4 [报告]
发表于 2008-11-30 21:12 |只看该作者

看了ULK的一部分,似乎明白了

是不是说在只有一个硬盘设备的前提下,块设备驱动程序可能有多个访问请求,但同一时刻只能有一个正在处理(这里的处理指真正的I/O指令)的未完成的访问?

论坛徽章:
0
5 [报告]
发表于 2010-01-06 10:22 |只看该作者
up, 顶一下, 知道的兄弟说说
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP