一、什么是进程
进程是指计算机中已运行的程序。是正在执行的一个程序或命令,每一个进程都是一个运行的实体,都有自己的地址空间并且占用一定的系统资源。
二、什么是线程
在程序中一个执行路线就叫做线程,线程是一个进程的内部控制序列。Linux线程的本质任是进程。
三、区别
进程和线程的区别在于是否共享地址空间,进程总是独享4G的虚拟内存,而多个线程共享一段4G的空间。
四、关系
一个线程可以创建和撤销另一个线程;同一个进程中的多个线程可以并发执行;同一个进程中各个线程可以共享资源。
独有:
标识符、上下文数据、程序计数器、栈、信号屏蔽器……
共享:
虚拟地址空间、IO信号、信号处理方式、工作路径……
五、优劣(来自《Unix网络编程》)
·进程是资源分配的最小单位、线程是程序执行的最小单位
·进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。
·线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。
·但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。
六、补充
·进程会占用四类资源,CPU(中央处理单元)、Memory(内存)、Disk(磁盘)、Network(网络)
·线程是CPU调度的最小单元,也是CPU分配时间片的单位
·进程是资源分配的最小单位
·前面我们说过在Linux中线程的本质任然是进程,因为在Linux中没有真正意义上的线程的概念,都是进程来模拟的。如果一款操作系统要一套支持真的线程,那么就需要对这些线程进行管理。比如说创建线程、终止线程、调度线程、切换线程、给线程分配资源、释放资源以及回收资源等等,所有的这需要另起炉灶,搭建一套与进程平行的线程管理模块。因此,如果要支持真的线程一定会提高设计操作系统的复杂程度。在Linux看来,描述线程的控制块和描述进程的控制块是类似的,因此Linux并没有重新为线程设计数据结构,而是依旧使用task_struct模拟线程,所以我们说Linux中的所有执行流都叫做轻量级进程。