1、什么是进程和线程
进程是操作系统为程序运行进行资源分配的最小单位,其中资源包括:CPU、内存空间、磁盘IO等。同一个进程中的多个线程共享该进程中的全部资源。而不同进程之间,进程和进程是相互独立的。
线程是进程的一个实体,是CPU调度的最小单位,必须依赖于线程而存在。它与同属一个进程的其它的线程共享进程所拥有的全部资源。
例如:WPS是一个应用程序,双击后,操作系统就进行资源分配,使其能正常运行,就开启了一个进程,同时也至少开启了一个线程,比如在编写word文档的时候,会不定期的自动保存,这个就是另外一个线程在处理。所以程序是死的、静态的,进程是活的、动态的,一个进程至少存在一个线程。
2、CPU核心数和线程数的关系
CPU核心数是物理概念,是指硬件上存在几个核心。比如,双核就是包括2个相对独立的CPU核心单元组,四核就包含4个相对独立的CPU核心单元组,等等,依次类推。
CPU线程数是逻辑概念,简单地说,就是模拟出的CPU核心数。比如,可以通过一个CPU核心数模拟出2线程的CPU,也就是说,这个单核心的CPU被模拟成了一个类似双核心CPU的功能。这样可以更好的描述CPU的运行能力。
CPU的线程数概念仅仅只针对Intel的CPU才有用。一般情况下它们是1:1对应关系,也就是说四核CPU一般拥有四个线程。但Intel引入超线程技术后,使核心数与线程数形成1:2的关系。目前主流CPU都是多核的,增加核心数目就是为了增加线程数,因为操作系统是通过线程来执行任务的。增加线程数是源于多任务处理的需要,线程数越多,越有利于同时运行多个程序。
实际应用中,线程数远大于CPU核心数,感觉并没有受到CPU核心数的限制,那是因为CPU时间片轮转机制的原因。
3、CPU时间片轮转机制
我们平时在使用电脑时,开启了多个应用程序(也就是启动了多个线程),进行各种复杂的操作任务,系统依然能正常进行,为什么?这是因为操作系统提供了一种CPU时间片轮转机制。
时间片轮转调度是一种最古老、最简单、最公平且使用最广的算法,又称RR调度。时间片轮转法(Round-Robin,RR)主要用于分时系统中的进程调度。为了实现轮转调度,系统把所有就绪进程按先入先出的原则排成一个队列。新来的进程加到就绪队列末尾。每当执行进程调度时,进程调度程序总是选出就绪队列的队首进程,让它在 CPU 上运行一个时间片的时间。时间片是一个小的时间单位,通常为 10~100ms 数量级。当进程用完分给它的时间片后,系统的计时器发出时钟中断,调度程序便停止该进程的运行,把它放入就绪队列的末尾;然后,把 CPU 分给就绪队列的队首进程,同样也让它运行一个时间片,如此往复。
4、什么是并行和并发
并行:指两个或多个事件在同一时刻点发生,CPU同时执行。看的是同一个时刻点上有多少个任务在执行,这个执行的数量叫并行度。
并发:指两个或多个事件在同一时间段内发生,CPU交替执行。看的是在一个时间段内有多少个任务执行,这个执行的数量叫并发数。
比如:高速公路上并排有4条车道,那么同一时刻,高速公路上最多只有4辆车并排而走,那么并行度为4,这就是并行。假设遇到一条单行的隧道时,这4条车道的车都要相互交替的通过隧道,假设10min通过了30辆,那么并发数为30辆/10min=3辆/min,这就是并发。
所以当谈论并发的时候一定要加个单位时间,也就是说单位时间内并发量是多少,否则离开了单位时间其实是没有意义的。
5、高并发编程的好处和注意事项
好处:
(1)充分利用 CPU 的资源
(2)加快响应用户的时间
(3)可以使代码模块化,异步化,简单化
注意事项:
(1)线程之间的安全性
(2)线程之间的死锁
(3)线程太多了会将服务器资源耗尽形成死机宕机