0

当我的每一个被调用时,我的驱动程序中就会ioctl调用一个magic()函数,并且每当在开始和结束注释之间的代码中调用该函数时,不应由任何其他进程或线程调度。

magic()
{
// start

some code is here.

// end
}

我想要做的是:每当处理器开始执行代码,在启动之后,直到它完成到结束,它不应该被处理器调度。

那么我该怎么做呢?这是同一个东西,也被称为原子过程吗?

通过在互斥体之间保留该代码将提供该功能吗?

4

2 回答 2

1

曾经在类似的场景中,当我需要一个剪贴簿类型的地方时,多个客户端线程将写入并由充当服务器线程的线程读取,我所做的有点像这样:我所指的这些函数只是这里的例子,尽量不要担心参数和共享变量。

c1_thread_write() //let this be the unique function that client_thread_1 executes after it's inception  
{
   //some calls to open the scrapbook
   //the scrapbook thing I am referring to, is a buffer
   //Now I want to ensure that when client_thread_1 is writing, no other process or thread should be scheduled, which may somehow cause the client_thread_1 to exit this writing function without completing it.

   //so, I will create a MUTEX, lock it here as the first thing that gets executed in this function. MUTEX will be of ERROR_CHECK type
   //Start writing to the buffer, finish it
   //Unlock the mutex
   //call the pthread_join() and exit
}
于 2013-11-13T05:55:03.897 回答
1

这需要根据情况进行信号量/自旋锁。这是一个简单的字符驱动程序代码。当调用设备打开函数时,它会查看是否有其他进程打开了该设备,如果是,则等待它关闭。如果该设备没有被任何其他进程使用,它可以打开该设备。这是通过使用信号量来实现的。进程必须通过获取信号量来访问代码,一旦完成,它必须/应该释放信号量。下面是打开和关闭函数。

static int device_open(struct inode *inode, struct file *filp) {
    if(down_interruptible(&sem) != 0) {//take the semaphore
        printk(KERN_ALERT "megharajchard : the device has been opened by some other device, unable to open lock\n");
        return -1;
    }
    //buff_rptr = buff_wptr = device_buffer;
    printk(KERN_INFO "megharajchard : device opened succesfully\n");
    return 0;
}

这里进程试图打开设备,它必须接受信号量,一旦被接受,将不允许其他进程打开设备。

下面是关闭设备功能,进程将释放信号量,以便其他进程可以打开设备并使用它。

static int device_close(struct inode *inode, struct file *filp) {
    up(&sem);// release the semaphore
    printk(KERN_INFO "megharajchard : device has been closed\n");
    return ret;
}

原子意味着进程无法休眠的情况,通常在中断上下文中运行时遇到。在执行过程中不允许睡眠的地方。为了在这种情况下实现锁定,我们必须使用自旋锁。

如果您需要更多信息,请告诉我。

于 2013-11-13T06:21:24.857 回答