一. 线程、进程与线程的关系
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数据类型;
#include <pthread.h>
int pthread_equal(pthread_t, pthread_t);
返回:相等返回非0,否则返回0;
pthread_t pthread_self(void);
返回:调用线程的线程ID;
————————————————
原文链接:https://blog.youkuaiyun.com/zjwson/article/details/54564500
线程的概念
线程定义:
线程是进程内一个相对独立的可调度的执行单元。
线程属性:
- 轻型实体:TCB+堆栈+一组寄存器
- 独立调度和分派的基本单位;
- 可并发执行;
- 共享进程资源;
- 线程有生命周期,在生命期中有状态变化。
三个线程共享进程的资源
线程状态
- 就绪态;
- 执行态;
- 等待态;
- 终止态。
Windows 的线程状态:
(1)初始化状态; (2)就绪状态;
(3)备用状态; (4)运行状态;
(5)等待状态; (6)转换状态
(7)终止状态;
线程管理
TCB的管理:
按照线程的状态,分别将线程的线程控制块(TCB)组织在相应的队列中进行管理。
主要的线程控制原语:
- 线程创建原语
- 线程撤销原语;
- 线程阻塞原语;
- 线程唤醒原语
线程调度:
与进程调度相似
线程同步:
与进程同步相似
线程通信:
由于同一个进程内部中的多个线程之间是可以共享进程的相关资源的,因此只要在进程内部设置一个共享资源,使得线程之间互相共享即可,不需要操作系统内核的支持。
线程实现机制
用户级线程(ULT)
完全由用户应用程序实现的线程机制。该线程的所有功能都是由该应用程序来管理完成的。
示例:POSIX Pthreads; Mach C-threads;Solaris threads
在如上图所示,在用户空间中创建一个通信服务器,其中包含线程管理程序(实现对线程的管理);操作系统只为该通信服务器创建一个通信服务器进程,操作系统调度这个进程的运行,也就是为这个进程分配CPU和布置现场。当该通信服务器获得CPU的使用权后,会运行线程管理程序,创建多个用户级线程,让这些进程共享操作系统分配的CPU,实现多线程功能。
运行时系统(线程库):
提供多线程应用程序的开发环境和运行环境。
由一组管理和控制线程的函数(过程)集合组成。它们作为进程代码的一部分,驻留在进程的用户空间。
运行时系统功能:
(1)线程控制;
(2)线程调度;
(3)线程同步;
(4)线程通信;
用户级线程的优点:
(1)线程的调度及切换开销小;
(2)线程调度由应用程序完成,可以选择最适当的算法;
(3)可运行在任何操作系统上
用户级线程的缺点:
(1)线程系统调用时,将导致所属进程阻塞; (如下图,当T1线程申请系统调用,在T1线程执行系统调用的过程中,操作系统会将整个P1进程阻塞,从而导致此时P1进程的T2和T3线程不能获取CPU进行运行。)
(2)核心只将处理器分配给进程,同一进程中的两个线程不能同时运行于两个处理器上;(OS只会为进程分配CPU,比如只分配一个CPU给P1进程,而不会因为P1进程存在3个线程而分配3个CPU。从而会导致对系统资源的浪费,空闲资源得不到充分的使用。)
内核级线程(KLT)
完全由OS内核实现的线程机制。
示例:Windows 2000/xp, Solaris, Digital UNIX
内核级线程的实现:
(1)OS创建进程时,可为该进程分配一个任务数据区,其中包含一组TCB空间; (OS可看见线程)
(2)当进程创建一个线程时:
- 分配并填写一个空白TCB;
- 为线程分配栈空间。(存放在OS内核区域)
(3)OS内核实现线程的阻塞/唤醒、线程调度、线程同步、线程通信;
(4)撤销线程:
- 回收该线程所有资源;
- 回收TCB。
内核级线程优点:
(1)对多处理器,核心可以同时调度同一进程的多个线程;
(2)阻塞是在线程一级完成;
(3)核心例程是多线程的;
内核级线程缺点:
同一进程内的线程切换调用内核,系统开销大。