进程与线程的区别

    进程 process )和文件 files )是 UNIX/Linux 操作系统 两个最基本的抽象。进程是处于执行期的程序和它所包含的资源的总和,也就是说一个进程就是处于执行期的程序。一个 线程 thread )就是运行在一个进程上下文中的一个逻辑流,不难看出,线程是进程中最基本的活动对象。

在传统的系统中,一个进程只包含一个线程。但在现代操作系统中,允许一个进程里面可以同时运行多个线程,这类程序就被称为多线程程序。所有的程序都有一个主线程( main thread ),主线程是进程的控制流或执行线程。在多线程程序中,主线程可以创建一个或多个对等线程( peer thread ),从这个时间点开始,这些线程就开始并发执行。主线程和对等线程的区别仅在于主线程总是进程中第一个运行的线程。从某种程度上看,线程可以看作是轻量级的进程( lightweight process )。在 Linux 操作系统中,内核调度的基本对象是线程,而不是进程,所以进程中的多个线程将由内核自动调度。

每个线程都拥有独立的线程上下文( thread context ),线程 ID Thread ID TID ),程序计数器( pc ),线程栈( stack ),一组寄存器( register )和条件码。其中,内核正是通过线程 ID TID )来识别线程,进行线程调度的。

线程和进程在很多方面是相似的。相同点主要表现在如下几方面:

1)         比如都具有 ID ,一组寄存器,状态,优先级以及所要遵循的调度策略。

2)         每个进程都有一个进程控制块,线程也拥有一个线程控制块(在 Linux 内核,线程控制块与进程控制块用同一个结构体描述,即 struct task_struct ),这个控制块包含线程的一些属性信息,操作系统使用这些属性信息来描述线程。

3)     进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用 的并发性。

除了这些相同点,在很多方面也存在着差异:

1)         主要区别:每个进程都拥有自己的地址空间 ,但线程没有自己独立的地址空间,而是运行在一个进程里的所有线程共享该进程的整个虚拟地址空间

2)         线程的上下文切换时间开销比进程上下文切换时间开销要小的多

3)         线程的创建开销远远小于进程的创建

4)         子进程拥有自己的地址空间和数据 段的拷贝,因此当子进程修改它的变量和数据时,它不会影响父进程中的数据,但线程可以直接访问它进程中的数据段

5)         进程之间通讯必须使用进程间通讯机制,但线程可以与进程中的其他线程直接通讯

6)         线程可以对同一进程中的其他线程实施大量控制,但进程只能对子进程实施控制

7)         改变主线程的属性可能影响进程中其他的线程,但对父进程的修改不影响子进程。

 

你可能感兴趣的:(thread,多线程,linux,struct,通讯,linux内核)