计算机操作系统(二)

一、操作系统的运行机制和体系结构

1、运行机制

       1.1 两种指令

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C27vQ01M-1641526630166)(images/1358881-20190910075957602-96937647.png)]

       1.2 两种处理器状态

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tAqYVmp1-1641526630167)(images/1358881-20190910080207712-2102209368.png)]

       1.3 两种程序

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VCJvG1t4-1641526630167)(images/1358881-20190910080317714-934093301.png)]

       1.4 小结
  • 特权指令只能在CPU处于核心态下执行,非特权指令既可以在核心态下执行,也可以在用户态下执行。
  • 需要使用特权指令的程序称为内核程序,普通的程序为应用程序。
  • 内核程序由于需要使用特权指令,所以需要运行在核心态。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YWQte8Ww-1641526630167)(images/1358881-20190910082839913-133397401.png)]

2、OS体系结构

​ 既然操作系统中的两种程序分为内核程序和应用程序,那么那些功能需要内核程序来实现。我们先来看一下OS的体系结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jmbdJdGs-1641526630167)(images/1358881-20190910083817926-1074975257.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dd8UpNOs-1641526630167)(images/1358881-20190910083945287-261171179.png)]

举例子说明
       操作系统的体系结构问题与企业的管理问题很相似。内核就是企业的管理层,负责一些重要的工作。只有管理层才能执行特权指令,普通员工只能执行非特权指令。用户态、核心态之间的切换相当于普通员工和管理层之间的工作交接

  • 大内核:企业初创时体量不大,管理层的人会负责大部分的事情。优点是效率高;缺点是组织结构混乱,难以维护。
  • 微内核:随着企业体量越来越大,管理层只负责最核心的一些工作。优点是组织结构清晰,方便维护;缺点是效率低。

二、操作系统接口

​        操作系统作为计算机系统资源的管理者,对系统中的所有硬件和软件资源进行统一一的管理和操纵。无论是用户(程序)或OS的外层软件,凡是涉及到系统资源的有关操作,都必须作为服务请求提交给OS,由它来完成。为了使用户能方便地使用计算机,操作系统提供了相应的用户接口,帮助用户快速、有效、安全、可靠地操纵计算机系统中的各类资源,完成相关的处理。一般地,操作系统向用户提供了两类接口,即用户接口和程序接口。值得说明的是,在Internet 广为流行的今天,OS又增加了一种面向网络的网络用户接口

1、用户接口

​        在当今几乎所有的OS中,都向用户提供了用户接口,允许用户在终端上键入命令,或向OS提交作业书来取得OS的服务,并控制自己程序的运行。一般地,用户接口又可进一步分为三种类型:字符显示式联机用户接口、图形化联机用户接口和脱机用户接口。接下来我们主要看一下字符显示式联机用户接口、图形化联机用户接口。

       1.1 字符显示式联机用户接口-就是命令

​        字符显示式联机用户接口又称为联机命令接口,是指用户通过命令语言实现对作业的
控制,以及取得操作系统的服务。即用户在实现与机器的交互时,先在终端的键盘上键入
所需的命令,由终端处理程序接收该命令,并在用户终端屏幕上以字符显示方式反馈用户
输入的命令信息、命令执行及执行结果信息。
windows cmd.exe 、linux shell命令

       1.2 图形化联机用户接口-就是图形界面

​ 以Microsoft公司的Windows操作系统为例,在系统初始化后,OS为终端用户生成了一个运行explorer.exe的进程,它运行一个具有窗口界面的命令解释程序,该窗口是一个特殊的窗口,即桌面。在“开始”菜单中罗列了系统的各种应用程序,点击某个程序,则解释程序会产生一个新进程,由新进程弹出一个新窗口,并运行该应用程序,该新窗口的菜单栏或图标栏会显示应用程序的子命令。用户可进一-步选择并点击子命令, 如果该子命令需要用户输入参数,则会弹出一个对话窗口,指导用户进行命令参数的输入,完成后用户
点击“确定”按钮,命令进入执行处理过程。

2、程序接口-系统调用

​        程序接口,是OS专门为用户程序设置的,提供给程序员在编程时使用,也是用户程序取得os服务的唯一途径。 它是由-组系统调用(system call)组成,因而,也可以说,系统调用提供了用户程序和操作系统内核之间的接口。系统调用不仅可供所有的应用程序使
用,而且也可供OS自身使用。在每个系统中,通常都有几十条甚至上百条的系统调用,并可根据其功能把它们划分成若干类,每一个系统调用都是-一个能完成特定功能的子程序。

       2.1 系统调用的基本概念

​        在计算机系统中,通常运行着两类程序:系统程序和应用程序。为了防止应用程序对OS的破坏,应用程序和OS的内核是运行在不同的状态,即OS的内核是运行在系统态,而应用程序是运行在用户态。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wWtrPBqB-1641526630167)(images/image-20211204182605735.png)]

  1. 系统态(内核态)和用户态

           在计算机系统中设置了两种状态:系统态(或称为核心态)和用户态。在实际运行过程中,处理机会在系统态和用户态间切换。相应地,现代多数OS将CPU的指令集分为特权指令和非特权指令两类。
           (1)  特权指令。特权指令是指在系统态运行的指令,它对内存空间的访问范围基本不受限制,不仅能访问用户空间,也能访问系统空间。如启动外部设备、设置系统时钟时间、关中断、转换执行状态等。特权指令只允许OS使用,不允许应用程序使用,以避免引起系统混乱。
           (2)  非特权指令。非特权指令是在用户态运行的指令。应用程序所使用的都是非特权指令,它只能完成一般性的操作和任务,不能对系统中的硬件和软件直接进行访问,对内存的访问范围也局限于用户空间。这样,可以防止应用程序的运行异常对系统造成破坏。这种限制是由硬件实现的,如果在应用程序中使用了特权指令,就会发出权限出错信号,操作系统捕获到这个信号后,将转入相应的错误处理程序,将停止该应用程序的运行,重新调度。

  2. 系统调用

           在OS中提供系统调用的目的,是使应用程序可以通过它间接调用OS中的相关过程,取得相应的服务。系统调用在本质上是应用程序请求OS内核完成某功能时的一种过程调用,但它是一种特殊的过程调用,它与一般的过程调用有下述几方面的明显差别:
           (1)  运行在不同的系统状态。一般的过程调用其调用程序和被调用程序运行在相同的状态一系统态或用户 态;而系统调用与一般调用的最大区别就在于:调用程序是运行在用户态,而被调用程序是运行在系统态。
           (2)  状态的转换。由于一般的过程调用并不涉及到系统状态的转换,所以可直接由调用过程转向被调用过程。但在运行系统调用时,由于调用和被调用过程是工作在不同的系统状态,因而不允许由调用过程直接转向被调用过程,需要通过软中断机制,先由用户态转换为系统态,经内核分析后,才能转向相应的系统调用处理子程序。
           (3)  返回问题。在采用了抢占式(剥夺)调度方式的系统中,在被调用过程执行完后,要对系统中所有要求运行的进程做优先权分析。当调用进程仍具有最高优先级时,才返回到调用进程继续执行;否则,将引起重新调度,以便让优先权最高的进程优先执行。此时,将把调用进程放入就绪队列。

       2.2 系统调用的标准

​        最开始许多操作系统都提供了系统调用是有差异的,但是提供的的各种类型的系统调用,实现的功能也相类似,但在实现的细节和形式方面却相差很大,这种差异给实现应用程序与操作系统平台的无关性带来了很大的困难。为解决这一问题,国际标准化组织ISO给出的有关系统调用的国际标准POSIX 1003. 1(Portable Operating System IX),也称为“基于UNIX的可移植操作系统接口”。POSIX定义了标准应用程序接口(API),用于保证编制的应用程序可以在源代码一级上在多种操作系统上移植运行。只有符合这一标准的应用程序,才有可能完全兼容多种操作系统,即在多种操作系统下都能够运行。

       POSIX标准定义了- -组过程,这组过程是构造系统调用所必须的,通过调用这些过程所提供的服务,确定了一系列系统调用的功能。一般而言,在POSIX标准中,大多数的系统调用是一个系统调用直接映射一个过程,但也有-一个系统调用对应若千个过程的情形,如当一个系统调用所需要的过程是其它系统调用的组合或变形时,则往往会对应多个过程。

       需要明确的是,POSIX标准所定义的一组过程虽然指定了系统调用的功能,但并没有明确规定系统调用以什么形式实现,是库函数还是其它形式。如早期操作系统的系统调用.使用汇编语言编写,这时的系统调用可看成扩展的机器指令,因而,能在汇编语言编程中
直接使用。而在一些高级语言或C语言中,尤其是最新推出的一些操作系统, 如UNIX新版本、Linux. Windows和OS/2等,其系统调用干脆用C语言编写,并以库函数形式提供,所以在用C语言编制的应用程序中,可直接通过使用对应的库函数来使用系统调用,库函数的目的是隐藏访管指令的细节,使系统调用更像过程调用。但一般地说,库函数属于用户程序而非系统调用程序。如下图示出了UNIX/Linux的系统程序、库函数、系统调用的层次关系。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PnSSvTYg-1641526630168)(images/image-20211204183736898.png)]

       2.3 系统调用的类型

​        现在所有的通用OS都提供了许多系统调用,但它们所提供的系统调用会有一定的差异。对于一-般通用的OS而言,可将系统调用分为如下三大类。

  1. 进程控制类系统调用
    ​ 主要用于对进程控制的系统调用有:
      (1)  创建和终止进程的系统调用。利用创建进程的系统调用,为欲参加并发执行的程序创建一-个进程。 当进程已经执行结束时,利用终止进程的系统调用来终止该进程的运行。
    ​  (2)  获得和设置进程属性的系统调用。进程的属性包括有进程标识符、进程优先级、最大允许执行时间等。利用获得进程属性的系统调用来了解某进程的属性,利用设置进程属性的系统调用来确定和重新设置进程的属性。
      (3)  等待某事件出现的系统调用。进程在运行过程中,需要等待某事件(条件)出现后方可继续执行。此时进程可利用等待(事件)的系统调用,使自己处于等待状态,一旦等待的事件出现,便可将等待进程唤醒。

  2. 文件操纵类系统调用
    对文件进行操纵的主要系统调用如下:
      (1)  创建和删除文件。利用创建文件的系统调用请求系统创建一-个新文件。利用删除文件的系统调用将指名文件删除。
      (2)  打开和关闭文件的系统调用。用户在第一次访问某个文件之前,应先利用打开文件的系统调用将指名文件打开。利用关闭文件的系统调用将指定文件关闭。
      (3)  读和写文件的系统调用。用户可利用读系统调用从已打开的文件中读出给定数目的字符,并送至指定的缓冲区中;也可利用写系统调用从指定的缓冲区中将给定数目的字符写入文件中。读和写系统调用是文件操纵类中使用最频繁的系统调用。

  3. 进程通信类系统调用
           在单处理机系统中,OS经常采用消息传递方式和共享存储区方式。当采用消息传递方式时,在通信前需先打开一个连接。为此,应由源进程发出一条打开连接的系统调用,而目标进程则应利用接受连接的系统调用表示同意进行通信;然后,在源和目标进程之间便可开始通信。可以利用发送消息的系统调用或者用接收消息的系统调用来交换信息。通信、结束后,还须再利用关闭连接的系统调用结束通信。
           用户在利用共享存储区进行通信之前,须先利用建立共享存储区的系统调用来建立一个共享存储区,再利用建立连接的系统调用将该共享存储区连接到进程自身的虚地址空间上,然后便可利用读和写共享存储区的系统调用实现相互通信。
           除上述三类系统调用外,常用的系统调用还包括设备管理类系统调用和信息维护类系统调用,前者主要用于实现申请设备、释放设备、设备I/O和重定向、获得和设置设备属性等功能,后者主要用来获得包括有关系统和文件的时间、日期信息、操作系统版本、当前用户以及有关空闲内存和磁盘空间大小等多方面的信息。

3、系统调用的实现原理

​        系统调用是通过中断机制实现的,并且一个操作系统的所有系统调用,都通过同一个中断入口来实现。如MS DOS提供了INT 21H,应用程序通过该中断获取操作系统的服务。对于拥有保护机制的OS来说,中断机制本身也是受保护的,在IBM PC. 上,Intel 提供了多达255个中断号,但只有授权给应用程序保护等级的中断号,才是可以被应用程序调用的。对于未被授权的中断号,如果应用程序进行调用,同样会引起保护异常,而导致自己被操作系统停止。如Linux仅仅给应用程序授权了4个中断号: 3, 4, 5, 以及80h。前三个中断号是提供给应用程序调试所使用的,而80h正是系统调用(system cll)的中断号。
https://www.jianshu.com/p/643cac5f5f02

在这里插入图片描述

三、进程与线程

1、基本概念

​        在早期未配置OS的系统和单道批处理系统中,程序的执行方式是顺序执行,即在内存中仅装入一道用户程序,由它独占系统中的所有资源,只有在一一个用户程序执行完成后,才允许装入另一个程序并执行。可见,这种方式浪费资源、系统运行效率低等缺点。而在多道程序系统中,由于内存中可以同时装入多个程序,使它们共享系统资源,并发执行,显然可以克服上述缺点。程序的这两种执行方式间有着显著的不同,尤其是考虑到程序并发执行时的特征,才导致了在操作系统中引入进程的概念。 多个进程同时跑

​        在20世纪60年代中期,人们在设计多道程序OS时,引入了进程的概念,从而解决了在单处理机环境下的程序并发执行问题。此后在长达20年的时间里,在多道程序OS中一直是以进程作为能拥有资源和独立调度(运行)的基本单位的。直到80年代中期,人们又提出了比进程更小的基本单位线 程的概念,试图用它来提高程序并发执行的程度,以进一步改善系统的服务质量。特别是在进入20世纪90年代后,多处理机系统得到迅速发展,由于线程能更好地提高程序的并行执行程度,因而近几年推出的多处理机OS无一例外地都引入了线程,用以改善OS的性能。一个进程多段代码同时跑

进程是资源分配的最小单位,线程是资料分配的最小单位

2、线程的实现方式

​        线程已在许多系统中实现,但各系统的实现方式并不完全相同。在有的系统中,特别是一些数据库管理系统,如infomix所实现的是用户级线程;而另第一些系统(如Macintosh和OS/2操作系统)所实现的是内核支持线程;还有一些系统如Solaris 操作系统,则同时实现了这两种类型的线程。

       2.1 内核支持线程KST(Kernel Supported Threads)

​        在OS中的所有进程,无论是系统进程还是用户进程,都是在操作系统内核的支持下运行的,是与内核紧密相关的。而内核支持线程KST同样也是在内核的支持下运行的,它们的创建、阻塞、撤消和切换等,也都是在内核空间实现的。为了对内核线程进行控制和管理,在内核空间也为每-一个内核线程设置了一个线程控制块,内核根据该控制块而感知某线程的存在,并对其加以控制。当前大多数OS都支持内核支持线程。这种线程实现方式主要有四个主要优点:
  (1)  在多处理器系统中,内核能够同时调度同一进程中的多个线程并行执行;
​  (2)  如果进程中的一个线程被阻塞了,内核可以调度该进程中的其它线程占有处理器运行,也可以运行其它进程中的线程;
  (3)  内核支持线程具有很小的数据结构和堆栈,线程的切换比较快,切换开销小;
  (4)  内核本身也可以采用多线程技术,可以提高系统的执行速度和效率。内核支持线程的主要缺点是:对于用户的线程切换而言,其模式切换的开销较大,在同一个进程中,从一个线程切换到另一个线程时,需要从用户态转到核心态进行,这是因为用户进程的线程在用户态运行,而线程调度和管理是在内核实现的,系统开销较大。

       2.2 用户级线程ULT(User Level Threads)

​        用户级线程是在用户空间中实现的。对线程的创建、撤消、 同步与通信等功能,都无需内核的支持,即用户级线程是与内核无关的。在一个系统中的用户级线程的数目可以达到数百个至数千个。由于这些线程的任务控制块都是设置在用户空间,而线程所执行的操作也无需内核的帮助,因而内核完全不知道用户级线程的存在。

使用用户级线程方式有许多优点:
  (1)  线程切换不需要转换到内核空间。对一个进程而言,其所有线程的管理数据结构均在该进程的用户空间中,管理线程切换的线程库也在用户地址空间运行,因此进程不必切换到内核方式来做线程管理,从而节省了模式切换的开销。
  (2)  调度算法可以是进程专用的。在不干扰OS调度的情况下,不同的进程可以根据自身需要选择不同的调度算法,对自己的线程进行管理和调度,而与OS的低级调度算法是无关的。
  (3)  用户级线程的实现与OS平台无关,因为对于线程管理的代码是属于用户程序的一-部分,所有的应用程序都可以对之进行共享。因此,用户级线程甚至可以在不支持线程机制的操作系统平台上实现。

而用户级线程方式的主要缺点则在于:
  (1)  系统调用的阻塞问题。在基于进程机制的OS中,大多数系统调用将使进程阻塞,因此,当线程执行一个系统调用时,不仅该线程被阻塞,而且,进程内的所有线程会被阻塞。而在内核支持线程方式中,则进程中的其它线程仍然可以运行。
  (2)  在单纯的用户级线程实现方式中,多线程应用不能利用多处理机进行多重处理的优点,内核每次分配给一个进程的仅一个CPU,因此,进程中仅有一个线程能执行,在该线程放弃CPU之前,其它线程只能等待。

       2.3 组合模式

​        有些OS把用户级线程和内核支持线程两种方式进行组合,提供了组合方式ULT/KST线程。在组合方式线程系统中,内核支持多个内核支持线程的建立、调度和管理,同时,也允许用户应用程序建立、调度和管理用户级线程。一些内核支持线程对应多个用户级线程,这是用户级线程通过时分多路复用内核支持线程来实现的。即将用户级线程对部分或全部内核支持线程进行多路复用,程序员可按应用需要和机器配置,对内核支持线程数目进行调整,以达到较好效果。组合方式线程中,同一个进程内的多个线程可以同时在多处理器上并行执行,而且在阻塞一个线程时并不需要将整个进程阻塞。所以,组合方式多线程机制能够结合KST和ULT两者的优点,并克服了其各自的不足。由于用户级线程和内核支持线程。

注意:linux同时支持内核线程和用户线程,但是jvm封装的线程是内核线程,但是jvm有最新计划实现用户线程。

详细参见:深入理解Java虚拟机:JVM高级特性与最佳实践(第3版) 周志明 12.4.1

记住:现在的jvm中,创建线程和释放线程都要调用linux的内核指令,就是要进行用户态与内核态之间的切换。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值