1.进程与线程
对于有线程系统:
(1).进程是资源分配的独立单位;
(2).线程是资源调度的独立单位;
对于无线程系统:
(1).进程是资源调度、分配的独立单位;
2.进程间的通信方式及优缺点
管道
有名管道:一种半双工的通信方式,它允许无亲缘关系进程间的通信。
优点:可以实现任意关系的进程间的通信;
缺点:a.长期存于系统中,使用不当容易出错;b.缓冲区有限;
无名管道:一种半双工的通信方式,只能在具有亲缘关系的进程间使用(父子进程)
优点:简单方便;
缺点:a.局限于单向通信;b.只能创建在它的进程以及其有亲缘关系的进程之间;c.缓冲区有限;
信号量:一个计数器,可以用来控制多个线程对共享资源的访问。
优点:可以同步进程;
缺点:信号量有限;
信号: 一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
消息队列: 是消息的链表,存放在内核中并由消息队列标识符标识。
优点:可以实现任意进程间的通信,并通过系统调用函数来实现消息发送和接收之间的同步,无需考虑同步问题,方便。
缺点:信息的复制需要额外消耗 CPU 的时间,不适宜于信息量大或操作频繁的场合。
共享内存:映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。
优点:无须复制,快捷,信息量大。
缺点:a.通信是通过将共享空间缓冲区直接附加到进程的虚拟地址空间中来实现的,因此进程间的读写操作的同步问题;b.利用内存缓冲区直接交换信息,内存的实体存在于计算机中,只能同一个计算机系统中的诸多进程共享,不方便网络通信。
套接字socket:可用于不同及其间的进程通信。
优点:a.传输数据为字节级,传输数据可自定义,数据量小效率高;b.传输数据时间短,性能高;c.适合于客户端和服务器端之间信息实时交互;d.可以加密,数据安全性强。
缺点:需对传输的数据进行解析,转化成应用级的数据。
3.线程之间的通信方式
锁机制:包括互斥锁/量(mutex)、读写锁(reader-writer lock)、自旋锁(spin lock)、条件变量(condition)。
互斥锁/量(mutex):提供了以排他方式防止数据结构被并发修改的方法。
读写锁(reader-writer lock):允许多个线程同时读共享数据,而对写操作是互斥的。
自旋锁(spin lock):与互斥锁类似,都是为了保护共享资源。互斥锁是当资源被占用,申请者进入睡眠状态;而自旋锁则循环检测保持者是否已经释放锁。
条件变量(condition):可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。
信号量机制
a.无名线程信号量
b.有名线程信号量
信号机制(Signal):类似进程间的信号处理。屏障:屏障允许每个线程等待,直到所有的合作线程都达到某一点,然后从该点继续执行。
4.进程之间私有和共享的资源
私有:地址空间、堆、全局变量、栈、寄存器。
共享:代码段、公共数据、进程目录、进程 ID。
5.线程之间私有和共享的资源
私有:线程栈、寄存器、程序计数器。共享:堆、地址空间、全局变量、静态变量。
6.多进程 vs 多线程
线程与进程选用规则:
a.需要频繁创建销毁的优先用线程;
b.需要进行大量计算的优先使用线程;
c.强相关的处理用线程,弱相关的处理用进程;
d.可能要扩展到多机分布的用进程,多核分布的用线程;
e.都满足需求的情况下,用你最熟悉、最拿手的方式;
7.Linux的内核同步方式
为什么需要内核同步:在现代操作系统里,同一时间可能有多个内核执行流在执行,因此内核其实像多进程、多线程编程一样也需要一些同步机制来同步各执行单元对共享数据的访问。尤其是在多处理器系统上,更需要一些同步机制来同步不同处理器上的执行单元对共享的数据的访问。
内核同步方式:
a.原子操作;
b.信号量(semaphore);
c.读写信号量(rw_semaphore);
d.自旋锁(spinlock);
e.大内核锁(BKL,Big Kernel Lock);
f.读写锁(rwlock);
g.大读者锁(brlock-Big Reader Lock);
h.读-拷贝修改(RCU,Read-Copy Update);
i.顺序锁(seqlock);
8.死锁
定义:是指两个或两个以上进程在执行过程中,因争夺资源而造成的下相互等待的现象。
死锁产生的条件:
a.互斥
b.请求和保持
c.不可剥夺
d.环路等待
预防死锁:
a.打破互斥条件:改造独占性资源为虚拟资源,大部分资源已无法改造。
b.打破不可抢占条件:当一进程占有一独占性资源后又申请一独占性资源而无法满足,则退出原占有的资源。
c.打破占有且申请条件:采用资源预先分配策略,即进程运行前申请全部资源,满足则运行,不然就等待,这样就不会占有且申请。
d.打破循环等待条件:实现资源有序分配策略,对所有设备实现分类编号,所有进程只能采用按序号递增的形式申请资源。
e.有序资源分配法
f.银行家算法