🌈hello,你好鸭,我是Ethan,一名不断学习的码农,很高兴你能来阅读。
✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。
🏃人生之义,在于追求,不在成败,勤通大道。加油呀!
🔥个人主页:Ethan Yankang
🔥温馨提示:划到文末发现专栏彩蛋
🔥本篇概览: 这一章我们将学习应用程序是如何与操作系统进行交互的
目录
异常
控制流
从处理器开始上电运行,一直到断电关机这段时间内,假设程序计数器的值的序列是——
其中ak表示的是一条指令Ik的地址,我们把每一次ak到ak+1的过度称为控制转移。最简单的控制流是一个简单的序列。这里的平滑表示的含义是IK与IK+1在内存中是相邻的。
如果平滑的控制流发生了突变,也就是说比+1与k在内存中是不相邻的,这种情况一般是由跳转、函数调用、返回这类指令造成的。这类指令导致的突变属于必要的机制。
异常控制流
不过,系统在运行的过程中,需要对系统状态的变化做出反应。比如从网络中传输的数据包到达网络适配器之后,需要将数据放入内存中。
接下来处理器需要处理这类情况。通常我们把这类突变称为异常控制流。
为什么学习异常控制流
1、有助于理解基本系统概念。异常控制流是操作系统用来实现IO、进程、虚拟内存的基本机制。先理解异常控制流是必要的。
2、有助于帮助我们理解应用程序是如何与操作系统交互的。例如当需要向磁盘写入一个数据或是创建一个新的进程时,这类操作都是应用程序向操作系统发出申请调动的。理解异常控制流可以帮助我们理解这些服务是如何提供给应用程序的。
3、帮助我们编写如linux shell、web服务器之类的程序。
4、帮助理解并发。异常控制流是并发最基本的机制。
5、理解软件异常是如何工作的。
如C++、Java中的try catch之类的异常跳转。
异常
异常可能与当前指令有关,比如除与0;也有可能与当前指令无关,比如IO请求操作。
处理异常的流程如下:
处理异常需要硬件和软件紧密配合
系统为每种异常都分配了唯一的异常编号。其中一些编号是处理器设计者分配的,例如被0除,缺页、算术溢出等等。
其他异常是有操作系统内核设计者分配的,例如系统调用以及来自外部的IO信号。
当处理器检测到异常事件的发生,并且确定了相应的异常编号k,然后从异常表中检索出对应的异常处理程序来处理这个异常。
异常表是在系统启动时,操作系统分配和初始化的一个跳转表。其中异常号就是跳转表的索引号。异常表的起始地址是保存在CPU中的一个特殊的寄存器中。这样一来,通过异常表基址寄存器与异常号可以确定对应的异常表项。异常表项中的内容是对应的异常处理程序的起始地址。
综上所述,异常的处理类似执行一个间接的函数调用。异常出程序是运行在内核态的,他对系统的所有资源都有访问权限。
一旦硬件触发了异常,剩下的工作就是由异常处理程序在软件中完成。
进程与上下文
进程:一个运行中的程序的实例。
当我们在shell中输入一个可执行程序的名字后,然后按下回车键。此时就会创建一个新的进程,然后处理器执行这个可执行程序。
两种假象
进程提供给应用程序的抽象——
在现代操作系统上,运行一个程序时,会得到两个假象:
好像是我们的程序独占了整个处理器,处理器在不断地执行程序的指令。
好像程序中的数据与代码是系统内存中的唯一的对象。
上面的两种假象都是通过进程提供给应用程序的。
逻辑控制流
假如我们用调试器来控制程序单步执行,我们会看到一系列的程序计数器(PC)的数值。这些数值与可执行程序中的指令是一一对应的,我们把这一系列的PC数值的序列称为逻辑控制流。简称逻辑流。
假设运行了三个进程,ABC,对于一个单核处理器,在一个时间段只能处理一个进程,因此处理器的物理控制流被分成了三个逻辑控制流,每个进程一个。三个进程的执行是交替进行的。
并发并行
我们把一个逻辑流的执行在时间上与另一个流重叠的情况,称为并发流。
如在这里的AB、AC就是并发流。
并行是两个进程在不同的处理器核上同时运行。
因此,对于二者的区别是:并发是交替运行的,而并行是同时运行的。
内核
上下文
内核为每个进程维护可一个上下文。上下文就是内核重新启动一个被抢占进程所需的状态。是由一系列对象的值组成。
进程的上下文切换
内核代码实现的切换
💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖
热门专栏推荐
🌈🌈计算机科学入门系列 关注走一波💕💕
🌈🌈CSAPP深入理解计算机原理 关注走一波💕💕
🌈🌈微服务项目之黑马头条 关注走一波💕💕
🌈🌈redis深度项目之黑马点评 关注走一波💕💕
🌈🌈Java面试八股文系列专栏 关注走一波💕💕
🌈🌈算法leetcode+剑指offer 关注走一波💕💕
总栏
🌈🌈JAVA后端技术栈 关注走一波💕💕
🌈🌈JAVA面试八股文 关注走一波💕💕
🌈🌈JAVA项目(含源码深度剖析) 关注走一波💕💕
🌈🌈计算机四件套 关注走一波💕💕
🌈🌈算法 关注走一波💕💕
🌈🌈必知必会工具集 关注走一波💕💕
🌈🌈书籍网课笔记汇总 关注走一波💕💕
🌈🌈考试复习资料 关注走一波💕💕
🌈🌈C/C++技术栈 关注走一波💕💕
🌈🌈GO技术栈 关注走一波💕💕
分栏
🌈🌈JAVA后端技术栈
🌈🌈spring 关注走一波💕💕
🌈🌈redis 关注走一波💕💕
🌈🌈MySQL 关注走一波💕💕
🌈🌈mybatis 关注走一波💕💕
🌈🌈mybatisplus 关注走一波💕💕
🌈🌈MQ 关注走一波💕💕
🌈🌈微服务 关注走一波💕💕
🌈🌈设计模式 关注走一波💕💕
🌈🌈分布式锁 关注走一波💕💕
🌈🌈JAVA八股文JAVA面试八股文(redis、MySQL、框架、微服务、MQ、JVM、设计模式、并发编程、JAVA集合、常见技术场景) 关注走一波💕💕
🌈🌈JAVA项目(含源码深度剖析)
🌈🌈黑马头条(微服务) 关注走一波💕💕
🌈🌈黑马点评(redis) 关注走一波💕💕
🌈🌈计算机四件套
🌈🌈计算机基础 关注走一波💕💕
🌈🌈计算机基础 关注走一波💕💕
🌈🌈计算机网络 关注走一波💕💕
🌈🌈数据结构与算法 关注走一波💕💕
🌈🌈算法
🌈🌈leetcode 关注走一波💕💕
🌈🌈剑指offer 关注走一波💕💕
🌈🌈必知必会工具集 关注走一波💕💕
🌈🌈书籍网课笔记汇总
🌈🌈CSAPP笔记 关注走一波💕💕
🌈🌈计算机科学速成课 关注走一波💕💕
🌈🌈CS自学指南 关注走一波💕💕
🌈🌈读书笔记与每日记录 关注走一波💕💕
🌈🌈考试复习资料 关注走一波💕💕
🌈🌈C/C++技术栈 关注走一波💕💕
🌈🌈GO技术栈 关注走一波💕💕
📣非常感谢你阅读到这里,如果这篇文章对你有帮助,希望能留下你的点赞👍 关注❤收藏✅ 评论💬,大佬三连必回哦!thanks!!!
📚愿大家都能学有所得,功不唐捐!