1. Linux IO简介
1.1 IO概述
IO是Input、Output的简称,也就是输入和输出。在计算机世界中,除了计算和存储,剩下的几乎都是IO,它包含硬件设备层面的数据交换,也包含软件层面的数据传输。
1.2 Linux IO方式
Linux IO方式表示Linux系统处理IO事件的方式,IO事件包括可读事件、可写事件、错误事件等。Linux IO方式主要包括:
- 阻塞IO:在IO事件发生之前,会一直阻塞。
- 非阻塞IO:如果没有IO事件,直接返回错误。
- IO多路复用:同时监听多个描述符的IO事件,取出状态ready的描述符列表。
- 异步IO:为IO事件绑定处理程序,当事件发生时触发处理程序。
- 信号驱动IO:利用Linux的信号机制,当IO事件发生时,触发信号处理程序。
2. IO复用
2.1 概念
IO复用(I/O Multiplexing)通俗的来说:是同时处理多个描述符IO事件的一种技术手段。这些文件描述符包括:socket套接字、普通文件、设备文件等。
举个简单例子:tcp server同时处理两个文件描述符,一个是标准输入,一个是tcp连接。当server接收标准输入时,可能会因调用fgets()
而阻塞,从而无法及时处理另一个tcp连接的可读事件,比如有tcp client发送了数据。
如果tcp server想要同时处理多个描述符的事件,可能的做法是开启多个线程或进程,各自等待描述符的可读可写事件,但这样一来,就需要引入线程间同步和通信问题,大大增加编程的复杂性。
但IO复用技术的出现,可以很好的解决上述问题,它直接管理多个描述符,选出IO事件ready的描述符列表。这种操作方式允许应用程序以较低的成本、较高的效率,同时管理多个描述符的IO事件。
在Linux中,以下接口可以实现IO多路复用:
- select
- poll
- epoll
3. 总结
IO模式多种多样,在软件开发过程中,不能唯一而论,要根据实际的应用场景,选择合适的IO技术,才能取得事半功倍的效果。
2.数据结构中顺序表和链表
2.1顺序表和链表的比较
1)顺序表:顺序表的特点是逻辑上相邻的数据元素,物理存储位置也相邻,并且顺序表的存储空间需要预先分配。
它的优点是:
a) 方法简单,各种高级语言中都有数组,容易实现。
b) 不用为表示节点间的逻辑关系而增加额外的存储开销。
c) 顺序表具有按元素序号随机访问的特点。
缺点:
a) 在顺序表中做插入、删除操作时,平均移动表中的一半元素,因此n较大的顺序表效率低。
b) 静态分配,程序执行之前必须明确规定存储规模预先分配足够大的存储空间,估计过大,可能会导致顺序表后部大量闲置;预先分配过小,又会造成溢出。
2)链表:
在链表中逻辑上相邻的数据元素,物理存储位置不一定相邻,它使用指针实现元素之间的逻辑关系。并且,链表的存储空间是动态分配的。
优点:
插入、删除运算方便。
缺点:
a) 要占用额外的存储空间存储元素之间的关系,存储密度降低。存储密度是指一个节点中数据元素所占的存储单元和整个节点所占的存储单元之比。
b) 链表不是一种随机存储结构,不能随机存取元素。