BIO到NIO,IO零食一箩筐
1.linux编辑文本显示行号
set nu
2.linux程序标准输出流返回值
0输入
1标准输出
2报错输出
===============下面返回值以程序实际运行为准=====================
3(需要开辟)比如new ServerSocket时对内核产生3个系统调用,线程执行的非Java函数socket()方法的返回值是3,代表监听,一个服务的描述
5代表系统调用,一个客户端连接,也是方法返回值
3.linux建立连接命令
nc:建立3次握手进行连接
4.Java对linux底层的IO调用
system.out.println会调用IO,会不断调用内核,在接口压测时会影响测试结果
5.一个Java线程与操作系统线程的一一对应的场景
socket网络编程中,Java通过执行操作系统的clone()方法新建线程
6.内核监听程序的3步
socket()=3 bind(3,8080) listen(3)
7.程序调用系统内核
接上,
while(true){
accept(3) = 5阻塞| 返回 client FD 这里会调用thread => recv(5 阻塞
clone()
}
8.BIO的优缺点
优点:每个连接 对应一个线程
缺点:本质时blocking,没办法,必须得多线程,才能支持多客户端交互
9.计组(可不是计算机组成原理)
第一个进入内存的程序时内核kernel(向下管理IO,向上服务app),有且仅有一个,
之后内核会暴露系统调用,如socket(),write(),bind()。(这里开机时内核进入内存时会有实模式、保护模式(程序无法访问内核)两种模式)
(这里有一个函数调用(不复杂,快,因为直接通过函数地址找下一个函数)与系统调用(会中断,较复杂))
直流电流入晶振,输出有规律的电给CPU供电,产生时钟中断,会记录在中断向量表(如0对用一个回调函数cb 1cb 128cb ...),CPU根据中断向量表对程序进行切换
参考:
计组--指令集及其特性(博主表示有点难啃)
https://blog.csdn.net/qq_42182367/article/details/82950703
10.什么叫系统调用
system.out.println会调用write(1,hello)函数,向CPU的寄存器填充:write函数名,参数,执行对应指令+一个序号,int 0x80
这里比如某个app会执行write 函数名 参数 int 0x80,进行系统调用
11.系统调用与中断
系统调用会产生软中断,会触发内核保护模式
12.缓存IO(带buffer的)优点
带buffer的会减少系统调用
参考:
Linux 中直接 I/O 机制的介绍
https://www.ibm.com/developerworks/cn/linux/l-cn-directio/
13.BIO的accept方法响应时间为什么变长
线程特别多的时候 CPU在单位时间内,消费更多的时间去,中断/调度,去进行保护线程/恢复线程
14.常见webserver
apache@httpd进程模型
nginx NIO epoll => 轻量级的
参考:
Apache进程模型分析
https://baijiahao.baidu.com/s?id=1659326572286532468&wfr=spider&for=pc
15.NIO模型
Java的NewIO用到OS Kernel nonbocking
16.man命令是很有用的命令,Linux默认man为英文,我们需要安装中文man-pages
yum install man-pages
17.Java服务端编程设置非阻塞
ServerSocketChannel对象.setConfiguration(true/false);此处JAVA的NIO会调用操作系统的非阻塞
18.NIO下网络编程不再是阻塞点的方法
accept() read()
19.打印程序下所有线程的执行日志
step1
编写Java类 testSocket.java
step2
javac testSocket.java
step3
strace -ff -o out java testSocket
strace 指令 可以查看 Java代码形成的 底层调用 ,具体是什么
参考:
https://www.bilibili.com/video/BV1ft4y1i7G1?p=18
20.非阻塞优缺点
优点:节省线程
缺点:连接数多时,每次都会所有线程遍历一遍
21.NIO下网络socket

Linux fcntl函数详解
https://www.cnblogs.com/xuyh/p/3273082.html

浙公网安备 33010602011771号