ismallboy

ismallboy 查看完整档案

填写现居城市  |  填写毕业院校  |  填写所在公司/组织填写个人主网站
编辑
_ | |__ _ _ __ _ | '_ \| | | |/ _` | | |_) | |_| | (_| | |_.__/ \__,_|\__, | |___/ 该用户太懒什么也没留下

个人动态

ismallboy 赞了回答 · 11月29日

解决为什么说NIO能处理更高的并发链接?

BIO是同步阻塞的,客户端在请求数据的过程中需要保持同一个连接;而NIO是同步非阻塞的,客户端在请求数据的过程中不需要保持同一个连接,即是轮询的方式实现的;所以区别在于一个请求是否需要保持同一个连接。

单从客户端请求与服务端连接连接来看,NIO确实不比BIO有优势,但一个请求处理简单来说可以分为两步:建立连接、服务端处理数据。假如一个请求建立连接需要1s和1MB内存,然后等待数据处理返回需要4s,对于BIO来说,5s内占用的内存都是1MB,100个请求就需要500MB;而对于NIO来说,假如一个轮询持续1s,然后下一次轮询间隔也是1s,第1s处理100个请求连接需要500MB,第2s没有连接0MB,第3s处理100个连接500MB,第4s没有连接0MB,第5s开始处理返回所以请求结果,平均下来只需要250MB,换个角度就是接收200个请求500MB,NIO的容纳量比BIO高了一倍。

所以NIO比BIO性能更好,优势在于NIO节约了“始终保持一个连接”的内存消耗。

关注 3 回答 3

ismallboy 赞了回答 · 11月29日

解决为什么说NIO能处理更高的并发链接?

图中好处主要是下面
1.nio只保持有限线程来接受请求,有限工作线程处理业务。同时把请求交给工作线程后又可以接受新请求了。所以这个线程一直存活
2.池化的bio每次请求需要创建一个线程,一般不能无限资源会耗尽,而且应该是同步等待返回的。最后回收到线程池

再讲讲你画的bio图 其实不是完全意义上bio的。比如你引入了等待队列,也就是说整个bio把任务交给等待队列就应该结束了。
Nio也不是完全的nio 而是react模型。

本质上的nio应该是只看多路复用 bio是堵塞 不是你画的图

关注 3 回答 3

ismallboy 赞了回答 · 11月26日

解决为什么说NIO能处理更高的并发链接?

你已经知道是提升的是“并发”能力了,那又跟处理“速度”有啥关系呢?

确实像你说的,对于客户端来说客户端都是等。但“等”跟“等”是不一样的,就像银行取号机,就这一台,假设说这取号机你点了取号按钮以后 2s 才能吐出一张纸,你自己捋一捋 BIO/NIO 场景下有一百个人的话总共需要多少秒能全部拿到号?

省下的是取号本身的时间,至于你取完号你到柜台去办理业务了,柜台给你办多久你能离开银行了,跟取号机是 BIO/NIO 有啥关系呢?

关注 3 回答 3

ismallboy 提出了问题 · 11月26日

解决为什么说NIO能处理更高的并发链接?

一直都说NIO相对BIO来说可以处理更高的并发链接,但是觉得NIO处理高并发的链接,也只是接受了tcp链接而已,是qps,等待处理的任务还是放在“事件队列”当中,等待后面的“业务线程池”处理,虽然说qps高,但是tps仍然受制于后面的业务线程池,所以对于“客户端”来说,NIO虽然是握手成功了,但是仍然是阻塞在那里,客户端也是等待!所以,NIO的优势在哪里呢?如下图:图1是NIO,图2是BIO。

image.png
图1

image.png
图2

关注 3 回答 3

ismallboy 回答了问题 · 11月21日

解决为什么说线程太多,cpu切换线程会浪费很多时间?

我自己写了个回答:
https://www.cnblogs.com/ismal...

关注 3 回答 3

ismallboy 提出了问题 · 11月21日

解决为什么说线程太多,cpu切换线程会浪费很多时间?

一直不明白一件事情,说线程不宜开得太多,太多的线程会导致线程频繁切换,消耗cpu时间。但是对于操作系统来说,运行当中的线程肯定是大于1个,所以cpu也是一直在切换的。10个运行中的线程和20个运行中的线程,有什么区别?反正cpu都是一直在切换,这里假设线程的优先级都是一样的,并且都还是按照cpu的时间片轮转来切换线程。

第一种情况,10个运行中的线程a1-a10。cpu在a1-a10来回切换,切换了一轮,又重a1开始,重复切换,不断循环(假设任务一直执行)。

第二种情况,20个运行中的线程b1-b20。cpu在b1-b20来回切换,切换了一轮,又重b1开始,重复切换,不断循环(假设任务一直执行)。

以上两种情况对于cpu来说,都是一直在切换,在线程切换上消耗的时间不是一样的?

关注 3 回答 3

ismallboy 提出了问题 · 11月17日

strace跟踪进程(mosquitto)运行一段时间自动挂掉原因

linux上有一个进程(mosquitto)启动之后,过几分钟或者几小时就会无缘无故自动挂掉,也没有什么log,然后使用strace跟踪了一下该进程的系统调用,发现最后是挂掉了,但是从strace打印的系统调用看来,看不出什么问题,有大神能看出点什么来么?
image

关注 2 回答 1

ismallboy 提出了问题 · 11月12日

mat的OQL语句查询结果如何解码

如下图,是MAT(eclipse memory analyzer)工具使用OQL查询出来的结果,但是查询出来的结果都是unicode编码的,如何能让查出来的结果就直接是中文的?image

关注 1 回答 0

ismallboy 赞了回答 · 10月14日

解决springboot的api如何配置多个统一前缀

在类上配置多个前缀是最好的办法:

@RestController
@RequestMapping(value = {"/prefix1","/prefix2"})
public class HelloWorldController {
    @GetMapping("/hello")
    public String Hello(){
        return "hello,world!";
 }
}

关注 4 回答 3

ismallboy 提出了问题 · 9月25日

解决springboot的api如何配置多个统一前缀

springboot的api如何配置多个统一前缀,比如,`GET /{prefix1}/user`和`GET /{prefix2/user`访问的是同一个接口,如何实现?上网查了一下,springboot可以通过`server.servlet.context-path`统一配置api的前缀,但是只能配置一个,如何实现配置一个或者多个?
另外,以下两种方式也也可以实现,但是不是全局的,要一个接口一个接口去写:
* 方法上加`@GetMapping(value = {"/{prefix1}/user", "/{prefix2}/user"}`;
* 类上加`@RequestMapping(value = {"/{prefix1}/user", "/{prefix2}/user"}`
不知道有没有更好的方式呢?

关注 4 回答 3

认证与成就

  • 获得 1 次点赞
  • 获得 8 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 8 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2017-06-10
个人主页被 465 人浏览