等待队列
参考:
http://blog.csdn.net/murui/archive/2008/04/23/2318280.aspx
http://blog.ednchina.com/tiloog/133368/message.aspx
http://blogold.chinaunix.net/u2/73528/showart_1108420.html
什么是等待队列?
在软件开发中任务经常由于某种条件没有得到满足而不得不进入睡眠 状态,然后等待条件得到满足的时候再继续运行 ,进入运行状态。这种需求需要等待队列机制的支持。 Linux 中提供了等待队列的机制,该机制在内核中应用很广泛。
在 Linux 内核中使用等待队列的过程很简单,首先定义一个 wait_queue_head ,然后如果一个 task 想等待某种事件,那么调用 wait_event (等待队列,事件)就可以了。
linux 中等待队列的实现思想如下图所示,当一个任务需要在某个 wait_queue_head 上睡眠时,将自己的进程控制块信息封装到 wait_queue 中,然后挂载到 wait_queue 的链表中,执行调度睡眠。当某些事件发生后,另一个任务(进程)会唤醒 wait_queue_head 上的某个或者所有任务,唤醒工作也就是将等待队列中的任务设置为可调度的状态,并且从队列中删除。
Linux 内核的等待队列是以双循环链表为基础数据结构,与进程调度机制紧密结合,能够用于实现核心的异步事件通知机制。在 Linux2.4.21 中,等待队列在源代码树 include/linux/wait.h 中,这是一个通过 list_head 连接的典型双循环链表,如下图所示。
在这个链表中,有两种数据结构:等待队列头( wait_queue_head_t )和等待队列项( wait_queue_t )。等待队列头和等待队列项中都包含一个 list_head 类型的域作为 " 连接件 " 。由于我们只需要对队列进行添加和删除操作,并不会修改其中的对象(等待队列项),因此,我们只需要提供一把保护整个基础设施和所有对象的锁,这把锁保存在等待队列头中,为 wq_lock_t 类型。在实现中,可以支持读写锁( rwlock )或自旋锁( spinlock )两种类型,通过一个宏定义来切换。如果使用读写锁,将 wq_lock_t 定义为 rwlock_t 类型;如果是自旋锁,将 wq_lock_t 定义为 spinlock_t 类型。无论哪种情况,分别相应设置 wq_read_lock 、 wq_read_unlock 、 wq_read_lock_irqsave 、 wq_read_unlock_irqrestore 、 wq_write_lock_irq 、 wq_write_unlock 、 wq_write_lock_irqsave 和 wq_write_unlock_irqrestore 等宏。
Linux中的物理地址与虚拟地址
http://blog.csdn.net/do2jiang/archive/2010/04/05/5450839.aspx
linux中,驱动程序不能直接访问物理地址空间,要访问外设的寄存器,需要将寄存器的地址映射到虚拟地址中,才能访问,wince也是这样的。
Linux中的Socket编程
htons(将16位主机字符顺序转换成网络字符顺序)host to network
因为网络的字节顺序与CPU的字节顺序可能不同,所以转一下,只有16位,32位需要,8位一个字节的不需要了。
peeraddr.sin_port=htons(atoi(argv[2]));argv2是port
atoi:ascii to int,字符串转成有符号整数。
inet_pton(AF_INET, argv[1], &peeraddr.sin_addr),点分十进制IP地址转成IP地址结构体