IO模型及select,poll,epoll和kqueue的区别
(一)首先,介绍几种常见的I/O模型及其区别,如下:
blocking I/O
nonblocking I/O
I/O multiplexing (select and poll)
signal driven I/O (SIGIO)
asynchronous I/O (the POSIX aio_functions)—————异步IO模型最大的特点是 完成后发回通知。
阻塞与否,取决于实现IO交换的方式。
异步阻塞是基于select,select函数本身的实现方式是阻塞的,而采用select函数有个好处就是它可以同时监听多个文件句柄
异步非阻塞直接在完成后通知,用户进程只需要发起一个IO操作然后立即返回,等IO操作真正的完成以后,应用程序会得到IO操作完成的通知,此时用户进程只需要对数据进行处理就好了,不需要进行实际的IO读写操作,因为真正的IO读取或者写入操作已经由内核完成了。
1 blocking I/O
这个不用多解释吧,阻塞套接字。下图是它调用过程的图示:
重点解释下上图,下面例子都会讲到。首先application调用 recvfrom()转入kernel,注意kernel有2个过程,wait for data和copy data from kernel to user。直到最后copy complete后,recvfrom()才返回。此过程一直是阻塞的。
2 nonblocking I/O:
与blocking I/O对立的,非阻塞套接字,调用过程图如下:
可以看见,如果直接操作它,那就是个轮询。。直到内核缓冲区有数据。
3 I/O multiplexing (select and poll)
最常见的I/O复用模型,select。
select先阻塞,有活动套接字才返回。与blocking I/O相比,select会有两次系统调用,但是select能处理多个套接字。
4 signal driven I/O (SIGIO)
只有UNIX系统支持,感兴趣的课查阅相关资料
与I/O multiplexing (select and poll)相比,它的优势是,免去了select的阻塞与轮询,当有活跃套接字时,由注册的handler处理。
5 asynchronous I/O (the POSIX aio_functions)
很少有nix系统支持,windows的IOCP则是此模型
完全异步的I/O复用机制,因为纵观上面其它四种模型,至少都会在由kernel copy data to appliction时阻塞。而该模型是当copy完成后才通知application,可见是纯异步的。好像只有windows的完成端口是这个模型,效率也很出色。
6 下面是以上五种模型的比较
可以看出,越往后,阻塞越少,理论上效率也是最优。
=====================分割线==================================
5种模型的比较比较清晰了,剩下的就是把select,epoll,iocp,kqueue按号入座那就OK了。
select和iocp分别对应第3种与第5种模型,那么epoll与kqueue呢?其实也于select属于同一种模型,只是更高级一些,可以看作有了第4种模型的某些特性,如callback机制。
为什么epoll,kqueue比select高级?
答案是,他们无轮询。因为他们用callback取代了。想想看,当套接字比较多的时候,每次select()都要通过遍历FD_SETSIZE个Socket来完成调度,不管哪个Socket是活跃的,都遍历一遍。这会浪费很多CPU时间。如果能给套接字注册某个回调函数,当他们活跃时,自动完成相关操作,那就避免了轮询,这正是epoll与kqueue做的。
windows or nix (IOCP or kqueue/epoll)?
诚然,Windows的IOCP非常出色,目前很少有支持asynchronous I/O的系统,但是由于其系统本身的局限性,大型服务器还是在UNIX下。而且正如上面所述,kqueue/epoll 与 IOCP相比,就是多了一层从内核copy数据到应用层的阻塞,从而不能算作asynchronous I/O类。但是,这层小小的阻塞无足轻重,kqueue与epoll已经做得很优秀了。
提供一致的接口,IO Design Patterns
实际上,不管是哪种模型,都可以抽象一层出来,提供一致的接口,广为人知的有ACE,Libevent(基于reactor模式)这些,他们都是跨平台的,而且他们自动选择最优的I/O复用机制,用户只需调用接口即可。说到这里又得说说2个设计模式,Reactor and Proactor。见:Reactor模式--VS--Proactor模式。Libevent是Reactor模型,ACE提供Proactor模型。实际都是对各种I/O复用机制的封装。
Java nio包是什么I/O机制?
现在可以确定,目前的java本质是select()模型,可以检查/jre/bin/niodll得知。至于java服务器为什么效率还不错。。我也不得而知,可能是设计得比较好吧。。-_-。
=====================分割线==================================
总结一些重点:
只有IOCP是asynchronous I/O,其他机制或多或少都会有一点阻塞。
select低效是因为每次它都需要轮询。但低效也是相对的,视情况而定,也可通过良好的设计改善
epoll, kqueue、select是Reacor模式,IOCP是Proactor模式。
java nio包是select模型。。
(二)epoll 与select的区别
1 使用多进程或者多线程,但是这种方法会造成程序的复杂,而且对与进程与线程的创建维护也需要很多的开销。(Apache服务器是用的子进程的方式,优点可以隔离用户) (同步阻塞IO)
2一种较好的方式为I/O多路转接(I/O multiplexing)(貌似也翻译多路复用),先构造一张有关描述符的列表(epoll中为队列),然后调用一个函数,直到这些描述符中的一个准备好时才返回,返回时告诉进程哪些I/O就绪。select和epoll这两个机制都是多路I/O机制的解决方案,select为POSIX标准中的,而epoll为Linux所特有的。
区别(epoll相对select优点)主要有三:
1select的句柄数目受限,在linux/posix_typesh头文件有这样的声明:#define __FD_SETSIZE 1024 表示select最多同时监听1024个fd。而epoll没有,它的限制是最大的打开文件句柄数目。
2epoll的最大好处是不会随着FD的数目增长而降低效率,在selec中采用轮询处理,其中的数据结构类似一个数组的数据结构,而epoll是维护一个队列,直接看队列是不是空就可以了。epoll只会对"活跃"的socket进行操作---这是因为在内核实现中epoll是根据每个fd上面的callback函数实现的。那么,只有"活跃"的socket才会主动的去调用 callback函数(把这个句柄加入队列),其他idle状态句柄则不会,在这点上,epoll实现了一个"伪"AIO。但是如果绝大部分的I/O都是“活跃的”,每个I/O端口使用率很高的话,epoll效率不一定比select高(可能是要维护队列复杂)。
3使用mmap加速内核与用户空间的消息传递。无论是select,poll还是epoll都需要内核把FD消息通知给用户空间,如何避免不必要的内存拷贝就很重要,在这点上,epoll是通过内核于用户空间mmap同一块内存实现的。
关于epoll工作模式ET,LT
epoll有两种工作方式
ET:Edge Triggered,边缘触发。仅当状态发生变化时才会通知,epoll_wait返回。换句话,就是对于一个事件,只通知一次。且只支持非阻塞的socket。
LT:Level Triggered,电平触发(默认工作方式)。类似select/poll,只要还有没有处理的事件就会一直通知,以LT方式调用epoll接口的时候,它就相当于一个速度比较快的poll支持阻塞和不阻塞的socket。
三 Linux并发网络编程模型
1 Apache 模型,简称 PPC ( Process Per Connection ,):为每个连接分配一个进程。主机分配给每个连接的时间和空间上代价较大,并且随着连接的增多,大量进程间切换开销也增长了。很难应对大量的客户并发连接。
2 TPC 模型( Thread Per Connection ):每个连接一个线程。和PCC类似。
3 select 模型:I/O多路复用技术。
1 每个连接对应一个描述。select模型受限于 FD_SETSIZE即进程最大打开的描述符数linux2635为1024,实际上linux每个进程所能打开描数字的个数仅受限于内存大小,然而在设计select的系统调用时,却是参考FD_SETSIZE的值。可通过重新编译内核更改此值,但不能根治此问题,对于百万级的用户连接请求 即便增加相应 进程数, 仍显得杯水车薪呀。
2select每次都会扫描一个文件描述符的集合,这个集合的大小是作为select第一个参数传入的值。但是每个进程所能打开文件描述符若是增加了 ,扫描的效率也将减小。
3内核到用户空间,采用内存复制传递文件描述上发生的信息。
4 poll 模型:I/O多路复用技术。poll模型将不会受限于FD_SETSIZE,因为内核所扫描的文件 描述符集合的大小是由用户指定的,即poll的第二个参数。但仍有扫描效率和内存拷贝问题。
5 pselect模型:I/O多路复用技术。同select。
6 epoll模型:
1)无文件描述字大小限制仅与内存大小相关
2)epoll返回时已经明确的知道哪个socket fd发生了什么事件,不用像select那样再一个个比对。
3)内核到用户空间采用共享内存方式,传递消息。
四 :FAQ
1、单个epoll并不能解决所有问题,特别是你的每个操作都比较费时的时候,因为epoll是串行处理的。 所以你有还是必要建立线程池来发挥更大的效能。
2、如果fd被注册到两个epoll中时,如果有时间发生则两个epoll都会触发事件。
3、如果注册到epoll中的fd被关闭,则其会自动被清除出epoll监听列表。
4、如果多个事件同时触发epoll,则多个事件会被联合在一起返回。
5、epoll_wait会一直监听epollhup事件发生,所以其不需要添加到events中。
6、为了避免大数据量io时,et模式下只处理一个fd,其他fd被饿死的情况发生。linux建议可以在fd联系到的结构中增加ready位,然后epoll_wait触发事件之后仅将其置位为ready模式,然后在下边轮询ready fd列表。
09年专业课是第一年全国统考,应该不算难的,计算机专业最难的肯定还是数一和英语。
2009计算机考研大纲
Ⅰ考查目标
计算机学科专业基础综合考试涵盖数据机构、计算机组成原理、操作系统和计算机网络等学科专业基础课程。要求考生比较系统地掌握上述专业基础课程的概念、基本原理和方法,能够运用所学的基本原理和基本方法分析、判断和解决有关理论问题和实际问题。
Ⅱ考试形式和试卷结构
一、 试卷满分及考试时间
本试卷满分为150分,考试时间为180分钟
二、 答题方式
答题方式为闭卷、笔试
三、 试卷内容结构
数据结构 45分
计算机组成原理 45分
操作系统 35分
计算机网络 25分
四、 试卷题型结构
单项选择题 80分(40小题,每小题2分)
综合应用题 70分
Ⅲ考查范围
数据结构
考查目标
1理解数据结构的基本概念;掌握数据的逻辑结构、存储结构及其差异,以及各种基本操作的实现。
2掌握基本的数据处理原理和方法的基础上,能够对算法进行设计与分析。
3能够选择合适的数据结构和方法进行问题求解。
一、线性表
(一)线性表的定义和基本操作
(二)线性表的实现
1顺序存储结构
2链式存储结构
3线性表的应用
二、栈、队列和数组
(一)栈和队列的基本概念
(二)栈和队列的顺序存储结构
(三)栈和队列的链式存储结构
(四)栈和队列的应用
(五)特殊矩阵的压缩存储
三、树与二叉树
(一)树的概念
(二)二叉树
1二叉树的定义及其主要特征
2二叉树的顺序存储结构和链式存储结构
3二叉树的遍历
4线索二叉树的基本概念和构造
5二叉排序树
6平衡二叉树
(三)树、森林
1书的存储结构
2森林与二叉树的转换
3树和森林的遍历
(四)树的应用
1等价类问题
2哈夫曼(Huffman)树和哈夫曼编码
四、 图
(一) 图的概念
(二) 图的存储及基本操作
1 邻接矩阵法
2 邻接表法
(三) 图的遍历
1 深度优先搜索
2 广度优先搜索
(四) 图的基本应用及其复杂度分析
1 最小(代价)生成树
2 最短路径
3 拓扑排序
4 关键路径
五、 查找
(一) 查找的基本概念
(二) 顺序查找法
(三) 折半查找法
(四) B-树
(五) 散列(Hash)表及其查找
(六) 查找算法的分析及应用
六、 内部排序
(一) 排序的基本概念
(二) 插入排序
1 直接插入排序
2 折半插入排序
(三) 气泡排序(bubble sort)
(四) 简单选择排序
(五) 希尔排序(shell sort)
(六) 快速排序
(七) 堆排序
(八) 二路归并排序(merge sort)
(九) 基数排序
(十) 各种内部排序算法的比较
(十一) 内部排序算法的应用
计算机组成原理
考查目标
1 理解单处理器计算机系统中各部件的内部工作原理、组成结构以及相互连接方式,具有完整的计算机系统的整机概念。
2 理解计算机系统层次化结构概念,熟悉硬件与软件之间的界面,掌握指令集体系结构的基本知识和基本实现方法。
3 能够运用计算机组成的基本原理和基本方法,对有关计算机硬件系统中的理论和实际问题进行计算、分析,并能对一些基本部件进行简单设计。
一、 计算机系统概述
(一) 计算机发展历程
(二) 计算机系统层次结构
1 计算机硬件的基本组成
2 计算机软件的分类
3 计算机的工作过程
(三) 计算机性能指标
吞吐量、响应时间;CPU时钟周期、主频、CPI、CPU执行时间;MIPS、MFLOPS。
二、 数据的表示和运算
(一) 数制与编码
1 进位计数制及其相互转换
2 真值和机器数
3 BCD码
4 字符与字符串
5 校验码
(二) 定点数的表示和运算
1 定点数的表示
无符号数的表示;有符号数的表示。
2 定点数的运算
定点数的位移运算;原码定点数的加/减运算;补码定点数的加/减运算;定点数的乘/除运算;溢出概念和判别方法。
(三) 浮点数的表示和运算
1 浮点数的表示
浮点数的表示范围;IEEE754标准
2 浮点数的加/减运算
(四) 算术逻辑单元ALU
1 串行加法器和并行加法器
2 算术逻辑单元ALU的功能和机构
三、 存储器层次机构
(一) 存储器的分类
(二) 存储器的层次化结构
(三) 半导体随机存取存储器
1 SRAM存储器的工作原理
2 DRAM存储器的工作原理
(四) 只读存储器
(五) 主存储器与CPU的连接
(六) 双口RAM和多模块存储器
(七) 高速缓冲存储器(Cache)
1 程序访问的局部
2 Cache的基本工作原理
3 Cache和主存之间的映射方式
4 Cache中主存块的替换算法
5 Cache写策略
(八) 虚拟存储器
1 虚拟存储器的基本概念
2 页式虚拟存储器
3 段式虚拟存储器
4 段页式虚拟存储器
5 TLB(快表)
四、 指令系统
(一) 指令格式
1 指令的基本格式
2 定长操作码指令格式
3 扩展操作码指令格式
(二) 指令的寻址方式
1 有效地址的概念
2 数据寻址和指令寻址
3 常见寻址方式
(三) CISC和RISC的基本概念
五、 中央处理器(CPU)
(一) CPU的功能和基本结构
(二) 指令执行过程
(三) 数据通路的功能和基本结构
(四) 控制器的功能和工作原理
1 硬布线控制器
2 微程序控制器
微程序、微指令和微命令;微指令的编码方式;微地址的形式方式。
(五) 指令流水线
1 指令流水线的基本概念
2 超标量和动态流水线的基本概念
六、 总线
(一) 总线概述
1 总线的基本概念
2 总线的分类
3 总线的组成及性能指标
(二) 总线仲裁
1 集中仲裁方式
2 分布仲裁方式
(三) 总线操作和定时
1 同步定时方式
2 异步定时方式
(四) 总线标准
七、 输入输出(I/O)系统
(一) I/O系统基本概念
(二) 外部设备
1 输入设备:键盘、鼠标
2 输出设备:显示器、打印机
3 外存储器:硬盘存储器、磁盘阵列、光盘存储器
(三) I/O接口(I/O控制器)
1 I/O接口的功能和基本结构
2 I/O端口及其编址
(四) I/O方式
1 程序查询方式
2 程序中断方式
中断的基本概念;中断响应过程;中断处理过程;多重中断和中断屏蔽的概念。
3 DMA方式
DMA控制器的组成;DMA传送过程。
4 通道方式
操作系统
考查目标
1 了解操作系统在计算机系统中的作用、地位、发展和特点。
2 理解操作系统的基本概念、原理,掌握操作系统设计方法与实现技术。
3 能够运用所学的操作系统原理、方法与技术分析问题和解决问题。
一、 操作系统概述
(一) 操作系统的概念、特征、功能和提供的服务
(二) 操作系统的发展与分类
(三) 操作系统的运行环境
二、 进程管理
(一) 进程与线程
1 进程概念
2 进程的状态与转换
3 进程控制
4 进程组织
5 进程通信
共享存储系统;消息传递系统;管道通信。
6线程概念与多线程模型
(二)处理机调度
1调度的基本概念
2调度时机、切换与过程
3调度的基本准则
4调度方式
5典型调度算法
先来先服务调度算法;短作业(短任务、短进程、短线程)优先调度算法;时间片轮转调度算法;优先级调度算法;高响应比优先调度算法;多级反馈队列调度算法。
(三)进程同步
1 进程同步的基本概念
2 实现临界区互斥的基本方法
软件实现方法;硬件实现方法。
3 信号量
4 管程
5 经典同步问题
生产者-消费者问题;读者-写者问题;哲学家进餐问题。
(四) 死锁
1 死锁的概念
2 死锁处理策略
3 死锁预防
4 死锁避免
系统安全状态:银行家算法。
5 死锁检测和解除
三、 内存管理
(一) 内存管理基础
1 内存管理概念
程序装入与链接;逻辑地址与物理地址空间;内存保护。
2 交换与覆盖
3 连续分配管理方式
单一连续分配;分区分配。
4 非连续分配管理方式
分页管理方式;分段管理方式;段页式管理方式。
(二) 虚拟内存管理
1 虚拟内存基本概念
2 请求分页管理方式
3 页面置换算法
最佳置换算法(OPT);先进先出置换算法(FIFO);最近最少使用置换算法(LRU);时钟置换算法(CLOCK)。
4 页面分配策略
5 抖动
抖动现象;工作集。
6 请求分段管理方式
7 请求段页式管理方式
四、 文件管理
(一) 文件系统基础
1 文件概念
2 文件结构
顺序文件;索引文件;索引顺序文件。
3 目录结构
文件控制块和索引节点;单级目录结构和两级目录结构;树形目录结构;图形目录结构。
4 文件共享
共享动机;共享方式;共享语义。
5 文件保护
访问类型;访问控制。
(二) 文件系统实现
1 文件系统层次结构
2 目录实现
3 文件实现
(三) 磁盘组织与管理
1 磁盘的结构
2 磁盘调度算法
3 磁盘的管理
五、 输入输出(I/O)管理
(一) I/O管理概述
1 I/O设备
2 I/O管理目标
3 I/O管理功能
4 I/O应用接口
5 I/O控制方式
(二) I/O核心子系统
1 I/O调度概念
2 高速缓存与缓冲区
3 设备分配与回收
4 假脱机技术(SPOOLing)
5 出错处理
计算机网络
考查目标
1 掌握计算机网络的基本概念、基本原理和基本方法。
2 掌握计算机网络的体系结构和典型网络协议,了解典型网络设备的组成和特点,理解典型网络设备的工作原理
3 能够运用计算机网络的基本概念、基本原理和基本方法进行网络系统的分析、设计和应用
一、 计算机网络体系结构
(一) 计算机网络概述
1 计算机网络的概念、组成与功能
2 计算机网络的分类
3 计算机网络与互联网的发展历史
4 计算机网络的标准化工作及相关组织
(二) 计算机网络体系结构与参考模型
1 计算机网络分层结构
2 计算机网络协议、接口、服务等概念
3 ISO/OSI参考模型和TCP/IP模型
二、 物理层
(一) 通信基础
1 信道、信号、宽带、码元、波特、速率等基本概念
2 奈奎斯特定理与香农定理
3 信源与信宿
4 编码与调制
5 电路交换、报文交换与分组交换
6 数据报与虚电路
(二) 传输介质
1 双绞线、同轴电缆、光纤与无线传输介质
2 物理层接口的特性
(三) 物理层设备
1 中继器
2 集线器
三、 数据链路层
(一) 数据链路层的功能
(二) 组帧
(三) 差错控制
1 检错编码
2 纠错编码
(四) 流量控制与可靠传输机制
1 流量控制、可靠传输与滑轮窗口机制
2 单帧滑动窗口与停止-等待协议
3 多帧滑动窗口与后退N帧协议(GBN)
4 多帧滑动窗口与选择重传协议(SR)
(五) 介质访问控制
1 信道划分介质访问控制
频分多路复用、时分多路复用、波分多路复用、码分多路复用的概念和基本原理。
2 随即访问介质访问控制
ALOHA协议;CSMA协议;CSMA/CD协议;CSMA/CA协议。
3 轮询访问介质访问控制:令牌传递协议
(六) 局域网
1 局域网的基本概念与体系结构
2 以太网与IEEE 8023
3 IEEE 80211
4 令牌环网的基本原理
(七) 广域网
1 广域网的基本概念
2 PPP协议
3 HDLC协议
4 ATM网络基本原理
(八) 数据链路层设备
1 网桥
网桥的概念;透明网桥与生成树算饭;源选径网桥与源选径算法。
2 局域网交换机及其工作原理。
四、 网络层
(一) 网络层的功能
1 异构网络互联
2 路由与转发
3 拥塞控制
(二) 路由算法
1 静态路由与动态路由
2 距离-向量路由算法
3 链路状态路由算法
4 层次路由
(三) IPv4
1 IPv4分组
2 IPv4地址与NAT
3 子网划分与子网掩码、CIDR
4 ARP协议、DHCP协议与ICMP协议
(四) IPv6
1 IPv6的主要特点
2 IPv6地址
(五) 路由协议
1 自治系统
2 域内路由与域间路由
3 RIP路由协议
4 OSPF路由协议
5 BGP路由协议
(六) IP组播
1 组播的概念
2 IP组播地址
3 组播路由算法
(七) 移动IP
1 移动IP的概念
2 移动IP的通信过程
(八) 网络层设备
1 路由器的组成和功能
2 路由表与路由转发
五、 传输层
(一) 传输层提供的服务
1 传输层的功能
2 传输层寻址与端口
3 无连接服务与面向连接服务
(二) UDP协议
1 UDP数据报
2 UDP校验
(三) TCP协议
1 TCP段
2 TCP连接管理
3 TCP可靠传输
4 TCP流量控制与拥塞控制
六、 应用层
(一) 网络应用模型
1 客户/服务器模型
2 P2P模型
(二) DNS系统
1 层次域名空间
2 域名服务器
3 域名解析过程
(三) FTP
1 FTP协议的工作原理
2 控制连接与数据连接
(四) 电子邮件
1 电子邮件系统的组成结构
2 电子邮件格式与MIME
3 SMTP协议与POP3协议
(五) WWW
1 WWW的概念与组成结构
2 HTTP协议
电话:0411-84748200
QQ:3147634
如果觉得推荐的不错,那就请顶一下表示支持吧!
回帖的同学今年一定能够战胜统考,一定能够考上研究生!!!!!!!!!!!!!!!!!!!!
刚刚在一个考研论坛上看到的,希望给计算机考研的人带来帮助。
2009年计算机考研专业课统考已成定局,而关于专业课教材和辅导书很多人都犹豫不决。在这里我给大家推荐几本比较权威的教材及辅导书籍。这些教材和辅导书籍在国内使用的很广,在广大的考生中口碑不错。最近得到消息,计算机专业课统考将不会指定教材,这或者和公共课统考有些类似,但是考试科目中的权威教材还是显而易见的,而且对学习的帮助相对于其他教材也是更加显著的。
一、数据结构
1教材:《数据结构》严蔚敏 清华大学出版社
清华大学严蔚敏的这本数据结构的教材是国内数据结构教材的权威。也是国内使用最广,其广度远远超越其他同类教材,计算机考研专业课命题必定以它为蓝本。这一本数据结构是2007年的最新版本,完全适合任何学校的考研数据结构的复习之用,是数据结构学习最权威的教材。
2辅导书:《算法与数据结构考研试题精析(第二版)》机械工业出版社
网上广为流传的数据结构1800题相信只要是计算机考研的同学无人不知无人不晓。其实1800题是2001年推出来的,当时编者把电子版免费分享给大家,却很少有人知道它也有纸质版本就是《算法与数据结构考研试题精析》。第二版是2007年最新出版的,对里面的题目进行了大量的更新,去掉了一些比较过时和重复的题,加上了很多名校最近几年的考研真题,总共大约1650题左右。真题就是训练的最好武器,相信当你复习完这本数据结构辅导书后,任何关于数据结构的考题都是小菜一碟。
二、计算机组成原理
1教材:《计算机组成原理》唐朔飞 高等教育出版社
《计算机组成原理》白中英 科学出版社
这两本教材都是普通高等教育十一五国家级规划教材,其权威性不言而喻,在国内是使用最广的两本教材,而前者应该略胜一筹。而且两位老师说教学的计算机组成原理课程都是国家级精品课程,网上甚至还有他们的讲课视频可以下载,再配合教材的使用,这样可以更加增强学习的效率。
2辅导书:《计算机组成原理考研指导》徐爱萍 清华大学出版社
《计算机组成原理--学习指导与习题解答》唐朔飞 高等教育出版社
清华大学的这套辅导教材在广大的考生中有着极为优秀的口碑,特别是系列中的李春葆《数据结构考研辅导》在数据结构考研辅导资料中占据着数一数二的地位。这本辅导书通俗易懂,重点突出,特别适合于考研复习,特别是武汉大学以前的专业试题就完全以这本书为蓝本,甚至直接考上面的原题。唐朔飞的题集上面的题型也比较适合于考研,和它的配套教材一样,是一本不可多得的好书。
三、操作系统
1教材:《计算机操作系统(修订版)》汤子瀛 西安电子科技大学出版社
毫无疑问这本教材是国内操作系统教材的权威,使用度很广,以往一般考操作系统的学校基本都以此本教材作为指定教材。在国内目前还没有其他同类教材的使用广度和其相媲美,所以考研操作系统的复习应以这本书为准,相信操作系统统考试题的出题肯定也会以这本教材为蓝本。
2辅导书:《操作系统考研辅导教程(计算机专业研究生入学考试全真题解) 》电子科技大学出版社
《操作系统考研指导》清华大学出版社
我把《操作系统考研辅导教程》摆在前面是因为这本书主要是精选名校历年操作系统考研真题,真题的权威行和参考性都很大,真题是提高解答真题能力的最好武器。之所以把后者也放在这里,是因为这一系列的教材确实很有名,之前这些书在网上都可以免费下载电子版的,但电子版毕竟不是很清楚,而且天天盯着电脑看不仅很费劲,而且也不适合考研的学校,不是真正好好的复习考研,纸质的辅导书是必备的。
四、计算机网络
1教材:《计算机网络(第五版)》谢希仁 电子工业出版社
在国外翻译过来的教材中,有一些教材比较不错,比如《计算机网络--自顶向下方法与Internet特色》,但是这些教材都不可能作为计算机统考的出题蓝本。一是因为他们是国外教材,二是因为他们的使用度不够广,三是考研也要支持国货嘛^_^。谢希仁的《计算机网络》是目前国内使用最广的计算机网络教材,也是国人所编写公认最好的一本,这本教材必将称为09年计算机统考的出题蓝本无疑。第五版是2008年最新出版的,相比以前的版本变化也不是太大,做了一些扩充。
2辅导书:《计算机网络知识要点与习题解析》哈尔滨工程大学出版社
这本书是谢希仁《计算机网络》的配套习题集,封面上都是第四版教材的图案。之前各高校考计算机网络的很少,目前市场上还没有计算机网络的考研辅导书,所以这本配套习题集应该就是最好的选择了。可惜这本书可能会比较难购买到,因为以前出版的数量比较少。但是相信细心的你和渴望考名校研的你一定能够在淘宝上买到这本书。计算机网络题应该相对是最容易的,所以先看看教材,然后再看看习题集,对于网络考高分一定没有任何问题。
数据结构:
http://bbskaoyancom/thread-2236815-1-2html
操作系统考研辅导:(和推荐的可能不同)
http://bbskaoyancom/thread-1437564-1-1html
数据结构1800题:
http://bbskaoyancom/thread-1432160-1-1html
清华版组成原理考研辅导:
http://bbskaoyancom/thread-1437549-1-1html
清华版数据结构考研辅导::
http://bbskaoyancom/thread-1437578-1-1html
清华版操作系统考研辅导:
http://bbskaoyancom/thread-1437489-1-1html
计算机组成原理(白中英):
http://bbskaoyancom/thread-2293143-1-8html
计算机网络 谢希仁,第四版PDF的,那天我都在论坛看到了的,现在找不到了。
每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。进程也可能是整个程序或者是部分程序的动态执行。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通常由操作系统负责多个线程的调度和执行。
什么是多线程?
多线程是为了使得多个线程并行的工作以完成多项任务,以提高系统的效率。线程是在同一时间需要完成多项任务的时候被实现的。
使用线程的好处有以下几点:
·使用线程可以把占据长时间的程序中的任务放到后台去处理
·用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度
·程序的运行速度可能加快
·在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。
还有其他很多使用多线程的好处,这里就不一一说明了。
一些线程模型的背景
我们可以重点讨论一下在Win32环境中常用的一些模型。
·单线程模型
在这种线程模型中,一个进程中只能有一个线程,剩下的进程必须等待当前的线程执行完。这种模型的缺点在于系统完成一个很小的任务都必须占用很长的时间。
·块线程模型(单线程多块模型STA)
这种模型里,一个程序里可能会包含多个执行的线程。在这里,每个线程被分为进程里一个单独的块。每个进程可以含有多个块,可以共享多个块中的数据。程序规定了每个块中线程的执行时间。所有的请求通过Windows消息队列进行串行化,这样保证了每个时刻只能访问一个块,因而只有一个单独的进程可以在某一个时刻得到执行。这种模型比单线程模型的好处在于,可以响应同一时刻的多个用户请求的任务而不只是单个用户请求。但它的性能还不是很好,因为它使用了串行化的线程模型,任务是一个接一个得到执行的。
·多线程块模型(自由线程块模型)
多线程块模型(MTA)在每个进程里只有一个块而不是多个块。这单个块控制着多个线程而不是单个线程。这里不需要消息队列,因为所有的线程都是相同的块的一个部分,并且可以共享。这样的程序比单线程模型和STA的执行速度都要块,因为降低了系统的负载,因而可以优化来减少系统idle的时间。这些应用程序一般比较复杂,因为程序员必须提供线程同步以保证线程不会并发的请求相同的资源,因而导致竞争情况的发生。这里有必要提供一个锁机制。但是这样也许会导致系统死锁的发生。
由此使我一直在考虑,多线程模型真的能够提高应用程序的效率吗?如果不能,那么多线程模型能干什么呢? 很多程序员一谈到提高应用程序效率的问题,就会想到多线程模型。就如我所看到的那篇文章一样,希望能够通过多线程模型达到在文件系统中快速搜索文件的目的。然而不幸的是,在很多应用场景中,多线程模型不仅不能提高效率,还会带来很多的负面问题。尤其是对于需要反复访问临界资源的应用场景中,由于同步与线程调度所引起的效率问题,会使得应用程序的运行效率与数据吞吐量大打折扣。 首先就是并发控制带来的效率问题。多线程模型必须现实地面对并发控制问题,否则将会出现数据完整性的严重后果,甚至引发悲观并发控制的经典问题:死锁。通常情况下,应用程序都是使用操作系统提供的加锁机制实现并发控制,但是这些加锁机制都是非常耗费资源的,频繁的加锁与释放会大大降低应用程序的执行效率。乐观并发控制可以有效地避免加锁机制的效率损耗,提高系统的并发度,但是它的应用范围十分有限,因为乐观并发控制首先假设应用程序很少出现并发冲突。关于悲观并发控制与乐观并发控制,可以参考我的上一篇文章。您或许会认为,可以使用双检查加锁优化惯用法来减小加锁开销,事实上这种惯用法确实可以大幅度提高加锁效率,但双检查加锁优化并不能100%地用于所有的编译系统,至少我知道在Java编译系统中可能会出现问题(比如编译系统的优化选项使得用作标记的类级静态变量被优化,导致第一次检查失败)。 其次就是线程调度引起的效率问题。假设现在有两个线程A和B,它们执行着简单的逻辑:A获得锁(加锁),B阻塞,A执行操作,之后A释放锁,B获得锁,A继续请求锁,因被B获得锁而阻塞,B执行操作,如此反复。当一个线程获得锁以后,会导致另一个线程进入阻塞状态。在这样的操作多次反复的情况下,线程调度的开销是非常可观的。Windows系统是抢占式操作系统,与实时操作系统不一样,在底层,一个处理器在一个时间点只能执行一个线程,这是一种微观串行,从宏观上来看,似乎是多个任务同时执行,实现了宏观并行。为了真正达到并行处理,或者应该使用多处理器的体系结构。 再次就是多线程模型的移植性很差,这是因为,并非所有的操作系统都支持线程模型,因此使用多线程模型的应用程序将会变得很难移植。为了解决这些问题,几乎所有操作系统都提供事件的异步处理机制,用来实现并发处理,并且避免由于多线程模型带来的额外系统开销。 您可能会觉得,既然多线程模型在系统开销上很大,那为什么现在很多网络下载软件使用多线程模型可以提高下载速度呢?我想,下载软件的速度瓶颈应该不是在并发控制与线程调度上,而是在网络速度上,这两个值是在不同数量级上的。 对于像高性能服务器这样的应用程序而言,多线程模型带来的弊端不可忽视,它直接影响到整个系统的执行效率和移植性。
相对于进程来说,线程所占用资源更少,比如创建进程,系统要为它分配进程很大的私有空间,占用的资源较多,而对多线程程序来说,由于多个线程共享一个进程地址空间,因此占用资源较少。此外,进程间切换时,需要交换整个地址空间,而线程之间切换时只是切换线程的上下文环境,因此效率更高。在操作系统中引入线程带来的主要好处是:
(1)在进程内创建、终止线程比创建、终止进程要快。(2)同一进程内的线程间切换比进程间的切换要快,尤其是用户级线程间的切换。(3)每个进程具有独立的地址空间,而该进程内的所有线程共享该地址空间。因此,线程的出现可以解决父子进程模型中子进程必须复制父进程地址空间的问题。(4)线程对解决客户/服务器模型非常有效。
Netty是基于NIO的异步通信框架(曾经引入过AIO,后来放弃),故要说Netty原理我们要先从NIO开始。
NIO 是JAVA在JDK4中引入的同步非阻塞通信模型,在NIO出现之前(JDK4之前)市场上只有一个BIO模型顾名思义BLOCKING IO (同步阻塞通信模型)
BIO(BLOCKING I/O):
BIO 为一个连接 一个线程的模式,当有连接时服务器会开启一个线程来处理请求
若此请求啥都不想干此时线程会怎么样?
此线程会进入阻塞模式(BLOCKING)!---啥也不干,干等着zzZZ~
这种一连接,一线程的模式会造成服务器资源不必要的开销并且在大量连接访问时 服务器会发生什么?车道(线程)不足,车太多--我堵车了
由此就出现了NIO
↓
NIO(new/NONBLOCKING I/O):
NIO为同步非阻塞通信模型,Select(多路复用器)为此模型的核心,实现了多个连接一个线程
当有客户端连接请求时 此连接请求会被注册至select上,当select检测到此连接有I/O请求时才会打开一个线程去对此I/O请求进行处理-----单线程模型
这个时候有人问了:这么多操作都在一个线程里,线程忙不过来怎么办?
此时 由于网络请求、I/O读写、业务操作都在一个线程下,会导致在高并发的情况下存在性能瓶颈 于是乎有人就提出来 将业务操作丢到另一个线程怎么样?
于是出现了第三种reactor模型-使用线程池进行操作网络请求、IO在一个线程,业务操作在另个一个线程 的业务分离----线程池模型
从此图中可以看出此时 模型中使用一个线程池来进行网络请求、IO读取
当读取完成后将业务操作绑定在线程池中另外的线程上-------网络IO与业务操作可以同步进行了!一切都完美了起来!
但是!事情还没完!!这个时候又有人提出问题:在高并发的时候咋办?会不会有性能瓶颈
因为网络IO是非常消耗CPU的,当网络请求与网络IO在同个线程中时,造C10K的情况下单个线程并不足以支撑起所有的IO操作!因此也形成了在高并发状态下的性能瓶颈
于是大佬们就想着,如果把IO拆出来让单个线程池去接收网络请求,用另一个线程池来进行IO与业务操作会不会更好
于是第四种Reactor模型应运而生--主从Reactor多线程模型
此模型中 mainReactor只用于接收网络请求,而subReactor中为一个线程池,线程池中每个线程上绑定一个select
当mainReactor接收到请求时(一个描述符) 系统会生成一个新的描述符代表此连接生效,此时mainReactor会将新的描述符通过一个算法在线程池中选定一个线程 将此描述符绑定至此线程池上的select上,由此线程来对请求进行I/O 与业务操作
从此百万连接高并发不是问题
写到这 我们是不是想起了Netty的启动过程
1、声明两个EventLoopGroup一个为boss(mainReactor)一个为worker(subReactor)
EventLoopGroup(线程池)初始化的时候会生成(懒加载)指定数量的EventLoop(线程)若无指定 则会生成CPU数X2的线程
2、声明一个启动辅助类Bootstrap并将EventLoopGroup注册到启动辅助类BootStrap上(bootStrapgroup)
接着再给bootstrap指定channel模型等属性,再添加上业务流水线(channelpipeline)并且在pipeline中添加上业务操作handler,(通过channelpipeline可以对传入数据为所欲为)
3、绑定端口
Netty启动完成
这时候可能有人会问了:这和你上面说的reactor?NIO有啥关系?
这个时候我们要这么看
↓
若我们将boss与worker线程池设置为相同的一个线程池,那么会发生什么事?
此时关注一下第三个Reactor模型时就会发现 当BOSS=WORKER时候 netty实现的就是第三种Reactor模型 使用线程池模型
而当boss不等于worker的时候使用的就是第四种 主从多线程模型
Netty就是基于Reactor模型来对NIO进行了易用化封装,从Netty源码中就可以看出来其实底层还都是NIO的接口
此次处为自己读源码之后的理解 如有误请指正
感恩
反手拿下第一个赞
在进行服务器处理的过程中,需要保证数据的正确处理,那么最重要的就是使用不同的数据处理模式进行运算。
在整个过程中,可能很多人对服务器的知识并不了解,那么应该如何进行Java开发服务器的线程处理呢,关于线程处理有哪些知识?下面运城北大青鸟为大家介绍关键服务器线程处理的简单知识。
1、BIO线程模型在JDK14中引入JavaNIO之前,所有基于Java的Socket通信都使用了同步阻塞模式(BIO)。
这种请求-响应通信模型简化了上层的应用程序开发上,但在具有性能和可靠性的情况下,存在一个巨大的瓶颈。
在一段时间里面,大型应用程序服务器主要是用C或C++开发的,因为它们可以直接使用操作系统提供的异步I/O或AIO功能。
当流量增加且响应时间延迟增加时,JavaBIO开发的服务器软件只能通过硬件的不断扩展来满足并发性和低延迟的情况,这极大地增加了企业的成本和群集大小。
系统的不断扩展,系统的可维护性也面临着巨大的挑战,只能通过购买性能更高的硬件服务器来解决问题,这将导致恶性循环的产生。
2、异步非阻塞线程模型从JDK10到JDK13,Java的I/O类库非常原始。
UNIX网络编程中的许多概念或接口未反映在I/O类库中,例如Pipe、Channel、Buffer和Selector等。
在发布JDK14的时候,NIO正式发布JDK作为JSR-51。
并且它还添加了一个javanio包,为异步I/O开发提供了许多API和库。
3、RPC性能三原则影响RPC的性能主要有三大元素,其中主要为I/O模型、协议及线程。
I/O模型:使用什么样的通道传递给另一方,BIO,NIO或AIO发送数据,IO模型在很大程度上能够决定框架的性能。
协议:应该使用什么样的通信协议,Rest+JSON或基于TCP的专用二进制协议。
参加电脑培训的过程中发现,协议的选择不同,性能模型也不同。
内部专用二进制协议的性能通常可以比公共协议更好地设计。
线程:如何读取数据报?在执行读取后的编解码器的哪个线程中,如何分发编码消息,通信线程模型是不同的,并且对性能的影响也非常大。
0条评论