当前位置:  技术问答>linux和unix

Linux内核信号量和定时器问题请教:

    来源: 互联网  发布时间:2016-07-29

    本文导语:  正在学习用户态线程和内核态定时器的使用,有个问题请教大家: 我在用户空间建立了一个线程,内核做一个字符驱动模块,通过ioctl调用来不断读取内核定时器有没有 到期。在设备结构体里面加了一个信号量,在open调用...


正在学习用户态线程和内核态定时器的使用,有个问题请教大家:

我在用户空间建立了一个线程,内核做一个字符驱动模块,通过ioctl调用来不断读取内核定时器有没有

到期。在设备结构体里面加了一个信号量,在open调用的时候把信号量拿到,使用一个内核定时器,在内

核定时器到期的处理函数里面释放信号量,这样用户线程调ioctl的时候就获取不到信号量了,等定时器

超时了,就会释放信号量,这样ioctl就返回到用户空间了,可是下次再调用ioctl的时候就不等待信号量了,不知道为什么??

不知道这样做行不行,看书上好像都是两个内核线程间用信号量来通信,请大家指教,谢谢!

void timer_handle(void)
{
  int i = 0;
  mod_timer(&KDA_devp->s_timer,jiffies + HZ * 5);  /*重新改变定时器的超时时间*/      
  up(&KDA_devp->sem);  /*释放信号量,ioctl调用可以获取到该信号量*/

}

int KDA_open(struct inode *inode, struct file *filp)
{

struct KDA_dev *dev; /* device information */

dev = container_of(inode->i_cdev, struct KDA_dev, cdev);
filp->private_data = dev; /* for other methods */

 init_timer(&KDA_devp->s_timer);
 KDA_devp->s_timer.function = &timer_handle;
 KDA_devp->s_timer.expires = jiffies + HZ * 5;
 add_timer(&KDA_devp->s_timer); /*添加(注册)定时器*/
 down_interruptible(&dev->sem); /*获取信号量*/

return 0;

}


int KDA_ioctl(struct inode *inode, struct file *filp,
                 unsigned int cmd, unsigned long arg)
{
int err = 0;
int isr_num = 100;

struct KDA_dev *dev = filp->private_data; 

printk("want to get sem n");

down_interruptible(&dev->sem);

switch(cmd)
{
case  1 :
printk("the case 1 n");
break;

case 2 :
printk("the case 2 n");
break;

case 3 :
        __put_user(KDA_devp->ISR_flag, (int __user *)arg);               
break;
default:
printk("the default case  n");
}

}

|
我个人觉得你这样做应该能实现你要的效果,但是逻辑上有点问题,理由如下:

1、信号量适用于进程间通信,而你这里实际上只有一个进程,即用户态创建的进程(你写成了线程)。这个进程和内核之间进行通过驱动接口进行数据交流,这个过程中并没有引入新的进程。其实简单化来看:这个模型的工作就是在进程里面先down()了一下,然后再up()一下,在down和up这段时间间隔内,轮询的查看信号量是否可用。但是信号量的真正作用确是用于进程间的通信,所以说你的效果应该能实现,但是逻辑上有点问题。

2、再分析下你这个模型,轮询的查看,这个很浪费CPU的资源。而根据你的设计,似乎用condition更合适一些。即先down()一下,然后用户态的进程就在那里阻塞着,什么时候定时器超时了,这个时候再产生一个condition,通知用户态的进程:我完事了,到你了。这时候用户态的进程再执行其他的操作。这样似乎效率更高一些。逻辑上也合理一些。

以上只是个人分析,未必全面,欢迎拍砖。

PS:这个确实是个挺不错的问题!

|
   一般性思路: 应用程序调用驱动,通常在驱动里加入同步机制,例如用信号量加条件变量。
有数据需要应用程序处理时,驱动就唤醒应用程序,否则使应用程序睡眠(挂起)。这种异步的做法比较节省资源,比应用程序轮询高效得多。





    
 
 

您可能感兴趣的文章:

  • 在linux下怎么使用信号量?
  • linux 中信号量的使用 当信号初始化的时候设置的值大于1将是如何?
  • 关于Linux下的信号量
  • 请问下,在嵌入式linux驱动里面可不可以用信号量?
  • linux中信号量实现原理
  • linux下信号量的释放的问题
  • linux服务器中,php页面中信号量锁住的问题,在线等
  • 在linux下有没有系统的命令可以看到某个信号量被哪个进程锁定?
  • linux posix信号量使用疑问
  • 靠,Linux提供给应用开发的信号量机制也太复杂了吧
  • 求 思路 信号量控制函数中的线程sleep 100微秒。(linux)
  • 一个关于linux的信号量集的问题
  • linux设备驱动中的信号量机制
  • 求助:linux 用户态 线程同步中信号量、互斥量、锁之间的区别?
  • 关于Linux程序设计中多线程信号量的一个疑问
  • linux 下使用信号量编程的问题·~~~~谁能帮帮我啊????
  • linux多线程编程详解教程(线程通过信号量实现通信代码)
  • linux 定时器销毁
  • 请问linux下的定时器怎么使用??******************************
  • Linux用户态可以通过同一段程序创建多个定时器么?
  • Linux 提供的基于文件描述符的定时器接口
  • linux定时器!
  • linux下如何设置高精度定时器?
  • 测试linux定时器
  • linux 多个定时器 几乎同时到时 , 部分定时器信号 丢失的问题.
  • linux里面如何实现定时器的功能
  • 请问Linux下如何使用定时器?
  • linux中的串口通信判断一帧数据是否传输完整时,用定时器检查前后两帧数据的间隔时间,该用什么定时函数,有详细代码最好,谢谢!
  • ***请问linux下面有没有使用精度到ms级的定时器API函数啊?***
  • Linux下有定时器库函数吗?
  • linux下,如何在多线程中每个线程设置一个定时器,在线等,急。。。谢谢
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Linux内核中影响tcp三次握手的一些协议配置
  • 我想学习linux桌面编程,那么有没有必要学习linux的内核以及内核的相关编程呢?
  • TCP协议四次断连过程介绍及Linux内核协议栈中相关设置项
  • 网络技术 iis7站长之家
  • Linux进程的内核栈和用户栈概念,相互关系及切换过程
  • 读懂 Linux 内核代码不难,难的是读懂 Linux 内核代码背后的哲学!
  • linux内核中的likely宏和unlikely宏介绍及用法
  • Linux中内核线程不访问内核态地址空间?
  • Linux下c/c++开发之程序崩溃(Segment fault)时内核转储文件(core dump)生成设置方法
  • linux为什么要升级内核?升级内核有何作用?
  • 请问linux中如何判断内核是否已经启动。(在内核中写程序)
  • 《Linux内核情景分析》值得推荐的内核学习参考两用资料
  • *******是不是对内核模块编程然后再重新编译内核就可以把此模块整合到linux系统中
  • Linux 编译内核之后 没办法选择内核版本
  • 想看linux内核源代码,另外手头上有一本《unix环境高级编程》,需要先把《unix环境高级编程》看完之后再看内核吗?
  • 请问重新编译LINUX内核是否能将没有用的外设的驱动程序删除并减少内核占有内存的资源?请好心人仕指教!
  • Linux内核工具包 TOMOYO Linux
  • 请问:构建嵌入式linux环境时,“Linux内核的移植”是达到什么目的啊?
  • 求教,Linux下键盘输入的所有数据都会经过Linux内核吗???
  • 高深问题:有了linux内核源代码如何做成一个linux操作系统
  • linux内核编译一定要在linux环境下么?
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3