进程的切换和系统的一般执行过程

贾瑗 原创作品转载请注明出处 《Linux内核分析》MOOC课程 http://mooc.study.163.com/course/USTC-1000029000

一、进程切换的关键代码switch-to分析

1、进程调度与进程调度的时机分析

不同类型的进程有不同的调度需求

  • 第一种

      I/O-bound
    · 频繁的进行I/O
    · 通常会花费很多的时间等待I/O操作的完成
    CPU-bound
    · 计算密集型
    · 需要大量的CPU时间进行计算 //导致交互式计算反应迟钝
  • 第二种

      批处理进程
    · 不必与用户交互,通常在后台运行
    · 不必很快响应
    · 典型的批处理程序:编译程序和科学计算
    实时进程
    · 有实时需求,不应被低优先级的进程阻塞
    · 响应的时间要短、要稳定
    · 典型的实时进程:视频音频、机械控制
    交互式进程
    · 需要经常与用户进行交互,要花很多时间等待用户输入
    · 响应时间要快,平均延迟要低于50~150ms
    · 典型的交互式程序:shell、文本编辑程序、图形应用

Linux既支持普通的分时进程,也支持实时进程。调度是多种调度策略和调度算法的混合,基于分时和优先级

调度策略:是一组规则,他们决定什么时候以怎样的方式选择一个新进程运行。(内核中的调度算法相关代码使用了类似OOD中的处理模式)

Linux的进程根据优先级排队,优先级是动态的

根据特定的算法计算出进程的优先级,用一个值表示
这个值表示把进程如何适当的分配给CPU
调度程序会根据进程的行为周期性的调整进程的优先级

进程调度的时机

  • 中断处理过程(时钟中断、I/O中断、系统调用和异常)中直接调用schedule(),或者返回用户态时根据need-resched标记调用

  • 内核线程可以直接调用schedule()进行进程切换,也可以在中断处理过程中进行调度,也就是说线程作为一类特殊的进程,只有内核态没有用户态可以主动调度也可以被动调度

  • 用户态进程无法实现主动调度,只能被动调度,仅能通过陷入内核态后的某个时机点进行调度,即在中断处理过程中进程调度

      schedule函数:在运行队列中找到一个函数,把CPU分配给他

2、进程上下文切换相关代码分析

进程的切换:为了控制进程的执行,内核必须有能力挂起正在CPU上执行的进程,并恢复以前挂起的某个进程

挂起与中断是保存现场的区别:中断前后是同一个进程上下文,只是由用户态和内核态执行。进程上下文是两个进程。

进程上下文包含进程执行的信息

用户地址空间:程序代码、数据、用户堆栈
控制信息:进程描述符、内核堆栈
硬件上下文
  • next = pick_next_task(rq, prev); //进程调度算法都封装这个函数内部
  • context_switch(rq, prev, next); //进程上下文切换
  • switch_to利用了prev和next两个参数:prev指向当前进程,next指向被调度的进程

switch_to代码及分析

二、Linux系统的一般执行过程

1、Linux系统的一般执行过程分析

最一般的情况:从正在运行的用户态进程x切换到运行用户态进程y

1、正在运行的用户态进程x
2、发生中断——save cs:eip/esp/eflags(current) to kernel stack,
then load cs:eip(entry of a specific ISP)
and ss esp(point to kernel stack)
3、SAVE_ALL //保存现场
4、中断处理过程中或中断返回前调用了schedule()
其中的switch-to做了关键的进程上下文切换
5、标号1之后开始运行用户态进程y
6、restore-all //恢复现场
7、iret - pop cs:eip/ss:esp/eflags from kernel stack
8、继续运行用户态进程y

几种特殊情况

  • 通过中断处理过程中的调度时机,用户态进程和内核线程之间相互切换和内核线程之间相互切换与最一般的状况非常类似,只是内核线程运行过程中发生中断没有进程用户态和内核态的转换
  • 内核线程主动调用schedule,只有进程上下文的切换,没有发生中断上下文的切换,与最一般的情况略简略
  • 创建子进程的系统调用在子进程中的执行起点及返回用户态
  • 加载一个新的可执行程序后返回到用户态的情况

2、内核与舞女

ps:忍不住的想吐槽,我还是个孩子啊!

那么问题来了:如果进程发生切换,代码段堆栈段等是如何进行切换的

内核就是一个出租车!!!哪个进程招手都可以!!!

进程就是出租车的客人!!!

内核是各种中断处理过程和内核线程的集合

操作系统架构和执行过程

Linux操作系统架构概览

回顾

操作系统:基本程序集合

  • 内核:进程管理,进程调度,进程间通讯机制,内存管理,中断异常处理
  • 其他:函数库,shell程序
  • 目的:与硬件交互,管理所以的硬件资源。为用户程序提供一个良好的执行环境

最简单也是最复杂的操作——执行ls命令

从CPU和内存的角度看Linux系统的执行

实验部分

前面几步重新克隆menu的步骤已经做过很多次了所以就不麻烦再记下来了,直接从gdb设置断点开始

  • 先后在schedule、switch_to两处设置断点。

  • s一直执行可以看到每一步,输入list可以看到更多的代码

总结部分

进程的调度少不了进程的切换,关键操作是:切换地址空间、切换内核堆栈、切换内核控制流程,加上一些必要的寄存器保存和恢复。用户上下文的保存和恢复是通过中断和异常机制,在内核态和用户态相互切换时才发生的。

Linux内核分析作业八的更多相关文章

  1. LINUX内核分析第八周学习总结——进程的切换和系统的一般执行过程

    LINUX内核分析第八周学习总结——进程的切换和系统的一般执行过程 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/c ...

  2. LINUX内核分析第八周学习总结

    LINUX内核分析第八周学习总结 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.c ...

  3. Linux内核分析第八周——进程的切换和系统的一般执行过程

    Linux内核分析第八周--进程的切换和系统的一般执行过程 李雪琦+原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/cou ...

  4. Linux 内核分析第八周学习笔记

    Linux 内核分析第八周学习笔记 zl + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-10 ...

  5. linux内核分析 第八周

    第八周 理解进程调度时机跟踪分析进程调度与进程切换的过程 一.进程调度与切换 1.进程的调度时机与进程切换 操作系统原理中介绍了大量进程调度算法,这些算法从实现的角度看仅仅是从运行队列中选择一个新进程 ...

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

    实验作业:进程调度时机跟踪分析进程调度与进程切换的过程 20135313吴子怡.北京电子科技学院 [第一部分]理解Linux系统中进程调度的时机 1.Linux的调度程序是一个叫schedule()的 ...

  7. linux内核分析作业8:理解进程调度时机跟踪分析进程调度与进程切换的过程

    1. 实验目的 选择一个系统调用(13号系统调用time除外),系统调用列表,使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 分析汇编代码调用系统调用的工作过程,特别是参数的传递的方 ...

  8. Linux内核分析作业7:Linux内核如何装载和启动一个可执行程序

            1.可执行文件的格式 在 Linux 平台下主要有以下三种可执行文件格式: 1.a.out(assembler and link editor output 汇编器和链接编辑器的输出) ...

  9. linux内核分析作业6:分析Linux内核创建一个新进程的过程

    task_struct结构: struct task_struct {   volatile long state;进程状态  void *stack; 堆栈  pid_t pid; 进程标识符  u ...

随机推荐

  1. Django admin 后台管理

    在App 文件夹下的 admin.py 文件中写入 from django.contrib import admin from app名 import models admin.site.site_h ...

  2. [MySQL学习]STRICT_ALL_TABLES相应的OUT of RANGE VALUE FOR COLUMN和DATA truncated FOR COLUMN

    版权声明:声明:本文档能够转载,须署名原作者. 作者:无为 qq:490073687 周祥兴 zhou.xiangxing210@163.com https://blog.csdn.net/Rooki ...

  3. 深入浅出RxJava(二:操作符)

    看完这篇blog,我相信你肯定想立即在你的项目中使用RxJava了,这篇blog将介绍许多RxJava中的操作符,RxJava的强大性就来自于它所定义的操作符. 首先先看一个例子: 准备工作 假设我有 ...

  4. 洛谷P2342-叠积木

    Problem 洛谷P2342-叠积木 Accept: 373   Submit: 1.1k Time Limit: 1000 mSec    Memory Limit : 128MB Problem ...

  5. input框下拉综合搜索

    静态页面 <form action="houtai.php" method="get">                               ...

  6. MySql常用命令集Mysql常用命令showdatabases;显示数据库createdatab

    MySql 常用命令集 Mysql常用命令 show databases; 显示数据库 create database name; 创建数据库 use databasename; 选择数据库 drop ...

  7. python 播放mp3

    import os os.system('out1.mp3') 自动带开播放器

  8. Arduino IDE for ESP8266 ()esp8266项目 WIFI攻击器

    https://www.wandianshenme.com/play/esp8266-nodemcu-create-portable-wifi-jammer/ 使用 ESP8266 制作 WiFi 干 ...

  9. Click to add to Favorites Troubleshooting: High Version Count Issues (Doc ID 296377.1)

    Copyright (c) 2018, Oracle. All rights reserved. Oracle Confidential. Click to add to Favorites Trou ...

  10. Python基础(4)列表、元组、字符串、字典、集合、文件操作

    列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 详见:http://www.cnblogs.com/alex3714/articles/5717620.html 1.列表和元 ...