382 + 原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/

一、实验环境

  win10 -> VMware -> Ubuntu16.04 -> QEMU -> linux-3.9.4

二、实验目的

  1、了解在一个极简内核中,为了实现多进程的切换,需要哪些必要的数据结构;

  2、了解对于一个OS来说,进程是如何启动以及如何基于时间片轮转对进程进行切换。

三、实验结果

  

图 1 实验结果 

四、代码分析

  (1) 对应的PCB(进程控制块)

   为了能够实现进程的切换和正常运行,对于每一个进程,都需要有一些必要的资源、参数。比如,对应进程的唯一标识(pid)、进程的状态(state)、每一个进程对应的堆栈(stack)、进程的入口地址(entry)、指向进程队列中位于当前进程的下一进程指针(pnext)等等。

图 2 PCB结构体定义

图 3 进程切换的大致流程图

  (2)进程切换的逻辑分析

  具体来讲,对于进程的上下文切换,需要在平常的C代码之间嵌入一些必要的汇编代码,以保存将要被替换的进程的相关信息(现场)以及执行下一的进程,对于新的进程,也并非是从头开始执行(第一次执行除外),而是从上一次被中断的地方继续开始执行。

                            

图 4 进程切换中实现进程间上下文切换的汇编代码

  (3)极简内核的整体流程分析

            

                    

图 5 极简内核整体运行流程图

  在个人看来,该极简内核的运行在本质上是一个死循环,在这个死循环中,基于固定时间片轮转思想,修改进程切换标志,在该死循环中查询进程切换标志,如果符合要求,则进行进程的切换,否则继续执行当前进程,不进行进程切换。当然,这个死循环,是由内核中的0号进程触发。0号进程是内核启动起来,经过相应的初始化之后,执行的第一个进程。

                                      

图 6 my_start_kernel中对0号进程的初始化

      ·          

图 7 my_start_kernel中对进程链表的初始化(包括PCB初始化)

                    

图 8 my_start_kernel中执行的第一个进程(0号进程)

                          

图 9 时间片的实现(系统时钟中断      

 

图 10 0号进程死循环查询是否执行进程切换

四、总结

  通过分析实验代码,比较清楚地了解一个简单的时间片轮转多道操作系统内核,了解了操作系统的中断上下文和进程上下文切换。对于当前执行的进程来说,如果被分配到的时间片执行完,CPU 则会进行相应的进程切换。其中的调度程序,就是在维护一个就绪进程队列,当进程用完属于它的时间片后,在队列中就会按照优先级重新排序。这种调度方式,应该是属于一种比较简单、公平同时也是比较高效的方式。

基于Linux-3.9.4的mykernel实验环境的极简内核分析的更多相关文章

  1. 基于七牛云对象存储,搭建一个自己专属的极简Web图床应用(手摸手的注释讲解核心部分的实现原理)

    一个极简的Web图床应用,支持复制粘贴与拖拽上传图片 1.开发缘由 日常使用Vs Code编写markdown笔记与博客文章时,在文章中插入图片时发现非常不便 使用本地文件编写相对路径---没法直接复 ...

  2. [Android] 基于 Linux 命令行构建 Android 应用(七):自动化构建

    本章将演示如何基于 Linux 命令行构建 Android 应用,在开始本章之前,希望你已经阅读之前几章内容. 本文环境为 RHEL Sandiego 32-bits,要基于 Linux CLI 构建 ...

  3. Linux内核分析——第八周学习笔记20135308

    第八周 进程的切换和系统的一般执行过程 一.进程切换的关键代码switch_to分析 1.进程调度与进程调度的时机分析 (1)进程分类 第一种分类 I/O-bound:等待I/O CPU-bound: ...

  4. 《Linux内核分析》第八周学习总结

    <Linux内核分析>第八周学习总结                                      ——进程的切换和系统的一般执行过程 姓名:王玮怡  学号:20135116 ...

  5. Linux内核分析 笔记八 进程的切换和系统的一般执行过程 ——by王玥

    一.进程切换的关键代码switch_to的分析 (一)进程调度与进程调度的时机分析 1.不同类型的进程有不同的调度需求 第一种分类: I/O-bound:频繁地进行I/O,花费很多的时间等待I/O操作 ...

  6. Nginx配置多个基于域名的虚拟主机+实验环境搭建+测试

    标签:Linux 域名 Nginx 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://xpleaf.blog.51cto.com/9 ...

  7. 【MOOC EXP】Linux内核分析实验八报告

    程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 进程的切换和系统的一般执行过程 知识点 ...

  8. “Linux内核分析”实验二报告

    张文俊 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.第二周学习内 ...

  9. 【MOOC EXP】Linux内核分析实验二报告

    程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000  [操作系统是如何工作的]   教学内 ...

随机推荐

  1. 聚类--K均值算法

    import numpy as np from sklearn.datasets import load_iris iris = load_iris() x = iris.data[:,1] y = ...

  2. react native进一步学习(NavigatorIOS 学习)

    特别申明:本人代码不作为任何商业的用途,只是个人学习的一些心得,为了使得后来的更多的程序员少走一些弯路.*(如若侵犯你的版权还望见谅)*. 开发工具:WebStorm,xcode 1. rn的创建的时 ...

  3. 在Eclipse中Tomcat配置图片保存路径

    在上一篇二维码功能实现的时候发现,若将二维码保存在项目路径下,服务器起了之后存入的二维码图片是无法实时读取的,所以在Tomcat上配置图片保存位置,将图片保存到项目外的地方. 查找资料的时候看见一个方 ...

  4. Exploit-Exercises nebule 旅行日志(六)

    接着上次的路程继续在ubuntu下对漏洞的探索练习,这次是level05了 先看下level05的问题描述: 从level05的描述上看,是/home/flag05目录的权限有漏洞,看来多半是又跟fl ...

  5. bit、byte、与字符

    bit bit是计算机中最小的传输单元 是计算机晶体管的一种状态(通电与断电).就是0与1,真与假. 示例: 2bit : 10; 4bit : 1111; 8bit : 1111 1111; byt ...

  6. struts校验

    Struts2 校验框架 Struts2 和Struts1同样也提供了校验框架,但在Struts2 已经不再把校验框架做为一个插件,而是已经内置到了Struts2中,而且配置起来更为简单方便,功能也更 ...

  7. 踩坑学习python自动化测试第一天!

    这只是一个标题, # 迭代器与生成器# 迭代器有两个基本的方法:iter() 和 next(). # 字符串,列表或元组对象都可用于创建迭代器:"""list1 = [1 ...

  8. C#设计模式——单例模式的实现

    1. 什么是单例 保证一个类只有一个实例的实现方法. 2. 使用场景 页面访问计数器 需要保持状态的工具类 需求很多,不能一一列举了 3. 实现方 非线程安全 /// <summary> ...

  9. docker info 警告"WARNING: No swap limit support"

    vim/etc/default/grub 找到 GRUB_CMDLINE_LINUX="" 在双引号里面输入cgroup_enable=memory swapaccount=1 然 ...

  10. java并发中的Semaphore

    什么是Semaphore Semaphore可以控制某个资源可被同时访问的个数(locks和synchronized锁,在任何时刻只允许一个任务访问一个资源),通过acquire()获取一个许可,如果 ...