计算机三大核心组件:cpu、内存和输入输出设备(IO)

开启多线程的最根本的目的是为了充分利用cpu,提高计算机资源利用率。cpu是发送执行命令的地方,其只能从内存里读取指令来执行,也是线程调度的执行者

拿IO来说,在单线程的情况下,假如此时有一个线程需要执行IO,这个过程分2个阶段,1、cpu调度该线程,让该线程执行其要执行的任务;2、该线程执行其IO操作,如果此时的IO需要花费很长时间,那此时的cpu就会处于等待时间,换句话说cpu现在是空闲的,所以在多线程的情况下cpu就可以利用这个空闲时间去调度其他线程,让他们执行各自的任务,这样就提高了程序的执行效率

我们经常会听到要好好使用cpu的资源,提高cpu利用率,要学习应对高负载的情况,那这个高负载其实大多数情况指的就是cpu负载。我们还会学习到一个命令是top,这个命令可以得到他们的数值和其他系统指标。那么什么是cpu利用率,其实就是单位时间里cpu被使用的时间,那么为什么cpu会没有被使用到呢,我们经常可以看到cpu负载都是在3以上,也就是说如果cpu核心有四个的话,那么同一时刻可能就有三个核心在工作,虽然核心的工作并不一定是平均分配的。cpu的工作时间并不等于使用时间,因为这个工作可能需要请求硬盘资源和系统资源,时间还有大部分花在了这些事情上了。所以有的人会说当应用是io密集型的时候,要使用更多的线程,因为更多的线程意味着更多的任务,也意味着每个cpu执行一个任务的时间缩短了,所以花在io阻塞,socket阻塞的时间就少了,因为他们是异步执行,也就可以提高cpu利用率了。

那么cpu负载是什么呢,其实就是所有cpu的运行的和在队列里等待的任务的数量,记住是所有cpu,所以4的负载率平均到每个cpu核心的任务数是4/逻辑cpu数,这个逻辑cpu数是因为有的cpu核心可以同时执行两个线程,所以哪怕有两个核心,我们也要当成有4个核心。负载数一般是每个核心承担0.7个任务最好,这个不是什么标准,我也不知道对不对,因为如果大于1,表示我们任务的延迟就比较大了,如果等于1,那么cpu就基本没闲着,对机器的损耗挺大的。

其实理解概念没什么用,我们给指导这里面的原理,比如线程是怎么被执行的,它是先告诉cpu我处于可执行状态,然后cpu把他放到等待队列里或执行,cpu会为它分配时间片,时间片就是给予的cpu执行时间,这里面通过一个算法,叫做线程调度算法,有兴趣的可以搜一下,有时间片,fifo,抢占式,优先级几种。当线程被执行后,它就会执行到时间片时间用完,如果这个线程都是io操作,那么cpu就相当于什么都没干了。

服务器是怎么处理高并发场景的?

其实服务器并不是为每个请求创建一个线程,由于client 在访问tomcat的时候,需要建立一个connector,这个建立connector的过程有可能因为各种原因而耗费一定的时间,比如网络原因,所以实际上tomcat默认采用线程池的方式,即用线程池保存一定数量的连接,当有新的请求时,就从线程池取连接,不需要时就放回线程池,这种方式相对于一个请求创建一个线程,会更少的占用服务器资源,更高效。另外tomcat的线程池有两种基于方式:BIO(阻塞)和NIO(非阻塞)