Linux进程间通信和同异步机制
目录
- 进程或线程持有锁期间终止了,怎么办?
- 进程管理和调度
- 线程模型
- Linux 线程模型的比较:LinuxThreads 和 NPTL(从Linux 2.6版本开始,NPTL成为了Linux默认的线程库)
- System V 和 Posix 的区别(只需关注Posix即可, Posix其实是一种标准)
- 进程简介
- 进程创建
- 僵尸进程
- 进程间协作——信号
- 进程间通信——管道
- 文件上锁(用于进程间)
- POSIX线程
- 信号量、共享内存和消息队列
- 消息队列
- 信号量
- 共享内存
- 其它
- 线程池的思想
- 一个Linux应用程序需要包含信号处理函数,可以是禁用或者什么都不做
- 线程同步方式:互斥锁、条件变量、读写锁、信号量、文件锁和记录锁
- 进程间通信: 共享内存, 消息队列, 管道, 套接字, 信号(kill),信号量(更合适的说法应该是同步),
- Linux进程间同步的方式进程间同步:
- 信号量,互斥锁(需配合共享内存,这样锁才能被其它进程访问)、文件锁
- Linux 多进程锁的几种实现方案 - 明明1109 - 博客园 (cnblogs.com)
- Linux进程间互斥锁 (共享内存实现)_koko_TT的博客-优快云博客
- 冷门知识点:进程间通信如何加锁?-51CTO.COM
进程或线程持有锁期间终止了,怎么办?
- 设置PTHREAD_MUTEX_ROBUST属性
- 利用RAII思想,可以使用RAII的设计方法, 离开作用域的时候栈对象析构, 从而释放锁。比如使用try-finally语句块确保锁的释放:在加锁和解锁的代码块中使用try-finally语句块,以确保在任何情况下都会释放锁。这样即使出现异常或者程序意外退出,也能够保证锁能够被释放。
- 使用定时锁:在使用锁时,可以使用定时锁,它会在一定时间内自动释放锁。这种锁可以避免在锁被持有的过长时间内阻塞其他线程的执行。
进程管理和调度
- 见OS.md
线程模型
- 一比一模型: 每个用户线程对应一个内核线程,该模型在一个线程执行阻塞系统调用时,能够允许另一个线程继续执行,所以对于IO密集型的场景,CPU、磁盘IO、网卡等资源利用率还是非常友好的,提供了更好的并发功能
- 多对一模型:多个用户线程对应一个内核线程,该模型的线程管理是由用户空间的线程库来完成的,因此效率更高,并且高效的上下文切换和几乎无限制的线程数量.不过,如果一个线程执行阻塞系统调用,那么整个进程将会阻塞.再者,因为任一时间只有一个线程可以访问内核,所以多个用户线程不能并行运行在多处理核系统上
- 多对多模型: 多个用户线程对应多个内核线程,使得库和操作系统都可以管理线程,用户线程由运行时库调度器管理,内核线程由操作系统调度器