Linux系统编程——进程和线程的区别与联系

在许多经典的操做系统教科书中,老是把进程定义为程序的执行实例,它并不执行什么, 只是维护应用程序所需的各类资源,而线程则是真正的执行实体。css


为了让进程完成必定的工做,进程必须至少包含一个线程。工具



进程,直观点说,保存在硬盘上的程序运行之后,会在内存空间里造成一个独立的内存体,这个内存体有本身的地址空间,有本身的堆,上级挂靠单位是操做系统。操做系统会以进程为单位,分配系统资源,因此咱们也说,进程是资源分配的最小单位。更多详情,请看《进程的介绍》url


线程存在与进程当中,是操做系统调度执行的最小单位。说通俗点,线程就是干活的。
spa


进程是具备必定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。线程是进程的一个实体,是 CPU 调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程本身基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器),可是它可与同属一个进程的其余的线程共享进程所拥有的所有资源。
操作系统


若是说进程是一个资源管家,负责从主人那里要资源的话,那么线程就是干活的苦力。一个管家必须完成一项工做,就须要最少一个苦力,也就是说,一个进程最少包含一个线程,也能够包含多个线程。苦力要干活,就须要依托于管家,因此说一个线程,必须属于某一个进程。进程有本身的地址空间,线程使用进程的地址空间,也就是说,进程里的资源,线程都是有权访问的,好比说堆啊,栈啊,静态存储区什么的。


线程就是个无产阶级,但无产阶级干活,总得有本身的劳动工具吧,这个劳动工具就是栈,线程有本身的栈,这个栈仍然是使用进程的地址空间,只是这块空间被线程标记为了栈。每一个线程都会有本身私有的栈,这个栈是不能够被其余线程所访问的。
.net


进程所维护的是程序所包含的资源(静态资源), 如:地址空间,打开的文件句柄集,文件系统状态,信号处理handler,等;
线程


线程所维护的运行相关的资源(动态资源),如:运行栈,调度相关的控制信息,待处理的信号集,等;
blog


线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护;而进程正相反。
进程


参考资料:iteye内存