进程
进程的并发性
现在的操作系统多为并发执行,引入并发执行的目的是为了提高资源利用率。在多道系统出现后为了划分系统内部情况引进了进程的概念。
- 进程是系统进行资源分配和调度的独立单位
进程控制块
进程控制块PCB是进程实体的一部分,是操作系统中最重要的记录型数据结构。PCB中记录了操作系统所需的、用于描述进程当前情况以及控制进程运行的全部信息。
线程
线程的引进
由于进程是资源拥有者,进程创建,撤销等操作系统都需要付出较大的时空开销,因此不宜频繁创建,也限制了并发度,将进程的两个属性分开,作为调度和分派的基本单位,不同时作为资源的拥有者,就形成了线程的概念。
- 一个进程可以由多个线程构成
- 线程之间共享进程资源
线程挂掉会影响进程吗?
不一定,要看线程崩溃到底是由于自己的独立空间引起的( java中的栈 )那就不会对其他线程造成影响,也就不会影响进程,如果线程崩溃是因为对共享区域造成了破坏( 堆 ),那就会影响到进程。
进程间通信
只列出部分,不代表所有通信方式
1. socket通信
socket是网络通信协议中应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。
2. 管道通信
管道就是一个连接读进程和写进程实现他们之间通信的一个共享文件也叫pipe文件。
- 向管道提供输入的发送进程以字符的形式将大量的数据送入管道
- 接收进程则从管道中读取
3. 信号量
信号量就是管理公共资源的有效手段,信号量代表资源的实体数量,信号量只能通过两个原子操作wait(S)和signal(S)来访问。
- wait(S)代表有进程请求一个单位的资源,即S.value-1,当S.value<0时代表资源已经分配完了,因此应该调用block原语自我阻塞,并插入到信号量链表S.list中
- signal(S)代表有进程释放了一个单位的资源,即S.value+1,如果S.value<=0则还有进程在阻塞中,此时调用wakeup原语将S.list中第一个阻塞进程唤醒
4.互斥锁
互斥锁和条件变量总是可用来同步一个进程内的各个线程。但是如果一个互斥锁或条件变量是 存放在多个进程间共享的某个内存区内,那么它还可以被用来同步这几个进程。互斥锁指代相互排斥,用于保护临界区,以保证任何时刻只有一个线程/进程在执行 其中的代码。
临界区: 不论是硬件临界资源还是软件临界资源( 诸进程之间只能用互斥的方式进行访问
),多个进程必须互斥地对它进行访问在每个进程中访问临界资源的那段代码称为临界区
- 在访问共享资源后临界区域前,对互斥锁进行加锁
- 在访问完成后释放互斥锁导上的锁
- 对互斥锁进行加锁后,任何其他试图再次对互斥锁加锁的线程将会被阻塞,直到锁被释放
5. 消息缓冲队列
发送一条消息,填入到缓冲区,并把它挂到接收进程的消息链上
-
在自己的内存设置发送区a,把消息填入,调入发送原语,把消息发送给接收进程
-
原语过程包括根据a中消息长度申请缓冲区,把a中数据复制到缓冲区,并且把缓冲区挂在接收进程的消息队列上( 每个进程的消息队列就在pcb中 )
线程间通信
1.信号量
2.互斥锁
这两个方式进程通信中已经描述了,不再重复
参考资料:
博客 https://www.jianshu.com/p/cfcdc068955f
博客 https://blog.csdn.net/qq_39721016/article/details/120477622
书籍《现代操作系统》