【操作系统】设备管理
输入输出设备
首先我们来看这样一个场景:屏幕上有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。
其实也很简单,也就是说,将输入设备的绝对坐标转化为当前软件进程的相对坐标,再进行计算得到点击的是哪一个控件。
比如说外面知道了这个控件的坐标以及它的宽度和高度,我们就能计算出这个控件所覆盖的范围,那么我们就能知道他点的是哪一部分。
IO 的控制方式
- 演进过程:轮询 --> 中断 --> DMA --> IO 通道
- 经典布局:南北桥
- PS:详见《计算机组成原理》
IO 的实现
- 软件实现层次:硬件 --> 中断处理程序 --> 设备驱动程序 --> 独立于设备的 IO 软件 --> 用户空间的 IO 软件
- IO 缓冲:
- 解决问题:
- 设备与 CPU 速度不匹配
- 逻辑记录大小和物理记录大小不一致
- 减少 IO 操作对 CPU 的中断次数
- 实现:缓冲区
- 内存中开辟一个专门临时存放 IO 数据的区域
- 分类:单缓冲、双缓冲、多缓冲
- 解决问题:
磁盘
- 调度策略
- 移臂调度:以双向调度中的电梯调度算法为经典
- 旋转调度:写数据时采用交叉因子写入方式,可以提高旋转读数据的命中率
笔者将不定期更新【考研或就业】的专业相关知识以及自身理解,希望大家能【关注】我。
如果觉得对您有用,请点击左下角的【点赞】按钮,给我一些鼓励,谢谢!
如果有更好的理解或建议,请在【评论】中写出,我会及时修改,谢谢啦!
本文来自博客园,作者:Nemo&
转载请注明原文链接:https://www.cnblogs.com/blknemo/p/12811153.html