当前位置:网站首页>关于线程切换问题的一些思考总结
关于线程切换问题的一些思考总结
2022-07-15 22:43:00 【花生酱拌面】
最近被问到一个问题,线程是如何切换的?线程本身的切换过程是可以几句话说清的,但其后是关于操作系统最核心的进程和线程的问题,我有回顾了一下操作系统,做了一些总结。
1. 进程、内核级线程、用户级线程
- 本质上来说,三者都是执行一个指令序列,都属于CPU的管理范畴;
- 要执行一个序列,除了分配栈、创建数据结构记录执行位置外,还要分配内存等资源,这就是进程的概念;
- 将进程中的资源和执行序列分离以后就引出了线程概念,进程中的执行序列实际上就是一个内核级线程;
- 内核级线程就是操作系统在一套资源下创建的可以并发执行的多个序列;
- 而上层应用程序创建的多个指令执行序列,执行程序所需的资源已经在创建进程时分配好了,这就是用户级线程。
2. 用户级线程的切换
- 用户级线程的切换就是在切换位置调用yield()函数;
- 函数的基本工作就是找到下一个进程的TCB,将当前寄存器ESP的值保存在当前线程TCB中,从下一线程的TCB中取出保存的ESP的值赋给ESP寄存器;
- 切换到新栈以后,通过压入栈的返回值,将PC指针切换到下一个线程要执行的指令处;
- 线程切换时还需要保存和恢复一些现场,主要就是一些通用寄存器。
Yield()
{
next = FindNext();
push %eax
push %ebx
...
mov %esp, TCB[current].esp
mov TCV[current].esp, %esp
...
push %ebx
push %eax
}
2. 内核级线程的切换

- 中断进入,利用int指令或其他硬件中断的中断处理入口,核心工作是记录当前程序在用户态执行时的信息,如当前的使用的用户栈、当前程序执行位置、当前执行的现场信息等;
- 调用schedule()引起TCB的切换,将当前线程的状态修改为阻塞,添加到一个等待队列链表上,schedule()函数从就绪队列中选出下一个要执行线程的TCB,将指针指向它;
- 完成内核栈的切换,其实就是ESP寄存器值的切换;
- 中断返回,将切换后的内核栈中的用户态程序执行现场恢复出来;
- 用户栈的切换,将CS:EIP寄存器设置为当前用户程序执行地址,将SS:ESP寄存器设置为当前用户栈地址。
3. 思考
操作系统的故事都是围绕多进程视图展开的,理解了进程、线程,就理解了操作系统的核心,掌握操作系统最根本的视图,才能在脑海里构建庞大的操作系统的具体图像。
边栏推荐
- Excerpt of new features in PHP version - php7.2 X to php7.4 x
- Cluster all processes view shell script
- 【vulnhub】DC9
- Sélection de nouvelles fonctionnalités pour la version PHP - PHP 8.0x
- 手机浏览器扫一扫的花样玩法,识万物还能答疑翻译
- Reinforcement Learning 强化学习(二)
- Is it safe to open an account for flush stock
- Model comparison of material inventory management between sap ECC and s4hana material
- (手工)【sqli-labs42、43】POST注入、堆叠注入、错误回显、字符型注入
- Basic SQL (I): install MySQL and some simple operations
猜你喜欢

Brush questions - note 2

力扣练习——22 买卖股票的最佳时机

记录一次坑爹内存泄漏排查经历

Ethernet development and testing, have you done this step right (1)
![[OBS] coding CPU performance related problems](/img/65/9bff5c875f1d8f84331a108c822972.png)
[OBS] coding CPU performance related problems

Modern application security requires defense in depth V

LeetCode_ 112_ Path sum

Record the troubleshooting experience of a pit father memory leak

I.MX6U-系统移植-3-uboot启动流程

Redis - redis list function explanation and industrial application
随机推荐
ASEMI整流桥GBJ2510规格,GBJ2510封装,GBJ2510特性
Note: Transformation of gamma distribution
力扣练习——18 前 K 个高频元素
Be the owner of the product
带你刷(牛客网)C语言百题(第二天)
Paul Holland: predicting the trend of the financial market
PHP版本新特性摘選 - PHP8.0X
Cloud computing in China: prospects for 2025
漫谈软件缺陷管理
Metal organic framework complex uio-66-nh2/mos2|pps-zif-8-bsa|pva/uio-66| [email protected] |
JVM fatal error log (hs_err_pid.log) interpretation
Basic SQL (I): install MySQL and some simple operations
移动布局 -适配
PendingIntent详解
With 8 years of product experience, I have summarized these practical experience of continuous and efficient research and development
PHP版本新特性摘选 - PHP7.2.x 到 PHP7.4.x
做工程师还是转型做产品经理?
多御安全浏览器怎么移除密码?
torch.gather()
力扣练习——22 买卖股票的最佳时机