一、概括
进程(process)和线程(thread)的: 进程是资源管理的最小单位,线程是程序执行的最小单位。
线程的本质是一个进程内部的一个控制序列,它是进程里面的东西,一个进程可以拥有一个线程或者多个线程。
当进程执行fork()函数创建一个进程时,将创建出该进程的一份新副本。 这个新进程拥有自己的变量和自己的PID,它的执行几乎完全独立于父进程, 这样子得到一个新的进程开销是非常大的。而当在进程中创建一个新线程时,新的执行线程将拥有自己的栈, 但与它的创建者共享全局变量、文件描述符、信号处理函数和当前目录状态。 也就是说,它只使用当前进程的资源,而不是产生当前进程的副本。
与进程不同,线程(thread)是系统调度分配的最小单位。与进程相比,线程没有独立的地址空间,多个线程共享一段地址空间,因此线程消耗更少的内存资源,线程间通信也更为方便,有时线程也被称为轻量级进程(Light Weight Process,LWP)
二、Linux中进程与线程
Linux系统中的线程借助进程机制实现,线程与进程联系密切。进程可以蜕变成线程,当一个进程中创建一个线程时,原有的进程就会变成线程,两个线程共用一段地址空间;线程有被称为轻量级进程,线程的TCB(Thread Contorl Block,线程控制块)与进程的PCB相同,因此也可以将TCB视为PCB;对内核而言,线程与进程没有区别,CPU会为每个线程与进程分配时间片,并通过PCB来调度不同的进程和线程。
Linux系统中的线程分为三种:内核线程、用户线程和轻量级线程(TWP)。
①内核线程是内核的分支,每个内核线程可处理一项特定操作。
②用户线程是完全建立在用户空间的线程,用户线程的创建、调度、销毁等操作都在用户空间完成,是一种低消耗、高效率的线程。
③轻量级线程是一种用户线程,同时也是内核线程的高级抽象,每一个轻量级线程都需要一个内核线程支持,轻量级线程与内核及CPU之间的关系。
一个进程的实体可以分为两大部分:线程集和资源集。
①线程集是多个线程的集合,每个线程都是进程中的动态对象 。
②资源集是进程中线程集共享资源的集合,包括地址空间、打开的文件描述符、用户信息等。
一个线程的实体包括程序、数据、TCB以及少量必不可少的用于保证线程独立运行的资源。
使用多线程编程时,程序的并发性会得到一定的提升。若一个进程细分为多个线程,那么一个进程中的多个线程可以同时在不同的CPU上运行,如此可在一定程度上减少程序的运行时间,提高程序的执行效率。
Linux系统中的每个进程都有独立的地址空间,一个进程崩溃后, 在系统的保护模式下并不会对系统中其它进程产生影响,而线程只是一个进程内部的一个控制序列, 当进程崩溃后,线程也随之崩溃,所以一个多进程的程序要比多线程的程序健壮,但在进程切换时, 耗费资源较大,效率要差一些。但在某些场合下对于一些要求同时进行并且又要共享某些变量的并发操作, 只能用线程,不能用进程。
总的来说:
- 一个程序至少有一个进程,一个进程至少有一个线程。
- 线程使用的资源是进程的资源,进程崩溃线程也随之崩溃。
- 线程的上下文切换,要比进程更加快速,因为本质上,线程很多资源都是共享进程的,所以切换时, 需要保存和切换的项是很少的。
标签:一个,资源,理解,线程,内核,进程,轻量级 From: https://www.cnblogs.com/FireLife-Cheng/p/16587214.html