zoukankan      html  css  js  c++  java
  • Android 4.4 Fence在SurfaceFlinger中的应用

             网上关于android。fence的资料好少啊。差点儿没有,可是这个机制又在GUI系统中起着关键的数据,于是自己通读源代码和凝视。与大家分享下Fence究竟是怎么回事?

             Fence即栅栏。栅栏的角色与它的名字很类似.一组线程能够使用栅栏来集体进行相互同步;在本质上,每一个线程在到达某种周知的状态时调用栅栏的wait()方法,堵塞起来,以等待其他全部參与线程调用wait()方法表明它们也到达了这个状态.一旦全部的线程都到达栅栏,它们就会集体解除堵塞,并一起继续运行;引起程序调用栅栏的wait()方法进行堵塞的那个状态叫做栅栏状态;

       本篇主要讲述fencesurfaceflinger中的应用的理论基础。确切的说fenceproducerconsumerbuffer处理的过程中是怎样协调他们同步的工作,从而保证buffer内容的准确性。而不会被篡改。

       首先我们知道一个buffer有下面几种状态:

       FREE->DEQUEUED->QUEUED->ACQUIRED->FREE

        FREE状态时,producer就能够申请他了吗?答案是错的,他须要等一个signal。也就是NO_FENCE这个信号,由于有可能上一次申请的buffer正在被consumer作业中,所以要等待consumer发出finish的信号,而此时FREE状态下的buffer就好像被栅栏拦住了,这里是用Fencewait()或者waitForever()方法。等一个NO_FENCCE信号,栅栏就会打开。进入到下一流程。

       DEQUEUED是指producer已经申请了一个buffer从队列中出来了,还没有入队列或者取消buffer。这个状态下的bufferproducer想对其进行改动也就是填入UI数据时,必须等一个NO_FENCE信号。由于有可能其它owner正在对它进行操作。当信号一到,poducer就能够对其进行操作,操作完毕后发出一个NO_FENCE信号。

       QUEUED状态下。也就是把buffer入队列,只是在这个操作前须要等一个NO_FENCE信号,就比方上一步dequeueBuffer完毕之后发的NO_FENCE.收到信号后才进行入队列操作或者取消buffer操作。

    这个时候它的owner就变成BufferQueue了。

       ACQUIRED状态也就是producer已经对buffer填充完毕,与前面一样它也要等到一个NO_FENCE信号,然后consumer才干对其进行操作。

    操作完毕后会释放buffer,然后发出一个NO_FENCE 信号。

         这下大概知道Fence的工作流程了吧。

         当先前的全部者发出一个工作被完毕的时候,fence就会发一个信号。当一个bufferfree的时候,消费者已经完毕了从buffer里读出来东西或者假设它在queuebuffer一些操作之后调用了cancelBuffer当生产者完毕了对buffer的写操作。假设当buffer处于QUEUED状态时,这表明了生产者完毕了对buffer的填充。当buffer处于DEQUEUEACQUIRED状态时,fence已经被传给了消费者或者生产者连同buffer的所属者。这个时候fence被置为NO_FENCE.

     

  • 相关阅读:
    【Oracle】IF语句
    【Oracle】PL/SQL中对空字符串的判断
    【读书笔记】沉默的大多数
    【Oracle】包及包的调用
    Android (争取做到)最全的底部导航栏实现方法 ZZ
    一个屌丝程序猿的人生(一百一十七)
    一个屌丝程序猿的人生(一百一十六)
    一个屌丝程序猿的人生(一百一十五)
    DIV_ROUND_UP(x,y)实现x/y向上取整
    SMI(MDC/MDIO)总线接口介绍
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6952146.html
Copyright © 2011-2022 走看看