进程(英语:process),是指计算机中已运行的程序。进程为曾经是分时系统的基本运作单位。在面向进程设计的系统(如早期的UNIX,Linux 2.4及更早的版本)中,进程是程序的基本执行实体;在面向线程设计的系统(如当代多数操作系统、Linux 2.6及更新的版本)中,进程本身不是基本运行单位,而是线程的容器。程序本身只是指令、数据及其组织形式的描述,进程才是程序(那些指令和数据)的真正运行实例。若干进程有可能与同一个程序相关系,且每个进程皆可以同步(循序)或异步(平行)的方式独立运行。现代计算机系统可在同一段时间内以进程的形式将多个程序加载到存储器中,并借由时间共享(或称时分复用),以在一个处理器上表现出同时(平行性)运行的感觉。同样的,使用多线程技术(多线程即每一个线程都代表一个进程内的一个独立执行上下文)的操作系统或计算机体系结构,同样程序的平行线程,可在多CPU主机或网络上真正同时运行(在不同的CPU上)

什么是进程?

1、程序:一段静态的代码。

2、进程:程序的一次动态执行过程,它对应从代码加载、执行到执行完毕的一个完整过程。

3、进程也称任务,支持多个进程同时执行的OS就被称为多进程OS或多任务OS。

什么是线程?

在一个程序内部也可以实现多个任务并发执行,其中每个任务称为线程。

线程是比进程更小的执行单位,它是在一个进程中独立的控制流,即程序内部的控制流。

特点:

线程不能独立运行,必须依赖于进程,在进程中运行。

每个程序至少有一个线程称为主线程。

单线程:只有一条线程的进程称为单线程

多线程:有不止一个线程的进程称为多线程

开启多线程的优点和缺点

提高界面程序响应速度。通过使用线程,可以将需要大量时间完成的流程在后台启动单独的线程完成,提高前端界面的相应速度。

充分利用系统资源,提高效率。通过在一个程序内部同时执行多个流程,可以充分利用CPU等系统资源,从而最大限度的发挥硬件的性能。

当程序中的线程数量比较多时,系统将花费大量的时间进行线程的切换,这反而会降低程序的执行效率。但是,相对于优势来说,劣势还是很有限的,所以现在的项目开发中,多线程编程技术得到了广泛的应用。

线程与进程的区别

线程与进程有很多类似的性质,因此人们习惯上也称线程为轻量级进程(lightweightprocess,LWP),也是CPU调度和分派的基本单元;而传统意义上的进程则被称为重量级进程(heavyweightprocess,HWP),从现代的角度来看,它就是只拥有一个线程的进程。如果进程有多个线程,那么它就能同时执行多个任务。他们之间的关系可以简单的由下图表示

    单线程(Node,Nginx)    多线程(PHP-FPM,Apache)

理解这个对于编程和处理并发以及优化是很有帮助的,基本就可以理解Node为什么是非阻塞式,异步IO

下面,我们主要从调度、并发性、系统开销、拥有资源等方面来对线程和进程进行比较。

调度

在传统的操作系统中,CPU调度和分派的基本单位是进程。而在引入线程的操作系统中,则把线程作为CPU调度和分派的基本单位,进程则作为资源拥有的基本单位,从而使传统进程的两个属性分开,线程便能轻装运行,这样可以显著地提高系统的并发性。同一进程中线程的切换不会引起进程切换,从而避免了昂贵的系统调用。但是在由一个进程中的线程切换到另一进程中的线程时,依然会引起进程切换

并发性

在引入线程的操作系统中,不仅进程之间可以并发执行,而且在一个进程中的多个线程之间也可以并发执行,因而使操作系统具有更好的并发性,从而能更有效地使用系统资源和提高系统的吞吐量。例如,在一个未引入线程的单CPU操作系统中,若仅设置一个文件服务进程,当它由于某种原因被封锁时,便没有其他的文件服务进程来提供服务。在引入了线程的操作系统中,可以在一个文件服务进程中设置多个服务线程。当第一个线程等待时,文件服务进程中的第二个线程可以继续运行;当第二个线程封锁时,第三个线程可以继续执行,从而显著地提高了文件服务的质量以及系统的吞吐量。

系统开销

不论是引入了线程的操作系统,还是传统的操作系统,进程都是拥有系统资源的一个独立单位,它可以拥有自己的资源。一般地说,线程自己不拥有系统资源(也有一点必不可少的资源),但它可以访问其隶属进程的资源。亦即一个进程的代码段、数据段以及系统资源(如已打开的文件、I/O设备等),可供同一进程的其他所有线程共享。

拥有资源

由于在创建或撤消进程时,系统都要为之分配或回收资源,如内存空间、I/O设备等。因此,操作系统所付出的开销将显著地大于在创建或撤消线程时的开销。类似地,在进行进程切换时,涉及到整个当前进程CPU环境的保存环境的设置以及新被调度运行的进程的CPU环境的设置。而线程切换只需保存和设置少量寄存器的内容,并不涉及存储器管理方面的操作。可见,进程切换的开销也远大于线程切换的开销。此外,由于同一进程中的多个线程具有相同的地址空间,致使它们之间的同步和通信的实现也变得比较容易。在有的系统中,线程的切换、同步和通信都无需操作系统内核的干预

Thank

Intel