可见性涉及的底层硬件原理

目录

基础概念

可见性问题

MESI 协议同步实现

flush处理器缓存

refresh处理器缓存


基础概念

【摘自网络】

  • 寄存器:(register)寄存器是 CPU 内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。它的功能是存储二进制代码,它是由具有存储功能的触发器组合起来构成的。一个触发器可以存储1位二进制代码,故存放n位二进制代码的寄存器,需用n个触发器来构成。
  • 高速缓 存:(Cache)其原始意义是指存取速度比一般随机存取记忆体(RAM)来得快的一种RAM,一般而言它不像系统主记忆体那样使用DRAM技术,而使用昂贵但较快速的SRAM技术,也有快取记忆体的名称。

       高速缓冲存储器是存在于主存与CPU之间的一级存储器, 由静态存储芯片(SRAM)组成,容量比较小但速度比主存高得多, 接近于CPU的速度。在计算机存储系统的层次结构中,是介于中央处理器和主存储器之间的高速小容量存储器。它和主存储器一起构成一级的存储器。高速缓冲存储器和主存储器之间信息的调度和传送是由硬件自动进行的。

  • 写缓冲器:写缓冲器是一个非常小的告高速存储缓冲器,用来临时存放处理器将要写入到主存中的数据,然后写缓冲器再以低速写入主存中。这就将高速的CPU和cache从对主存的低速读写中脱离了出来。

可见性问题

1、每个处理器都有自己的寄存器(register),所以多个处理器各自运行一个线程的时候,可能导致某个变量存放在各自的寄存器中,其他处理器无法看到该处理器的变量值修改;

2、处理器运行的线程对变量的修改要保存在写缓存器,而不是直接更新到主内存中,其他处理器无法获得最新的变量;

3、有些系统会在保存变量在写缓存器后,同步更新到高速缓存,并且会把这个更新通知给其他处理器,但其他处理器可能把这个更新放到无效队列中,导致没有更细各自的缓存。

上面三种情况出现可见性问题,底层硬件确定通过了一个 MESI 协议,不同的底层系统,针对可见性问题会有不同的实现

MESI 协议同步实现

MESI 协议、flush处理器缓存和refresh处理器缓存整套机制来保证可见性的。

flush处理器缓存

会将更新的变量(强制)刷新到高速缓存(或者主内存),并发送一个消息到总线,通知其他处理器,某个变量的值被修改了。

refresh处理器缓存

处理器从总线嗅探,发现其他处理器中变量更新的消息,必须强制会从其他高速缓存(或是主内存)中读取这个最新的值,并更新到自己的高速缓存。

 

<think>好的,用户想了解Android中OnTouchEvent的底层实现机制,包括触摸屏事件分发、原理实现机制。首先,我需要回忆一下Android的事件分发流程,确保自己理解正确。 根据用户提供的引用[^1]和[^2],事件分发是从根视图开始,逐级向下询问是否拦截,最后到达具体的View。而OnTouchEvent是处理触摸事件的方法,同时涉及onTouch、onClick等回调的关系。 首先,我应该从硬件层开始解释,触摸事件如何从屏幕硬件传递到内核,再通过Android框架的InputManagerService处理。这部分可能涉及到Linux的输入子系统,比如/dev/input下的设备节点,以及事件的上报流程。 接下来是系统层的处理,InputReader读取原始事件,InputDispatcher将事件分发给合适的窗口。这里需要提到WindowManagerService的作用,确定哪个窗口应该接收事件,可能涉及Z-order和窗口的层级结构。 然后是应用层的事件分发流程。从ViewRootImpl开始,到DecorView,再逐级分发到Activity的各个子View。这里要详细说明ViewGroup的onInterceptTouchEvent方法和View的onTouchEvent方法,以及事件传递的顺序,比如从父View到子View,处理拦截的逻辑。 还要提到OnTouchListener和OnTouchEvent的关系,如果设置了OnTouchListener并且返回true,那么OnTouchEvent就不会被调用。同时,onClick和onLongClick是如何在onTouchEvent中被触发的,比如在ACTION_UP时检查点击时间,触发onClick。 可能需要补充一些关于事件分发的优化,比如事件序列的连贯性,同一个事件序列中的DOWN、MOVE、UP事件都会被同一个View处理,除非父View进行拦截。另外,触摸反馈的延迟处理,比如长按事件的触发机制,涉及到Handler的postDelayed方法。 用户的问题还涉及底层原理,所以需要解释触摸事件是如何从硬件到应用层的整个流程,可能包括内核驱动、系统服务、应用进程之间的通信机制,比如通过socket或者Binder。 需要确保使用正确的中文术语,避免翻译错误,比如“事件分发机制”、“拦截”、“消费事件”等。同时,检查是否有遗漏的关键点,比如MotionEvent的不同action(ACTION_DOWN, ACTION_MOVE等)的处理,以及ViewGroup和View在处理事件时的区别。 最后,生成的相关问题要围绕用户的需求展开,比如性能优化、事件冲突处理、自定义手势等,确保问题与主题紧密相关,并且能够帮助用户进一步深入学习。</think>### Android触摸事件底层实现机制分析 #### 1. 硬件信号接收(触摸屏驱动层) 当用户触摸屏幕时,硬件驱动会生成原始坐标数据,通过Linux内核的输入子系统传递到Android框架。触摸事件会被封装为`struct input_event`结构体,包含坐标、压力值、时间戳等信息。例如: $$ x=320,y=480,pressure=0.5,time=158000000 $$ #### 2. 系统级事件处理(Native层) Android的`InputManagerService`通过`EventHub`读取`/dev/input`节点数据,经过以下处理流程: - **InputReader**:将原始事件转换为Android标准事件 - **InputDispatcher**:通过跨进程通信(IPC)将事件分发给目标窗口 - **WindowManagerService**:根据Z-order确定窗口层级,使用Binder机制传递事件 #### 3. 应用层事件分发(Java框架层) 事件到达应用进程后,通过`ViewRootImpl`开始分发: ```java // 伪代码表示分发流程 public void deliverPointerEvent(MotionEvent event) { mView.dispatchPointerEvent(event); // mView即DecorView } ``` 具体流程包含三个阶段: 1. **拦截判断**:从根ViewGroup开始调用`onInterceptTouchEvent()` 2. **事件分发**:通过`dispatchTouchEvent()`逐级向下传递 3. **事件处理**:最终由`View.onTouchEvent()`处理具体操作 #### 4. OnTouchEvent核心实现(源码级解析) 在`View.java`中可见关键处理逻辑: ```java public boolean onTouchEvent(MotionEvent event) { // 检查View是否可用、点击状态等 if ((viewFlags & ENABLED_MASK) == DISABLED) return false; // 处理不同事件类型 switch (event.getAction()) { case MotionEvent.ACTION_DOWN: startLongClickCheck(); // 触发长按检测 break; case MotionEvent.ACTION_UP: performClick(); // 触发点击事件 break; } return true; // 表示已消费事件 } ``` 这里存在两个重要机制: 1. **长按检测**:通过`Handler.postDelayed()`延迟触发`OnLongClickListener` 2. **点击判断**:通过坐标差异计算(`slop`值)过滤无效点击 #### 5. 事件响应优先级 当存在多个监听器时,响应顺序为: $$ \text{OnTouchListener} \rightarrow \text{onTouchEvent} \rightarrow \text{OnClickListener} $$ 如果`OnTouchListener.onTouch()`返回true,将直接阻断后续事件处理 #### 6. 底层通信机制 应用进程通过`InputChannel`接收事件,该通道实际对应共享内存区域。事件数据通过`BitTube`(基于Unix域套接字)进行传输,这种设计保证了事件传递的高效性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值