信号量

    在内核中,为了解决使用多个进程或者中断竞争共同的资源问题,引进Semaphore信号量机制;

   一.完成量:compation,常用于中断之间,以下是字符设备驱动,多个read进程来同时调用字符设备,而当么有write的时候,read只可以等着。

      

  1 #include <linux/init.h>
  2 #include <linux/thread_info.h>
  3 #include <linux/module.h>
  4 #include <linux/sched.h>
  5 #include <linux/errno.h>
  6 #include <linux/kernel.h>
  7 #include <linux/module.h>
  8 #include <linux/slab.h>
  9 #include <linux/input.h>
 10 #include <linux/init.h>
 11 #include <linux/serio.h>
 12 #include <linux/delay.h>
 13 #include <linux/clk.h>
 14 #include <linux/miscdevice.h>
 15 #include <linux/io.h>
 16 #include <linux/ioport.h>
 17 #include <linux/vmalloc.h>
 18 #include <linux/dma-mapping.h>
 19 #include <linux/export.h>
 20 #include <linux/gfp.h>
 21 #include <linux/cdev.h>
 22 
 23 #include <asm/dma-mapping.h>
 24 #include <asm/uaccess.h>
 25 
 26 #include <linux/gpio.h>
 27 #include <mach/gpio.h>
 28 #include <plat/gpio-cfg.h>
 29 #include <linux/completion.h>
 30 
 31 MODULE_LICENSE("GPL");
 32 MODULE_AUTHOR("bunfly");
 33 
 34 
 35 struct completion  read_com;
 36 
 37 int myopen(struct inode *no, struct file *fp)
 38 {
 39     return 0;
 40 }
 41 
 42 int myrelease(struct inode *no, struct file *fp)
 43 {
 44     return 0;
 45 }
 46 
 47 int mywrite(struct file *fp, char *buf, int size, int *off)
 48 {
 49     complete(&read_com);
 50     //完成可完成的完成量
 51     //complete_all(&read_com);
 52     return 0;
 53 }
 54 
 55 int myread(struct file *fp, char *buf, int size, int *off)
 56 {
 57     wait_for_completion_interruptible(&read_com);
 58     //wait_for_completion(&read_com);
 59     //等待可打断的completicon
 60     return 0;
 61 }
 62 
 63 struct cdev  mydev;
 64 struct file_operations  fops = {
 65     .open = myopen,
 66     .release = myrelease,
 67     .write = mywrite,
 68     .read = myread,
 69 };
 70 
 71 int test_init()
 72 {
 73     int ret = 0;
 74 
 75     cdev_init(&mydev, &fops);
 76     cdev_add(&mydev, MKDEV(22, 29), 1);
 77 
 78     init_completion(&read_com);
 79     //初始化一个完成量
 80     return 0;
 81 }
 82 
 83 void test_exit()
 84 {
 85     cdev_del(&mydev);
 86 }
 87 
 88 module_init(test_init);
 89 module_exit(test_exit);
 90 
~                              

      二.锁问题:

         1.解决中断的问题:

          a:

             local_irq_enable();

             local_irq_disable();

             禁用所有中断,在处理之后,再打开中断;

          b: 

          .local_irq_save(flag)    保存并退出

          local_irq_restore(flag)  

          

          c:

          .spin_lock_irq(&lock)

           spin_lock_irq(lock)

              单核中等于禁用中断

       2.进程与进程之间:

          a:

            preampt_disable()

            preampt_able()

                禁用抢占(禁用切换任务)

          b:

            spin_lock(&lock)

            spin_lock(&lock)

             (尽量多用)
 
 
    总结:
        1.信号量,在各种处理中,不可一嵌套,比较容易造成死锁
        2.在拥有信号量的时候,尽量不要再去申请;
        3.如果只有解决进程竞争问题,--------->信号量 semphone;如果有中断的话-------->>>>spin_lock()

 

posted @ 2015-05-28 17:17  慢伴拍的二叉树  阅读(331)  评论(0编辑  收藏  举报