IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 进程的切换的过程 -> 正文阅读

[嵌入式]进程的切换的过程

一、进程何时切换?

中断时切换,包括:

外部中断,异常,系统调用

二、中断可以分为哪几类?

1、外部中断,也简称中断

????????由CPU外部设备引起的外部事件如I/O中断、时钟中断、控制台中断等是异步产生的(即产生的时刻不确定),与CPU的执行无关

2、内部中断,也简称异常,

????????在CPU执行指令期间检测到不正常的或非法的条件(如除零错、地址访问越界)所引起的内部事件称作,也称内部中断

3、陷入中断,简称软中断,使用请求系统服务的系统调用而引发的事件

三、外部中断是什么?为何引入外部中断?

????????外部设备的速度远远低于CPU的速度,为了提高CPU的利用率,引入了中断机制(中断是系统?来响应硬件设备请求的?种机制)

????????当CPU收到中断信号或异常事件后,它会暂停当前的程序或任务,在操作系统处理与硬件相关的事情时,CPU去处理与这个信号相关的工作(这样就不用一直等待IO了,通常以内核线程执行),在完成对这个事件的处理后再跳回到刚才被打断的程序或任务中;

四、进程执行系统调用的过程?

1、程序跳入陷阱(trap)是什么?

????????程序指令跳入内核并将特权提升到内核态,此外为了确保操作系统能从陷阱经指令正确返回,处理器会将程序计数器、标志和其他一些寄存器的内容推送到每个进程的内核栈中,返回陷阱则将从栈中弹出这些值,并恢复执行用户态(操作系统执行完系统调用返回后,会检查当前进程是否处于就绪状态,时间片是否用完,如果用完就去schedule()调用其他进程,否则出栈寄存器,恢复现场)

2、所谓的陷阱表是什么?

????????陷阱表是使陷阱指令与OS要运行的代码对应起来(不能直接跳转到要运行的地址,这样不安全)通过设置陷阱表,OS能将异常事件与需要运行的代码对应起来。

如果一个程序直接在CPU中运行,总过程?(一行一行看)

操作系统状态

硬件状态

程序状态

操作系统启动(内核模式)

硬件

初始化陷阱表

记住系统调用处理程序的地址

操作系统运行(内核模式)

硬件

程序准备(用户态)

在进程列表上创建条目

为程序分配内存

将程序加载到内存中

根据argv设置程序栈

从陷阱返回

从内核栈恢复寄存器

跳转用户模式

跳转main

运行main

……

进行系统调用

陷入操作系统

将寄存器保存到内核栈

转向内核模式

跳到陷阱处理程序

处理陷阱

做系统调用的工作

从陷阱返回

从内核栈恢复寄存器

转到用户模式

跳到陷阱之后的程序计数器

……..

从main返回

陷入(exit())

释放进程的内存,并将进程从进程列表中清除

怎么就一个进程,不是说进程的切换吗?

上面讲述了程序执行系统调用的过程,系统调用有点特别。

先考虑以下场景,假如一个进程在CPU运行,这就意味着操作系统没有运行,如果操作系统没有'运行',他就不能做事。所以他如何重获CPU控制权?

刚才我们看到了在系统调用时,操作系统获得了CPU控制权,其实在过去的某些系统(早期的Macintosh操作系统)就是等待系统调用使操作系统获取CPU控制权;

一个进程在系统调用时,如打开文件并随后读取文件,或者创建新进程,再或者什么也不干就显示地调用yield系统调用,只是将控制权交给操作系统,操作系统获得了CPU的控制权,他可以运行其他进程。

但是,这种被动的方式不太理想,不安全,假如进程进入无限循环从不进行系统调用,操作系统就获得不了主动权。

五、操作系统如何实现进程之间的切换?

1、操作系统如何主动获得控制权?

利用时钟中断获得控制权:时钟设备可以编程每隔几毫秒产生一次中断,当产生中断时,正在运行的程序停止,操作系统中预先配置的中断处理程序会先运行,此时操作系统重新获取CPU控制权。

注意,硬件发生中断时有一定的责任,尤其是中断发生时,要为正在运行的程序保存足够的状态,以便随后从陷阱返回指令能够正确恢复正在运行的程序(各种寄存器进入内核栈,这与显式调用系统调用陷入内核时的行为相似)。

2、保存和恢复上下文(上下文切换)

我们知道操作系统可以通过时钟中断获取CPU的控制权,那么之后操作系统选择运行哪个进程就是调度程序做出的,它是操作系统的一部分(有着相应的调度策略);

如果决定切换,OS就会决定执行一些底层代码。总的来说是将当前正在运行进程寄存器中的值保存到内核栈中,并为即将要执行的进程从内核栈中恢复一些寄存器的值。这样操作系统可以确保最后执行从陷阱返回指令时,不是返回到之前运行的进程,而是继续执行另一个进程。

为了保存当前正在运行的进程的上下文,操作系统会执行一些底层汇编代码,用来保存通用寄存器、程序计数器,以及当前正在运行的进程的内核栈指针,然后恢复寄存器、程序计数器,并切换内核栈,供即将运行的进程使用。

通过切换内核栈,内核在进入切换代码系统调用时,是一个被中断进程的上下文,在返回时,是另一个即将执行的进程的上下文。当操作系统最终执行从陷阱返回指令时,即将执行的进程就编程了当前运行的进程。至此上下文切换完成。

下面是进程切换的具体过程:

操作系统启动(内核模式)

硬件

初始化陷阱表

记住以下地址:

1.系统调用处理程序

2.时钟处理程序

启动中断时钟

启动时钟

每隔x ms 中断CPU

操作系统运行(内核模式)

硬件

程序(用户模式)

进程A运行…..

时钟中断

将寄存器(A)保存到内核栈(A)

转向内核模式

跳到陷阱处理程序

处理陷阱

调用switch()例程

?? 将寄存器(A)保存到进程结构(A)

?? 将进程结构(B)恢复到寄存器(B)

从陷阱返回(进入B)

从内核栈(B)恢复寄存器(B)

转向用户模式

跳到B的程序计数器

进程B运行…..

在这个过程中,发生了两种类型的寄存器保存恢复

第一次:发生时钟中断时,由硬件隐式保存

第二次:操作系统决定A切换B进程,内核寄存器被软件(OS)明确保存

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-10-30 12:41:30  更:2021-10-30 12:42:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:26:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码