一、进程,线程的背景
引入进程,为了描述和实现多个程序的并发执行,以改善资源利用率即提高系统的吞吐量
引入线程,减少程序并发执行时系统所付出的额外开销,使操作系统具有更好的并发性
二、进程的互斥与同步
注意:同步即协调
采用多道程序技术的操作系统,允许多个进程同时驻留内存并发执行,若干进程将不可避免的会竞争系统资源。如对处理器,内存空间,打印机等资源的竞争。
如何协调多个进程对系统资源(内存空间,外部设备等)的竞争和共享?
如果竞争某资源的进程太多,这些进程还必须等待在一个队列中。如就绪队列,阻塞队列。如果长期得不到资源,进程可能进入死锁。如何解决死锁?
进程竞争资源必须解决“互斥问题”,某些资源必须互斥使用,这些资源称为临界资源,访问临界资源的那段代码称为临界区。
进入临界区,需要判断是否可以进入临界区,如果可以,则必须设置临界区使用标志;如果不可以,则后来的进程查看临界区的使用标志,进入阻塞队列。
互斥条件总结为如下16个字:
忙则等待;优先等待;空闲让进;让全等待
三、进程的死锁
多进程,多线程的并发执行虽然提升了系统资源的利用率,提高了系统的性能,但是并发执行也带来了新的问题-----死锁。
死锁是指多个进程(线程)在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象(互相挂起等待),若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程
举一个生活中的简单例子:小明和小红都想买一块橡皮,这块橡皮价值一块钱,但是他们俩每个人都只有五毛钱,小明说:你把你的五毛钱给我,让我买橡皮。小红说:你把你的五毛钱给我,让我买橡皮。这样,两个人互相僵持着,谁也不愿意低头,谁都买不到橡皮。
3.1死锁产生的四个必要条件
- 互斥条件:进程(线程)申请的资源在一段时间中只能被一个进程(线程)使用。
- 请求与等待条件:进程(线程)已经拥有了一个资源,但是又申请新的资源,拥有的资源保持不变 。
- 不可剥夺条件:在一个进程(线程)没有用完,主动释放资源的时候,不能被抢占。
- 循环等待条件:多个进程(线程)之间存在资源循环链。
3.2处理死锁的方法
- 预防死锁:破坏死锁产生的四个条件之一,注意,互斥条件不能破坏。
- 避免死锁:合理的分配资源。
- 检查死锁:利用专门的死锁机构检查死锁的发生,然后采取相应的方法。
- 解除死锁:发生死锁时候,采取合理的方法解决死锁。一般是强行剥夺资源。
四、进程通信的方式
进程之间需要通信协作来协调
当进程进行通信协作时,各个进程之间需要建立连接,进程通信需要同步和协调。进程通信的方式很多,包括消息传递、管道、共享存储区等。
1、 软件方法
由进程自己,执行相应的程序指令,实现与别的进程的同步与互斥
2、 硬件方法
屏蔽中断或采取专门的机器指令控制同步与互斥,进程不会切换,实现互斥。可能出现饥饿现象,死锁现象
3、 信号量方法
控制进程同步与互斥的通用方法。信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
4、管道的方法
管道是指用于连接一个读进程和一个写进程以实现它们之间通信的一个共享文件(pipe文件)
5、消息队列MessageQueue方法
消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点
6、共享存储SharedMemory
共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
7、套接字Socket
Socket也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同计算机之间的进程通信。
8、信号 ( sinal ) 。
信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
参考:
https://www.cnblogs.com/ryxiong-blog/p/10892010.html
https://blog.csdn.net/zhaohong_bo/article/details/89552188