flaming-cl / 61C

1 stars 0 forks source link

I/O #14

Open flaming-cl opened 3 years ago

flaming-cl commented 3 years ago

I/O device speeds

Screen Shot 2021-06-08 at 4 54 14 PM

Memory Mapped I/O

RISC-V uses loads for input, stores for output (MMIO) (Some processors may have special input and output instructions) 某些物理地址是用来响应 I/O 设备的 假设 CPU 要和键盘交互,每次 CPU 和键盘交互时,都会去到某个物理地址 I/O chunk 包含两个部分:control register (if I/O is ready) & data register (这里的 register 和 cpu 里的 register 不是一个概念,就是一个约定俗成的名字)

Polling

  1. processor 循环读取 control register,等 I/O 准备好了,设置 Ready bit -> 1
  2. processor 读取(input)或写入(output)数据进 data register 再重置 ready bit 为 0

Polling RISC-V Example

Screen Shot 2021-06-07 at 2 43 25 PM

Polling cost

一个小例子: 假设我们在一台主频为 1GHz 的机器上,使用 400 clock cycles/polling 的鼠标(鼠标polling 30 次/s 来避免错过用户操作) 每秒鼠标 polling 耗费的 clock cycles = 30 400 = 12K % Processor for polling: 12 10^ 3 / (1 * 10^9) = 0.0012% (可以看出鼠标 polling 不怎么吃性能,但如果是 hard disk polling,就没这么轻松了) 为了解决 polling 造成的资源浪费,我们可以用 exception 来帮着触发 I/O,当 I/O 完成数据传输的时候,我们用 interrupt 中断当前进程。

Interrupt

Whenever it's convenient, just don't wait too long.

没必要像警犬一样竖着耳朵监听 I/O 操作: 假设家人出门没带钥匙,要我们帮着开门。 我们在卧室看书,也不知道家人什么时候到家,于是看会书就跑去阳台,看看人回来了没 (polling) 实际上,大多数人都不会这样做,而是先专注做自己的事情,等门铃响了再去开门。

等门铃响,就很像 interrupt 机制

等 I/O 准备好了,中断当前进程,并把 control 传给 interrupt handler 注:interrupt 是异步的,也是由外部事件引起的,e.g. disk I/O; key press interrupt 不会组织任何指令完成,只是中断它;interrupt 也不和任何指令相关联,但它可能在某个指令运行的时候突然出现 Screen Shot 2021-06-08 at 8 46 43 PM (第5步,I/O完成之后跳回之前正在运行的指令)

Exception

Drop whatever you are doing and act now.

exception 是同步的,exception 发出以后,就要停下当前进程,去运行 exception e.g. divide by 0; bus error; illegal memory access; syscall; overflow error C 语言最常见的 exception: segmentation fault (core dumped)

Exception 步骤

异常出现、存储PC和registers、转向 trap handler、执行 handler 代码、恢复 registers 和 PC

Trap

执行 interrupt 或 exception 时, 跳转去 "interrupt or trap handler" 的过程

Polling vs. Interrupts

Low data rate(e.g. 鼠标、键盘)

用 interrupts 就好,避免一直傻等 I/O ready

High data rate(e.g. network, disk)

一开始用 interrupts 等数据,等开始拿数据以后,转为 polling(keep grabbing data until it stops:假设总共要收一吨货,来一点搬一点,比等货都运到了再卸车高效)

Real Solution: Direct Memory Access (DMA)

I/O 设备那么多,各个都要引起 CPU 的注意,这不是很心累么 CPU 干脆把 I/O 处理外包给别人——DMA engine

  1. 设备 controller 直接传输数据去 memory,没 processor 什么事
  2. 数据传输结束时,per page 只 interrupt 一次

    programmed I/O (PIO) vs. DMA

    Screen Shot 2021-06-08 at 9 08 12 PM 来自 SU20 视频的小比喻: polling: 去餐厅等餐,半天不上菜,一直问菜好了吗 interrupt:线上预点单,菜好了去取餐 DMA:点外卖,等餐取餐送餐让外卖小哥搞定

    Operation of a DMA transfer

    Screen Shot 2021-06-08 at 9 19 04 PM