42 进程的初步实现(上)
参考
https://blog.51cto.com/13475106/category6.html及狄泰软件相关课程
1.进程=运行当中的程序,应用程序的目的就是解决问题,生成的可执行文件,执行会有一个进程,进程的目的就是完成任务。
思考-计算机只有一个处理器,那么如何同时执行多个任务?
远古时期的计算机系统
由上图可知,处理器一次只执行一次任务,所以当task1执行结束才会从任务等待队列中继续执行。远古时期存在的弊端-当正在执行的任务需要外部设备交互时,处理器几乎处于K线状态,其他任务无法执行,只能等待。
A.任务定义(进程定义)
在微观角度(操作系统),一个任务包含上图所拥有的。对多任务的实现我们需要完成以下的执行情况
多任务的并行执行,在多数情况下,任务数量大于处理器数量,因此,无法做到真正意义上的任务并行执行,但是可以让处理器每个时间单位执行一个任务,最终,处理器在多个任务之间切换执行
B.如何在计算机内部表示一个任务?
C语言结构体-该处表示一个进程的表示(对应之前的任务定义),rv表示寄存器的值(保存进程的状态),stack表示栈,代码与数据(程序加载到内存中)以后在详解
任务的执行状态如下图所示-结构体的寄存器的值-保存在内存当中
TSS(保存特权级转换的栈信息,会有各个寄存器的值)-在从低特权级转入0特权级执行时,进行切换栈时需要用到TSS,该表对应着右边的结构体,下图右图结构体表示前四个字节表示前一个栈信息,后续表示的是各个特权级的栈信息,unused[22],表示中间没有用到的寄存器
进程实现需要的原材料
1.LDT-x86系统中的任务使用私有的段描述符
2.TSS-特权级提升执行时需要-查看栈信息
3.RegValue-保存任务执行时的上下文信息
4.Stack-x86系统中的任务私有的栈
5.GDT-任务对应的LDT和TSS需要在GDT中注册
在这里出现的问题-如何动态在GDT中注册LDT和TSS?要设置GDT中的描述符就必须获得GDT的起始地址,这个地址如何获得?
解决方案如下(共享内存)-loader不同的地址写入交换内存,kernel可以通过在交换内存中拿到所需的地址
详细的代码放置以下链接:链接:https://pan.baidu.com/s/1LbsIhwyjzTY_4sBV96RuDw 提取码:y0zy
运行结果如图所示
posted on 2021-04-20 09:02 lh03061238 阅读(118) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)