(二)线程

1.进程和线程

进程特点:

  • 资源所有权(存放进程映像
  • 调度/执行

独立两个特点:

资源所有权 -> 进程
调度/执行 -> 线程

1.1 多线程

  • 概念: 单个进程可以并发执行
  • 每个线程都有自己的
    1. 执行状态 (就绪、进行。。。)
    2. 线程上下文 (独立程序计数器)
    3. 执行栈
    4. 静态储存空间 (保存局部变量)
    5. 可共享的内存和资源 (内存间通信)

线程优点

  1. 创建时间短
  2. 终止时间短
  3. 切换实践短
  4. 通信时间短(无须调用内核)

线程使用例子

  • 前后台同时工作
  • 异步处理
  • 执行速度快
  • 模块化程序结构(多输入/输出)

调度和分派 是在 线程基础 上完成的。

1.2线程功能

线程状态:

运行态、就绪态、阻塞态 (挂起无意义)

基本操作

  • 派生 (父进程生成子进程,一般也会派生一个线程)
  • 阻塞
  • 解除阻塞
  • 结束

线程同步 (详见下一章)

使用同步操作可以将防止因为资源被其他线程修改而导致结果错误。
换句话说,就是 保护资源,有的操作不能同时做

2. 线程分类

2.1 用户级和内核级线程

三种线程分类方式

用户级线程 ULT

  • 线程库管理线程,不需要内核参与,内核仍操作进程,进程就绪态时所有线程都不能继续运行,即便他是运行态,直到进程重新变为运行态
  • 优点
    1. 线程切换节省两次转换(不用调用内核)
    2. 可以为进程量身定做调度算法
    3. 不受操作系统限制(因为不调用内核)
  • 缺点
    1. 线程执行系统调用时,会阻塞所有当下进程的线程
    2. 同一进程无法多线程处理,因为内核只能调用一个进程
  • 改进缺点2
    1. 使用多进程程序 (开销巨大)
    2. 使用“套管技术” : 把一个产生阻塞的系统调用转换为非阻塞的系统调用

套管例子:替代直接调用一个系统IO例程,让线程调用一个应用级的IO套管例程,这个套管例程中的代码用于检査并确定IO设备是否忙。如果忙,该线程进入阻塞态并把控制权传送给另一个线程。这个线程重新获得控制权后,套管例程会再次检査IO设备。

内核级线程 KLT

内核为进程及进程内的每个线程维护上下文信息,调度由内核基于线程完成。

  • 优点
    1. 内核可以同时把同一个进程中的多个线程调度到多个处理器中;
    2. 进程中的一个线程被阻塞时,内核可以调度同一个进程中的另一个线程。
    3. 内核例程自身也可是多线程的。
  • 缺点
    1. 线程切换慢(调用内核)

### 混合方法
用户空间完成 线程创建、调度和同步
内核空间解决 阻塞单个线程

2.2 其他方案

线程:进程描述
1:1执行的每个线程是唯一的进程,它有自己的地址空间和资源
N:1一个进程定义了一个地址空间和动态资源所有权。可以在该进程中创建和执行多个线程
1:M一个线程可以从一个进程环境迁移到另一个进程环境。允许线程
M:N轻松地在不同系统中移动结合了前两者的属性
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值