文章目录
一、虚拟内存
(1)虚拟内存分段、分页
虚拟内存的出现就是为了更好的管理内存,避免在物理地址相邻的程序之间相互影响,更好的利用碎片化的内存空间,避免浪费。
分页存储管理:
将用户程序的地址空间分成若干个固定大小区域,称为页,同时将内存空间分成对应大小物理块。系统中维护一个页表,通过页与物理块的对应,完成逻辑地址到物理地址(实际内存的地址,比如内存条)的映射。
分段存储管理:
将程序地址空间分成若干段,段大小不定,每段定义一组相对完整信息,在内存分配时以段为单位。
- 分页的粒度更小,能更好的利用内存但是当进程使用过多页面,就会导致页表过长,降低页面换入换出效率。
- 分段换入换出效率更高,利于一个进程内的信息共享,但是粒度过大,内存利用率不如分页
段页式存储:
对虚拟内存先分段在分页,结合两者的优点。
(2)页面置换算法
当访问一个内存中不存在的页,并且内存已满,则需要从内存中调出一个页或将数据送至磁盘对换区,
替换一个页,这种现象叫做缺页置换。当前操作系统最常采用的缺页置换算法如下:
- 先进先出(FIFO)算法:
- 思路:置换最先调入内存的页面,即置换在内存中驻留时间最久的页面。
- 实现:按照进入内存的先后次序排列成队列,从队尾进入,从队首删除。
- 特点:实现简单;性能较差,调出的页面可能是经常访问的
- 最近最少使用( LRU ) 算法:
- 思路: 置换最近一段时间以来最长时间未访问过的页面。根据程序局部性原理,刚被访问的页面,可能马上又要被访问;而较长时间内没有被访问的页面,可能最近不会被访问。
- 实现:缺页时,计算内存中每个逻辑页面的上一次访问时间,选择上一次使用到当前时间最长的页面
- 特点:可能达到最优的效果,维护这样的访问链表开销比较大
- 最不常用算法( Least Frequently Used, LFU )
- 思路:缺页时,置换访问次数最少的页面
- 实现:每个页面设置一个访问计数,访问页面时,访问计数加1,缺页时,置换计数最小的页面
- 特点:算法开销大,开始时频繁使用,但以后不使用的页面很难置换
二、内核态和用户态
(1)什么是内核态和用户态
为了避免操作系统和关键数据被用户程序破坏,将处理器的执行状态分为内核态和用户态。
内核态是操作系统管理程序执行时所处的状态,能够执行包含特权指令在内的一切指令,能够访问系统内所有的存储空间。
用户态是用户程序执行时处理器所处的状态,不能执行特权指令,只能访问用户地址空间。
用户程序运行在用户态,操作系统内核运行在内核态。
(2)如何实现内核态和用户态的切换
处理器从用户态切换到内核态的方法有三种:系统调用、异常和外部中断。
- 系统调用是操作系统的最小功能单位,是操作系统提供的用户接口,系统调用本身是一种软中断。
- 异常,也叫做内中断,是由错误引起的,如文件损坏、缺页故障等。
- 外部中断,是通过两根信号线来通知处理器外设的状态变化,是硬中断。
三、进程调度时机
- 当前运行的进程运行结束。
- 当前运行的进程由于某种原因阻塞。
- 执行完系统调用等系统程序后返回用户进程。
- 在使用抢占调度的系统中,具有更高优先级的进程就绪时。
- 分时系统中,分给当前进程的时间片用完。
四、不能进行进程调度的情况
- 在中断处理程序执行时。
- 在操作系统的内核程序临界区内。
- 其它需要完全屏蔽中断的原子操作过程中。
五、进程调度策略
- 先到先服务调度算法
- 短作业优先调度算法
- 优先级调度算法
- 时间片轮转调度算法
- 高响应比优先调度算法
- 多级队列调度算法
- 多级反馈队列调度算法
六、进程调度策略的基本设计指标
- CPU利用率
- 系统吞吐率,即单位时间内CPU完成的作业的数量。
- 响应时间。
- 周转时间。是指作业从提交到完成的时间间隔。从每个作业的角度看,完成每个作业的时间也是很关键
- 平均周转时间
- 带权周转时间
- 平均带权周转时间
七、什么是孤儿进程?僵尸进程
- 孤儿进程: 父进程退出,子进程还在运行的这些子进程都是孤儿进程,孤儿进程将被init进程(1号进程)所收养,并由init进程对他们完成状态收集工作。
- 僵尸进程: 进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait 获waitpid 获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中的这些进程是僵尸进程。
八、进程的组成
- 进程控制块PCB,是进程存在的唯一标志,包含进程标识符PID,进程当前状态,程序和数据地址,进程优先级、CPU现场保护区(用于进程切换),占有的资源清单等。
- 程序段
- 数据段
九、进程和线程的区别和联系
- 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程依赖于进程而存在。
- 进程在执行过程中拥有独立的地址空间,而多个线程共享进程的地址空间。(资源分配给进程,同一进程的所有线程共享该进程的所有资源。同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量。)
- 进程是资源分配的最小单位,线程是CPU调度的最小单位。
- 通信:由于同一进程中的多个线程具有相同的地址空间,使它们之间的同步和通信的实现,也变得比较容易。进程间通信 IPC ,线程间可以直接读写进程数据段(如全局变量)来进行通信(需要一些同步方法,以保证数据的一致性)。
- 进程编程调试简单可靠性高,但是创建销毁开销大;线程正相反,开销小,切换速度快,但是编程调试相对复杂。
- 进程间不会相互影响;一个进程内某个线程挂掉将导致整个进程挂掉。
- 进程适应于多核、多机分布;线程适用于多核。
十、进程同步的方法
- 互斥锁
- 读写锁
- 条件变量
- 记录锁(record locking)
- 信号量
- 屏障(barrier)
十一、线程同步方法
- 互斥锁
- 读写锁
- 条件变量
- 信号量
- 自旋锁
- 屏障(barrier)
十二、写时复制
如果一个进程要修改自己的那份资源“副本”,那么就会复制那份资源,并把复制的那份提供给进程。不过其中的复制对进程来说是透明的。这个进程就可以修改复制后的资源了,同时其他的进程仍然共享那份没有修改过的资源。所以这就是名称的由来:在写入时进行复制。
十三、实时操作系统概念
实时操作系统(Real-time operating system, RTOS),又称即时操作系统,它会按照排序运行、管理系统资源,并为开发应用程序提供一致的基础。 实时操作系统与一般的操作系统相比,最大的特色就是“实时性”,如果有一个任务需要执行,实时操作系统会马上(在较短时间内)执行该任务,不会有较长的延时。这种特性保证了各个任务的及时执行。
十四、优先级反转是什么?如何解决
由于多进程共享资源,具有最高优先权的进程被低优先级进程阻塞,反而使具有中优先级的进程先于高优先级的进程执行,导致系统的崩溃。这就是所谓的优先级反转(Priority Inversion)。其实,优先级反转是在高优级(假设为A)的任务要访问一个被低优先级任务(假设为C)占有的资源时,被阻塞.而此时又有优先级高于占有资源的任务©而低于被阻塞的任务(A)的优先级的任务(假设为B)时,于是,占有资源的任务就被挂起(占有的资源仍为它占有),因为占有资源的任务优先级很低,所以,它可能一直被另外的任务挂起.而它占有的资源也就一直不能释放,这样,引起任务A一直没办法执行.而比它优先低的任务却可以执行。
解决办法:
- 优先级继承(priority inheritance) 优先级继承是指将低优先级任务的优先级提升到等待它所占有的资源的最高优先级任务的优先级.当高优先级任务由于等待资源而被阻塞时,此时资源的拥有者的优先级将会自动被提升。
- 优先级天花板(priority ceilings)优先级天花板是指将申请某资源的任务的优先级提升到可能访问该资源的所有任务中最高优先级任务的优先级.(这个优先级称为该资源的优先级天花板)。