zoukankan      html  css  js  c++  java
  • 操作系统 part3

    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操作。磁盘文件通常是全缓冲。
    行缓冲:遇到' '换行符才调用IO操作,但是缓冲区满了没遇到' '也会调用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)
    # 输出:  
    开始吃  
    生产了西瓜  
    吃了西瓜  
    生产了蛋糕  
    吃了蛋糕  
    生产了馒头  
    吃了馒头
    
  • 相关阅读:
    在IIS中设置默认网页
    vim 查找匹配字符串次数
    resource about NLP
    Mongodb基本知识和常用语法
    fudanNLP keyword Extraction
    nltk support chinese by sinica
    Gmail小技巧:只显示未读邮件
    java get line number and file name
    java classpath import package 机制
    linux 调用 fudanNLP
  • 原文地址:https://www.cnblogs.com/KirinSB/p/12701670.html
Copyright © 2011-2022 走看看