在讨论进程和线程之前,我们首先要弄清楚并发与并行、同步和异步的概念:
并发与并行
并行( ParallelParallel ):指两个或多个事件在同一时刻发生(同时发生)。同一时刻,两个事物均处于活动状态
并发( Concurrency ):指两个或多个事件在同一个时间段内发生。同一时刻,只有个事物处于活动状态。
宏观上存在并行特征,微顺序性。
同步与异步
通俗的理解就是:
同步:排队执行 , 效率低但是安全.
异步:同时执行 , 效率高但是数据不安全.
进程
计算机操作系统中为了控制和协调各程序段执行过中的软硬件资源共享和竞争,必须有一个描述各程序执行过和共享资源的基本单位,这个单位就是进程:
进程的概念
并发执行的程序在执行过程中分配和管理资源的基本单位。
进程是一个内存中能独立运行的应用程序,每个进程都有一个独立的内存空间。
CPU同时刻只能执行一个进程,所以为了实现多进程并发和进程间的切换,出现了操作系统进程调度器,而进程也成为了调度的基本单位。凡是没有建立进程的程序,都不能作为一个独立的单位参加运行。
单CPU中进程只能是并发,多CPU计算机中进程可以并行。
进程的特性
进程具有三个特性:
- 进程是一个动态的概念,进程的实质是程序的一次执行过程,动态性是进程的基本特征,同时进程是有一定生命周期的。
- 并发性:并发性是进程的重要特征,引入进程的目的正是为了使其程序和其他程序并发执行,而没有建立进程的程序是不能并发执行的。
- 独立性:是指进程是一个能独立运行,独立分配资源的和独立调度的基本单位。
由于进程具有这样的属性:
- 进程是一个可拥有资源的基本单位
- 进程是可独立调度和分派的基本单位
- 进程作为一个资源拥有者,在创建、撤销、切换中,系统必须为之付出较大的时空开销
所以这也就导致了进程自身的一些局限性:
系统中进程的数量不宜过多,系统切换进程的频率不宜过高。
这就限制了并发度的进一步提高。
于是为解决此问题,人们想到将进程的上述两个属性分开:
对作为操作系统调度和分派的基本单位,不同时作为独立分配资源的基本单位。
线程由此产生。
线程
线程是进程的一个实体,可作为系统调度和分派的基本单位。
线程是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换,并发执行. 一个进程最少有一个线程。
线程实际上是在进程基础之上的进一步划分,一个进程启动之后,里面的若干执行路径又可以划分成若干个线程。
引入线程的好处
- 创建一个新线程的系统开销小(结束亦如此)
- 两个线程的切换花费时间少
- 同一进程内的线程共享内存和文件,因此它们之间的通信无需调用操作系统内核。
- 同一进程内的各线程由于拥有相同的地址空间,它们之间的同步和通信也变得比较容易。
- 对用户来说,多线程比无线程可减少用户的等待时间,提高系统的相应速度。
- 适合多处理机系统
线程调度
分时调度:
- 所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。
抢占式调度:
- 优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),
Java使用的为抢占式调度。
CPU与线程的关系
CPU使用调度模式在多个线程间进行着高速的切换。对于CPU的一个核新而言,某个时刻,只能执行一个线程,而 CPU的在多个线程间切换速度相对我们的感觉要快,看上去就是在同一时刻运行。 其实,多线程程序并不能提高程序的运行速度,但能够提高程序运行效率,让CPU的使用率更高。
如果CPU是单核的话,那么在进程中的不同线程为了使用CPU核心,则会进行线程切换,在这里依然是并发,唯一核心同时刻只能执行一个线程。
如果这个CPU是多核的话,那么进程中的不同线程可以使用不同核心,真正的并行出现了。
值得注意的几点
- 线程自己基本不拥有资源,只拥有少量必要的资源。
- 线程的改变只代表CPU执行过程的改变,即除了CPU之外,计算机内的软硬件资源的分配与线程无关。
- 在传统的操作系统中,拥有资源、独立调度和分派的基本单位都是进程,在引入线程的系统中,线程是调度和分派的基本单位,而进程是拥有资源的基本单位(包括cpu、内存、磁盘IO等)。
- 另外在有的操作系统里,进程不是调度单位,线程是最基本的调度单位,调度器只调度线程,不调度进程,如VxWorks。