linux 中的每个进程和线程都是相互独立的, 因此对于如何共享资源和如实现相互之间的通途,就规定了一些方法。 不一定需要对每一中方法都要做到熟悉,只要知道就行了,linux 发展了几十年可以移植性强。
内核中对于临界的保护: 锁 --异步
1. 原子操作 -->针对整形的数值的保护
2. 信号量 --> 他也是一种原子操作,只不过它带有通知机制 当有型号可用是wake up 起挂起的进程。
3. 自旋锁 --> 是很耗费cpu的如果没有获得锁 就一直在那里打转, 注意他在临界区不能有 进程调度发生(中断 sleep 等发生)
3.1 读写锁 --> 读写加锁,写和读只有有一个发生,读可以同时发生,写和写不能同时发生。
3.2 顺序锁 --> 读和写可同时发生 但是在读是入如果有写发生需要在同步一次,读和读之间没有限制,写和写之间不能同时发生。
3.3 RCU --> read copy update 写时复制和更新,在写之前会copy 一份备份 在写完后在摸个时间点会udpate 源文件。 这种锁在读时需要先同步。
以上都是 自旋锁, 因为自旋锁的开销较大,能少用就少用。
4. 互斥锁 --> 如果获取不到就休眠知道获得锁后在wakeup
以上 除了 信号量 其他的都是枷锁解锁在同一各进程中。
5. 完成 变量 这是一个信号量的加强版,能解决多cpu 的问题。
用户空间进程之间的锁
1. 互斥锁 -->加解一体
2. 读写锁
3. 记录锁
4. 条件变量
5. 信号量
其实锁对线程间用的比较多,二进程间除了 文件和共享区的保护就没有了。
讲完了锁 也就是异步 下面我们讲一下同步 分两部分 kernel和user 的通讯 user 和user 的通讯。
1. kernel和user的通讯
1. ioctl 这是一种单向发起的通讯 一般用户向driver 发送一条命令 让他坐什么事,而不能有kernel 发起。
2. socket netlink 双向的通讯
3. 共享内存 这种比较快速高效
4. api (包括函数和 system call)
2. 用户和用户之间的通讯
1. 管道
2. 信号
3. 消息队列
4. 型号量
5. 共享内存
6. socket