李治军操作系统学习(五)——多线程切换

本文详细介绍了线程的概念,并重点探讨了用户级线程的切换,包括yield函数的工作原理、线程创建过程以及用户级线程的特点。同时,解释了核心级线程的必要性,分析了它们与用户级线程的区别,以及从用户栈到内核栈切换的具体步骤。文章还讨论了内核栈的创建和用户级线程与核心级线程的对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


一、线程是什么?

在这里插入图片描述

在一个进程中,可以有多个指令序列在执行,这些指令序列共享进程的资源(进程代码、进程数据、进程映射表等)。这些进程中的多个执行的指令序列称为线程。线程相比进程更轻量化,启动更快,且线程之间的切换更加容易,因为线程之间的切换只用切换指令序列,内存映射表不变,而进程之间的切换要切换内存映射表。

二、 用户级线程的切换

在这里插入图述
网页浏览器访问网站时会启动多个线程,比如一个线程向站点服务器请求数据,一个线程将数据显示在页面上。上图代码创建了两个线程,分别用于实现这两种功能。要想实现(伪)并发需要将线程交替执行,在用户态下这种交替执行通过调用yield函数执行。

1. yield函数如何实现切换?

用堆栈

在这里插入图片描述
如果两个执行序列用一个堆栈,首先A函数中调用B函数,先将地址104压入堆栈,接着跳转到B函数执行。在B函数中调用Yield()切换线程,则将地址204压入堆栈,跳转到C函数执行。C函数中调用D函数时,将地址304压入堆栈,跳转到D函数执行。在D函数中调用Yield()切换线程时,假定Yield函数能找到跳回上个线程所需的地址204

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值