随着计算机系统性能的不断提升,出于多任务的需求和提高资源利用率的原因,需要计算机同时执行多个程序,进一步催生了操作系统中的进程管理,以及多线程的概念。
程序
程序是描述计算机所要完成的具有独立功能的,并且在时间上按严格次序前后相继的计算机操作序列集合,是一个静态的概念。
它体现了编程人员要求计算机完成相应功能时所应采取的顺序步骤。
什么是程序的顺序执行、并发执行和并行执行?
我们以一个例子来讲解这个问题,假设一个老师有三个学生需要辅导作业,帮每个学生辅导完作业是一个任务,辅导作业的过程分为讲解思路、学生写解题过程、老师检查解题过程。
顺序执行:老师甲先帮学生A辅导,辅导完之后再去给B辅导,最后再去给C辅导,效率低下 ,很久才能完成三个任务。
并发执行:老师甲先给学生A去讲思路,A听懂了自己书写解题过程,而老师在这A书写解题过程期间直接去给B讲思路,讲完思路再去给C讲思路,让B自己书写解题过程。这样老师就没有空着,一直在做事情,很快就完成了三个任务。与顺序执行不同的是,顺序执行,老师讲完思路之后学生在写步骤,这在这期间,老师是完全空着的,没做事的,所以效率低下。
并行执行:直接让三个老师甲、乙、丙三个老师“同时”给三个学生辅导作业,也完成的很快。
所以,程序的并发执行是一组逻辑上互相独立的程序或程序段在执行过程中,其执行时间在客观上互相重叠,即一个程序段的执行尚未结束,另外一个程序段的执行已经开始的执行方式。
程序的并行执行是指一组程序独立的、异步的速度执行。并行是指两个或者多个程序或程序段在同一个时刻发生;而并发是指两个或多个程序或程序段在同一时间间隔发生。
并发就是指代码逻辑上可以并行,有并行的潜力,但是不一定当前是真的以物理并行的方式运行。并发指的是代码的性质,并行指的是物理运行状态。
上述例子中,老师相当于计算机中的CPU,为学生辅导功课相当于我们的程序,可见使用并发执行的方式可以提高CPU的执行效率,实现并行执行则需要多核CPU。
进程
为了有一个能够描述程序的执行过程且能用来共享资源的基本单位,引入了进程。
进程是为了提高CPU的执行效率,减少因为程序等待带来的CPU空转以及其他计算机软硬件资源的浪费而提出来的。
进程是为了完成用户任务所需要的程序的一次执行过程以及为其分配资源的一个基本单位。
进程和程序是两个既有联系又有区别的概念。进程是一个动态概念,而程序则是一个静态概念。程序是指令的有序集合,没有任何的执行的含义。而进程则强调执行过程,它动态地被创建,并被调度执行后消亡。如果把程序比作菜谱,那么进程就是按照菜谱炒菜的过程。
线程
由于创建一个进程需要花费较大的系统开销和占用较多的资源,为了减少进程切换和创建的开销,提高执行效率和节省资源,又引入了线程的概念。
线程是进程的一部分,进程拥有线程和资源。进程是指一段正在执行的程序。而线程是指程序的执行过程中,能够执行程序代码的一个最小执行单元。所以,线程有时候又被称为“轻量级的进程”。
一个进程可以拥有多个线程,各个线程之间共享程序的内存空间(代码段、数据段和堆空间)及一些进程级资源(例如打开的文件),但是各个线程拥有自己的栈空间。
在操作系统级别上,程序的执行都是以进程为单位的,为每个进程中通常都会有多个线程互不影响地并发执行,这就是多线程。
线程调度与方法调用的区别
程序中的方法调用是必须等被调用的方法执行完才能继续执行后面的程序代码,而线程调度是开辟一条新的执行路径,与原来的线程异步地执行,原来的线程不需要等被调度的线程运行完毕。
注意:
(1)在Java程序的运行过程中,即使自己没有创建和调度进程,也会存在多个进程,例如主线程和GC(垃圾收集器)进程;
(2)main()称为主线程,为程序的入口点,用于执行整个程序。