1.进程的定义
1.1为什么要有进程这个定义
- 在多道系统的情况下程序的执行是属于并发执行,此事他们将失去封闭性,并且具有间断性,以及运行结果的不可再现行,为了能使程序能够并发的执行,可以对并发执行的程序进行控制和描述,顺水推舟的引入了进程的概念。、
1.2 那进程和普通程序的区别在哪里呢?
- 区别在进程比程序多了PCB进程控制块来控制进程。
- 所以一个进程是由:PCB,程序段,数据段三部分构成。
1.3进程的几种状态
- 就绪
- 执行
- 阻塞
- 挂起
1.4 区别一下进程阻塞和挂起的区别吧
- 阻塞:是因为进程暂时因为某种事件的干涉放弃cpu的使用权,等阻塞原因消失后才能重新运行;但这时候进程还在内存里等待,看是否能重新获取cpu的使用权。
- 挂起: 可以被定义为暂时淘汰出内存的进程,懂得都懂计算机资源是有效的;这时候进程已经被调出内存,放在外存里面了。
2.进程的通信
2.1进程通信的概念
我的理解:一个进程想获取另一个进程的数据他们就带通信吧,一个进程又看不见另一个进程里面的东西,所有就需要操作系统的内核来帮忙,这时候操作系统的内核里面会开辟一个缓冲区,进程1把自己的数据拷贝到内核的缓冲区里面,进程2再从内核的缓冲区里面把数据拿出来。
网解:每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication)
2.2 进程通信的7种方式
https://www.jianshu.com/p/c1015f5ffa74
1 管道/匿名管道
-
管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道。
-
只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程);
-
单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中。
-
数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。
管道的实质:
管道的实质是一个内核缓冲区,进程以先进先出的方式从缓冲区存取数据,管道一端的进程顺序的将数据写入缓冲区,另一端的进程则顺序的读出数据。
该缓冲区可以看做是一个循环队列,读和写的位置都是自动增长的,不能随意改变,一个数据只能被读一次,读出来以后在缓冲区就不复存在了。
当缓冲区读空或者写满时,有一定的规则控制相应的读进程或者写进程进入等待队列,当空的缓冲区有新数据写入或者满的缓冲区有数据读出来时,就唤醒等待队列中的进程继续读写。
管道的局限:
管道的主要局限性正体现在它的特点上:
-
只支持单向数据流;
-
只能用于具有亲缘关系的进程之间;
-
没有名字;
-
管道的缓冲区是有限的(管道制存在于内存中,在管道创建时,为缓冲区分配一个页面大小);
-
管道所传送的是无格式字节流,这就要求管道的读出方和写入方必须事先约定好数据的格式,比如多少字节算作一个消息(或命令、或记录)等等;
- 管道/匿名管道(Pipes) :用于具有亲缘关系的父子进程间或者兄弟进程之间的通信。
- 有名管道(Names Pipes) : 匿名管道由于没有名字,只能用于亲缘关系的进程间通信。为了克服这个缺点,提出了有名管道。有名管道严格遵循先进先出(first in first out)。有名管道以磁盘文件的方式存在,可以实现本机任意两个进程通信。
- 信号(Signal) :信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生;
- 消息队列(Message Queuing) :消息队列是消息的链表,具有特定的格式,存放在内存中并由消息队列标识符标识。管道和消息队列的通信数据都是先进先出的原则。与管道(无名管道:只存在于内存中的文件;命名管道:存在于实际的磁盘介质或者文件系统)不同的是消息队列存放在内核中,只有在内核重启(即,操作系统重启)或者显示地删除一个消息队列时,该消息队列才会被真正的删除。消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取.比 FIFO 更有优势。消息队列克服了信号承载信息量少,管道只能承载无格式字 节流以及缓冲区大小受限等缺。
- 信号量(Semaphores) :信号量是一个计数器,用于多进程对共享数据的访问,信号量的意图在于进程间同步。这种通信方式主要用于解决与同步相关的问题并避免竞争条件。
- 共享内存(Shared memory) :使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。可以说这是最有用的进程间通信方式。
- 套接字(Sockets) : 此方法主要用于在客户端和服务器之间通过网络进行通信。套接字是支持 TCP/IP 的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。
3.死锁
3.1 死锁的概念
多个线程因为抢占资源从而产生的互相等待的现象
3.2 死锁产生的四个条件
- 互斥:资源被只能被一个线程所获取,不能被其他线程所共享
- 占有且等待:线程a获取自己部分所需的资源后,另一部分无法获取;线程a就一直等待
- 非抢占:资源非抢占,只有在持有资源的进程完成任务后资源才会被释放
- 循环等待:有一组等待进程
{P0, P1,..., Pn}
,P0
等待的资源被P1
占有,P1
等待的资源被P2
占有,…,Pn-1
等待的资源被Pn
占有,Pn
等待的资源被P0
占有。
只有同时满足以上条件死锁才会出现。
3.3 解决死锁的方法
从条件入手
- 破坏“占有且等待的条件”:让一个进程一次获取自己所需要的全部资源
- 破坏“非抢占条件”:如果一个进程提出获取新资源的请求被拒绝,那么就让他释放自己所有的资源。
- 破坏“循环等待条件”:可以通过定义资源类型的线性顺序来预防,可将每个资源编号,当一个进程占有编号为i的资源时,那么它下一次申请资源只能申请编号大于i的资源。如图所示:
4 .页面置换算法
- 最佳置换算法(OPT):置换最久不能被访问的页面。
- 先进先出算法(FIFO):置换最早出现的页面。
- 最近未被使用算法(LRW):置换最近最久未被使用的页面。
5.IO控制方式
- 轮询的可编程的io方式
- 可中断的可编程io方式
- DMA方式
- 通道控制方式
6.假脱机spooling
目的:解决cpu的高速性和io设备低速之间的矛盾。
例题:
SPOOLing技术的主要目的是()
-
提高CPU和外设交换信息的速度
-
提高独占设备的利用率
-
减轻用户编程负担
-
提供主、辅存接口
正确答案:提高独占设备的利用率
6.1 spooling的组成
- 输入进程和输出进程
- 输入井和输出井
- 输入缓冲区和输出缓冲区
- 井管理程序
6.2spooling的优点
- 缓和的高速的cpu和低速的io设备间的不匹配矛盾
- 减少了cpu的中断频率
- 提高了cpu和io设备的并行性
7. 磁盘调度算法
- 先来先服务算法
- 最短寻道算法
- 电梯调度算法
8. 进程调度的两种方式
- 抢占式和非抢占式
8.1 几种典型的调度算法
- 先来先服务:进来一个调度一个,按顺序。
- 短作业优先:先把运行时间最短的进程给执行了。–可能会出现饥饿现象。
- 优先级算法:等下待时间越长优先级越高
- 最高响应比:综合等待时间和运行时间的一个调度算法。
9. 进程控制
9.1 进程控制的作用
控制进程啊。–创建新进程,终止已完成的进程,将因发生异常而无法继续运行的进程给阻塞了,负责进程中的状态转化。
9.2 内核是个啥?
- 内核一个名词,名词就是对一种事物的一个代指。内核顾名思义就是操作系统中最里面的那一部分。
- 为了提升操作系统的效率,操作系统最里面的那部分模块一定是和硬件密切联系的部分。
- 所以内核就是最靠近硬件那部分的操作系统。
9.3 内核的作用
支撑功能
- 中断处理
- 时钟管理
- 原语操作
10 缓冲
10.1 为什么引入缓冲
- 缓和cpu和io设备速度不匹配的矛盾
- 减少cpu的中断频率
- 解决数据粒度不匹配的问题
- 提高cpu和设备之间的并行性
10.2 缓冲区的工作方式
- 收容输入
- 提取输入
- 收容输出
- 提取输出