3.6.2.阻塞式IO的困境

本节通过实例代码运行结果,让大家看到在并发式IO访问时非阻塞IO遭遇的困境,由此引入非阻塞式IO。

3.6.2.1、程序中读取键盘

include

include

include

int main(void)

{

// 读取键盘

// 键盘就是标准输入,stdin

char buf[100];

memset(buf, 0, sizeof(buf));
printf("before read.\n");
read(0, buf, 5);
printf("读出的内容是:[%s].\n", buf);

return 0;

}

运行过程:

./a.out

before read.

进程被阻塞住,因为此时还没有键盘输入,此时,键入一个a,

before read.

a

打印一个a,然后键入bcdggggg,

before read.

abcdggggg

因为linux使用行缓存技术。如果在结束,则按一个Enter就可以结束这个函数。(行缓存for直到换行符到了)。

3.6.2.2、程序中读取鼠标

键盘是一个标准输入设备,所以可以直接打开。但是鼠标不是标准输入设备,所以要先用open打开鼠标鼠标。

ls /dev/input

by-id by-path event0 event1 event2 event3 mice mouse0 mouse1

cat /dev/input/mouse1

如何判断哪个是我们的鼠标,只要cat /dev/input/mouse1,就会阻塞,然后移动鼠标,如果有打印出来的东西,就是当前鼠标设备。

include

include

include

include <sys/types.h>

include <sys/stat.h>

include

int main(void)

{

// 读取鼠标

int fd = -1;

char buf[200];

fd = open("/dev/input/mouse1", O_RDONLY);
if (fd < 0)
{
    perror("open:");
    return -1;
}

memset(buf, 0, sizeof(buf));
printf("before 鼠标 read.\n");
read(fd, buf, 50);
printf("鼠标读出的内容是:[%s].\n", buf);

return 0;

}

结果分析:先前打印before 鼠标 read.阻塞住,直到鼠标移动,才打印出乱码[(?]。打印出乱码的原因是鼠标移动输入二进制,但是终端以ASCII方式解析。

3.6.2.3、程序中同时读取键盘和鼠标(有问题没想明白)

include

include

include

include <sys/types.h>

include <sys/stat.h>

include

int main(void)

{

// 读取鼠标

int fd = -1;

char buf[200];

fd = open("/dev/input/mouse1", O_RDONLY);
if (fd < 0)
{
    perror("open:");
    return -1;
}

memset(buf, 0, sizeof(buf));
printf("before 鼠标 read.\n");
read(fd, buf, 50);
printf("鼠标读出的内容是:[%s].\n", buf);

// 读键盘
memset(buf, 0, sizeof(buf));
printf("before 键盘 read.\n");
read(0, buf, 5);
printf("键盘读出的内容是:[%s].\n", buf);

return 0;

}

3.6.2.4、问题分析

总结:阻塞式IO:函数调用会被阻塞。本质是当前进程调用了函数,进入内核里面去后,因为当前进程的执行条件不满足,内核无法里面完成操作,就挂起这个进程,去执行其他进程。默认使用阻塞IO。是linux系统的常态。但是阻塞式IO有一个缺点,比如说如果要同时读取鼠标和键盘的输入(不知道鼠标动还是键盘动),就会遇见很糟糕的情况,这时我们可以用并发式IO解决,有三种方法可以实现:非阻塞IO,多路复用IO,异步IO。

并发式IO可以解决这个问题

原文地址:https://www.cnblogs.com/Ocean-Star/p/9245447.html

时间: 2024-10-22 08:53:59

3.6.2.阻塞式IO的困境的相关文章

Java基础:阻塞式IO

转载请注明出处:jiq?钦's technical Blog 备注:阅读此文之前,建议先看我这篇博文了解阻塞式IO和非阻塞式IO的基本概念. 一.流(Stream) 1.字节流 输入(InputStream) 介质流 FileInputStream 从文件中读取信息 PipedInputStream 产生用于写入相关PipedOutputStream的数据,实现"管道化"概念 ByteArrayInputStream 允许将内存缓冲区当做InputStream使用 处理流 Sequen

Java基础:非阻塞式IO

转载请注明出处:jiq?钦's technical Blog 引言 JDK1.4中引入了NIO,即New IO,目的在于提高IO速度.特别注意JavaNIO不完全是非阻塞式IO(No-Blocking IO),因为其中部分通道(如FileChannel)只能运行在阻塞模式下,而其他的通道可以在阻塞式和非阻塞式之间进行选择. 尽管这样,我们还是习惯将Java NIO看作是非阻塞式IO,而前面介绍的面向流(字节/字符)的IO类库则是非阻塞的,详细来看,两者区别如下: IO NIO 面向流(Strea

Java NIO实现非阻塞式socket通信

博主知识水平有限,只能提供一个个人的狭隘的理解,如果有新人读到这儿,建议看一下其他教程或者API,如果不明白,再来看一下:如果有dalao读到这儿,希望能指出理解中的问题~谢谢 Java提供了用于网络通信的socket和serversocket包,然而实现方式是阻塞式的,同一时间点上只能进行一个连接,这会带来不好的体验.当然了,我们也可以通过不断创建线程的方式管理连接,但线程多了的话反而会降低效率.于是Java推出了非阻塞式IO--channel.并且channel提供关于网络通信的相关chan

python开发IO模型:阻塞&amp;非阻塞&amp;异步IO&amp;多路复用&amp;selectors

一 IO模型介绍 为了更好地了解IO模型,我们需要事先回顾下:同步.异步.阻塞.非阻塞 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non-blocking IO是一个东西.这其实是因为不同的人的知识背景不同,并且在讨论这个问题的时候上下文(context)也不相同.所以,

JAVA NIO学习记录2-非阻塞式网络通信

一.阻塞与非阻塞 传统的IO 流都是阻塞式的.也就是说,当一个线程调用read() 或write() 时,该线程被阻塞,直到有一些数据被读取或写入,该线程在此期间不能执行其他任务.因此,在完成网络通信进行IO 操作时,由于线程会阻塞,所以服务器端必须为每个客户端都提供一个独立的线程进行处理,当服务器端需要处理大量客户端时,性能急剧下降. Java NIO 是非阻塞模式的.当线程从某通道进行读写数据时,若没有数据可用时,该线程可以进行其他任务.线程通常将非阻塞IO 的空闲时间用于在其他通道上执行I

C++ 异步IO (一) 阻塞式HTTP客户端

An IO call is synchronous if, when you call it, it does not return until the operation is completed, or until enough time has passed that your network stack gives up. 简单来说,IO的函数后面的代码不会被执行,除非IO函数已返回,或函数超时了. /* For sockaddr_in */ #include <netinet/in.h

使用阻塞式队列处理大数据

前言 我们都知道,JAVA对于文本文件在读时是独占的,即使可以用多线程去读也涉及到一个POS(定位读)的问题,这在设计框架上会带来许多的复杂性,同时也带来代码上的不可维护性以及会经常出一些千奇百怪的错误(多线程程序由其如此). 传统阻塞式做法的敝病 特点:多线程,阻塞式导入 缺点:阻塞式,导入速度慢,线程状态无法精确记录,速度慢内存开销大 优秀的做法 多线程 非阻塞式 内存开销恒定 线程可以自由增加 我们将采用的做法 在数据提取的设计时基于以下几个指标考虑: 1)内存占用数始终必须恒定值 2)使

阻塞式简易http服务器

说明         使用java.net包的ServerSocket也是阻塞的,所以下面的实例把ServerSocketChannel换成ServerSocket效果一样. 后台代码 1 package study.socket.tcp.block.httpserver; 2 3 import java.io.FileInputStream; 4 import java.io.IOException; 5 import java.net.InetSocketAddress; 6 import

4.NIO的非阻塞式网络通信

/*阻塞 和 非阻塞 是对于 网络通信而言的*/ /*原先IO通信在进行一些读写操作 或者 等待 客户机连接 这种,是阻塞的,必须要等到有数据被处理,当前线程才被释放*/ /*NIO 通信 是将这个阻塞的过程 丢给了选择器,客户端和 服务器端 之间建立的通道,都会注册到 选择器上,然后用选择器 实时监控 我们这些通道上的状况*/ /*当某一个通道上 某一个请求的事件 完全准备就绪时,那么选择器才会将 这个任务 分配到服务器上的一个 或多个线程中*/ /*阻塞 与 非阻塞*/ 传统的IO 流都是