笔者建议初学者学习Java的方式:看书+视频+实践(初学最难的问题其实仍是在环境)java
Java学习书籍推荐
《Head First Java.第二版》:
能够说是个人Java启蒙书籍了,特别适合新手读固然也适合咱们用来温故Java知识点。node
《Java核心技术卷1+卷2》:
很棒的两本书,建议有点Java基础以后再读,介绍的仍是比较深刻的,很是推荐。程序员
《Java编程思想(第4版)》:
这本书要常读,初学者能够快速概览,中等程序员能够深刻看看java,老鸟还能够用之回顾java的体系。这本书之因此厉害,由于它在无形中整合了设计模式,这本书之因此难读,也偏偏在于他对设计模式的整合是无形的。面试
一些Java方向学习书籍汇总(PDF仅为预览版本,建议购买正版):编程
连接:https://pan.baidu.com/s/1g0mjyJX5ZWU706IKjDSzeg 密码:b88d设计模式
Java学习视频推荐
如下视频整理自慕课网Java工程师路径相关免费课程。安全
Java基础面试常见问题汇总
超详细的Java面试题总结(二)之Java基础知识篇数据结构
超详细的Java面试题总结(四 )之JavaWeb基础知识总结
下面都是以网络读数据为例
【2阶段网络IO】
第一阶段:等待数据 wait for data
第二阶段:从内核复制数据到用户 copy data from kernel to user
下面是5种网络IO模型
【阻塞blocking IO】
两阶段全程阻塞
recvfrom -> [syscall -> wait -> copy ->] return OK
【非阻塞nonblocking IO】
第一阶段是非阻塞的不断检查是否数据准备好,第二阶段阻塞读取数据
recvfrom -> [syscall -> wait ->] return no data ready
recvfrom -> [syscall -> wait ->] return no data ready
recvfrom -> [syscall -> wait ->] return ready
recvfrom -> [syscall -> copy ->] return OK
【多路复用IO multiplexing】
每一个IO都是非阻塞IO,第一阶段经过select/poll方法,一次性轮询多个IO句柄,检查是否有IO句柄准备好,第二阶段阻塞读取数据
select/pool -> [syscall -> wait ->] return readable
recvfrom -> [syscall -> copy ->] return OK
【信号驱动signal driven IO】
第一阶段构造一个信号处理器,第二阶段阻塞读取数据
signal handle -> [syscall -> wait ->] return
[syscall ->] signal handle -> recvfrom -> [syscall -> copy ->] return OK
【异步asynchronous IO】
两阶段都是非阻塞
aio_read -> [syscall -> wait ->] return
[syscall -> copy ->] aio_read callback
5种网络IO对比,只有aio才是全程非阻塞,其它4种都是同步IO。
阻塞IO编程简单,这种方式使用很普遍,可是效率较低。
非阻塞IO效率较高,可是编程较复杂,有开发语言和代码库支持就简单多了。
多路复用非阻塞IO效率比非阻塞IO更高,在大规模的网络IO处理中尤为明显,支持的程序也愈来愈多。
异步IO效率很高,可是编程很复杂。node.js中使用的就是异步IO。
【select / epoll 对比】
select不足的地方:
1 每次select都要把所有IO句柄复制到内核
2 内核每次都要遍历所有IO句柄,以判断是否数据准备好
3 select模式最大IO句柄数是1024,太多了性能降低明显
epoll的特色
1 每次新建IO句柄(epoll_create)才复制并注册(epoll_ctl)到内核
2 内核根据IO事件,把准备好的IO句柄放到就绪队列
3 应用只要轮询(epoll_wait)就绪队列,而后去读取数据
只须要轮询就绪队列(数量少),不存在select的轮询,也没有内核的轮询,不须要屡次复制全部的IO句柄。所以,能够同时支持的IO句柄数轻松过百万。
网络编程,必定要很是了解网络IO模型,对系统设计和架构选型才能有更好的选择和把握。
下面都是以网络读数据为例
【2阶段网络IO】
第一阶段:等待数据 wait for data
第二阶段:从内核复制数据到用户 copy data from kernel to user
下面是5种网络IO模型
【阻塞blocking IO】
两阶段全程阻塞
recvfrom -> [syscall -> wait -> copy ->] return OK
【非阻塞nonblocking IO】
第一阶段是非阻塞的不断检查是否数据准备好,第二阶段阻塞读取数据
recvfrom -> [syscall -> wait ->] return no data ready
recvfrom -> [syscall -> wait ->] return no data ready
recvfrom -> [syscall -> wait ->] return ready
recvfrom -> [syscall -> copy ->] return OK
【多路复用IO multiplexing】
每一个IO都是非阻塞IO,第一阶段经过select/poll方法,一次性轮询多个IO句柄,检查是否有IO句柄准备好,第二阶段阻塞读取数据
select/pool -> [syscall -> wait ->] return readable
recvfrom -> [syscall -> copy ->] return OK
【信号驱动signal driven IO】
第一阶段构造一个信号处理器,第二阶段阻塞读取数据
signal handle -> [syscall -> wait ->] return
[syscall ->] signal handle -> recvfrom -> [syscall -> copy ->] return OK
【异步asynchronous IO】
两阶段都是非阻塞
aio_read -> [syscall -> wait ->] return
[syscall -> copy ->] aio_read callback
5种网络IO对比,只有aio才是全程非阻塞,其它4种都是同步IO。
阻塞IO编程简单,这种方式使用很普遍,可是效率较低。
非阻塞IO效率较高,可是编程较复杂,有开发语言和代码库支持就简单多了。
多路复用非阻塞IO效率比非阻塞IO更高,在大规模的网络IO处理中尤为明显,支持的程序也愈来愈多。
异步IO效率很高,可是编程很复杂。node.js中使用的就是异步IO。
【select / epoll 对比】
select不足的地方:
1 每次select都要把所有IO句柄复制到内核
2 内核每次都要遍历所有IO句柄,以判断是否数据准备好
3 select模式最大IO句柄数是1024,太多了性能降低明显
epoll的特色
1 每次新建IO句柄(epoll_create)才复制并注册(epoll_ctl)到内核
2 内核根据IO事件,把准备好的IO句柄放到就绪队列
3 应用只要轮询(epoll_wait)就绪队列,而后去读取数据
只须要轮询就绪队列(数量少),不存在select的轮询,也没有内核的轮询,不须要屡次复制全部的IO句柄。所以,能够同时支持的IO句柄数轻松过百万。
网络编程,必定要很是了解网络IO模型,对系统设计和架构选型才能有更好的选择和把握。
下面都是以网络读数据为例
【2阶段网络IO】
第一阶段:等待数据 wait for data
第二阶段:从内核复制数据到用户 copy data from kernel to user
下面是5种网络IO模型
【阻塞blocking IO】
两阶段全程阻塞
recvfrom -> [syscall -> wait -> copy ->] return OK
【非阻塞nonblocking IO】
第一阶段是非阻塞的不断检查是否数据准备好,第二阶段阻塞读取数据
recvfrom -> [syscall -> wait ->] return no data ready
recvfrom -> [syscall -> wait ->] return no data ready
recvfrom -> [syscall -> wait ->] return ready
recvfrom -> [syscall -> copy ->] return OK
【多路复用IO multiplexing】
每一个IO都是非阻塞IO,第一阶段经过select/poll方法,一次性轮询多个IO句柄,检查是否有IO句柄准备好,第二阶段阻塞读取数据
select/pool -> [syscall -> wait ->] return readable
recvfrom -> [syscall -> copy ->] return OK
【信号驱动signal driven IO】
第一阶段构造一个信号处理器,第二阶段阻塞读取数据
signal handle -> [syscall -> wait ->] return
[syscall ->] signal handle -> recvfrom -> [syscall -> copy ->] return OK
【异步asynchronous IO】
两阶段都是非阻塞
aio_read -> [syscall -> wait ->] return
[syscall -> copy ->] aio_read callback
5种网络IO对比,只有aio才是全程非阻塞,其它4种都是同步IO。
阻塞IO编程简单,这种方式使用很普遍,可是效率较低。
非阻塞IO效率较高,可是编程较复杂,有开发语言和代码库支持就简单多了。
多路复用非阻塞IO效率比非阻塞IO更高,在大规模的网络IO处理中尤为明显,支持的程序也愈来愈多。
异步IO效率很高,可是编程很复杂。node.js中使用的就是异步IO。
【select / epoll 对比】
select不足的地方:
1 每次select都要把所有IO句柄复制到内核
2 内核每次都要遍历所有IO句柄,以判断是否数据准备好
3 select模式最大IO句柄数是1024,太多了性能降低明显
epoll的特色
1 每次新建IO句柄(epoll_create)才复制并注册(epoll_ctl)到内核
2 内核根据IO事件,把准备好的IO句柄放到就绪队列
3 应用只要轮询(epoll_wait)就绪队列,而后去读取数据
只须要轮询就绪队列(数量少),不存在select的轮询,也没有内核的轮询,不须要屡次复制全部的IO句柄。所以,能够同时支持的IO句柄数轻松过百万。
网络编程,必定要很是了解网络IO模型,对系统设计和架构选型才能有更好的选择和把握。
下面都是以网络读数据为例
【2阶段网络IO】
第一阶段:等待数据 wait for data
第二阶段:从内核复制数据到用户 copy data from kernel to user
下面是5种网络IO模型
【阻塞blocking IO】
两阶段全程阻塞
recvfrom -> [syscall -> wait -> copy ->] return OK
【非阻塞nonblocking IO】
第一阶段是非阻塞的不断检查是否数据准备好,第二阶段阻塞读取数据
recvfrom -> [syscall -> wait ->] return no data ready
recvfrom -> [syscall -> wait ->] return no data ready
recvfrom -> [syscall -> wait ->] return ready
recvfrom -> [syscall -> copy ->] return OK
【多路复用IO multiplexing】
每一个IO都是非阻塞IO,第一阶段经过select/poll方法,一次性轮询多个IO句柄,检查是否有IO句柄准备好,第二阶段阻塞读取数据
select/pool -> [syscall -> wait ->] return readable
recvfrom -> [syscall -> copy ->] return OK
【信号驱动signal driven IO】
第一阶段构造一个信号处理器,第二阶段阻塞读取数据
signal handle -> [syscall -> wait ->] return
[syscall ->] signal handle -> recvfrom -> [syscall -> copy ->] return OK
【异步asynchronous IO】
两阶段都是非阻塞
aio_read -> [syscall -> wait ->] return
[syscall -> copy ->] aio_read callback
5种网络IO对比,只有aio才是全程非阻塞,其它4种都是同步IO。
阻塞IO编程简单,这种方式使用很普遍,可是效率较低。
非阻塞IO效率较高,可是编程较复杂,有开发语言和代码库支持就简单多了。
多路复用非阻塞IO效率比非阻塞IO更高,在大规模的网络IO处理中尤为明显,支持的程序也愈来愈多。
异步IO效率很高,可是编程很复杂。node.js中使用的就是异步IO。
【select / epoll 对比】
select不足的地方:
1 每次select都要把所有IO句柄复制到内核
2 内核每次都要遍历所有IO句柄,以判断是否数据准备好
3 select模式最大IO句柄数是1024,太多了性能降低明显
epoll的特色
1 每次新建IO句柄(epoll_create)才复制并注册(epoll_ctl)到内核
2 内核根据IO事件,把准备好的IO句柄放到就绪队列
3 应用只要轮询(epoll_wait)就绪队列,而后去读取数据
只须要轮询就绪队列(数量少),不存在select的轮询,也没有内核的轮询,不须要屡次复制全部的IO句柄。所以,能够同时支持的IO句柄数轻松过百万。
网络编程,必定要很是了解网络IO模型,对系统设计和架构选型才能有更好的选择和把握。
做者: 连接:https://www.imooc.com/article/37093 来源:慕课网 本文原创发布于慕课网 ,转载请注明出处,谢谢合做