操作系统基础

内容纲要

概念

  • 进程地址空间(进程虚拟地址)
    • 用户空间与内核空间(Linux)
    • 内核可以访问受保护内存空间,也有访问底层所有设备的权限
    • 为了保证内核安全(保证用户进程不能直接操作内核),将虚拟空间划分为用户空间和内核空间
    • 32位操作系统:2^32 = 4GB;内核空间 1GB(从虚拟地址0xC0000000到0xFFFFFFFF),用户空间 3GB(从虚拟地址0x00000000到0xBFFFFFFF)
    • 64位操作系统:2^48(不需要64那么大、过大会导致资源浪费) = 256T;内核、用户空间分别占128T
  • 进程切换(任何进程都在操作系统的内核支持下运行)
    • 可以挂起在 CPU 上运行的进程
    • 保存上下文(计数器、寄存器等)
    • 更新 PCB(进程控制块)信息
    • 把进程 PCB 移入相应的队列(就绪、在某事件阻塞等队列)
    • 可以恢复以前挂起的进程
    • 选择一个进程执行,更新其 PCB
    • 更新内存管理的数据结构
    • 恢复上下文
  • 进程阻塞、唤醒
    • 进程状态
    • 运行态:进程获得 CPU 并运行
    • 就绪态:进程具备运行条件,但尚未获得 CPU
    • 阻塞态:进程因等待某事件发生而暂时不能运行
    • 正在运行的进程,由于提出系统服务请求(如 I/O 操作)未得到系统的立即响应,该进程会调用阻塞原语把自己阻塞,等待相应事件出现后被唤醒
    • 只有处于获得 CPU 的进程才能将其转换为阻塞状态
    • 阻塞
    • 请求系统服务、I/O 操作等未得到即时响应
    • 找到要被阻塞进程的标识号对应的 PCB
    • 停止执行
    • 若该进程为运行状态(获得 CPU),则保护现场,改变状态为阻塞状态
    • 把 PCB 插入相应阻塞队列
    • 唤醒
    • 阻塞原因期待的事件出现
    • 把被阻塞的进程移出阻塞队列
    • 将 PCB 状态改为就绪状态
    • 将 PCB 插入到就绪队列中
  • 文件描述符(FD)(适用于 Unix、Linux;Windows 中通常叫 Handle)
    • 在 Linux 中,一切皆文件
    • 对所有文件(目录、字符设备、块设备、套接字、打印机、进程、线程、管道等)操作,读写都可用fopen()/fclose()/fwrite()/fread()等函数进行处理
    • 用于表述指向文件的引用的抽象化概念
    • 标准文件描述符
    • 0:标准输入;1:标准输出;2:标准错误
  • 缓存 I/O(标准I/O)
    • 工作过程
    • Linux 中,操作系统会将 I/O 的数据缓存在文件系统的页缓存中
      • 数据先被拷贝到操作系统内核缓冲区中
      • 再从内核缓冲区拷贝到应用程序地址空间
    • 缺点:开销大
    • 基于缓存 I/O 出现的模型
    • 阻塞 I/O
    • 非阻塞 I/O
    • I/O 多路复用
    • 信号驱动 I/O(不常用)
    • 异步 I/O

IO多路复用原理剖析

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注