# Linux系統的IPC
**線程之間不存在通信,因為本來就共享同一片內存**
各個線程可以訪問進程中的公共變量,資源,所以使用多線程的過程中需要注意的問題是如何防止兩個或兩個以上的線程同時訪問同一個數據,以免破壞數據的完整性。數據之間的相互制約包括
1、直接制約關系,即一個線程的處理結果,為另一個線程的輸入,因此線程之間直接制約著,這種關系可以稱之為同步關系
2、間接制約關系,即兩個線程需要訪問同一資源,該資源在同一時刻只能被一個線程訪問,這種關系稱之為線程間對資源的互斥訪問,某種意義上說互斥是一種制約關系更小的同步
## 線程間同步
* 臨界區
* 每個線程中訪問臨界資源的代碼,一個線程拿到臨界區的所有權后,可以多次重入.只有前一個線程放棄,后一個才可以進來
* 互斥量
* 互斥量就是簡化版的信號量
* 互斥量由于也有線程所有權的概念,故也只能進行線程間的資源互斥訪問,不能由于線程同步
* 由于互斥量是內核對象,因此其可以進行進程間通信,同時還具有一個很好的特性,就是在進程間通信時完美的解決了"遺棄"問題
* 信號量
* 信號量的用法和互斥的用法很相似,不同的是它可以同一時刻允許多個線程訪問同一個資源,PV操作
* 信號量也是內核對象,也可以進行進程間通信
## 進程間通信
* 管道
* 半雙工
* 只能在具有父子關系的進程間使用
* FIFO的共享內存實現
* 命名管道
* 以linux中的文件的形式存在
* 不要求進程有用父子關系,甚至通過網絡也是可以的
* 半雙工
* 信號量
* 有up和down操作
* 共享內存實現
* 消息隊列
* 隊列數據結構
* 共享內存實現
* 信號
* 較為復雜的方式,用于通知進程某事件已經發生.例如kill信號
* 共享內存
* 將同一個物理內存附屬到兩個進程的虛擬內存中
* socket
* 可以跨網絡通信
- JavaSE(Java基礎)
- Java基礎知識
- Java中的內存泄漏
- String源碼分析
- Java集合結構
- ArrayList源碼剖析
- HashMap源碼剖析
- Hashtable簡介
- Vector源碼剖析
- LinkedHashMap簡介
- LinkedList簡介
- JVM(Java虛擬機)
- JVM基礎知識
- JVM類加載機制
- Java內存區域與內存溢出
- 垃圾回收算法
- Java并發(JavaConcurrent)
- Java并發基礎知識
- 生產者和消費者問題
- Thread和Runnable實現多線程的區別
- 線程中斷
- 守護線程與阻塞線程的情況
- Synchronized
- 多線程環境中安全使用集合API
- 實現內存可見的兩種方法比較:加鎖和volatile變量
- 死鎖
- 可重入內置鎖
- 使用wait/notify/notifyAll實現線程間通信
- NIO
- 數據結構(DataStructure)
- 數組
- 棧和隊列
- Algorithm(算法)
- 排序
- 選擇排序
- 冒泡排序
- 快速排序
- 歸并排序
- 查找
- 順序查找
- 折半查找
- Network(網絡)
- TCP/UDP
- HTTP
- Socket
- OperatingSystem(操作系統)
- Linux系統的IPC
- android中常用設計模式
- 面向對象六大原則
- 單例模式
- Builder模式
- 原型模式
- 簡單工廠
- 策略模式
- 責任鏈模式
- 觀察者模式
- 代理模式
- 適配器模式
- 外觀模式
- Android(安卓面試點)
- Android基礎知識
- Android內存泄漏總結
- Handler內存泄漏分析及解決
- Android性能優化
- ListView詳解
- RecyclerView和ListView的異同
- AsyncTask源碼分析
- 插件化技術
- 自定義控件
- ANR問題
- Art和Dalvik的區別
- Android關于OOM的解決方案
- Fragment
- SurfaceView
- Android幾種進程
- APP啟動過程
- 圖片三級緩存
- Bitmap的分析與使用
- 熱修復的原理
- AIDL
- Binder機制
- Zygote和System進程的啟動過程
- Android中的MVC,MVP和MVVM
- MVP
- Android開機過程
- EventBus用法詳解
- 查漏補缺
- Git操作