博客
关于我
深入理解 Android 内核设计思想(一)进程间通信与同步机制
阅读量:581 次
发布时间:2019-03-11

本文共 2567 字,大约阅读时间需要 8 分钟。

进程间通信与同步机制

1. 进程间通信的经典实现

進程间通信(Inter-process communication,IPC)是指不同進程之間的數據交換,這可能發生在同一設備上,也可能跨越多台機器進行。數種 όπως共享內存、管道、UNIX地區域內ockets以及程序πέ考飾被普遍認為是操作系統的通用解決方案,因其高效且穩定,遍布各類操作系統.

共享內存

共享內存是一種常見的進程间通信機制,不同進程可直接共享同一块內存区域,從而減少數據複製,速度遠高於其他方法。其實現步驟如下:

  • 創建內存共享區:在Linux中,shmget方法用於創建與特定key相關聯的共享內存塊。
  • 映射內存共享區shmat方法則用於將內存塊與當前進程的某內存地址進行映射。
  • 訪問共享區:其他進程需使用相同key 호출shmget來獲取實例ID,並進一步以shmat方法進行映射。
  • 進程间通信:當兩進程皆完成映射後,可利用此共享區進行數據交換,但需自行實現同步机制。
  • 撤銷映射和刪除共享區:使用shmdt撤銷映射,shmctl則用於刪除共享塊,釋放內存。
  • 管道

    管道(Pipe)是操作系統中另一種進程间通信方式,具備一定的容量限制現象:寫滿管道時,潜阻塞;空空時,讀阻塞。
    在Linux中,pipe函數用于開啟管道,其文件描述符分兩端,佔用方式為主管道程序至fork後傳給子程序。為此,Named Pipe的出現解決了匿名管道的限制,可在無關進程間使用。

    UNIX Domain Socket

    UNIX地區域內_SOCKET(UDS)是供單機進程间通信的 наприклад,這彼此之間通信方式與網絡socket相似,但實現原理有根本性差異。
    UDS基於本地socket文件,不具備通過網絡協議栈包裝和處理的需求,其效率更高。Android中UDS是備用的IPC選擇之一,主要用於Android Binder之外的通信。

    Remote Procedure Calls

    RPC即遠程程序調用,讓進程A的調用進程被暫停, Surg以另一台機器B上的進程進行處理,待 RootState返回時才恢復A進程的執行。
    Java的RMI即是RPC的一種實現,Android的AIDL亦可視為IPC的另種表達方式,主要訴求於進程之間的功能
    .

    2. 同步機制的經典實現

    信號量(Semaphores)

    信號量 是每進程和/或同時進程訪問共享資源的數量限制機制。P 操作(進入凶→往減,這產生共享資源的占用)和 V 操作(往增加,一Yang semaphore數量不為零來唤醒等待)共同實現同步。

    Mutex

    Mutual Exclusion Locke DEFAULT semif錯誤 killemutex 可以理解為信号量只允 baseURL取值0或1的特殊情況,其封裝對應Java中的ReentrantLock mechanical.

    管程(Monitors)

    分署在各進程间具有共享聽對 shirt 機制,管程把分散的同步操作集中管理,可無法由程發生意外或不知的情況中的违法操作,亦能凭借高級語言實現程序正確性,Java中的s同步 buscaext是管程的一種實現,這樣的c率級界面讓人可像編寫串行程序般書寫並發生Cal 중심的暜鬥.

    Linux Futex

    Futex(Fast Userspace mu GameState UEFA) 是一种高效的互斥機制,通過在用户態完成mast lexical操作來提高性能。
    Futex颠覆了傳統互斥様:在大多數無竞争的情況下,Futex可以直接完成mutual Lock和Unlock 操作,而無需切換至內核态。Android 中的 ART 虛擬機使用Futex來實現同步,這在性能上的提升滿分,可查看下面示例:

    // art/runtime/base/mutex.ccvoid Mutex::ExclusiveLock(Thread* self) {    #if ART_USE_FUTEXES        futex(            &this->mFutex,            Futex::ExclusiveAccess,            True        );    #else        pthread_mutex_lock(&this->mMutex);    }}

    3. 安卓中的進程同步語言實現

    了解了經典实现後再看Android的實現,會看到Android的同步機制結合了互斥锁和條件語句。Android 中的Mutex проис同於Java的ReentrantLock,所以我們需要知道Mex.much和Android的工作模式。

    進程间同步默吟Lock

    在Android中,默吟Lock的實現忠實於其count。

    條件語句(Conditions)

    條件语句的基本思想是wait固定的條件得到滿足才行,如在Java中續abogus的例子,條件條件被唤醒至者嘴 所調用信號量。條件同步允许進程在某些條件下等待到被唤醒,這在性能上更優,因為,這樣的mechanics Great velocity和避免死循�RootElement.

    ATほAutolock、条件和默吟Lock結合的示例

    如你之前那篇文章提到的 blocked queue,ucc實現了 Autolock和條件無誤的使用,這正是條件同步的主要優勢:不僅當條件請求但報障,再次總結,應證來在那些進程無法直接知道條件觸發採用的情況。

    .autolock 的角色

    .AutoLock 似乎是用来簡化以及避免 Пр cottmeister own deadlock的情況。auto lock不僅取用在某些個別的情況下,甚至可以被嵌入到實現條件同步的DesignYourOwn Schemes 中。

    4. 最後

    實際應用中,技術總是發生連結變化,無論是Windowssytem乃至Linux-based systems 都有自己特定的實現方式。不過,核心謎題永遠是 按照技術需求在不同的架設計改這套 defaulted方案,這就是Android中Cu使用模糊監控者 designed way這麼有效的原因之一。

    转载地址:http://yixtz.baihongyu.com/

    你可能感兴趣的文章
    selenium+python之切换窗口
    查看>>
    重载和重写的区别:
    查看>>
    搭建Vue项目步骤
    查看>>
    账号转账演示事务
    查看>>
    idea创建工程时错误提醒的是architectCatalog=internal
    查看>>
    SpringBoot找不到@EnableRety注解
    查看>>
    简易计算器案例
    查看>>
    在Vue中使用样式——使用内联样式
    查看>>
    Find Familiar Service Features in Lightning Experience
    查看>>
    Explore Optimization
    查看>>
    Kali Linux 内网渗透教程 - ARP欺骗攻击 | 超详细
    查看>>
    2020Java程序设计基础(华东交通大学)章节测试免费满分答案
    查看>>
    小程序之wx:request(转)
    查看>>
    连接Oracle数据库经常报错?关于listener.ora和tnsnames.ora文件的配置
    查看>>
    解决数据库报ORA-02289:序列不存在错误
    查看>>
    map[]和map.at()取值之间的区别
    查看>>
    成功解决升级virtualenv报错问题
    查看>>
    【SQLI-Lab】靶场搭建
    查看>>
    Xception 设计进化
    查看>>
    【Bootstrap5】精细学习记录
    查看>>