关于线程与进程之间的关系,我觉得有一篇文章讲的很生动形象,这里贴出来供大家参考。进程与线程的一个简单解释
关于线程的理解,同样很生动形象的一个例子。我是一个线程
一. 线程、进程与线程的关系
1. 进程是资源管理的最小单位,线程是程序执行的最小单位。
2. 每个进程都有自己的数据段、代码段和堆栈段。线程是轻量级的进程,它包含独立的栈和CPU寄存器状态,线程是进程的一条执行路径,每个线程共享其所附属进程的所有资源,包括打开的文件、内存页面、信号标识以及动态分配的内存等。
3. 因为线程和进程比起来很小,所以相对来说,线程花费更少的CPU资源。
4. 在操作系统设计上,从进程演化出线程,最主要的目的就是更好的支持多处理器,并且减少进程上下文切换的开销。
5. 线程和进程的关系:线程是属于进程的,线程运行在进程空间内,同一进程所产生的的线程共享同一用户内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。所以,线程不能独立地执行,它必须依附在一个运行的应用程序上(即进程上),而一个进程至少需要一个线程作为它的指令执行,进程管理着资源(比如CPU、内存、文件等等)。而将线程分配到某个CPU上执行。
6. 线程和进程的区别:当操作系统分配给进程资源后,同属一个进程的多个线程之间可以相互共享进程中的内存资源,原因是线程没有自己独立的内存资源,它只有自己执行的堆栈和局部变量。而多个进程之间每个进程都拥有自己的一整套变量,即每个进程都有自己独立的内存单元。这就使得多线程之间的通信比多进程之间的通信更加的容易和高效。
二. 线程实现、分类以及线程标识
1. Linux线程实现
在linux中,一般采用pthread线程库实现线程的访问与控制,由POSIX提出,具有良好的可移植性;
linux线程程序编译需要在gcc上链接库pthread. (-lpthread)
2. 线程分类
线程按其调度者可以分为用户级线程和内核级线程。
用户级线程:内核的切换由用户态程序自己控制内核切换,不需要内核干涉,少了进出内核态的消耗,但不能很好的利用多核CPU,目前Linux pthread大体是这么做的。其特点是不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。由于不需要用户态/核心态切换,速度快,操作系统内核不知道多线程的存在,因此,一个线程阻塞将使得整个进程(包括它的所有线程)阻塞。由于这里的处理器时间分配是以进程为基本单位,所以每个线程执行的时间相对减少。
内核级线程:切换由内核控制,当线程进行切换的时候,由用户态转化为内核态。切换完毕要从内核态返回用户态。可以很好的利用多核CPU,windows线程就是这样的。
3. 线程标识
- 每个进程内部不同线程都有自己的唯一标识ID;
- 线程标识只在它所属的进程环境中有效;
- 线程标识是pthread_t数据类型;