线程从刚开始的 单进程-> 多进程批处理 -> 多进程并行处理 -> 多线程 -> 纤程/协程 时效率慢慢的提升
-
单进程人工切换 纸带机
-
多进程批处理 多个任务批量执行
-
多进程并行处理 把程序写在不同的内存位置上来回切换
-
多线程 一个程序内部不同任务的来回切换 selector - epoll模型
-
纤程/协程 绿色线程,用户管理的(不是OS管理的)线程
CPU利用率达到最高
面试题
什么是进程?
操作系统进行资源分配的基本单位,一个程序可以有多个进程
什么是线程?
一个进程可以有多个线程,是调度执行的基本单位,多个线程共享同一个进程里所要的资源
什么是纤程/协程?
什么是程序?
所谓的程序就是操作系统可执行的文件,找到文件后,操作系统会把相关的信息load到内存里,程序可以在内存里存放多份
线程的切换
把T1线程指令与数据交给CPU去执行,T1线程执行一半时,会由于操作系统的调度算法让T1让出时间片,把之前计算好的数据放入cache中,然后去执行T2线程的指令与数据
线程切换也是需要消耗资源的,线程切换也称上下文切换
面试题
单核CPU设定多线程是否有意义?
当然有意义,如果一个线程在等待sleep时,其他线程可以运行,最大程度的利用了CPU的使用率
线程分类: CPU密集型(对CPU利用率比较高) IO密集型(简单消耗CPU的操作)
线程数是不是设置的越大越好?
不是,因为线程之间的切换会浪费CPU资源,线程数过多的话,大部分时间都会浪费在了线程的切换上面
工作线程数(线程池中线程数量)设多少合适?
模拟实际情况做压测,来找到一个适合自己业务的线程数量
大概公式:线程数量 = cpu核数 * cpu利用率 * (1 + 等待时间/计算时间的比例)
如何得到 线程的等待时间与计算时间分别是多少?
通常使用工具来测算 Profiler
生产上线后 可以用 Arthas 来监控