zoukankan      html  css  js  c++  java
  • 操作系统详解

    • 引子

    • 操作系统

    • 操作系统与应用软件的区别

    • 操作系统分类

    • 多道程序设计

    • 操作系统四个特性

    • 进程与线程

    • 内存管理


    • 操作系统

    • 为什么要有操作系统

      现代的计算机系统主要是由一个或者多个处理器,主存,硬盘,键盘,鼠标,显示器,打印机,网络接口及其他输入输出设备组成。

      一般而言,现代计算机系统是一个复杂的系统。

      其一:如果每位应用程序员都必须掌握该系统所有的细节,那就不可能再编写代码了(严重影响了程序员的开发效率:全部掌握这些细节可能需要一万年....)

      其二:并且管理这些部件并加以优化使用,是一件极富挑战性的工作,于是,计算安装了一层软件(系统软件),称为操作系统。它的任务就是为用户程序提供一个更好、更简单、更清晰的计算机模型,并管理刚才提到的所有设备。

      程序员无法把所有的硬件操作细节都了解到,管理这些硬件并且加以优化使用是非常繁琐的工作,这个繁琐的工作就是操作系统来干的,有了他,程序员就从这些繁琐的工作中解脱了出来,只需要考虑自己的应用软件的编写就可以了,应用软件直接使用操作系统提供的功能来间接使用硬件。
    • 什么是操作系统

      操作系统就是一个协调、管理和控制计算机硬件资源和软件资源的控制程序。

    操作系统位于计算机硬件与应用软件之间,本质也是一个软件。操作系统由操作系统的内核(运行于内核态,管理硬件资源)以及系统调用(运行于用户态,为应用程序员写的应用程序提供系统调用接口)两部分组成,所以,单纯的说操作系统是运行于内核态的,是不准确的

    细说的话,操作系统应该分成两部分功能:

    
    一:隐藏了丑陋的硬件调用接口,为应用程序员提供调用硬件资源的更好,更简单,更清晰的模型(系统调用接口)。
        应用程序员有了这些接口后,就不用再考虑操作硬件的细节,专心开发自己的应用程序即可。
    
    例如:操作系统提供了文件这个抽象概念,对文件的操作就是对磁盘的操作,有了文件我们无需再去考虑关于磁盘的
          读写控制(比如控制磁盘转动,移动磁头读写数据等细节),
    
    二:将应用程序对硬件资源的竞态请求变得有序化
    
    例如:很多应用软件其实是共享一套计算机硬件,比方说有可能有三个应用程序同时需要申请打印机来输出内容,那么
          a程序竞争到了打印机资源就打印,然后可能是b竞争到打印机资源,也可能是c,这就导致了无序,打印机可能
          打印一段a的内容然后又去打印c...,操作系统的一个功能就是将这种无序变得有序。
    
    
    • 操作系统与应用软件的区别

      一、定义不同

      1、系统软件是指控制和协调计算机及外部设备,支持应用软件开发和运行的系统,是无需用户干预的各种程序的集合,主要功能是调度,监控和维护计算机系统;负责管理计算机系统中各种独立的硬件,使得它们可以协调工作。

      2、应用软件是为满足用户不同领域、不同问题的应用需求而提供的那部分软件,可以拓宽计算机系统的应用领域,放大硬件的功能。

      二、运行环境不同

      1、操作系统可以直接安装到相应的硬件设备上,比如常见Windows系统就直接安装在电脑中。

      2、应用软件不能直接安装在无操作系统的电脑中

      总结:操作系统和各种应用软件都属于“软件”,本质区别在于对“硬件”管控方式不同,操作系统在硬件管理中处于支配地位,应用软件则没有这个地位,操作系统可独立运行,应用软件不能独立运行

      注意:操作系统的本质,操作系统(Operating System,简称OS)是管理和控制计算机硬件与软件资源的计算机程序,是直接运行在“裸机”上的最基本的系统软件,任何其他软件都必须在操作系统的支持下才能运行.

    • 操作系统分类

      单用户操作系统

      单用户操作系统一次只能支持一个用户程序的运行。单用户操作系统向用户提供联机交互式的工作环境,比如MS-DOS就是一个经典的单用户操作系统

      批处理操作系统

      早期的一种大型机用操作系统。可对用户作业成批处理,期间勿需用户干预,分为单道批处理系统多道批处理系统

      分时操作系统

      利用分时技术的一种联机的多用户交互式操作系统,每个用户可以通过自己的终端向系统发出各种操作控制命令,完成作业的运行。分时是指把处理机的运行时间分成很短的时间片,按时间片轮流把处理机分配给各联机作业使用。

      实时操作系统

      一个能够在指定或者确定的时间内完成系统功能以及对外部或内部事件在同步或异步时间内做出响应的系统,实时意思就是对响应时间有严格要求,要以足够快的速度进行处理.分为硬实时和软实时两种。

      通用操作系统

      同时兼有多道批处理、分时、实时处理的功能,或者其中两种以上功能的操作系统。

      网络操作系统

      一种在通常操作系统功能的基础上提供网络通信网络服务功能的操作系统。

      分布式操作系统

      一种以计算机网络为基础的,将物理上分布的具有自治功能的数据处理系统或计算机系统互联起来的操作系统。分布式系统中各台计算机无主次之分,系统中若干台计算机可以并行运行同一个程序,分布式操作系统用于管理分布式系统资源。

      嵌入式操作系统

      一种运行在嵌入式智能芯片环境中,对整个智能芯片以及它所操作、控制的各种部件装置等资源进行统一协调、处理、指挥和控制的系统软件。

      多道程序设计

      多道程序设计是在计算机内du存中同时zhi存放几道相互独立的程序,使它们在管理程序控制之s下,相互穿插的运行。 两个或两个以上程序在计算机系统中同处于开始到结束之间的状态。这就称为多道程序设计。

      多道程序设计运行的特征:

      1、多道:计算机主存中同时存放几道相互独立的程序。

      2、宏观上并行:同时进入系统的几道程序都处于运行过程中,即它们都开始运行,但都未运行完毕。

      3、微观上串行:从微观上看,主存中的多道程序轮流或分时地占有处理机,交替运行。

      多道程序设计优点:

      1、提高CPU的利用率。在多道程序环境下,多个程序共享计算机资源当某个程序等待I/O操作时,CPU可以执 行其他程序,大大提高CPU的利用率。

      2、提高设备的利用率。在多道程序环境下,多个程序共享系统的设备,大大提高系统设备的利用率。

      3、提高系统的吞吐量。在多道程序环境下,减少了程序的等待时间,提高了系统的吞吐量

    操作系统的四个特性

    并发:同一段时间内多个程序执行(注意区别并行和并发,前者是同一时刻的多个事件,后者是同一时间段内的多个事件)
    共享:系统中的资源可以被内存中多个并发执行的进线程共同使用
    虚拟:通过时分复用(如分时系统)以及空分复用(如虚拟内存)技术实现把一个物理实体虚拟为多个
    异步:系统中的进程是以走走停停的方式执行的,且以一种不可预知的速度推进

    进程与线程

    1、多进程的组织形式包括下面3个关键部分:

    1)PCB(Process Control Block):用来记录进程信息的数据结构(管理进程的核心,包含了PID等进程的所有关键信息)

    2)进程的状态:1:就绪状态,2:执行状态,3:阻塞状态(多线程时也是这些状态)

    3)队列:就绪队列、等待(阻塞)队列。

    处于就绪状态的进程,在调度程序为之分配了处理机之后便开始执行, 就绪 -> 执行

    正在执行的进程如果因为分配他的时间片已经用完,而被剥夺处理剂, 执行 -> 就绪

    如果因为某种原因致使当前的进程执行受阻,使之不能执行。 执行 -> 阻塞

    2、 CPU调度算法 (在就绪序列中怎么挑选进程让CPU执行)

    先了解两个概念:

    • 周转时间: 从开始申请执行任务,到执行任务完成
    • 响应时间: 从开始申请执行任务到开始执行任务

    先来先服务调度算法FCFS:按作业或者进程到达的先后顺序依次调度;(平均周转时间可能会很长 )

    短作业优先调度算法SJF:算法从就绪队列中选择估计时间最短的作业进行处理,直到得出结果或者无法继续执行(周转时间短,但是响应时间长 )

    高相应比算法HRN:响应比=(等待时间+要求服务时间)/要求服务时间;

    时间片轮转调度RR:按到达的先后对进程放入队列中,然后给队首进程分配CPU时间片,时间片用完之后计时器发出中断,暂停当前进程并将其放到队列尾部,循环 ;(响应时间可以得到保证)

    多级反馈队列调度算法:目前公认较好的调度算法;设置多个就绪队列并为每个队列设置不同的优先级,第一个队列优先级最高,其余依次递减。优先级越高的队列分配的时间片越短,进程到达之后按FCFS放入第一个队列,如果调度执行后没有完成,那么放到第二个队列尾部等待调度,如果第二次调度仍然没有完成,放入第三队列尾部…。只有当前一个队列为空的时候才会去调度下一个队列的进程。

    线程有自己的TCB(thread control block线程控制块), 只负责这条流程的信息,包括PC程序计数器,SP栈,State状态,和寄存器,线程id。

    线程有内核级线程和用户级线程,我们一般说的都是用户级线程,内核级线程由内核管理。

    补充小知识:

    1)只有内核级线程才能发挥多核性能,因为内核级线程共用一套MMU(即内存映射表),统一分配核1核2(即有多个CPU,可以一个CPU执行一个内核级线程)。进程 无法发挥多核性能,因为进程切换都得切MMU

    2)为什么需要内核级线程??如果只有用户级线程,在内核中只能看到进程,所以当用户级线程中一个线程进行IO读写阻塞时,内核会将该线程所在的进程直接切换。例如当用浏览器打开网页,这个进程中有下载数据线程,有显示数据线程,当数据下载读写阻塞时,内核直接切到qq(这些切换是指在CPU上运行的程序的切换)

    3、 进程和线程的对比

    进程是系统进行资源调度和分配的基本单位;线程是CPU调度的基本单位。

    进程 = 资源 (包括寄存器值,PCB,内存映射表)+ TCB(栈结构)
    线程 = TCB(栈结构)

    线程 的资源是共享的
    进程 间的资源是分隔独立的,内存映射表不同,占用物理内存地址是分隔的

    线程 的切换只是切换PC,切换了TCB(栈结构)
    进程 的切换不仅要切换PC,还包括切换资源,即切换内存映射表

    4、 进程间同步

    经典的进程同步问题:生产者-消费者问题;哲学家进餐问题;读者-写者问题

    同步的解决方案:管程,信号量。

    死锁定义:

      在两个或多个并发进程中,如果每个进程持有某种资源而又都等待别的进程释放它或它们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。通俗地讲,就是两个或多个进程被无限期地阻塞、相互等待的一种状态。**
    **

    产生条件:

      1:互斥条件 -- 一个资源一次只能被一个进程使用

    2:请求保持条件 -- 一个进程因请求资源而阻塞时,对已经获得资源保持不放

      3:不可抢占条件 -- 进程已获得的资源在未使用完之前不能强行剥夺

      4:循环等待条件 -- 若干进程之间形成一种头尾相接的循环等待资源的关系

    死锁处理:

    1. 预防死锁:破坏产生死锁的4个必要条件中的一个或者多个;实现起来比较简单,但是如果限制过于严格会降低系统资源利用率以及吞吐量
    2. 避免死锁:在资源的动态分配中,防止系统进入不安全状态(可能产生死锁的状态)-如银行家算法
    3. 检测死锁:允许系统运行过程中产生死锁,在死锁发生之后,采用一定的算法进行检测,并确定与死锁相关的资源和进程,采取相关方法清除检测到的死锁。实现难度大
    4. 解除死锁:与死锁检测配合,将系统从死锁中解脱出来(撤销进程或者剥夺资源)。对检测到的和死锁相关的进程以及资源,通过撤销或者挂起的方式,释放一些资源并将其分配给处于阻塞状态的进程,使其转变为就绪态。实现难度大

    死锁忽略: windows,Linux个人版都不做死锁处理,直接忽略,大不了重启就好了,小概率事件,代价可以接受

    内存管理

    要解决的两个问题

    1)每个进程代码中使用的地址可能相同。解决思路:对代码中的地址重定向(加个基地址)。

    2)物理内存可能比较小,不能同时放很多进程进来。解决思路:把要运行的代码移到内存,暂时不用的代码移入磁盘,即交换(swap),内存置换

    1、分段

    一个程序分成多个段(每个段特性不同为了方便管理,例如代码段只读、数据段等等),当然这都是逻辑上的。

    管理段的结构叫段表,段表保存中进程的PCB中。

    2 、页表

      把程序按段分对程序员是友好的,但是如果物理存储也按段存,则会导致大块的内存碎片,例如现在需要分个10M的段但是连续的存储空间只有8M/9M/5M三个。解决办法: (将段打散存到页中)不要对内存进行连续的分配,将内存划分成1页1页,按页分配,1页4kb大小,最多浪费的也就4KB。这样不会有内存碎片,也不会出现没有符合要求大小的内存可以申请的情况,因为可以打散了分散到一页一页中。

      整个系统的页表就是https://www.cnblogs.com/xdyixia/p/9253138.html中说的多级页表(这个整个系统的多级页表简单来说就是把物理地址都进行了按页划分,保存了每页的基地址(对应下图中的页框号))。程序向系统申请时内存时,系统就会把哪几个页框号分给程序的某个段,程序再把它段0中的第3页数据放到页框6中。


    说明:进程需要有自己的“页表”,里面映射双方是程序的逻辑地址中的页号和系统分给这給程序的页框号。

    3、 段页结合的内存管理

    实际在内存管理中的段页结合如下图,页号加偏移称为虚拟地址,MMU负载从虚拟地址到物理地址的转换,同时也负责权限检查。

    上面解决了每个进程代码中使用的地址可能相同,系统给每个进程分配基地址,进程保存在PCB中。

    但是进程可操作的虚拟地址为4G(32位系统),可物理地址为1G怎么办。

    4 、请求调页内存换入

    CPU对数据进行请求时,才会进行映射(虚拟内存到物理内存)。

    例如进程1正在运行,进行映射拿数据,查页表发现页框号中没有数据或有进程2的数据,则需要页表调入内存。

    5、内存换出

    有页表需要调入,那么谁调出。

    **************************页面置换算法****************************

    1:最佳置换算法(Optimal):一种理论的算法,选着淘汰的页面是以后一定不再使用的页面(理想化的),该算法无法实现,只能作为其他算法好坏的一个评价对比。

    2:先进先出(FIFO)算法:总是最先淘汰最先进去的页面,该算法容易实现。缺点:通常程序调入内存的先后顺序和程序执行的先后顺序不一致,导致缺页率高。

    3:最近最久未使用算法LRU:算法赋予每个页面一个访问字段,用来记录上次页面被访问到现在所经历的时间t,每次置换的时候把t值最大的页面置换出去(实现方面可以采用寄存器或者栈的方式实现)。

    4:时钟算法clock(也被称为是最近未使用算法NRU):页面设置一个访问位R,并将页面链接为一个环形队列,页面被访问的时候访问位设置R为1。页面置换的时候,如果当前指针所指页面访问R为0,那么置换,否则将其置为0,循环直到遇到一个访问为位0的页面。

    但是这个方法有缺点:缺页比较少的时候(最近没有使用淘汰中的“最近”太长了),所有的R都为1(很少变成0),每次都要转一圈才能找到换出去的页,退化成FIFO,效率不高。

    改进: 双指针,一个快,一个慢,像时钟一样 (定时清除R位)(更像clock)
    快时钟做R的清0定时清0,等到慢指针转到这里的时候R=0,说明在定时时间片内没有备访问,该页可以被替换了。

  • 相关阅读:
    SGU 271 Book Pile (双端队列)
    POJ 3110 Jenny's First Exam (贪心)
    HDU 4310 Hero (贪心)
    ZOJ 2132 The Most Frequent Number (贪心)
    POJ 3388 Japanese Puzzle (二分)
    UVaLive 4628 Jack's socks (贪心)
    POJ 2433 Landscaping (贪心)
    CodeForces 946D Timetable (DP)
    Android Studio教程从入门到精通
    Android Tips – 填坑手册
  • 原文地址:https://www.cnblogs.com/gfeng/p/14300656.html
Copyright © 2011-2022 走看看