非阻塞型I/O和阻塞型I/O

非阻塞型I/O和阻塞型I/O:

非阻塞型I/O
在这里插入图片描述

在这里插入图片描述

阻塞型I/O
如果资源不可用,进程阻塞

在这里插入图片描述
关于它的代码补充分析:

wait_queue_head_t rwqh;
wait_queue_head_t wwqh;

增加了r读和w写的等待队列头

代码

init_waitqueue_head(&vsdev.rwqh);
init_waitqueue_head(&vsdev.wwqh);

初始化这二个队列头

if (kfifo_is_empty(&vsfifo)) {
		if (filp->f_flags & O_NONBLOCK)
			return -EAGAIN;

		if (wait_event_interruptible(vsdev.rwqh, !kfifo_is_empty(&vsfifo)))
			return -ERESTARTSYS;
	}

在FIFO为空的情况下 进行休眠,直到不为空或者接到信号才被唤醒,如果是被信号唤醒,则返回 -ERESTARTSYS。

if (!kfifo_is_full(&vsfifo))
		wake_up_interruptible(&vsdev.wwqh);

	return ret == 0 ? copied : ret;
}

在fifo不为满的情况下,唤醒所有等待的w写进程。

下面也是仿照着上面,不过是写进程

	if (kfifo_is_full(&vsfifo)) {
		if (filp->f_flags & O_NONBLOCK)
			return -EAGAIN;

		if (wait_event_interruptible(vsdev.wwqh, !kfifo_is_full(&vsfifo)))
			return -ERESTARTSYS;
	}

	ret = kfifo_from_user(&vsfifo, buf, count, &copied);

	if (!kfifo_is_empty(&vsfifo))
		wake_up_interruptible(&vsdev.rwqh);

	return ret == 0 ? copied : ret;
}

测试如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
总的还是构造并初始化等待队列头,构造等待队列节点,设置进程的状态,将节点加入等待队列,放弃CPU,调度其他进程执行,在资源可用时候,唤醒队列上的进程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值