操作系统的功能
1,操作系统时计算机资源的管理者
2,操作系统为上层用户提供使用硬件资源的入口和环境
3,扩充裸机为虚拟机
进程与线程
1,进程是系统进行资源分配和调度的独立单位,线程是操作系统能够进行运算调度的最小单位。
2,线程依赖于进程而存在,一个进程至少有一个线程
3,进程有自己独立的地址空间,线程共享所属进程的地址空间。
4,进程是拥有系统资源的独立单位,线程只拥有一点在运行中避不可少的资源
5,多进程比多线程健壮
进程与程序
1,进程是在暂时的,是程序在数据集上的一次执行,而程序是永存的。
2,程序静态,进程动态。
3,进程是争夺计算机资源的基本单位,程序不是。
4.进程和程序不是一一对应的。
进程的通信方式
1,共享内存//有一块都可以修改和读取的公用内存,但访问互斥
2,管道通信//半双工
3,消息队列//链表
4,套接字//不同机器间的进程通信
5,信号
进程的五状态
新建一个进程并且分配它的PCB,进入新建态,进程运行的资源都分配好了,进入就绪态(哎还没运行呢,没运行呢,一会运行一下看甜不甜啊),被调度啦,进入运行态,申请的资源没准备好?进入阻塞态等一会噶,等待的事件发生啦?进入就绪态等待调度,调度后有进入运行态,退出进程啦,进入终止态。
进程调度分类
1,高级调度(作业调度)//看看外存中作业的资源申请能不能满足,若可,调入内存分配进程和资源
2,中级调度(内存调度)//其实就是存储器管理的兑换功能,把内存中不用的进程“挂起”,有需要再调回就绪队列
3,低级调度(进程调度)//把处理器分配给就绪队列中的某个进程
进程调度算法
1,先来先服务
2,短作业优先
3,高响应比优先
4,多级反馈队列调度算法
5,优先级调度算法
6,时间片轮转
同步机制四准则
1,空闲让进
2,忙则等待
3,有限等待
4,让权等待//不能进入临界区就应该释放处理机,防止忙等
管程
管程是为了简化实现进程同步和互斥操作用的信号量机制而生的,他是一种特殊的软件模块,隐藏了复杂的细节,提供一个简单的入口。
包括:
1,局部于管程的共享数据结构说明;//模块
2,对该数据结构进行操作的一组过程;//过程可以理解为函数
3,对该数据结构初始化
4,名子
特征:
1,管程管理的数据只能通过管程自己访问操作;//我的宝贝只有我能管
2,进程只有通过调用管程内的过程才能访问共享数据;//想跟我的小宝贝说话?只能用我的微信(入口,函数,insert,remove)联系它
3,同一时刻只有一个进程在使用管程的某个内部过程;//由编译器实现,程序员不管
4,某进程在条件变量上等待的话,应先释放管程的使用权,等待唤醒;
管程与进程的区别:
1,定义的数据结构不同:进程定义的是私有数据结构PCB(进程控制块),而管程定义的是公共的数据结构(如消息队列)
2,对数据结构的操作不同:进程由顺序程序执行有关操作。管程主要进行同步操作和初始化操作;
3,目的不同:进程是为了并发,管程是为了为了解决资源的互斥问题;
4,工作方式不同:进程是主动调用管程中的过程;
5,进程可并发,管程不能和其调用者并发;
6,进程是动态的,管程是一个供调用的资源管理模块;
处理机调度
层次分类:
1,高级调度(作业调度)
调度对象为作业,将外存上后备队列的作业调入内存,为它们创建进程,分配资源,放入就绪队列(多道批处理系统);
2,低级调度(进程调度)
对象是进程或者内核级线程,将就绪队列中的进程调入处理机,分派程序给该进程分配处理及;
3,中级调度(内存调度)
将挂起状态的程序Z(在外存中)重新调入内存(提高内存利用率和系统吞吐量)
进程调度的算法:
1,先来先服务
2,最短作业优先
3,优先级调度算法
4,时间片轮转
5,高相应比优先
6,多级反馈队列调度算法
死锁
定义:
在并发环境下,各个进程因竞争资源而造成的一种互相等待对方手里的资源,导致各进程都阻塞,无法推进的现象。(注意区别于死循环是死于运行态,是程序的问题)
成立条件:
1,互斥资源(需要争抢)
2,不可剥夺(资源没办法被强行抢夺,只能自己释放)
3,请求和保持(请求到的资源不放手,一直请求需要的其他资源)
4,循环等待条件(存在一种循环等待链)//注意,这一条是必要不充分条件,请求和释放资源不当,信号量使用不当也可能导致死锁
怎么办:
1,预防死锁(破坏必要条件)
2,避免死锁(避免系统陷入不安全状态,但是陷入不安全状态不一定死锁)//银行家算法
3,死锁的检测和解除(锁了再想办法吧唉)//死锁定理:若资源分配图不可完全简化,则死锁。
解除死锁的方法有:
1,资源剥夺法。挂起某些死锁进程,并抢占它的资源分给其他进程;//打土豪分田地,注意别把土豪饿死了
2,撤销进程法,强制撤销部分或者全部死锁的进程,并剥夺它们的资源;//一刀切。容易功亏一篑哦
3,进程回退法。让一个或者多个进程回退到足以避免死锁的情况。//系统要记录历史信息,设置还原点,留好后路。
内存
逻辑地址(相对地址)是相对于进程的起始地址而言的地址。//程序的指令中一般说的是这个
物理地址(绝对地址)真正的内存中的地址
那么问题来了,怎么把逻辑地址翻译成物理地址呢?//不然没法往内存里放啊
三种装入方式
绝对装入:编译的时候就把逻辑地址转换成最终的物理地址。//但是你要提前知道程序将放入内存的哪个位置;
静态重定位:装入内存之前对地址进行“重定位”(咦?我的装入起始地址是100?ok,我的所有地址参数+100),必须分配其要求的全部内存空间,如果内存不够就不能装入该作业。而且作业一旦装入内存,运行期间就不能再移动,也不能再申请内存空间。
动态重定位:装入程序把装入模块装入内存后,并不会立即转换地址,当程序真正执行时才进行,这种方法需要一个重定位寄存器存放装入模块的起始位置。
内存管理
1,内存空间的分配回收
-
连续分配管理方式(为用户分配的是连续的内存空间)
单一连续分配:内存分“系统区”(放操作系统的相关数据)和“用户区”(放进程相关数据且只能有一道用户程序)
优点:简单,无外部碎片;缺点:单用户单任务,有内部碎片 存储器利用率超级无敌低
固定分区分配:内存分“系统区”(放操作系统的相关数据)和“用户区”(划分为若干分区,分区大小有相等和不相等之分)无外部碎片,有内部碎片
动态分区分配:不预先划分分区,进程装入时才根据进程的大小动态的建立分区。无内部碎片,有外部碎片
动态分区分配算法:首次适应算法:每次都从低地址开始查找,找到第一个能满足大小的空闲分区。
最佳适应算法:按容量递增次序链接,每次分配内存时顺序查找空闲分区链(表)//解决了大进程进来有地方用的问题,但是会产生很多外部碎片,而且算法开销大,总要重新排列。//效果最好
最坏适应算法:按容量递减次序链接,每次分配内存时顺序查找空闲分区链(表)//解决了外部碎片的问题,但是大进程可能无处安放,算法开销大,总要重新排列
邻近适应算法:空闲分区以地址递增排列(和首次适应算法相同),可以排成一个循环链表,每次分配内存时从上次查找结束的位置开始查找空闲分区链(表)。//不用每次从头查找,等概率的分配大分区和小分区
-
非连续分配管理方式
分页存储:将内存空间分为一个个大小相等的分区,每个分区就是一个”页框“(页帧,内存块,物理块,物理页面)。每个页框有一个”页框号“,从0开始。将进程的逻辑地址也分为与页框大小相等的一个个部分,每个部分为一个”页“或者”页面“,每个页面也有一个”页号“,从0开始。OS以页框为各个进程分配内存空间,所以页面与页框一一对应。//各个页面不必连续存放。
页表:放在PCB中,每个页表项(一行)记录一个页面和一个页框的映射关系。----重要的数据结构
2,内存空间的拓展(实现虚拟性)
覆盖技术:将内存分为固定区和覆盖区,覆盖区的内存只能被轮流使用,共享一个覆盖区。
交换技术(兑换技术):内存紧张时,部分进程换出外存,外存中某些具备运行条件的进程换入内存(进程在内存与磁盘间动态调度)//这里用到了前面的中极调度(内存调度)
3,地址转换(逻辑地址转物理地址)
4,内存保护(各个进程只能访问自己的进程空间)