前面我们提到:OS希望在保持控制权的同时,为用户提供高性能的并发。

  那么OS究竟是如何保持对计算机的控制权呢?这似乎是一个令人迷惑(但很重要!)的问题:OS也是进程,自然也需要计算资源。那既然我们希望一直保持OS的控制权,难道OS需要一直占用计算资源么?当然不是这样。

  在微内核OS中,一般有两种模式 —— 内核模式(Kernel Mode)和 用户模式(User Mode),普通用户进程基本都运行在用户模式中,只能执行一些一般的、基本的操作。那不一般的操作(我们称之为“特权操作”)有哪些呢?比如I/O操作、中断处理、时钟管理、还有相当重要的进程调度操作等,这些“特权操作”只能在内核模式中由操作系统进行,而用户模式下则不能执行任何特权操作。

  上述内核模式与用户模式的关系类似于什么呢?其实有点像父母给小孩子的安全屋:所有比较危险的东西(比如带电的插座、窗户等)都被保护起来了,小孩子可以在里边安全的活动。但是一旦他想做任何“危险行为”,就应该找他的父母来完成那些“危险行为”。

  类似的,一旦某个程序希望执行某个特权操作,它就会调用OS内核(syscall)来执行,这样CPU的控制权就被原先的程序移交给了OS。

  好,看起来我们已经保证了OS的控制权:通过用户进程主动syscall移交控制权。但是这个方式没有解决另外一个问题:如果一个进程一直不愿意交出CPU控制权怎么办?这样的进程很容易实现:一个while(true);无限循环就行。对于这些不友好的进程,我们该如何处理才能保证OS的控制权?

  (想一想,你可以想到的!)

  没错,我们可以定时将控制权移交给OS,这可以利用时钟(如石英振荡器)来实现,每隔一段时间定时syscall,强制将计算机控制权移交给OS就行,当然这需要硬件中断的支持。

  综上,现在我们有两种方式来保证OS对计算机的控制权:1 友好的进程会主动syscall来移交控制权;2 对于不友好的进程,我们使用定时中断的方式获得控制权。

  当然,上述两种方式还带来了2个小问题:

  1.    所有用户模式的进程在将控制权移交给OS后(或主动或被动),它都相当于从原本的运行状态被硬生生地打断了。那么它下一次运行的时候,我们是不是需要将计算机恢复到它被打断之前的状态,从而接着运行呢?没错,当然是需要的,我们可以用Process Control Block来实现,这个过程就叫Context Switch —— 上下文切换

  2.    OS或主动或被动地获得控制权后,都必须要决定接下来要运行哪个用户进程,那么OS是如何来决定接下来运行什么进程的呢?这就要通过调度算法 —— Scheduler来实现。

OS如何保持对计算机的控制权?的更多相关文章

  1. os用法总结:python中必须掌握的内置模块os,实现与计算机操作系统的常规交互!

    os模块说明 ''' os 模块 Os库是python标准库,包含几百个函数 常用路径操作.进程管理.环境参数等几类 路径操作:os.path子库,处理文件路径及信息 进程管理:启动系统中其他程序 环 ...

  2. os 计算机的启动

    零.boot的含义 先问一个问题,”启动”用英语怎么说? 回答是boot.可是,boot原来的意思是靴子,”启动”与靴子有什么关系呢? 原来,这里的boot是bootstrap(鞋带)的缩写,它来自一 ...

  3. 计算机启动boot

    原创博文:转载请标明出处:http://www.cnblogs.com/zxouxuewei 零.boot的含义 先问一个问题,"启动"用英语怎么说? 回答是boot.可是,boo ...

  4. Lab_1:练习4——分析bootloader加载ELF格式的OS的过程

    一.实验内容 通过阅读bootmain.c,了解bootloader如何加载ELF文件.通过分析源代码和通过qemu来运行并调试bootloader&OS, bootloader如何读取硬盘扇 ...

  5. 计算机的启动和Linux的启动

    计算机的启动和Linux的启动 一 计算机的启动   计算机的启动过程分为四个阶段,分别是:BIOS.MBR.启动管理程序.加载操作系统内核.操作系统启动.   1.1 BIOS 计算机加电后,第一件 ...

  6. linux --> 计算机是如何启动的?

    计算机是如何启动的? 零.boot的含义 "启动"用英语怎么说?回答是boot.boot原来的意思是靴子,"启动"与靴子有什么关系呢? 原来,这里的boot是b ...

  7. python-时间模块,random、os、sys、shutil、json和pickle模块

    一.time与datetime模块 time模块: 时间戳:表示的是从1970年1月1日00:00:00开始按秒计算的偏移量,返回类型为float类型 格式化时间字符串(Format String) ...

  8. 常用模块之 time,datetime,random,os,sys

    time与datetime模块 先认识几个python中关于时间的名词: 时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.我们运行“ty ...

  9. Firefox OS简单介绍

    Firefox OS系统架构框图 一些Firefox相关的术语简单介绍: B2G Boot to Gecko 的简称. Boot to Gecko Firefox OS 操作系统的project代号. ...

  10. 计算机/linux启动过程

    开机过程指的是从打开计算机电源直到LINUX显示用户登录画面的全过程. 分析LINUX开机过程也是深入了解LINUX核心工作原理的一个很好的途径. 计算机开机过程是一个非常复杂的过程,想真正理解透彻并 ...

随机推荐

  1. immutable 不可改变的 mut ≈ to move = to change - 单词学习

    immutable im-不,非 + mut-改变 + -able. im 通 in able 有能力的 重点是 mut 的含义是 to change t 就是to mu 就是 change (*拉丁 ...

  2. javascript web development es6 pdf js - Cheat Sheet 表格 [vuejs / webcomponents-cheatsheet-2021] 共3套

    ES6 预览 VUE2 预览 webcomponents 预览 ES6 2019 pdf下载: https://files.cnblogs.com/files/pengchenggang/javasc ...

  3. SpringMVC深入总结--Spring中的拦截器

    Spring为我们提供了: org.springframework.web.servlet.HandlerInterceptor接口, org.springframework.web.servlet. ...

  4. drf(视图组件)

    一. 前言 Django REST framwork 提供的视图的主要作用 1. 控制序列化器的执行(检验.保存.转换数据) 2. 控制数据库查询的执行 二. 两个视图基类 两个视图基类: APIVi ...

  5. Rust Rocket简单入门

    目录 简介 hello world 常用功能 动态路径 多个片段(segments) 静态文件服务器 简单WebAPI示例 添加依赖 实现接口 接口测试 参考链接 简介 Rust中最知名的两个web框 ...

  6. Lifecycle详细分析

    Lifecycle源码分析 目录介绍 01.Lifecycle的作用是什么 02.Lifecycle的简单使用 03.Lifecycle的使用场景 04.如何实现生命周期感知 05.注解方法如何被调用 ...

  7. uni-app如何实现USB插入后自动弹出对应软件

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 最近碰到了一个奇葩需求,要用uni-app来实现usb接入设备的时候,让软件自动弹出来,这里给出我制作的过程和参考的各种思路,希望对大家有 ...

  8. 记录--通过手写,分析async await核心原理

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 async await 语法是 ES7出现的,是基于ES6的 promise和generator实现的 generator函数 在之 ...

  9. 聊聊ShareGPT格式的微调数据集

    转载请注明住处:https://www.cnblogs.com/zhiyong-ITNote 概述 ShareGPT格式的数据集中,一般是如下格式: [ { "conversations&q ...

  10. vue中elementui组件el-dialog拖拽(已处理边界情况)

    全局注册 Vue.directive("elDialogDrag", (el) => { const header = el.querySelector(".el- ...