进程:进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。(资源、独立)
举个例子,在linux系统中:
Linux进程结构:由三部分组成:代码段、数据段、堆栈段。也就是程序、数据、进程控制块PCB(Process Control Block)组成。进程控制块是进程存在的惟一标识,系统通过PCB的存在而感知进程的存在。
代码段存放程序的可执行代码。数据段存放程序的全局变量、常量、静态变量。堆栈段中的堆用于存放动态分配的内存变量,堆栈段中的栈用于函数调用,它存放着函数的参数、函数内部定义的局部变量。
系统通过PCB对进程进行管理和调度。PCB包括创建进程、执行程序、退出进程以及改变进程的优先级等。
线程:线程是进程的一个实体,是CPU调度和分配的基本单位。(运算)
线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。
(以上为第一点概念上的区别)
区别二:关系上的区别。
进程至少含一个线程(每个进程都有一个主线程),进程能创建、撤销线程。
线程能创建线程,但不能创建进程。(也就是说线程是进程的一部分)
区别三:资源上的区别。
进程在执行过程中拥有独立的内存单元,多个进程的资源不共享。而某个进程下的所有线程共享该进程所拥有的所有资源。
区别四:操作系统对其管理方式
进程崩溃不会影响其他进程。线程挂了其所属的进程也会挂。
进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
区别五:构建的代价
进程拥有独立的资源,而线程只是含有少量运行中必不可少的资源。所以建一个进程的开销比线程大。