免费注册 查看新帖 |

Chinaunix

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

[内核模块] prepare_to_wait的疑问。。。 [复制链接]

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-07-22 20:09 |只看该作者 |倒序浏览
30可用积分
本帖最后由 chishanmingshen 于 2014-07-25 14:27 编辑

      
ldd3(p159)都是这么用的:
  1.   prepare_to_wait(&dev->outq, &wait, TASK_INTERRUPTIBLE);
  2.         if (spacefree(dev) == 0)
  3.             schedule();
  4.         finish_wait(&dev->outq, &wait);
复制代码
我的疑问是,A在执行完spacefree(dev) == 0(此时确实为0)后,如果被B进程打断并让spacefree(dev) !=0了,那么A进程还继续执行schedule?

求解,谢谢!

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
2 [报告]
发表于 2014-07-23 19:11 |只看该作者
这个应该是有信号量控制,另外的进程在进行spacefree(dev) 相关操作是是需要先获取相应的信号量的,书上有注释。

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2014-07-23 21:15 |只看该作者
  1. static int scull_getwritespace(struct scull_pipe *dev, struct file *filp)
  2. {
  3.     while (spacefree(dev) == 0) { /* full */
  4.         DEFINE_WAIT(wait);

  5.         up(&dev->sem);
  6.         if (filp->f_flags & O_NONBLOCK)
  7.             return -EAGAIN;
  8.         PDEBUG("\"%s\" writing: going to sleep\n",current->comm);
  9.         prepare_to_wait(&dev->outq, &wait, TASK_INTERRUPTIBLE);
  10.         if (spacefree(dev) == 0)
  11.             schedule();
  12.         finish_wait(&dev->outq, &wait);
  13.         if (signal_pending(current))
  14.             return -ERESTARTSYS; /* signal: tell the fs layer to handle it */
  15.         if (down_interruptible(&dev->sem))
  16.             return -ERESTARTSYS;
  17.     }
  18.     return 0;
  19. }
复制代码
回复 2# humjb_1983


这个,真没有啊。

   

论坛徽章:
2
寅虎
日期:2014-11-25 21:47:342015小元宵徽章
日期:2015-03-06 15:58:18
4 [报告]
发表于 2014-07-23 21:39 |只看该作者
本帖最后由 镇水铁牛 于 2014-07-23 21:42 编辑

prepare_to_wait(&dev->outq, &wait, TASK_INTERRUPTIBLE);//把wait挂在等待队列outq上,应该有另外的地方将其唤 醒的,搜搜wake_up(&dev->outq)之类的

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2014-07-23 21:48 |只看该作者
回复 4# 镇水铁牛


       如果出现我一楼说的情况,那么B在**A时,A还在运行啊,那么**岂不是浪费了一次机会?

论坛徽章:
2
寅虎
日期:2014-11-25 21:47:342015小元宵徽章
日期:2015-03-06 15:58:18
6 [报告]
发表于 2014-07-23 22:24 |只看该作者
本帖最后由 镇水铁牛 于 2014-07-23 22:41 编辑
chishanmingshen 发表于 2014-07-23 21:48
回复 4# 镇水铁牛

prepare_to_wait(&dev->outq, &wait, TASK_INTERRUPTIBLE);
if (spacefree(dev) == 0)
            schedule();
finish_wait(&dev->outq, &wait);
我的疑问是,A在执行完spacefree(dev) == 0(此时确实为0)后,【疑问:A为什么会执行到spacefree,还是由于B将A唤 醒了吧】
如果被B进程打断并让spacefree(dev) !=0了,那么A进程还继续执行schedule?【疑问:spacefree(dev) !=0了,为什么会执行schedule?】

论坛徽章:
2
寅虎
日期:2014-11-25 21:47:342015小元宵徽章
日期:2015-03-06 15:58:18
7 [报告]
发表于 2014-07-23 22:26 |只看该作者

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2014-07-23 22:45 |只看该作者
回复 6# 镇水铁牛


>    如果被B进程打断并让spacefree(dev) !=0了,那么A进程还继续执行schedule?【疑问:spacefree(dev) !=0了,为什么会执行schedule?】
A一看spacefree(dev) ==0, 就要执行schedule,但是还未执行的时候,被B打断了。当A回来后会继续执行schedule

论坛徽章:
2
寅虎
日期:2014-11-25 21:47:342015小元宵徽章
日期:2015-03-06 15:58:18
9 [报告]
发表于 2014-07-23 23:11 |只看该作者
chishanmingshen 发表于 2014-07-23 22:45
回复 6# 镇水铁牛

首先对于这种spacefree(dev)访问一般是加锁,并且你采用waitq方式,就表明你对事件的关注度没有那么紧迫,浪费点也没啥子了。

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
10 [报告]
发表于 2014-07-24 09:12 |只看该作者
回复 9# 镇水铁牛


    不可能吧,还能允许浪费。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP