Android如何跨进程同步

Android如何跨进程同步,第1张

两个进程要进行同步,如果用IPC机制通信来同步,那么就会遇到一个问题,那就是这两个进程必须都已经启动才可以,如果遇到一个进程启动,但是另外一个进程不知道什么时候启动,这个办法就很难行得通了。

这时候就可以用到Android系统根据java提供的 FileLock 类

1.FileLock是线程安全的

2.FileLock适用于进程间文件读写控制,不适用于同一进程的不同线程

3.分为共享锁和独占锁,共享锁允许其他进程同样获取共享锁,独占锁不允许其他进程获得锁。

4.有两种方式获得文件锁,FileChannel的lock和tryLock,用lock会阻塞当前线程,直到获取到锁,用tryLock会尝试获取,如果获取失败则返回null,不会阻塞线程。

5.FileLock释放的条件是:自己调用release/close或者所使用的FileChannel调用close或者是JVM终止运行。

6.文件锁的效果是与 *** 作系统相关的。一些系统中文件锁是强制性的,当Java的某进程获得文件锁后, *** 作系统将保证其它进程无法对文件做 *** 作了。而另一些 *** 作系统的文件锁是询问式的(advisory),意思是说要想拥有进程互斥的效果,其它的进程也必须也按照API所规定的那样来申请或者检测文件锁,不然将起不到进程互斥的功能。所以文档里建议将所有系统都当做是询问式系统来处理,这样程序更加安全也更容易移植。

我们这里用的就是独占锁。

这个是先运行的获取锁的类,获取锁后持有10s后释放。

这个类是在第一个类运行后再运行的类,此时该进程会一直等到FileLockTest释放锁后才能获得锁然后继续运行。我们可以在获得锁之后do any thing you want,从而实现进程间同步。

多次运行后可能有人会发现有时候先打印获得锁后打印释放锁,其实是这样的,这是两个进程,一个进程释放锁之后另外一个进程才可能获得锁,但是两个进程的打印时间的执行不是同步的,所以不一定是先打印释放锁,只要时间基本一致即可(本人多次运行时间差小于2ms)。

通过这两个类的分别运行,可以看到即使不是都启动完成,一样可以跨进程同步。

uvm_eventaxi_busy_flag_ev

axi_busy_flag_ev = uvm_event_pool:get_global($sformatf("xxxx"))

同步发起地方触发

axi_busy_flag_ev.trigger()

需要同步的地方,可以在seq里同步用来控制仿真结束。而不需要用到 start_phase.raise/drop_objection尤其是 uvm_do调用的sequence。

这一段可以用来控制仿真结束。(在不同组件之间同步)

对于同一个文件,比如reference model,用run_phase控制结束信号,可以用单bit信号,不需要用 event

bit axi_busy_flag

在采到axi接口transaction时,将 axi_busy_flag = 1;

在run_phase

同步和通讯的目的是一样的,实现进程间数据共享,同步只是为了做到处理协同。共享内存在Win9X平台上是有的,在NT内核以后就没有这一说了,因为进程地址空间不再有共用部分Linux :通信就是说进程之间传递数据。常见的方法有 pipe(管道),FIFO(命名管道),socket(套接字),SysVIPC 的 shm(共享内存)、msg queue(消息队列),mmap(文件映射)。以前还有 STREAM,不过现在比较少见了(好像)。同步的意思是说,让不同进程能够在同时到达一个已知的特定状态之前等待另一方的执行。Linux 下常见的同步方法有SysVIPC 的 sem(信号量)、file locking / record locking(通过 fcntl 设定的文件锁、记录锁)、futex(基于共享内存的快速用户态互斥锁)。针对线程(pthread)的还有 pthread_mutex 和 pthread_cond(条件变量)。除了这些特定的同步对象之外,还有一些同步方法是与通信方法不可分离的,包括:对 pipe/FIFO/socket 和 msg queue 的阻塞等待、对子进程退出事件的等待(wait族)、对线程退出时间的等待(pthread_join)另外还有一个不能不提的,就是信号。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11969487.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存