多道程序设计和分时系统
我们已讨论了计算机系统的基本组成和体系结构,现在讨论操作系统。操作系统为执行程序而提供环境。操作系统可以通过许多不同方式来构建,因此内部组织差异很大。不过,它们也有许多共同点,这里将会加以讨论。
操作系统在内存中同时保存多个任务(图 1)。由于主存太小不能容纳所有作业,因此这些作业首先保存在磁盘的作业池(job pool)上。该作业池包括磁盘上的、等待分配内存的所有进程。
图 1 多道程序系统的内存分布
内存的作业集为作业池的作业集的一个子集。从内存的作业集中,操作系统可以选择执行一个作业。最终,该作业可能需要等待某个任务,如 I/O 操作的完成。对于非多道程序系统,CPU 就会空闲;而对于多道程序系统,CPU 就会简单切换到另一个作业,以便执行。当该作业需要等待时,CPU 会切换到另一个作业,等等。最终,第一个作业完成等待并重新获得 CPU。只要有一个任务可以执行,CPU 就不会空闲。
这种做法在日常生活中也常见。例如,一个律师在一段时间内不只为一个客户工作。当一个案件需要等待审判或需要准备文件时,该律师可以处理另一个案件。如果有足够多的客户,那么他就决不会因没有工作要做而空闲。
多道程序系统提供了一个环境,以便充分使用各种系统资源(如 CPU、内存、外设),但是没有提供用户与计算机系统的交互。分时系统(time sharing)(或多任务(multitasking))是多道程序设计的自然延伸。对于分时系统,虽然 CPU 还是通过切换作业来执行多个作业,但是由于切换频率很高,用户可以在程序运行时与其交互。
分时操作系统允许许多用户同时共享一台计算机。由于分时系统的每个动作或命令往往较短,因而每个用户只需少量 CPU 时间。随着系统从一个用户快速切换到另一个用户,每个用户都会感到整个系统只为自己所用,尽管它事实上为许多用户所共享。
分时操作系统采用 CPU 调度和多道程序设计,为每个用户提供一小部分的分时计算机资源。每个用户至少有一个程序在内存中。加载到内存并执行的程序,通常称为进程(process)。当进程执行时,它通常在执行较短的一段时间后,要么完成,要么需要进行 I/O 操作。
I/O 可以是交互的,即输出是到用户显示器,输入来自用户键盘、鼠标或其他设备。由于交互 I/O 通常按人类速度(people speed)来进行,因此可能需要很长时间完成。例如,输入通常受限于用户打字速度,每秒 7 个字符对人类来说可能很快,但是对计算机来说太慢了。在用户进行交互输入时,操作系统为了不让 CPU 空闲,会将 CPU 切换到其他用户程序。
分时系统和多道程序需要在内存中同时保存多个作业。如果有多个作业可以加载到内 存,同时内存太小而不能容纳所有这些作业,那么系统就应做出选择(这个决定涉及作业调度(job scheduling),将在后续章节中介绍)。操作系统从作业池中选中一个作业,并将它调入内存以便执行。内存同时保存多个程序,这需要一定形式的内存管理。
另外,如果有多个任务同时等待执行,那么系统应当做出选择。做出这样的决策称为 CPU 调度(CPU scheduling)。最后,在多个作业并发执行时,操作系统的各个阶段,如进程调度、磁盘和内存管理,应能限制作业之间的互相影响。这些讨论贯穿本教程。
对于分时系统,操作系统必须确保合理的响应时间。这有时可以通过交换(swapping)来得到,交换可将进程从磁盘调入内存,也可将进程从内存调到磁盘。不过,虚拟内存(virtual memory)是实现合理响应时间的更为常用的一种方法,虚拟内存允许一个执行作业不必完全在内存中。
虚拟内存的主要优点是,用户可执行比物理内存(physical memory)大的程序。再者,它将内存抽象成一个庞大的、统一的存储数组,将用户理解的逻辑内存(logical memory)与真正的物理内存区分幵来。这种安排使得程序员不受内存空间的限制。
分时系统也应提供文件系统。文件系统驻留在一组磁盘上,因此 也应提供磁盘管理。另外,分时系统需要提供机制,以便保护资源并防止不当使用。为了确保有序执行,系统必须提供机制,以便实现作业的同步和通信;它也可确保作业不会进入死锁,进而永远互相等待。
多道程序设计(multiprogramming)
操作系统最重要的一点是具有多道程序能力。一般来说,单个程序并不能让 CPU 和 I/O 设备始终忙碌。单个用户通常具有多个运行程序。多道程序设计(multiprogramming)通过安排作业(编码与数据)使得 CPU 总有一个执行作业,从而提高 CPU 利用率。操作系统在内存中同时保存多个任务(图 1)。由于主存太小不能容纳所有作业,因此这些作业首先保存在磁盘的作业池(job pool)上。该作业池包括磁盘上的、等待分配内存的所有进程。
图 1 多道程序系统的内存分布
内存的作业集为作业池的作业集的一个子集。从内存的作业集中,操作系统可以选择执行一个作业。最终,该作业可能需要等待某个任务,如 I/O 操作的完成。对于非多道程序系统,CPU 就会空闲;而对于多道程序系统,CPU 就会简单切换到另一个作业,以便执行。当该作业需要等待时,CPU 会切换到另一个作业,等等。最终,第一个作业完成等待并重新获得 CPU。只要有一个任务可以执行,CPU 就不会空闲。
这种做法在日常生活中也常见。例如,一个律师在一段时间内不只为一个客户工作。当一个案件需要等待审判或需要准备文件时,该律师可以处理另一个案件。如果有足够多的客户,那么他就决不会因没有工作要做而空闲。
多道程序系统提供了一个环境,以便充分使用各种系统资源(如 CPU、内存、外设),但是没有提供用户与计算机系统的交互。分时系统(time sharing)(或多任务(multitasking))是多道程序设计的自然延伸。对于分时系统,虽然 CPU 还是通过切换作业来执行多个作业,但是由于切换频率很高,用户可以在程序运行时与其交互。
分时系统(time sharing)
分时系统要求计算机系统是可交互(interactive)的,以便用户与系统直接通信。用户通过输入设备,如键盘、鼠标、触摸板、触摸屏等向操作系统或程序发出指令,并等待输出设备的即时结果。相应地,响应时间(response time)应当较短,通常小于 1 秒。分时操作系统允许许多用户同时共享一台计算机。由于分时系统的每个动作或命令往往较短,因而每个用户只需少量 CPU 时间。随着系统从一个用户快速切换到另一个用户,每个用户都会感到整个系统只为自己所用,尽管它事实上为许多用户所共享。
分时操作系统采用 CPU 调度和多道程序设计,为每个用户提供一小部分的分时计算机资源。每个用户至少有一个程序在内存中。加载到内存并执行的程序,通常称为进程(process)。当进程执行时,它通常在执行较短的一段时间后,要么完成,要么需要进行 I/O 操作。
I/O 可以是交互的,即输出是到用户显示器,输入来自用户键盘、鼠标或其他设备。由于交互 I/O 通常按人类速度(people speed)来进行,因此可能需要很长时间完成。例如,输入通常受限于用户打字速度,每秒 7 个字符对人类来说可能很快,但是对计算机来说太慢了。在用户进行交互输入时,操作系统为了不让 CPU 空闲,会将 CPU 切换到其他用户程序。
分时系统和多道程序需要在内存中同时保存多个作业。如果有多个作业可以加载到内 存,同时内存太小而不能容纳所有这些作业,那么系统就应做出选择(这个决定涉及作业调度(job scheduling),将在后续章节中介绍)。操作系统从作业池中选中一个作业,并将它调入内存以便执行。内存同时保存多个程序,这需要一定形式的内存管理。
另外,如果有多个任务同时等待执行,那么系统应当做出选择。做出这样的决策称为 CPU 调度(CPU scheduling)。最后,在多个作业并发执行时,操作系统的各个阶段,如进程调度、磁盘和内存管理,应能限制作业之间的互相影响。这些讨论贯穿本教程。
对于分时系统,操作系统必须确保合理的响应时间。这有时可以通过交换(swapping)来得到,交换可将进程从磁盘调入内存,也可将进程从内存调到磁盘。不过,虚拟内存(virtual memory)是实现合理响应时间的更为常用的一种方法,虚拟内存允许一个执行作业不必完全在内存中。
虚拟内存的主要优点是,用户可执行比物理内存(physical memory)大的程序。再者,它将内存抽象成一个庞大的、统一的存储数组,将用户理解的逻辑内存(logical memory)与真正的物理内存区分幵来。这种安排使得程序员不受内存空间的限制。
分时系统也应提供文件系统。文件系统驻留在一组磁盘上,因此 也应提供磁盘管理。另外,分时系统需要提供机制,以便保护资源并防止不当使用。为了确保有序执行,系统必须提供机制,以便实现作业的同步和通信;它也可确保作业不会进入死锁,进而永远互相等待。
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算