阻塞与非阻塞

阻塞是指执行设备操作时,不能获得 资源,则挂起进程直到满足可操作的条件在进行操作。

非阻塞是在进程不能进行设备操作时,并不挂起,要么放弃、要么不停的查询,直到进行操作为止。

等待队列;

typedef struct _wait_queue_head  wait_queue_head_t;

1.定义等待队列头部:wait_queue_head_t my_head;

2.初始化等待队列头:init_waitqueue_head(&my_queue);

DECLARE_WAIT_QUEUE_HEAD(name)可以作为 定义并初始化等待队列头的“快捷方式”。

3.定义等待队列元素:

DECLARE_WAITQUEUE(name,tsk);

4,添加和移除等待队列

void add_wait_queue(wait_queue_head_t *q, wiat_queue_t *wait);

void remove_wait_queue(wait_queue_head_t *q, wiat_queue_t *wait);

add_wait_queue()用于将等待队列元素wait添加到等待队列的头部q指向的双向链表中,

void remove_wait_queue用于将等待队列元素wait从等待队列的头部q指向的双向链表移除。

5.等待事件

wait_event(queue,condition)

wait_event_interruptible(queue,condition);

等待参数queue作为等待队列头部的队列被唤醒,condition必须满足,否则继续阻塞。

6.唤醒队列

void wake_up(wait_queue_head_t *queue);

void wake_up_interruptible(wait_queue_head_t *queue);

要对应起来用。

7,在等待队列上的睡眠

sleep_on(wait_queue_head_t *queue);

interruptible_sleep_on(wait_queue_head_t *queue);

sleep_on()函数的作用将进程状态置成task_uninterruptible,定义一个等待队列元素。之后把它赋予到q指向的队列,直到资源获得。

interruptible_sleep_on()函数的作用将进程状态置成task_interruptible。

Linux进程状态

1.如果非阻塞访问(o_nonblock)设备忙时,直接返回“-EAGAIN”

2.对于阻塞访问,会调用_set_current_state(task_interruptible)进行进程的状态切换并显示通过"schedule()"调度其他进程的执行

3.醒来的时候注意,由于调度出去的时候,进程状态task_interruptible,即浅度睡眠,唤醒的可能是信号,通过signal_pending(current)了解是不是信号,是返回“erestartsys”

轮询

int select(int numfd,fd_set *readfds, fd_set *writefds,fd_set *exceptfds,struct timeval *timeout);

其中readfds ,writefds,expectfds分别是select()监视的读写和异常处理 的文件描述符集合。

poll函数原型

unsigned int (*poll)(struct file * filp, struct poll_table* wait);

1.对可能引起设备文件变化状态的等待队列调用poll_wait(),将对应的等待队列头部添加到poll_table

2.返回表示是否对设备进行无阻塞读,写访问的掩码。

void poll_wait(struct file *filp,wait_queue_head_t *queue,poll_table *wait)

poll_wait就是把当前进程添加到wait参数指定的等待列表,实际让唤醒参数queue对应的等待队列可以唤醒因select()而睡眠的进程。

时间: 2024-09-30 13:03:57

阻塞与非阻塞的相关文章

同步与异步、阻塞与非阻塞

"阻塞"与"非阻塞"与"同步"与"异步"不能简单的从字面理解,提供一个从分布式系统角度的回答.1.同步与异步同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回.但是一旦调用返回,就得到返回值了.换句话说,就是由*调用者*主动等待这个*调用*的结果. 而异步则是相反

阻塞、非阻塞、同步、异步

同步和异步关注的是消息通信机制. 同步 调用者主动等待调用结果返回,没有得到结果之前,该调用不返回. 异步 调用者不必马上等待返回结果,执行部件通过通知.状态或回调函数来返回结果给调用者. 阻塞和非阻塞关注的是程序等待调用结果的状态. 阻塞 调用返回之前,当前线程挂起.调用线程只有等待结果之后才返回. 非阻塞 它不会阻塞当前线程.

同步与异步,阻塞与非阻塞基础

1.同步与异步 同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication) 同步,在发出一个调用时,在没有得到结果之前,该调用就不返回.但是一旦调用返回,就得到返回值了.是由调用者主动等待这个调用的结果. 异步,调用在发出之后,这个调用就直接返回了,所以没有返回结果.当一个异步过程调用发出后,调用者不会立刻得到结果.而是在调用发出后,被调用者通过状态.通知来通知调用者,或通过回调函数处理这个调用. 2.阻塞与非阻

Linux设备驱动中的阻塞和非阻塞I/O

[基本概念] 1.阻塞 阻塞操作是指在执行设备操作时,托不能获得资源,则挂起进程直到满足操作所需的条件后再进行操作.被挂起的进程进入休眠状态(不占用cpu资源),从调度器的运行队列转移到等待队列,直到条件满足. 2.非阻塞 非阻塞操作是指在进行设备操作是,若操作条件不满足并不会挂起,而是直接返回或重新查询(一直占用CPU资源)直到操作条件满足为止. 当用户空间的应用程序调用read(),write()等方法时,若设备的资源不能被获取,而用户又希望以阻塞的方式来访问设备,驱动程序应当在设备驱动层的

socket阻塞与非阻塞,同步与异步、I/O模型,select与poll、epoll比较

1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端: 同步:      所谓同步,就是在c端发出一个功能调用时,在没有得到结果之前,该调用就不返回.也就是必须一件一件事做,等前一件做完了才能做下一件事. 例如普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事 异步:      异步的概念和同步相对.当c端一个异步过程调用发出后,调

IO-同步,异步,阻塞,非阻塞

IO-同步,异步,阻塞,非阻塞1.什么是IO数据在系统内核(kernel)和用户进程之间的传递,称为IO. 2.IO操作步骤以read为例,涉及两个系统对象,调用IO的process(or thread),即用户进程:另一个为系统内核(kernel).当用户进程调用recvfrom操作时,会经历两个阶段1)等待数据准备2)将数据从内核拷贝至进程中 3.IO模型根据用户进程在IO操作时的状态,可以分为5中IO类型:blocking IO:阻塞IOnon-blocking IO:非阻塞IOIO mu

阻塞IO,非阻塞IO,异步IO和非异步IO 的区别

最近在研究java IO.NIO.NIO2(或者称AIO)相关的东西,有些概念还是要明确下. 按照<Unix网络编程>的划分,IO模型可以分为:阻塞IO.非阻塞IO.IO复用.信号驱动IO和异步IO,按照POSIX标准来划分只分为两类:同步IO和异步IO. 如何区分呢?首先一个IO操作其实分成了两个步骤: 1.发起IO请求 2.实际的IO操作 阻塞和非阻塞IO:在于第一个步骤是否会会被阻塞,如果会则是阻塞IO,否则是非阻塞IO. 异步和非异步(同步)IO:在于第二个步骤是否会阻塞,如果实际的I

同步和异步、阻塞和非阻塞

首先说明我对这些概念也不是很清楚,以下内容是我做的一些理事. 同步和异步.阻塞和非阻塞这是两组概念,说的是不同的事情,同步和阻塞没有必然的联系,异步和非阻塞也没有必然的联系.同步和异步是只跟IO操作过程中进程的状态变化有关.阻塞和非阻塞就是进程的两种状态.比如你去银行,排除的话就是一种同步的方式,叫号的话就是异步的方式.排队必须自己看着什么时候轮到自己,而叫号则不必,轮到你的时候会触发一个事件,或者说你会收到一个信号,别人会叫你.不管是排除还是叫号,如果你在等待的过程中不能做其他事情,那就是阻塞

Java中的阻塞和非阻塞IO包各自的优劣思考

NIO 设计背后的基石:反应器模式,用于事件多路分离和分派的体系结构模式. 反应器(Reactor):用于事件多路分离和分派的体系结构模式 通常的,对一个文件描述符指定的文件或设备, 有两种工作方式: 阻塞 与非阻塞 .所谓阻塞方式的意思是指, 当试图对该文件描述符进行读写时, 如果当时没有东西可读,或者暂时不可写, 程序就进入等待 状态, 直到有东西可读或者可写为止.而对于非阻塞状态, 如果没有东西可读, 或者不可写, 读写函数马上返回, 而不会等待 . 一种常用做法是:每建立一个Socket

阻塞与非阻塞IO -- 网络编程随想

阻塞和非阻塞IO 阻塞IO指当进行IO操作时, 如果IO操作无法立即完成,当前线程进入阻塞状态,直到IO操作完成,IO函数返回. 非阻塞IO指当进行IO操作时,如果IO操作无法立即完成,IO函数立即返回,线程不会阻塞. 写与读操作对阻塞与非阻塞IO的语义 写操作,只有完成所有指定数据的写入时,写操作才算完成. 读操作,只要能读取到数据,读操作就算完成. 阻塞IO 写操作.len 为指定写入的数据量. 如果只写入部分数据,IO函数会阻塞直至写入数据或发生错误才返回. 以soket的send()为例