进程的控制与描述——线程

线程的引入

1、引入进程的目的
使多个程序能并发执行,提高资源利用率和系统吞吐量。
2、引入线程的目的
应用的需要/ 开销的考虑/ 性能的提升

线程的基本概念

线程的概念

线程:进程中的一个运行实体,是CPU的调度单位,有时将线程称为轻量级进程 。
进程中的一个相对独立的、可调度的执行单元。

进程与线程的区别

进程是资源分配单位
线程是CPU执行单位

多线程优点

切换速度快(地址空间不变)
系统开销小
通讯容易(共享数据空间)

线程的内存布局

在这里插入图片描述

每个线程拥有自己的栈:局部变量和返回地址

线程控制块

TCB(Thread control block)
标志线程存在的数据结构, 其中包含对线程管理需要的全部信息.
内容
线程标识、线程状态
调度参数、现场(通用寄存器,PC,SP)
存放位置
用户级线程:目态空间
核心级线程:管态空间

线程的属性

1、轻型实体:只有一点必不可少的、能保证独立运行的资源
2、CPU调度的基本单位
3、可并发执行
4、共享进程资源
(并发性、共享性、动态性)

线程的优点

1、快速切换;
2、易于通信;
3、并行度高;
4、节省内存;
5、减少管理开销。

线程的基本状态

三基态:执行状态、就绪状态、阻塞状态
在这里插入图片描述

线程的创建和终止

线程的创建:
利用线程创建函数(或系统调用);
创建成功后,返回一个线程标识符。
线程的终止方式:
自愿退出
被其它线程强行终止

线程与进程的比较

线程:作为CPU调度单位。
线程只拥有必不可少的资源,如:线程状态、寄存器上下文和栈
同样具有就绪、阻塞和执行三种基本状态
进程:其它资源分配单位(存储器、文件、IO等)。

调度:线程作为CPU调度的基本单位,而进程只作为其它资源分配单位。
并发性:进程之间可以并发,且一个进程的多个线程之间亦可并发。
拥有资源:进程间相互独立,同一进程的各线程间共享资源。某进程内的线程在其它进程不可见。
系统开销:线程上下文切换比进程上下文切换要快得多。

线程的实现及控制

用户级线程(User-level thread)

一、线程库
提供线程运行管理系统:
创建、撤消线程
在线程之间传递消息和数据
调度线程执行
保护和恢复线程上下文
二、
实现方法:

  • 基于library函数,系统不可见
  • 线程创建、撤销、状态转换在目态完成
  • TCB在用户空间,每个进程一个系统栈

优点:

  • 不依赖于操作系统,调度灵活
  • 切换无须从目态到管态,速度快
  • ULT可运行在任何操作系统上(只需要线程库),可以在一个不支持线程的OS上实现

缺点:

  • 核心只将处理器分配给进程,在多处理机中同一进程中多个线程不能真正并行
  • 一个线程进入系统受阻,进程中其它线程不能执行

核心级线程(Kernel-level thread)

一、
所有线程管理由核心完成
没有线程库,但核心提供API
核心维护进程和线程的上下文
线程之间的切换需要核心支持
以线程为基础进行调度
二、
实现方法:

  • 基于系统调用
  • 创建、撤销、状态转换由操作系统完成

优点:

  • 对多处理器,核心可以同时调度同一进程的多个线程
  • 某线程阻塞,其它线程仍可执行

缺点:

  • 应用程序线程在用户态运行,而线程调度和管理在内核实现,在同一进程中,控制权从一个线程传送到另一个线程时需要用户态-内核态-用户态的模式切换,系统开销较大。
  • 调度算法不能灵活控制

混合线程(Hybrid approach)

混合式中,一个应用中的多个线程能同时在多处理器上并行运行,且阻塞一个线程时并不需要封锁整个进程。如果设计得当,混合式多线程机制能够结合了两者优点,舍去缺点。

用户级线程和核心级线程的区别

用户级线程(ULT)核心级线程(KLT)
管理线程库内核
调度单位进程线程
切换速度同一进程 线程间切换,由线程库完成,速度较快由内核完成,速度较慢
系统调用行为内核看做是整个用户进程的行为内核只看做该线程的行为
阻塞用户进程线程
优点线程切换不调用内核,切换速度较快,调度算法可由应用程序定对多处理器,可同时调度同一进程的多个线程,速度较快,阻塞是在线程一级
缺点阻塞在用户进程一级同一进程内的线程切换速度较慢

测试

1、同一进程中的多个线程有哪些成分是共用的,哪些成分是私用的?
答:
线程的公有成分包括:代码区、数据区、动态堆空间。
线程的私有成分包括:线程控制块; 一个执行栈;运行时动态分给线程的寄存器。
2、如果信号量的当前值为-4,则表示:系统中在该信号量上有4个等待进程。
3、在操作系统中,不可中断的操作称为:原语
4、用户级线程和内核支持线程有何区别?
解答:
(1)内核支持线程是OS内核可感知的,而用户级线程是OS内核不可感知的。
(2)用户级线程的创建、撤消和调度不需要OS内核的支持,是在语言(如Java)这一级处理的;而内核支持线程的创建、撤消和调度都需OS内核提供支持,而且与进程的创建、撤消和调度大体是相同的。
(3)用户级线程执行系统调用指令时将导致其所属进程被中断,而内核支持线程执行系统调用指令时,只导致该线程被中断。
(4)在只有用户级线程的系统内,CPU调度还是以进程为单位,处于运行状态的进程中的多个线程,由用户程序控制线程的轮换运行;在有内核支持线程的系统内,CPU调度则以线程为单位,由OS的线程调度程序负责线程的调度。
(5)用户级线程的程序实体是运行在用户态下的程序,而内核支持线程的程序实体则是可以运行在任何状态下的程序。

### 如何使用 Keil5 烧录 Hex 文件 对于仅拥有已编译好的 hex 文件而无源文件的情况,在 Keil V5 平台上直接烧录 hex 文件至单片机(如华大单片机)需采取特定的方法,因为直接调用该平台进行此类操作不可行[^1]。 #### 设置 Output 路径 进入 Keil 的 output 设置界面,指定要烧录的 hex 文件的具体位置。确保在路径输入框中填写完整的 hex 文件名称并附带 `.hex` 扩展名;缺少此扩展名可能导致系统继续尝试烧录先前编译的结果而非所选的 hex 文件[^3]。 #### 配置 Flash 工具选项 针对不同类型的微控制器(MCU),可能还需调整 flash 下载工具的相关配置参数以匹配目标设备的要求。这一步骤通常涉及选择合适的编程算法以及设定通信接口等细节[^2]。 #### 启动下载过程 完成上述准备工作之后,可以通过点击调试窗口内的 “Download” 或者快捷菜单里的相应命令来启动实际的程序写入流程。如果一切顺利的话,软件会自动连接硬件并将选定的 hex 数据传输到 MCU 中存储起来[^4]。 ```python # Python 示例代码用于说明自动化脚本概念 (并非真实实现) def download_hex_to_mcu(hex_file_path, mcu_type): """ 自定义函数模拟将 HEX 文件下载到指定型号的 MCU 上 参数: hex_file_path -- 完整路径字符串指向待上传的 .hex 文件 mcu_type -- 字符串表示的目标单片机类型标识符 返回值: 成功则返回 True ,失败抛出异常信息 """ try: configure_output_settings(hex_file_path) # 设定输出设置 select_flash_tool(mcu_type) # 挑选适合的闪存工具 execute_download_command() # 发送下载指令 return True # 表明成功结束 except Exception as e: raise RuntimeError(f"Failed to upload {hex_file_path}: {e}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值