分类: LINUX
2016-07-21 11:07:28
阻塞与非阻塞
阻塞调用是指在调用结果返回前,挂起当前进程;知道结果返回后才返回。
同步和阻塞的差异:同步仅仅强调逻辑上先后,及逻辑上没有返回,但不一定挂起当前线程。
非阻塞调用是指在不能立刻得到结果时,立刻返回,不会挂起当前线程。
对象阻塞状态与阻塞调用的关系
对象处于阻塞状态与阻塞调用有一定的相关性,但不是一一对应关系。阻塞对象可以使用非阻塞调用,可以
通过轮询方式查看,然后调用阻塞函数,这样避免阻塞;非阻塞对象也可以使用阻塞的调用方式,例如
select系统调用。
挂起(休眠)
休眠意味着线程被标志为特殊状态并从运行队列移除。直到某些情况修改了这一状况,才重新调度执行。休
眠的线程被搁置一边,等待某个事件发生。
安全进入休眠要记住个2规则:
等待队列
等待队列用处很多,尤其是中断处理、进程同步、定时等场合。可以使用等待队列唤醒进程的唤醒.
wait_queue_head_t my_queue;
init_waitqueue_head(& my_queue);
或静态定义并初始化:DECLARE_WAIT_QUEUE_HEAD(name)
点击(此处)折叠或打开
点击(此处)折叠或打开
系统提供select函数来实现多路复用输入/输出模型。原型:
#include <linux/poll.h>
int select(int maxfd,fd_set *rdset,fd_set *wrset,fd_set *exset,struct timeval *timeout);
参数maxfd是需要监视的最大的文件描述符值+1;
返回值正整数,表示满足的文件描述符的个数.
返回0,表示超时.
返回-1,且errno为 -EENTIR,表示select在阻塞时被信号中断.
返回-1,其他情况下的错误返回,会设置相应errno.
FD_SET(int fd,fd_set *fdset);用于在文件描述符集合中增加一个新的文件描述符。
FD_CLR(fd_set *fdset);用于在文件描述符集合中删除一个文件描述符。
FD_ISSET(int fd,fd_set *fdset);用于测试指定的文件描述符是否在该集合中。
unsigned int poll(struct file *filp,poi_table *wait);
poll设备方法负责完成:
void poll_wait(struct file *,wait_queue_head_t *,poll_table *);
该函数不会挂起当前进程
POLLIN 设备可读
POLLRDNORM 数据可读
POLLOUT 设备可写
POLLWRNORM 数据可写
设备可读一般返回(POLLIN|POLLRDNORM),设备可写一般返回(POLLOUT|POLLWRNORM).