一、概述

本文通过分析一个简单的时间片轮转多道程序的内核

mykernel,来理解操作系统是如何工作的。

mykernel 是孟宁老师的一个开源项目,借助 Linux

内核部分源代码模拟存储程序计算机工作模型及时钟中断,添加与修改部分代码实现的(详情点 此处)。未加入进程管理功能的

mykernel,会在初始化后,周期性地执行时间中断处理程序。在实验楼虚拟机的终端输入以下指令(图形模式下),即可运行

mykernel 。运行时效果如下:

可以看出,这个系统目前只是简单地不停输出“my_timer_handler here”、“my_start_kernel

here”等字样。通过查看源码,可以发现这些输出字符串分别位于 mymain.c 和 myinterrupt.c

中。只要在此基础上,再加入进程描述 PCB 和进程链表管理、进程切换等代码,一个可运行的小OS kernel

就完成了。下面便开始逐步实现这些功能(本文所有代码均由孟宁老师提供,笔者只分析其功能与实现原理)。

二、添加 PCB 描述信息

为了实现进程管理,需要先引入进程块描述信息,我们将其放入一个新的头文件 mypcb.h

中。

由代码可知,一个 PCB

的相关信息,是通过结构体进行封装的,其组成元素的含义及用途,由变量名及注释即可知其意,就不详述了。

三、PCB初始化(修改 mymain.c )

未修改前, mymain.c

中只有如下一个初始化函数,周期性地输出当前运行位置:

显然,进程块的初始化信息也应添加到这个初始化函数中。

初始化完毕后,各 PCB 构成一个单向循环链表。接着启动 0

号进程。

原来的初始化函数中的打印输出信息,就交由 my_process() 处理了,并调用了进程调度管理程序。

四、时间片分配(修改 myinterrupt.c

)

未修改前,时间中断处理函数

my_timer_handler()内只有一条标识位置的打印输出命令:

现在修改下,让其支持进程的时间片轮转功能:

此时,my_time_handle()

所执行的主要功能为:每被中断调用1000次,且没有需要调度的进程时,就将全局变量 my_need_sched

置为1(中断返回后,正在执行的进程就会执行调度程序 my_schedule())。相当于每次进程占用

CPU的最长时间片为1000个时钟中断周期。时间片长度由 time_count 控制。

五、进程调度( 置于

myinterrupt.c 中 )

当一个进程执行完毕,或用完所分配的时间片后,就会让位给其他进程运行。进程切换功能由 my_schedule()

实现。

my_schedule() 的流程如下:

六、运行验证

以上代码修改完毕,就可以重新编译与运行了。为了更便于观察进程的切换状态,我将my_timer_handler()中每个时间片的1000个时钟中断周期改为了10,再次编译后,运行结果如下图:

六、总结

通过以上分析,我们知道了操作系统的核心功能是:进程调度与中断机制。通过与硬件配合,实现多任务处理,再加上上层应用软件的支持,最终变成可以满足用户使用要求的计算机系统。

——————————————————————————————————————————

PS:

1、本文为网易云课堂《Linux内核分析》第2讲(操作系统是如何工作的)的课后作业,属原创作品,如需转载请注明出处。

2、网易云课堂《Linux内核分析》MOOC课程:http://mooc.study.163.com/course/USTC-1000029000,欢迎前往共同学习。

Linux内核实验孟宁,《linux内核分析》实验二:时间片轮转多道程序运行原理相关推荐

  1. linux实验:基于mykernel的一个简单的时间片轮转多道程序内核代码分析

    学号后三位:288 原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/ 1.mykernel mykernel是由中科大孟宁老师建立的用于开发 ...

  2. 格雷码算法c语言实验报告,算法设计与分析实验报告

    本科生实验报告 课程名称:算法设计与分析 实验项目:递归和分治算法 实验地点:计算机系实验楼110 专业课:物联网1601学生.2016002105 学生姓名:于 指导员:郝晓丽 2018年5月4日 ...

  3. 回归分析的计算机实践实验,山东农业大学XS080011-数据分析实验

    <数据分析实验>教学大纲 Experiments of Data Analysis 课程代码:XS080011学时:32学时学分:1学分 适用专业:课程性质:选修 撰稿人:李俊清审定人:葛 ...

  4. Spark RPC框架源码分析(二)RPC运行时序

    前情提要: Spark RPC框架源码分析(一)简述 一. Spark RPC概述 上一篇我们已经说明了Spark RPC框架的一个简单例子,Spark RPC相关的两个编程模型,Actor模型和Re ...

  5. linux EHCI DRIVER之中断处理函数ehci_irq()分析(二)

    先上代码, 1. static void scan_async (struct ehci_hcd *ehci) 2. { 3.  struct ehci_qh *qh; 4.  bool check_ ...

  6. doubb超时_dubbo源码分析(二):超时原理以及应用场景

    本篇主要记录dubbo中关于超时的常见问题,实现原理,解决的问题以及如何在服务降级中体现作用等. 超时问题 为了检查对dubbo超时的理解,尝试回答如下几个问题,如果回答不上来或者不确定那么说明此处需 ...

  7. Linux内核分析:完成一个简单的时间片轮转多道程序内核代码

    PS.贺邦   原创作品转载请注明出处  <Linux内核分析>MOOC课程    http://mooc.study.163.com/course/USTC-1000029000 1.m ...

  8. linux内核计算代码时间,完成一个简单的时间片轮转多道程序内核代码

    <Linux 内核分析>实验二:How Does a Operating System Work? 1.函数调用堆栈和中断 在上一节实验中我们已经明白了,存储程序计算机的运行原理,就是通过 ...

  9. 网络协议实验四 ARP 协议分析实验

    实验四 ARP 协议分析实验 2.2 ARP 协议分析实验 1.ARP 协议介绍 ARP 是地址解析协议 (Reverse Address Resolution Protocol)的缩写,负责实现从I ...

最新文章

  1. html5里可移动线性进度条的类型怎么表示,HTML5触摸事件实现移动端简易进度条的实现方法...
  2. sql server 怎么把视图中的数据存到另外一张表中_承上篇,自制插件优化Kep数据存储问题...
  3. python自动化工具开发_初识TPOT:一个基于Python的自动化机器学习开发工具
  4. python画同心圆程序_python – matplotlib:如何在给定的半径范围内绘制同心圆
  5. Require Busy dialog
  6. 数字签名与HTTPS详解
  7. 最常问的MySQL面试题集合
  8. libevent 例子,从简单到复杂
  9. java-web-j2e学习建议路线
  10. springcloud五大组件?注解_Spring Cloud学习
  11. mysql药品管理_药品管理系统(药库管理)+数据库连接代码
  12. java小项目之简单聊天室
  13. GitHub上的项目受美国出口管制吗?
  14. Java日志体系(三) jul 配置文件详解,日志示例
  15. cd 命令行进入目标文件夹
  16. 机器学习因子:在线性因子模型中捕捉非线性
  17. 外业调查工具助手,照片采集、精准定位、导航、地图查看
  18. Android刷机SD卡分区指南 [
  19. R语言条形图的制作--barplot()
  20. 你只要上传两张毫无关联的照片「这个网站就会自动帮你合成了!」

热门文章

  1. 计算机桌面图标变小了怎么恢复,window_win7电脑桌面图标变大怎么恢复?win7桌面图标怎么变小?,win7电脑桌面图标变大怎么恢复 - phpStudy...
  2. RGB565数据转RGB8888图片
  3. 【Ubuntu 篇】关于Ubuntu启动报错“hdaudio hdaudioC0D2: unable to bind codec”
  4. Linux系统编程及应用——ubuntu环境下
  5. 【软件工程理论与实践】(笔记)
  6. 400错误 解决方案
  7. 上海迪士尼将开启五周年庆典;凯悦第1000家新酒店开业;舍弗勒轮毂驱动业务全球总部在上海启用 | 美通企业周刊...
  8. BUUCTF VN2020 公开赛 Misc(复现)
  9. RTL-SDR之对讲收听windows篇
  10. 解决RocketMQ的幂等性问题