1、操作系统四特性

  1. 并发:一个时间段,多个进程在宏观上同时运行
  2. 共享:系统中的资源可以被多个并发进程共同使用(互斥共享,同时共享)
  3. 虚拟:利用多道程序设计,利用时分复用(分时系统)和空分复用(虚拟内存),使得一台物理设备在感觉上像是多台物理设备
  4. 异步:程序的执行不是一贯到底,而是走走停停,向前推进的速度是不可预知的

2、用户态和核心态

references:内核态和用户态

概念

用户态:用户态具有较低的权限(3环),运行在用户态的程序不能直接访问内核中的程序和数据结构。大部分用户面对的程序都是在用户态的,只能执行非特权指令。

内核态:具有较高的权限(0环),可以访问内存中所有的数据包括外围设备,能执行特权指令。sys_fork()就运行在内核态。

RING0~RING3的权限分级是通过硬件实现的。

每个进程中有两个栈:用户栈和内核栈。分别对应用户态和内核态。

用户态到内核态的切换

用户态切换到内核态的三种方式:系统调用,异常,外围设备的中断

  1. 系统调用:用户态进程主动要求切换到内核态的方式,用户态进程通过系统调用来申请操作系统提供的服务。比如fork()创建新的进程。
  2. 异常:CPU在执行用户态程序时发生了异常,就会切换到处理此异常的相关内核程序。比如缺页异常。
  3. 外围设备的中断:外围设备完成用户请求的操作后,会向CPU发送相应的中断信号,那么CPU就会暂停下一条指令,然后去执行中断信号所指的程序。比如硬盘读写完成,

为什么要分用户态和内核态

CPU将指令分为特权指令和非特权指令。特权指令权限非常大(清内存、修改用户的访问权限),使用不当将导致程序崩溃,如果所有程序都能使用特权指令,那么这是很危险的。

3、缓冲区

references:缓冲区

概念

缓冲区是内存空间的一部分,即内存中预留了一定的存储空间,用来缓冲输入输出数据。

为什么引入缓冲区

高速设备和低速设备的速度不匹配,会让高速设备等待低速设备。

作用:

  1. 解除两者制约关系,高速设备把数据输入缓冲区就可以去处理别的事情,低速设备从缓冲区读取数据。
  2. 减少数据读写次数,如果每次传输的数据很少,那么传输的次数就要增加。如果使用缓冲区,待缓冲区满后再读出,次数就减少了。

分类

全缓冲:缓冲区填满时才调用IO操作。磁盘文件通常是全缓冲。

行缓冲:遇到'\n'换行符才调用IO操作,但是缓冲区满了没遇到'\n'也会调用IO操作。如命令行输入。

无缓冲:不进行缓冲。有的时候我们希望数据第一时间显示出来,比如显示错误信息stderr(标准错误)。

缓冲区的刷新

  • 缓冲区满
  • 关闭文件
  • C++中提供了flush

缓冲区刷新时,会进行IO操作把数据读出

缓冲区溢出

计算机向缓冲区填充数据时超过了缓冲区本身的容量,溢出的数据覆盖到了合法数据上。

原因:没有检查用户输入的合法性。

4、协程

协程,又叫微线程,是一种用户态的“线程”,其实是一种函数。

线程、进程都是内核管理创建销毁等等,但是协程完全由程序控制,完全由程序员来调度,所以协程都在用户态下。线程、进程在多核情况下能进行并行,但是协程不行。

优点

  1. 协程的切换开销很小,和内核没有关系,也不需要同步机制。
  2. 单线程内就能实现高并发的效果。

缺点

  1. 协程无法利用多核资源。
  2. 协程阻塞将导致整个线程阻塞。

在Python中,可以使用yield/send来使用协程。

协程执行到yield会阻塞,然后等待send进来一个东西再继续执行

def consumer():
print("开始吃")
while True:
str = yield
print("吃了" + str) if __name__ == '__main__':
con = consumer() #消费者对象
next(con)
food = ["西瓜", "蛋糕", "馒头"]
for i in food:
print("生产了" + i)
con.send(i)
# 输出:
开始吃
生产了西瓜
吃了西瓜
生产了蛋糕
吃了蛋糕
生产了馒头
吃了馒头

操作系统 part3的更多相关文章

  1. 秋招C++面试相关总结索引

    C++相关 C++ part1 C++ part2 C++ part3 C++ part4 C++ part5 C++ part6 C++ part6.5 C++ part7 C++ part8 C+ ...

  2. Linux内核分析——操作系统是如何工作的

    万子惠 + 原创作品转载请注明出处 + <Linux内核分析> 实验部分 使用实验楼的虚拟机打开shell 然后cd mykernel 您可以看到qemu窗口输出的内容的代码mymain. ...

  3. [自制操作系统] BMP格式文件读取&图形界面系统框架/应用接口设计

    本文将介绍在本人JOS中实现的简单图形界面应用程序接口,应用程序启动器,以及一些利用了图形界面的示例应用程序. 本文主要涉及以下部分: 内核/用户RW/RW调色板framebuffer共享区域 8bi ...

  4. 30天自制操作系统day2汇编语言

    <30天自制操作系统>一书中第1天和第二天中有关汇编语言的程序的理解 ; hello-os ; TAB=4 ORG 0x7c00 ; 指明程序的装载地址 ; 以下的记述用于标准FAT12格 ...

  5. 操作系统篇-调用门与特权级(CPL、DPL和RPL)

    || 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.前言 在前两篇文章(<操作系统篇-浅谈实模式与保护模式>和<操作系统篇-分段机制与GDT|LDT>)中,我们提到 ...

  6. Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级

    Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 5.安装Database软件 5. ...

  7. 操作系统篇-分段机制与GDT|LDT

    || 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.前言     在<操作系统篇-浅谈实模式与保护模式>中提到了两种模式,我们说在操作系统中,其实大部分时间是待在保护模式中的. ...

  8. 操作系统篇-hello world(免系统运行程序)

     || 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.前言     今天起开始分享关于操作系统的相关知识,本人也是菜鸟一个,正处于学习阶段,这整个操作系统篇也是我边学习边总结的一些结果,希 ...

  9. Linux实战教学笔记03:操作系统发展历程及系统版本选择

    标签(空格分隔): Linux实战教学笔记-陈思齐 第1章 Linux简介 1.1 什么是操作系统? 简单讲:操作系统就是一个人与计算机硬件的中介. 操作系统,英文名称Operating System ...

随机推荐

  1. Windows10下Canvas对象获得屏幕坐标不正确的原因排查与处理

    因为Canvas没有直接将画布内容保存为图片的方法,所以很多时候是通过获得Canvas画布的坐标,然后通过截图的方式来将画布内容保存为本地图片. 如何取得Canvas画布的坐标呢,比较简单实用的方式如 ...

  2. 命令模式与go-redis command设计

    目录 一.什么是命令(Command)模式 二.go-redis command相关代码 三.总结 一.什么是命令(Command)模式 命令模式是行为型设计模式的一种,其目的是将一个请求封装为一个对 ...

  3. luogu P4116 Qtree3

    题目描述 给出N个点的一棵树(N-1条边),节点有白有黑,初始全为白 有两种操作: 0 i : 改变某点的颜色(原来是黑的变白,原来是白的变黑) 1 v : 询问1到v的路径上的第一个黑点,若无,输出 ...

  4. [Noip模拟题]Seq

    题目描述 由于hyf长得实在是太帅了,英俊潇洒,风流倜傥,人见人爱,花见花开,车见车载.有一群MM排队看hyf.每个MM都有自己独特的风格,由于hyf有着一颗包容的心,所以,什么风格的MM他都喜欢-- ...

  5. 计算机之路 -MySQL 初学

    照着电脑学了一天终于把MySQL装上了. 明天打算重新装一次 然后再自己记录一下步骤

  6. gRPC-go源码(1):连接管理

    1 写在前面 在这个系列的文章中,我们将会从源码的层面学习和理解gRPC. 整个系列的文章的计划大概是这样的:我们会先从客户端开始,沿着调用路径逐步分析到服务端,以模块为粒度进行学习,考虑这个模块是为 ...

  7. WIFI 国家码和信道划分

    前言 网上百度了很多资料,都没有找到国家码对应支持哪些信道的资料,无奈只能qiang到谷歌,分享给大家完整的WIFI 国家码和信道划分. 安卓WIFI国家码的影响 android中设置wifi国家码的 ...

  8. jmeter进行分布式压测过程与 注意事项

    jmeter命令行运行但是是单节点下的, jmeter底层用java开发,耗内存.cpu,如果项目要求大并发去压测服务端的话,jmeter单节点难以完成大并发的请求,这时就需要对jmeter进行分布式 ...

  9. https://nginx.org/en/docs/http/request_processing.html

    https://nginx.org/en/docs/http/request_processing.html

  10. WebServices 与 Web API 的区别

    WebServices : WebServices 是可以通过 Internet 访问并通过 XML 编码规范其通信的任何服务. 客户通过发送请求(大部分是 XML消息)来召唤 WebServices ...