linux内核如何识别是进程间切换还是线程间切换?
linux内核中的线程是用进程模拟的——LWP轻量级进程——linux的进程和线程都是task结构体。一个进程就是一组task的集合——用双向链表互相链接,所有task的成员group_leader指向主线程的task地址。tgid就是进程号,pid是线程号。tgid相同的task属于同一进程,和tgid相同的pid是主线程,其他是普通线程。
在linux的调度器眼里只能看到task的结构体,那么如何区分是进程间切换或是线程间切换呢? 比如A进程的a线程要切换到B进程的b线程,如何识别?再比如A进程a线程要切换到A进程的另一个线程,又如何识别?
难道是根据页表地址不同来确定是进程间切换?不对。搜了下,是比较task的成员mm的地址来识别的。 如果旧task的mm与即将运行的task的mm地址是同一个说明就是线程间切换,否则就是进程间切换,走的流程就不一样了。
详情如下
调度器切换会调用context_switch,而它会调用switch_mm,搜了context_switch的相关代码片段:
if (!mm)
{
/* 要运行的task是内核线程走这里 /
}
else
{
/ 不是内核线程, 则需要切换虚拟地址空间 */
switch_mm(oldmm, mm, next);
}
而switch_mm函数的部分代码片段如下:
if (likely(prev != next))
{
/* 执行进程间切换流程 /
}
else
{
/ 执行线程间切换流程 */
}
prev就是上个代码片段的oldmm,next就是上个代码片段的mm。
可见确实是比较task的mm成员来确定是进程间切换还是线程间切换的。
linux内核如何识别是进程间切换还是线程间切换?相关推荐
- Linux 内核如何描述一个进程?
哈喽,我是吴同学,继续记录我的学习心得. 一.关于写文章 许多知识,书上或者网络上都有,就算这两个地方都没有,代码里也会有答案.但有时恰恰是 资料太多,反而让人难以检索出有用的信息. 面对同样的资料, ...
- 十天学Linux内核之第二天---进程
十天学Linux内核之第二天---进程 原文:十天学Linux内核之第二天---进程 都说这个主题不错,连我自己都觉得有点过大了,不过我想我还是得坚持下去,努力在有限的时间里学习到Linux内核的奥秘 ...
- linux内核不能识别u盘分区,一种在Linux内核中识别特定USB大容量存储设备的方法及系统与流程...
本发明涉配usb设备识别技术领域,特别是涉及一种在linux内核中识别特定usb大容量存储设备的方法及系统. 背景技术: 在linux系统下对usb设备进行管控,一般而言有两种方法,一种是阻断新插入设 ...
- linux内核学习之四:进程切换简述
进程是现代操作系统的核心概念之一,用于分配系统(CPU,内存)资源的使用.了解linux进程及进程切换的知识,首先要理解进程与程序的区别,进程是执行流,是动态概念:程序是数据与指令序列的集合,是静态概 ...
- 《深入理解Linux内核》-3.3. 进程切换
3.3. 进程切换 为了控制进程的执行,内核必须能够挂起正在运行的进程并恢复运行其他之前被挂起的进程.这个活动通过进程切换,任务切换或上下文切换执行这种各样的操作.接下来的章节介绍Linux系统上的进 ...
- linux内核的进程管理,Linux内核设计与实现——进程管理
主要内容 进程 进程描述符及任务结构 进程创建 线程在linux中的实现 进程终结 1. 进程 进程不仅仅是一段可执行程序代码,还包含其他资源,如打开的文件,挂起的信号,内核内部数据,处理器状态,一个 ...
- linux内核设计与实现---进程管理
进程管理 1 进程描述符及任务结构 分配进程描述符 进程描述符的存放 进程状态 设置当前进程状态 进程上下文 进程家族树 2 进程创建 写时拷贝 fork() vfork() 3 线程在Linux中的 ...
- linux内核调度 0号进程,Linux内核源代码情景分析---第四章 进程与进程调度
4.1 进程四要素 什么是进程? 1:有一段代码段供其执行,这代码段不一定是进程所专用,可以与其他进程公用. 2:每个进程有其专用的系统空间的堆栈(栈)[这个栈是进程起码的"私有财产&quo ...
- Linux 内核、进程调度、进程通信、多线程、协程
Linux内核 操作系统是什么 内核是什么 从功能层面上来说,内核就是一个中间层,软件和硬件之间交互的中间层,链接层 从其他方面理解内核 系统调用,开放了很多接口:资源管理 内核实现的策略 宏内核 微 ...
最新文章
- AlexNet 网络详解及Tensorflow实现源码
- mongodb集群——配置服务器放分片meta信息,说明meta里包含了哪些数据信息
- __cdecl __stdcall区别-转
- [六]RabbitMQ-客户端源码之AMQCommand
- 定义一个包含增强方法的javaBean(最终增强)
- 全国计算机等级考试题库二级C操作题100套(第77套)
- java程序猿面试问缺点怎么回答_JAVA程序员面试32问,你能回答多少题
- null导入失败_当null检查非常失败时
- java 空指针异常之一。 新建的一个对象没有NEW 导致其SET属性时报错
- Autodesk Map3d的应用和开发
- Bzoj 3932: [CQOI2015]任务查询系统(主席树)
- 如何在 Keras 中开发具有注意力的编码器-解码器模型
- 122 Python程序中的进程池和线程池
- Linux平台代码覆盖率测试-.gcda/.gcno文件及其格式分析
- 最全国内外文献检索网站收集
- 人脸识别数据集的采集
- 时间序列平稳性的判断
- SVN修改提交后的文件名
- 【本人秃顶程序员】图解分布式架构的演进过程
- Unite Beijing 2018 | 技术专场部分精彩议题曝光
热门文章
- 用GIF展现程序员的生活二
- 知方可补不足~sqlserver中使用sp_who查看sql的进程
- 探讨如何确保对日软件外包开发过程中的质量
- python面试题(4)--- 字符串首字母大小写 和 反转字符串 问题
- java 生产者消费者同步_经典线程同步问题(生产者消费者)--Java实现
- nextcloud icon_吉利ICON的提车日记,这是一个不错的选择
- 55种数据可视化开源工具_6种用于撰写书籍的开源工具
- idea 工作区右边框提示_建立自己的制造商工作区的提示
- (65)Vue-cli介绍
- (32)Gulp CSS hack 与 Autoprefixer