𝓝𝓮𝓶𝓸&博客

【操作系统】设备管理

输入输出设备

首先我们来看这样一个场景:屏幕上有N个按钮,我们随意点击其中一个,手机怎么知道我点的是哪一个?

可能有小伙伴会问:这不是很简单吗?因为你点了屏幕啊,屏幕知道你点的是哪个按钮就行了啊。

但是事情不是这样。在冯诺依曼的计算机模型中,我们常说的屏幕被分为显示屏和触摸屏,分别表示输出设备、输入设备。

与一般的输入设备键盘不同,触摸屏只能接收到手指在屏幕上的坐标。在收到坐标信息之后,它将物理信号转化为二进制的数据,并交给操作系统去处理。

具体到Android系统中,它的整个单击事件处理流程是这样的:

1、触摸屏收到坐标
2、将坐标信息转为二进制信息交给Android
3、Android系统将触摸事件再进行一次封装,并交给当前页的Activity
4、activity把触摸事件再传递给PhoneWindow,PhoneWindow再传递给DecorView
5、DecorView继承自FrameLayout,FrameLayout继承自ViewGroup
6、最后知道手指点了哪个按钮的就是ViewGroup,使用的方式是最简单粗暴的遍历

说来惭愧啊,本来我是想通过Android源码来找找灵感。看看能不能找到更简单、高效的方法解决“碰撞检测”问题,结果找了半天发现原来小丑竟在我身边。。。

不过这波源码查找也不是完全没有收获的,至少我现在知道
1、Window这个抽象类的唯一子类就是PhoneWindow
2、Dialog、Activity它们的setContentView方法实际上就是在往DecorView中添加View

总结:
1.遍历根目录中的子控件,如果某个子控件区域包含点击坐标,停止根目录的子控件的判断,递归调用先前找的子控件,直到遍历结束。
2.如果遍历最后一层视图结束时,ViewGroup中没有找到子控件,就返回ViewGroup。

其实也很简单,也就是说,将输入设备的绝对坐标转化为当前软件进程的相对坐标,再进行计算得到点击的是哪一个控件。
比如说外面知道了这个控件的坐标以及它的宽度和高度,我们就能计算出这个控件所覆盖的范围,那么我们就能知道他点的是哪一部分。

http://t.csdn.cn/WUkXI

IO 的控制方式

  • 演进过程:轮询 --> 中断 --> DMA --> IO 通道
  • 经典布局:南北桥
  • PS:详见《计算机组成原理》

IO 的实现

  • 软件实现层次:硬件 --> 中断处理程序 --> 设备驱动程序 --> 独立于设备的 IO 软件 --> 用户空间的 IO 软件
  • IO 缓冲:
    • 解决问题:
      • 设备与 CPU 速度不匹配
      • 逻辑记录大小和物理记录大小不一致
      • 减少 IO 操作对 CPU 的中断次数
    • 实现:缓冲区
      • 内存中开辟一个专门临时存放 IO 数据的区域
    • 分类:单缓冲、双缓冲、多缓冲

磁盘

  • 调度策略
    • 移臂调度:以双向调度中的电梯调度算法为经典
    • 旋转调度:写数据时采用交叉因子写入方式,可以提高旋转读数据的命中率
posted @ 2020-05-31 14:41  Nemo&  阅读(163)  评论(0编辑  收藏  举报