热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

正襟危坐说操作系统(壹):操作系统概述及历史

概述:操作系统协调各任务公平分享CPU。所谓的操作系统隐藏在各任务和中断背后,在系统运行时,并不以独立的形式存在,没有自己

概述:

操作系统协调各任务公平分享CPU。所谓的操作系统隐藏在各任务和中断背后,在系统运行时,并不以独立的形式存在,没有自己的执行线程。就像赛场外的裁判,只是协调整个比赛过程,而不亲自参与比赛,由运动员自己进行比赛。什么时候这个裁判才起作用呢?当系统时钟中断或系统调用时,操作系统代码才会出面协调任务的进行。而中断处理在某些方面超出了系统软件的管理范围,而由CPU硬件触发,比所有任务都优先执行。中断处理以外剩余的CPU时间,由各任务依据优先级设置、资源分配和执行流程来共同分享。

在系统运行时,除了任务中断这样的动态运行对象外,还存在一些静态对象,如调度机制、任务间通信机制、内存管理机制和输入输出系统等。这里所讲的静态是相对的,指这些对象代码没有自主的执行线程,总处于被动的调用状态。调用时对内存中的分配的静态数据结构进行操作,有时也改变任务的运行状态。

 

操作系统在计算机运行过程中扮演的角色:魔术师管理者

魔术师隐藏了背后的复杂,把差的东西变好,把少的东西变多,把复杂的东西变得容易。

操作系统通过进程抽象让每个用户感觉到有一台自己独享的CPU;通过虚拟内存的抽象,让用户感觉到物理内存空间具有无限扩张性。

管理者则针对所有计算机资源进行管理以达到公平和效率的“双料”境界。操作系统对CPU、内存、磁盘等的管理,使得不同用户之间或者同一用户的不同程序之间可以安全有序的共享这些硬件资源。

 

历史:

操作系统Operating Systems指的就是掌控局势的一种系统。掌控的是计算机或计算机里发生的一切事情。最原始的计算机并没有操作系统,而是直接由人来掌控事情,即所谓的单一控制终端、单一操作员模式。但随着计算机的复杂性的增长,人已经不能胜任直接掌控计算机了。于是我们编写出OS这个软件来掌控计算机,将人类从日益复杂的任务中解脱出来。由于计算机的功能和复杂性不断发生变化,操作系统锁掌控的事情也就越来越多,越来越复杂。同时操作系统本身能够使用的资源也不断增多。

操作系统的不断发展与改善由两个因素驱动:

1,硬件成本的不断下降

2,计算机的功能和复杂性的不断变化

 

第一阶段:单一操作员、单一控制端操作系统(20世纪40年代)

代表机型是ENIAC。此时没有操作系统的整体概念,唯一想到的就是提供一些标准命令供用户使用,这些标准命令集合就构成我们原始的操作系统SOSC(单一操作员、单一控制终端 single operator,singleconsole)。

SOSC操作系统的设计就是满足基本的功能,并提供人机交互。在这种操作系统下,操作系统本身只是一组标准库函数而已。操作系统不自我运行,而是等待操作员输入命令再运行。用户想使用什么服务,就直接在命令行键入代表该服务的对应操作系统的库函数名即可。

 

第二阶段:批处理操作系统(20世纪50年代)

SOSC效率之所以低下,是因为计算机总是在等待人的下一步动作,而人的动作总是很慢。因此,如果将人的因素拿走,让所有人先想好自己要运行的命令,列成一个清单,打印在纸带上,然后交给一个工作人员来一批一批地处理,效率不就提高了么。

批处理操作系统针对的是第二代通用计算机,如IBM的1401和7094等,通过去除人机交互达到CPU和输入输出利用率的改善

在SOSC环境下,每个用户自己控制程序的开始和结束。而在批处理下,很多用户的程序一个接一个地存放在磁带上,用户本人无法控制程序的开始和结束。而这个任务就交给了批处理操作系统。整个批处理操作系统是由批处理监视器和原来的操作系统库函数组成。

此种操作系统的任务就是加载一个程序、运行、打印结果,然后执行下一个程序。

 

第三代:多道批处理操作系统(20世纪60年代)

虽然批处理操作系统通过无需人机交互过程而在一定程度上提高了计算机的效率,但还是不那么令人满意。因为,CPU和输入输出设备的运行是串行的,即在程序进行输入输出时,CPU只能等待。CPU需要不断地探询I/O是否完成,因而不能执行别的程序。(磁带上的程序要先读进来,程序才能执行,执行完了又需要写到另一个磁带上。读写磁带的时候CPU是不工作的,这就是很大的浪费。)

能否将CPU和I/O进行并发呢?即在一个程序输出结果时,让另一个程序继续执行。CPU和I/O重叠需要我们将多个程序同时加载到计算机内存里(以前是加载一个程序,执行,输出,再加载下一个程序),从而出现了多道批处理系统。

由于多个程序同时执行,操作系统需要能够在多个程序之间进行切换,并且能够管理多个输入输出设备,同时还要能够保护一个进程不受另一个进程干扰。此时的操作系统要复杂的多:即要管理工作,又要管理内存,还要管理CPU调度。

 

第四代之一:分时操作系统(20世纪70年代)

多道批处理操作系统的出现使计算机的吞吐率大大提高,但是另一个问题,将程序制作在卡片上交给计算机管理员统一运行,将使用户无法立即获知程序运行的结果。

能否让人回到计算机前面来,每个人自己管理自己的程序,大家的程序可以同时运转。人的因素又引了回来。这看上去与原始的SOSC似乎一样,但有很多关键不同:多人同时连在计算机上,每个人是一个I/O终端而已,终端显示器只能接收和发送有限的文本命令和信息。计算机在所有连接的终端用户之间进行分时,即分给每个人有限的时间,只要时间到了,就换一个进程

在分时操作系统下,任意时间可以运行多个程序,用户直接与计算机交互,可当场调试程序。SOSC是一切等着人,执行一条命令就等人,分时系统是人等机器。机器不用再等你,当你想问题的时机器就切换到别的程序,等你想完了机器再切换回来,接受你的输入。

因为机器昂贵,我们不能容忍机器(CPU)在I/O设备工作期间闲置下来。同时,因为人的时间宝贵,我们不能容忍人们在机器面前漫长等待。因此,我们发明了分时操作系统来解决这两个问题。因为分时而引入的多道程序设计,又造成操作系统的空前复杂,我们需要应对竞争、通信、死锁、保护等一系列的新功能。

 

之二:实时操作系统

使用计算机对某些工业进程进行监视,并在需要的时候采取行动,这种对计算机响应时间有要求的系统通常称为临界系统或应用。为了满足这些应用对响应时间的要求,人们就开发了实时操作系统。实时操作系统是指所有任务都在规定时间内完成的操作系统,即必须满足时序可预测性。显然,实时操作系统的最重要部分是进程调度。只有精确、合理和及时的进程调度才能保证响应时间。

 

第五代:现代操作系统(1980年以后)

随着硬件越来越便宜,个人机出现了。人们可以拥有自己的电脑,无需与别人分享。由于个人机由用户一个人独享,分时操作系统的许多功能就无需存在。因此,个人操作系统又变回了标准库函数系统。(例如DOS)

但人们发现没有分时功能的操作系统使一些事情做不了。因为,虽然只有一个人在用机器,但这个人可能想同时想做好几件事。于是又将各种分时功能加了进去。于是Windows NT等就出现了。

 


推荐阅读
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 服务器上的操作系统有哪些,如何选择适合的操作系统?
    本文介绍了服务器上常见的操作系统,包括系统盘镜像、数据盘镜像和整机镜像的数量。同时,还介绍了共享镜像的限制和使用方法。此外,还提供了关于华为云服务的帮助中心,其中包括产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题和视频帮助等技术文档。对于裸金属服务器的远程登录,本文介绍了使用密钥对登录的方法,并提供了部分操作系统配置示例。最后,还提到了SUSE云耀云服务器的特点和快速搭建方法。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 本文讨论了如何在dotnet桌面(Windows)应用程序中添加图标。作者提到可以使用dotnet命令行工具与resource.rc文件一起使用来为标准.NET核心应用程序添加图标。作者还介绍了在创建控制台应用程序时如何编辑projeto1.csproj文件来添加图标。 ... [详细]
  • 在编写业务代码时,常常会遇到复杂的业务逻辑导致代码冗长混乱的情况。为了解决这个问题,可以利用中间件模式来简化代码逻辑。中间件模式可以帮助我们更好地设计架构和代码,提高代码质量。本文介绍了中间件模式的基本概念和用法。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
author-avatar
黑衬衫1994
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有