I/O 多路复用

在这里插入图片描述

系统调用流程

在这里插入图片描述

BIO

#最古老的多线程解决多客户端连接问题

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class TestSocket {
    public static void main(String[] args) throws IOException {
    	#启动一个服务端绑定一个端口8090
        ServerSocket server = new ServerSocket(8090);
        System.out.println("step1: new ServerSocket(8090)");
        #死循环,不同时刻接受客户端的连接
        while (true){
        	#每循环一次就接受一个客户端连接进来
            Socket client = server.accept();
            System.out.println("step2:client\t" + client.getPort());
            #如果直接客户端I/O直接读的话会与client阻塞,创建新的线程
            new Thread(()->{
                try {
                    InputStream in = client.getInputStream();
                    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
                    while (true){
                        System.out.println(reader.readLine());
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }).start();
        }
    }
}

1、运行java代码,并追踪线程

在这里插入图片描述

在这里插入图片描述

2、查看追踪文件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、本地连接server:8090后,新建socket连接

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4、深入内核查看

vim ooxx.25785 (主进程号)
可以看到有一个accept的内核调用方法,与java类似,java包装的

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

man accept

在这里插入图片描述

man 2 bind

在这里插入图片描述

java代码与内核调用有一种映射关系

在这里插入图片描述

多连接观察

在这里插入图片描述

1、观察现在主进程日志

在这里插入图片描述

2、再次添加一个连接

nc localhost 8090

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

再添加一个nc连接

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

非阻塞NIO

man socket

在这里插入图片描述

man 2 select

在这里插入图片描述
在这里插入图片描述

man epoll

在这里插入图片描述

非阻塞

在这里插入图片描述

在这里插入图片描述

查看nginx

在这里插入图片描述

3259

在这里插入图片描述
在这里插入图片描述

3260 master

在这里插入图片描述

3261 worker

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

worker就是等待着客户端来,来了之后才干活,不然就阻塞着

查看redis

单线程的redis

轮询线程

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

为啥不阻塞是轮询
redis只有一个线程,要干很多事情,epoll
比如LRU、LFU、RDB、AOF

在这里插入图片描述

kafka

在这里插入图片描述

0拷贝

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值