linux等待队列
1. linux系统中实现阻塞有哪些方法 等待队列 自旋锁 中断
你只在 server 进程中(对应spid==0),调用 open_queue 来打开消息队列,即msqid只在这个进程中有效,在host进程中(对应cpid==0),由于msqid无效,所以无法发送消息。 解决方法:只要把 do { msqid = open_queue(key); } while (msqid == -1); 这段代码移到第一个fork之前,这样所有的进程中的msqid就都指向那个队列了。 还有问题可以 hi我,别忘了加分。
2. Linux 工作队列和等待队列的区别
work queue是一种bottom half,中断处理的后半程,强调的是动态的概念,即work是重点,而queue是其次。
wait queue是一种“任务队列”,可以把一些进程放在上面睡眠等待某个事件,强调静态多一些,重点在queue上,即它就是一个queue,这个queue如何调度,什么时候调度并不重要
等待队列在内核中有很多用途,尤其适合用于中断处理,进程同步及定时。这里只说,进程经常必须等待某些事件的发生。例如,等待一个磁盘操作的终止,等待释放系统资源,或者等待时间经过固定的间隔。
等待队列实现了在事件上的条件等待,希望等待特定事件的进程把放进合适的等待队列,并放弃控制权。因此。等待队列表示一组睡眠的进程,当某一条件为真时,由内核唤醒进程。
等待队列由循环链表实现,其元素包括指向进程描述符的指针。每个等待队列都有一个等待队列头,等待队列头是一个类型为wait_queue_head_t的数据结构。
等待队列链表的每个元素代表一个睡眠进程,该进程等待某一事件的发生,描述符地址存放在task字段中。然而,要唤醒等待队列中所有的进程有时并不方便。例如,如果两个或多个进程在等待互斥访问某一个要释放的资源,仅唤醒等待队列中一个才有意义。这个进程占有资源,而其他进程继续睡眠可以用DECLARE_WAIT_QUEUE_HEAD(name)宏定义一个新的等待队列,该宏静态地声明和初始化名为name的等待队列头变量。 init_waitqueue_head()函数用于初始化已动态分配的wait queue head变量等待队列可以通过DECLARE_WAITQUEUE()静态创建,也可以用init_waitqueue_head()动态创建。进程放入等待队列并设置成不可执行状态。
工作队列,workqueue,它允许内核代码来请求在将来某个时间调用一个函数。用来处理不是很紧急事件的回调方式处理方法.工作队列的作用就是把工作推后,交由一个内核线程去执行,更直接的说就是写了一个函数,而现在不想马上执行它,需要在将来某个时刻去执行,那就得用工作队列准没错。
如果需要用一个可以重新调度的实体来执行下半部处理,也应该使用工作队列。是唯一能在进程上下文运行的下半部实现的机制。这意味着在需要获得大量的内存时、在需要获取信号量时,在需要执行阻塞式的I/O操作时,都会非常有用。
3. linux内核中有多少个等待队列
一个等待事件初始化一个等待队列
4. linux多线程怎么实现等待队列
首先硬盘I/O是慢速的I/O。你开了4个线程,无非就是全部在等待。原因很简单,你只有一个硬盘。而这个硬盘同一时间只能被一个线程使用。
5. linux 怎样让当前进程进入等待队列
对于linux而言,进程的等待是由于kernel中的一个事件等待队列,这个进程排在了这个等待队列里,他就标志为等待状态。在这个队列的等待资源就绪后,队列里的进程也都会成为就绪。
6. Linux内核中等待队列的几种用法
1. 睡眠等待某个条件发生(条件为假时睡眠):
睡眠方式:wait_event, wait_event_interruptible
唤醒方式:wake_up (唤醒时要检测条件是否为真,如果还为假则继续睡眠,唤醒前一定要把条件变为真)
2. 手工休眠方式一:
1)建立并初始化一个等待队列项
DEFINE_WAIT(my_wait) <== wait_queue_t my_wait; init_wait(&my_wait);
2)将等待队列项添加到等待队列头中,并设置进程的状态
prepare_to_wait(wait_queue_head_t *queue, wait_queue_t *wait, int state)
3)调用schele(),告诉内核调度别的进程运行
4)schele返回,完成后续清理工作
finish_wait()
3. 手工休眠方式二:
1)建立并初始化一个等待队列项:
DEFINE_WAIT(my_wait) <== wait_queue_t my_wait; init_wait(&my_wait);
2)将等待队列项添加到等待队列头中:
add_wait_queue
3)设置进程状态
__set_current_status(TASK_INTERRUPTIBLE);
4)schele()
5)将等待队列项从等待队列中移除
remove_wait_queue()
其实,这种休眠方式相当于把手工休眠方式一中的第二步prepare_to_wait拆成两步做了,即prepare_to_wait <====add_wait_queue + __set_current_status,其他都是一样的。
4. 老版本的睡眠函数sleep_on(wait_queue_head_t *queue):
7. linux内核等待队列实验
首先,你应该在 wait_event_interruptible和 wake_up_interruptible中使用相同的wait_queue,而你的代码显然不对,我觉得应该改成
wait_event_interruptible(memdev_queue, sleep_flag!=0);
其次,应该把 sleep_flag =1; 这句放在 wake_up_interruptible(&memdev_queue);
的前面,因为你调用这条语句去唤醒等待进程时,应该已经将 sleep_flag设置成1,否则被唤醒进程可能会发现 sleep_flag仍然为0。
然后,应该是在read中wait,在write中wake_up,write是生产者,read是消费者。
最后,在一个进程中执行 read (即 wait)后,这个进程就被block了,一直在等待被唤醒,因此你无法在同一个进程 wait 然后再试图在同一个进程执行 wake_up,必须先让一个进程 wait,然后再通过另外一个进程wake_up。
8. 在Linux驱动程序中,使用等待队列的作用
我帮你搜索到如下的回复希望对你有帮助《Linux就该这么学》
概念与术语
1内核里面的一个队列,可以将对象加入到队列中,
2可以选择条件休眠和无条件休眠,一般情况下是条件休眠用得较多。
3作用:阻塞读。当运用程序读数据但是现在还无数据可读时,往往会先挂起,
4让其他线程先走,等有数据可读时再唤醒。
5那么什么时候唤醒呢?怎样唤醒呢?
6这里等待队列就派上用场了。读的时候若无数据可读则加入到等待队列中,
7写入的时候唤醒这个队列。
8可以类比运用程序编程中的pthread_cond_wait()与pthread_cond_broadcast()记忆。
函数接口
include/linux/wait.h
9. 等待队列的使用案例
编写Linux驱动程序的一个问题是到底如何使用等待队列呢
处理等待队列的最佳方式就是依照如下操作:
1. 声明一个struct wait_queue * 变量. 你需要为每一个可以让进程睡眠的事件预备这样一个变量. 这就是我建议你放在描述硬件特性数据结构中的数据项.
2. 将该变量的指针作为参数传递给不同的sleep_on和wake_up函数.
这相当容易. 例如, 让我们想象一下, 当进程读你的设备时, 你要让这个进程睡眠, 然后在某人向设备写数据后唤醒这个进程. 下面的代码就可以完成这些工作:
struct wait_queue *wq= NULL;
read_write_t sleepy_read(struct inode *inode, struct file *flip, char *buf, count_t count)
{
printk(KERN_DEBUG process %i (%s) going to sleep
, current->pid, current->comm);
interruptible_sleep_on(&wq);
printk(KERN_DEBUG awoken %i (%s)
, current->pid, current->comm);
return 0;
}
read_write_t sleepy_write(struct inode *inode, struct file *flip, char *buf, count_t count)
{
printk(KERN_DEBUG process %i (%s) awakening the readers
, current->pid, current->comm);
wake_up_interruptible(&wq);
return count;
}
10. linux的进程等待队列有几个
根据等待不同的事件类型分成多个,比如jbd中等待数据写入完成,还有sched中等待时间经过固定的间隔,都会使用各种wait queue.