set nu
0输入
1标准输出
2报错输出
===============下面返回值以程序实际运行为准=====================
3(需要开辟)比如new ServerSocket时对内核产生3个系统调用,线程执行的非Java函数socket()方法的返回值是3,代表监听,一个服务的描述
5代表系统调用,一个客户端连接,也是方法返回值
nc:建立3次握手进行连接
system.out.println会调用IO,会不断调用内核,在接口压测时会影响测试结果
socket网络编程中,Java通过执行操作系统的clone()方法新建线程
socket()=3 bind(3,8080) listen(3)
接上,
while(true){
accept(3) = 5阻塞| 返回 client FD 这里会调用thread => recv(5 阻塞
clone()
}
优点:每个连接 对应一个线程
缺点:本质时blocking,没办法,必须得多线程,才能支持多客户端交互
第一个进入内存的程序时内核kernel(向下管理IO,向上服务app),有且仅有一个,
之后内核会暴露系统调用,如socket(),write(),bind()。(这里开机时内核进入内存时会有实模式、保护模式(程序无法访问内核)两种模式)
(这里有一个函数调用(不复杂,快,因为直接通过函数地址找下一个函数)与系统调用(会中断,较复杂))
直流电流入晶振,输出有规律的电给CPU供电,产生时钟中断,会记录在中断向量表(如0对用一个回调函数cb 1cb 128cb ...),CPU根据中断向量表对程序进行切换
参考:
https://blog.csdn.net/qq_42182367/article/details/82950703
system.out.println会调用write(1,hello)函数,向CPU的寄存器填充:write函数名,参数,执行对应指令+一个序号,int 0x80
这里比如某个app会执行write 函数名 参数 int 0x80,进行系统调用
系统调用会产生软中断,会触发内核保护模式
带buffer的会减少系统调用
参考:
https://www.ibm.com/developerworks/cn/linux/l-cn-directio/
线程特别多的时候 CPU在单位时间内,消费更多的时间去,中断/调度,去进行保护线程/恢复线程
apache@httpd进程模型
nginx NIO epoll => 轻量级的
参考:
https://baijiahao.baidu.com/s?id=1659326572286532468&wfr=spider&for=pc
Java的NewIO用到OS Kernel nonbocking
yum install man-pages
ServerSocketChannel对象.setConfiguration(true/false);此处JAVA的NIO会调用操作系统的非阻塞
accept() read()
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
优点:节省线程
缺点:连接数多时,每次都会所有线程遍历一遍
原文:https://www.cnblogs.com/powerZhangFly/p/13915560.html