持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情
从面试题开始
每次换工作都要大量的刷面试题,八股文等等。多线程的面试问题也是必不可少的一部分。由于之前有做过 NodeJs 也做过 Java 开发,总会被问它们之间的区别或者对它们的看法。
其中经常会说的一个优势点:NodeJs 的单线程机制。没有多线程那就可以不用考虑线程安全的问题,也无需担心多线程切换的开销。NodeJs 开发对于性能方面,通过异步 I/O很好的解决IO密集的问题,实现了高性能的服务器。
像 Java 这种面向对象语言的开发,都提供了多线程支持。让多个线程同时工作,可以加快程序运行的速度。但同时也是会带来性能的问题。
服务性能指标
所谓的性能问题,经常说的是什么?基本可以从以下方面的表现来体现性能问题:
- 并发数:同一时间同时请求服务的用户数。
- 服务响应时间
响应时间就是用户从发出请求到接收完响应之间的耗时。这个过程由网络传输、服务处理等多个部分组成
- 吞吐量
吞吐指的是服务处理请求的能力。吞吐量越高,代表服务处理效率就越高。换句话说就是网站的性能越高
- QPS
每秒查询率。在规定时间内所处理流量多少的衡量标准。QPS = 并发数 / 平均响应时间。
多线程产生性能问题
多线程也会带来性能问题。在使用线程会在两方面会带来性能问题:
- 线程调度
线程数是大于 CPU 核心数。所以在操作系统按照调度算法进行线程调度时,会引起上下文切换。上下文切换会把当前正在执行的线程挂起然后保存起状态,然后寻找下一个可执行的线程,然后唤醒它。这样反复不断执行。
如果下一个可执行的线程只是简单计算工作,那么上下文切换带来的性能开销比执行线程的开销还要大。
在整个不断挂断,唤醒的执行过程,有时候可能会使用缓存来加速正序的运行,但如果缓存失效就需要重新载入缓存,就会造成一定的开销。
- 线程协作
有时候多个线程之间有共享数据,为保证线程安全,可能需要进行一些安全保证的措施,可能就会导致性能降低。因为线程安全的优先级要比性能优先级更高