操作系统知识点

 

  • 操作系统是什么

    • 管理计算机硬件与软件资源的程序,是计算机系统的内核与基石

    • 本质上是运行在计算机上的软件程序

    • 为用户提供一个与系统交互的操作界面

    • 分为内核与外壳,其中内核是能操作硬件的程序,而外壳则是围绕着内核的应用程序

  • 进程调度算法

    • 根据系统资源分配资源所规定的资源分配算法

    • 先来先服务调度算法

      • FCFS调度算法每次从就绪队列中选择最先进入该队列的进程,将处理机分配给它,使之投入运行,直到完成或因某种原因而阻塞时才释放处理机。

      • 不可剥夺算法。对长作业有利,对短作业不利。有利于CPU繁忙型作业,不利于I/O繁忙型作业

    • 时间片轮转调度法

      • 适用于分时系统

      • 系统将所有就绪进程按到达时间的先后次序排成一个队列,进程调度程序总是选择就绪队列中第一个进程执行,即先来先服务的原则,但仅能运行一个时间片,如100ms。在使用完一个时间片后,即使进程并未完成其运行,它也必须释放出(被剥夺)处理机给下一个就绪的进程,而被剥夺的进程返回到就绪队列的末尾重新排队,等候再次运行。

      • 时间片的大小对系统性能影响很大。如果时间片过短,则处理机在进程间过于频繁切换,处理机的开销增大;若过长,则退化为先来先服务算法

    • 短进程优先调度算法

      • 从就绪队列中选择一个估计运行时间最短的进程,将处理机分配给它,使之立即执行,直到完成或发生某事件而阻塞时,才释放处理机。

      • 非抢占策略。但是长作业不利,不能保证紧迫性作业(进程)被及时处理,作业的长短只是被估算出来的。

      • 平均等待时间、平均周转时间最少

    • 最短剩余时间优先

      • 增加抢占机制,进程调度总是选择预期剩余时间最短的进程

      • 当一个进程加入到就绪队列时,他可能比当前运行的进程具有更短的剩余时间,因此只要新进程就绪,调度程序就能可能抢占当前正在运行的进程。

    • 高响应比优先调度算法

      • 主要用于作业调度。

      • R=(w+s)/s (R为响应比,w为等待处理的时间,s为预计的服务时间)

      • 当前进程完成或被阻塞时,选择R值最大的就绪进程,它说明了进程的年龄。当偏向短作业时,长进程由于得不到服务,等待时间不断增加,从而增加比值,最终在竞争中赢了短进程。

    • 优先级调度算法

      • 优先级用于描述作业运行的紧迫程度

      • 在进程调度中,优先级调度算法每次从就绪队列中选择优先级最高的进程,将处理机分配给它,使之投入运行。

      • 可分为非剥夺式优先级调度算法&剥夺式优先级调度算法

      • 可分为静态优先级(确定优先级的依据有进程类型、进程对资源的要求、用户要求。)和动态优先级(确定依据为进程占有CPU时间的长短、就绪进程等待CPU时间的长短。)(根据创建后优先级是否可以改变)

    • 多级反馈队列调度算法(公认较好)

      • 不必事先知道各进程所需要执行的时间

      • 实现思路:

        • 设置多个就绪队列,并为每个队列赋予不同的优先级

        • 赋予各个队列中进程执行时间片的大小也各不相同,优先级越高的队列中,各进程的运行时间片就越小。

        • 每个队列都采用先来先服务算法。当一个新进程进入内存后,首先将它放入第1级队列的末尾,按先来先服务原则排队等待调度。当轮到该进程执行时,如它能在该时间片内完成,便可准备撤离系统;如果它在一个时间片结束时尚未完成,调度程序便将该进程转入第2级队列的末尾,再同样地按FCFS 原则等待调度执行……如此下去,当一个长进程从第1级队列依次降到第 n 级队列后,在第 n 级队列中便釆用时间片轮转的方式运行。

        • 按队列优先级调度。仅当第1级队列为空时,调度程序才调度第2级队列中的进程运行;若优先级低队列执行中有优先级高队列进程执行,应立刻将此进程放入队列末尾,把处理机分配给新到高优先级进程。

  • 磁盘寻道算法

    • 由于有时候进程 发送 对磁盘进行读/写操作的请求 的速度 比 磁盘响应 的还要快,因此为每个磁盘设备建立一个等待队列

    • 先来先服务FCFS

      • 它根据进程请求访问磁盘的先后次序进行调度。每个进程的请求都能依次得到处理

    • 最短寻道时间优先SSTF

      • 选择 要求访问的磁道与当前磁头所在的磁道距离最近 的进程,使得每次的寻道时间最短,算法有比较好的吞吐量,但不能保证平均寻道时间最短。

      • 缺点在于对用户的服务请求的响应机会并不均等,因此导致响应时间的变化幅度很大。

    • 扫描算法SCAN/电梯调度算法

      • 除了考虑欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向。

      • 当磁头正在自里向外移动时,扫描算法所选择的的下一个访问对象应是其欲访问的磁道既在当前磁道之外,又是距离最近的。这样自里向外地访问,直到再无更外的磁道需要访问才将磁臂换向,自外向里移动。

      • 吞吐量较大,平均响应时间较小,但由于是摆动式的扫描方法,两侧磁道被访问的频率仍低于中间磁道。

    • 循环扫描算法CSCAN

      • 如果对磁道的访问请求是均匀分布的,当磁头到达磁盘的一端,并反向运动时落在磁头之后的访问请求相对较少。

      • 因此规定磁头单向移动。如只自里向外移动,当磁头移到最外的被访问磁道时,磁头立即返回到最里的欲访磁道,即将最小磁道号紧接着最大磁道号构成循环,进行扫描。

  • 进程的通信方式

    • 管道

      • 匿名管道:如netstat -tulnp | grep 8080,其中'|'就是管道的意思,即把前一条命令的输出作为后一条命令的输入(单向,要互相通信需要创建两个管道)。

      • 命名管道:如mkfifo test,即创建一个名字为test的命名管道;echo "this is a pipe" > test,即用一个进程向这个管道里面写数据;cat < test,另一个进程把test里面的内容读出来,此时前一条命令才会结束。

      • 管道的通知机制类似于缓存,就像一个进程把数据放在某个缓存区域,然后等着另外一个进程去拿,并且是管道是单向传输的。

    • 消息队列

      • 改进管道,把进程的数据放在某个内存之后就马上让进程返回,无需等着另一个进程去读取。

      • 例如a进程要给b进程发送消息,只需要把消息放在对应的消息队列里就行了,b进程需要的时候再去对应的消息队列里取出来。同理,b进程要给a进程发送消息也一样。

      • 缺点在于当a进程发送的数据占内存大,且两个进程通信频繁时,发送消息(拷贝)这个过程需要花很多时间读内存。

    • 共享内存

      • 解决拷贝所消耗的时间

      • 让两个进程各自拿出一块虚拟地址空间来(则虚拟地址独立),然后映射到相同的物理内存中。由于系统加载一个进程时,分配给进程的内存是虚拟内存空间

      • 缺点在于存在多进程竞争内存

    • 信号量

      • 本质是一个计数器,用来实现进程之间的互斥与同步。

      • 如信号量的初始值是 1,然后 a 进程来访问内存1的时候,就把信号量的值设为 0,然后进程b 也要来访问内存1的时候,看到信号量的值为 0 就知道已经有进程在访问内存1了,这个时候进程 b 就会访问不了内存1。

    • socket

      • 以上都是多个进程在一台主机之间的通信,socket实现物理距离很远的主机上的进程进行通信。

  • Linux常见目录结构说明

  • 系统颠簸:频繁的页面调度行为,因为不断产生缺页中断,导致不断要调入调出页

    • 选择合适的页面调度算法

    • 因为运行的程度太多,造成程序无法同时将所有频繁访问的页面调入内存,则要降低多道程序的数量

    • 终止该进程或者增加物理内存容量

  • 程序局部性原理

    • 空间上:内存中被访问的页的周围页也可能被访问

    • 时间上:最近被访问的页在不久的将来也可能被访问

  • 进程与线程、协程

    协程(Coroutines)是一种比线程更加轻量级的存在,正如一个进程可以拥有多个线程一样,一个线程可以拥有多个协程。

       协程不是被操作系统内核所管理的,而是完全由程序所控制,也就是在用户态执行。这样带来的好处是性能大幅度的提升,因为不会像线程切换那样消耗资源。

       进程与线程见:https://www.cnblogs.com/lyeeer/p/12252685.html

  • 栈内存和堆内存

    • 一个java程序运行时,程序一般会在内存中开辟一些空间供运行

    • 栈空间一般线程独享,存放一些简单的基本类型byte、short、int、long、float、double、char、boolean),以及方法,对象的地址等

    • 堆空间的内容全局共享,存放大部分的引用类型和数据(堆内存用来存放由new创建的对象和数组)。比栈内存大得多

    • 堆主要用来存放对象,栈主要用来执行程序

    • 堆是应用程序在运行的时候请求操作系统分配给自己内存,由于从操作系统管理的内存分配,所以在分配和销毁时都要占用时间,因此用堆。

    • 栈的优势是存取速度比堆要快,仅次于寄存器,栈数据可以共享。缺点是存在栈中的数据大小与生存期必须是缺点的,缺少灵活性。

  • 内存管理

    • 虚拟内存

      • 虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。

      • 使用空分复用技术,进程使用虚拟内存中的地址,由操作系统协助相关硬件,把它“转换”成真正的物理地址。

      • 结构:

              用户需要调用函数时,一般都会生成一个称为栈帧的结构,从而导致虚拟内存中的栈空间增长。

              用户需要单独申请内存空间时,就会从堆空间分配,从而导致虚拟内存中的堆空间增长。

    • 分页与分段

      • 段是信息的逻辑单位,根据用户的需求划分,因此段对用户是可见的。且段的大小不固定,由所完成的功能决定;向用户提供二维地址空间;便于存储保护以及信息的共享

      • 页则是信息的物理单位,为了方便管理主存而划分,对用户是透明的。因此页的大小固定,由系统决定;向用户提供一维地址空间;

    • 分页系统地址映射

      • 将主存空间和辅存空间分别等分为大小相等的若干页,并且为每个页按顺序指定一个页号。

      • 当程序运行时,以“页”为单位进行地址映射,即操作系统以页为单位把逻辑页从辅存调入主存,存放在物理页面上,供CPU执行。在分页存储管理机制中,把逻辑页对应的逻辑地址称为线性地址。

      • CPU访问某页时,首先要查找页表,判断要访问的页是否在主存,若在主存则命中,否则未命中。然后将未命中的页按某种调度算法由辅存调入主存,并根据逻辑页号和存放的物理页面号的对应关系,将线性地址转换为物理地址。

      • 物理地址=页的大小*页面号+页内地址

    • 内存置换算法

      • 最佳置换算法OPT(理论算法)

        • 将不再使用的页面换出,而实际中不能预知哪个页面不再使用,但是这个算法是最优算法,可以作为评测其他算法的性能。

      • FIFO

        • 按照页面装进内存的时间进行置换,越老的页面最先被换出,不管该页面是否经常使用,这样就有可能导致缺页率增加,导致页面置换次数增加。

      • 最少使用页面置换算法

        • 按照上次使用时间进行排序,将离上次使用时间最长的页面换出,可以采用栈的数据结构,每次页面被访问将该页面号放在栈顶。

      • 最近未使用页面置换算法

        • 设置引用位R,每次调用将R=1,系统每隔一段时间将R=0,当进行置换式检查哪个页面R=0说明近期不会再使用,可以将其换出。

      • 时钟页面置换算法

        • 设置引用位R,R=1表示被引用过。根据装入内存时间和是否被引用过作为标准,首先从时间最长项检查,若R=0则置换出,若为1则检查下一项并将R=0。若全部R=1,则按照FIFO方法进行置换。

posted @ 2020-02-08 22:39  闲不住的小李  阅读(252)  评论(0编辑  收藏  举报