操作系统基础(一)

一、电脑开机流程

  • 加载BIOS:检查硬件
  • 加载引导程序
  • 初始化内核
  • 加载设备驱动程序
  • 启动系统服务

同步 & 异步

  • 同步
    • B收到A的调用,立即干活,A本次调用可以获得结果
  • 异步
    • B收到A的调用,不一定立刻干活,但保证一定将会干,做好通知A,本次调用得不到结果

阻塞 & 非阻塞

  • 阻塞
    • A调用后等B返回结果
  • 非阻塞
    • A调用后干自己的事

二、操作系统的IO模型

  • 同步阻塞IO模型
    • 类似于排队去窗口办事,到号之前只能等待
  • 同步非阻塞IO模型
    • 类似于到窗口办事,发现没有人,每过一会儿来看看人来没来,知道看见人来了,开始办事。在循环查看人来没来的时间里,可以回家干自己的事
  • IO复用模型
    • 类似于去大厅办业务,所有窗口都有人了,于是要等空出来一个窗口,再过去办事,但是只知道有空窗口,不知道是几号,还要自己挨个找
  • 信号驱动IO模型
    • 你和大堂经理说有空窗口了要告诉自己,没一会儿,大堂经理由于你是VIP给你专门开了一个柜台办理业务
  • 异步IO模型
    • 你是大老板,直接告诉大堂经理办好业务喊自己来验收,这个过程中你还是可以去谈生意(做自己的事)

select、poll、epoll(Linux IO多路复用技术)

  • 用于同时监听多个文件描述符,任意一个文件描述符就绪,则可以非阻塞读写数据
  • select
    • 最原始的IO多路复用技术,最多监听len(fd) = 1024个文件描述符
    • 遍历所有fd
    • 把fd从用户态copy到内核态
  • poll
    • 监听更多,复杂度高,len(fd) = no limit
    • 遍历所有fd
    • 把fd从用户态copy到内核态
  • epoll
    • 在poll基础上优化了复杂度,更多。更高效,len(fd) = no limit
    • 不遍历所有fd
    • 把fd从用户态copy到内核态
    • LT模式:默认模式
      • epoll_wait检测到描述符事件发生并将此事件通知应用程序,应用程序不立即处理,下次调用epoll_wait会再次响应并通知这个事
    • ET模式
      • epoll_wait检测到描述符事件发生并将此事件通知应用程序,应用程序立即处理。如果不处理,下次调用不会响应应用程序并通知此事件
      • 减少了epoll事件被重复触发的次数,效率高
      • 必须使用非阻塞socket,避免由于一个文件句柄的阻塞读/写操作把处理多个文件描述符的任务饿死

三、零拷贝

  • 普通读写流程
    • 用户read发起系统调用,用户态转内核态,MDA将磁盘数据拷贝到内核缓冲区
    • DMA结束,发起一个中断通知CPU数据拷贝完成,CPU将内核态数据拷贝到用户态
    • 内核唤醒对应线程,同时将用户态数据返回给线程空间
    • 用户态线程进行业务处理
    • 服务器对请求进行响应,发起系统调用,内核将用户态数据拷贝到内核态
    • 复制完毕后,网络适配器通过DMA将内核缓冲区数据拷贝到网卡。结束后内核态转用户态
    • 网卡发送数据
  • 零拷贝
    • 特殊情况下,减少数据拷贝次数、减少CPU参与数据拷贝的次数
    • mmap
      • 内存映射,将用户态和内核态的内存映射到一起,避免来回拷贝,之后就可以采用指针来读写内存
      • 这样只需要3次拷贝、4次上下文切换
      • mmap采用基于缺页异常的懒加载模式
      • 必须指定好内存映射的大小,不适合变长文件
      • 在文件更新后通过OS自动将脏页写回disk
      • 需要连续内存,不适合超大文件
    • sendfile
      • 只做文件传输,数据拷贝3次,上下文切换2次
    • DMA
      • 直接将IO设备的数据拷贝到内核缓冲区
      • IO设备到内核之间数据拷贝不需要CPU参与
    • directIO
      • 不经过内核态,用户态和设备直接交互,快
      • 可以直接将文件写入磁盘,但文件相关元信息还要通过fsync缓存到内核空间

四、分段 vs 分页

  • 分段
    • 进程中代码、常量、变量,要使这些代码所在的空间不与运行时的堆栈空间冲突
    • 让每个段独享一部分可以自然增长的空间且与其他段相互隔离
    • 程序员感知
    • 地址空间可以超过物理空间
    • 不同用户可以共享
    • 不定长
    • 使程序和数据划分为逻辑上独立的空间
  • 分页
    • 把物理内存按固定大小分为页面,细粒度管理物理内存和虚拟空间的映射,高效利用物理内存
    • 用户访问到虚拟地址若未分配物理地址:缺页中断。将目标页面加到页框,修改MMU的映射关系
    • 程序员不感知
    • 地址空间可以超过物理空间
    • 不同用户不可共享
    • 定长
    • 获得更大的线性地址空间
  • 页表
    • 虚拟页号 + 偏移量 + 实际页框号
    • 虚拟地址到物理地址映射需要时间:快表TLB
    • 如果虚拟地址空间很大,页表就会很大,浪费空间
      • 多级页表:避免所有页表保存在内存中,只保留需要的页表
      • 倒排页表:结合TLB

负载 vs CPU利用率

  • 负载
    • 一段时间内系统等待处理的工作量
    • 负载平均:过去1min、5min、15min内运行队列的平均长度
    • 运行队列长度:某一时刻处于就绪队列和运行状态的进程数量的和,包括正在使用CPU的进程和等待CPU的进程
  • CPU利用率
    • CPU正在执行指令的时间比例
  • CPU利用率:忙碌程度(资源使用效率),负载:系统中等待运行的工作量

五、进程 vs 线程

  • 进程
    • 系统进行资源分配和保护的基本单位
    • 程序在计算机上的一次执行
    • 拥有资源、内存空间
    • 切换开销大
  • 线程
    • 处理器调度和分派的基本单位
    • 线程共享进程资源
    • 更轻量,包括程序、数据、TCB
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值