计算机速成课Crash Course - 18. 操作系统

news2024/11/20 18:44:19

今天继续计算机速成课Crash Course的系列讲解。

更多技术文章,全网首发公众号 “摸鱼IT” 锁定 -上午11点 - ,感谢大家关注、转发、点赞!

计算机速成课Crash Course - 17. 集成电路&摩尔定律

18. 操作系统

1940,1950 年代的电脑,每次只能运行一个程序,程序员在打孔纸卡上写程序,然后拿到一个计算机房间, 交给操作员,等计算机空下来了,操作员会把程序放入,然后运行,输出结果,停机。

以前计算机慢,这种手动做法可以接受,运行一个程序通常要几小时,几天甚至几周。

但上集说过,计算机越来越快,越来越快,指数级增长!很快,放程序的时间比程序运行时间还长我们需要一种方式,让计算机自动运作,于是"操作系统"诞生了。

操作系统,简称 OS,其实也是程序,但它有操作硬件的特殊权限,可以运行和管理其它程序。操作系统一般是开机第一个启动的程序,其他所有程序都由操作系统启动。

操作系统开始于 1950 年代,那时计算机开始变得更强大更流行。

第一个操作系统加强了程序加载方式,之前只能一次给一个程序,现在可以一次多个,当计算机运行完一个程序,会自动运行下一个程序,这样就不会浪费时间,找下一个程序的纸卡,这叫“批处理”。

电脑变得更快更便宜,开始在出现在世界各地,特别是大学和政府办公室。很快,人们开始分享软件,但有一个问题,在哈佛1号和 ENIAC 那个时代,计算都是一次性的,程序员只需要给那"一台"机器写代码。

处理器,读卡器,打印机都是已知的,但随着电脑越来越普遍,计算机配置并不总是相同的,比如计算机可能有相同 CPU,但不同的打印机,这对程序员很痛苦。

不仅要担心写程序,还要担心程序怎么和不同型号打印机交互,以及计算机连着的其他设备,这些统称"外部设备"。

和早期的外部设备交互,是非常底层的,程序员要了解设备的硬件细节,加重问题的是,程序员很少能拿到所有型号的设备来测代码,所以一般是阅读手册来写代码,祈祷能正常运行。

现在是"即插即用",以前是"祈祷能用",这很糟糕,所以为了程序员写软件更容易。

操作系统充当软件和硬件之间的媒介,更具体地说,操作系统提供 API 来抽象硬件,叫"设备驱动程序",程序员可以用标准化机制和输入输出硬件(I/O)交互。

比如,程序员只需调用 print(highscore),操作系统会处理输到纸上的具体细节。

到 1950 年代尾声,电脑已经非常快了,处理器经常闲着,等待慢的机械设备(比如打印机和读卡器),程序阻塞在 I/O 上,而昂贵的处理器则在度假,就是放松啥也不做。

50年代后期,英国曼彻斯特大学开始研发世界上第一台超级计算机,Atlas,他们知道机器会超级快,所以需要一种方式来最大限度的利用它。

他们的解决方案是一个程序叫 Atlas Supervisor,于1962年完成,这个操作系统,不仅像更早期的批处理系统那样,能自动加载程序,还能在单个 CPU 上同时运行几个程序,它通过调度来做到这一点。

假设 Atlas 上有一个游戏在运行,并且我们调用一个函数 print(highscore),它让 Atlas 打印一个叫 highscore 的变量值,让朋友知道 我是最高分冠军。

print 函数运行需要一点时间,大概上千个时钟周期,但因为打印机比 CPU 慢,与其等着它完成操作,但因为打印机比 CPU 慢,与其等着它完成操作,Atlas 会把程序休眠,运行另一个程序,最终, 打印机会告诉 Atlas, 打印已完成,Atlas 会把程序标记成可继续运行,之后在某时刻会安排给 CPU 运行,并继续 print 语句之后的下一行代码。

这样, Atlas 可以在 CPU 上运行一个程序,同时另一个程序在打印数据,同时另一个程序读数据。

Atlas 的工程师做的还要多,配了4台纸带读取器,4台纸带打孔机,多达8个磁带驱动器,使多个程序可以同时运行,在单个 CPU 上共享时间,操作系统的这种能力叫"多任务处理"。

同时运行多个程序有个问题,每个程序都会占一些内存,当切换到另一个程序时,我们不能丢失数据,解决办法是:给每个程序分配专属内存块。

举个例子,假设计算机一共有 10000 个内存位置,程序 A 分配到内存地址 0 到 999,而程序 B 分配到内存地址 1000 到 1999,以此类推。

如果一个程序请求更多内存,操作系统会决定是否同意,如果同意,分配哪些内存块,这种灵活性很好,但带来一个奇怪的后果,程序 A 可能会分配到非连续的内存块,比如内存地址 0 到 999,以及 2000 到 2999。

这只是个简单例子,真正的程序可能会分配到内存中数十个地方,你可能想到了,这对程序员来说很难跟踪。

也许内存里有一长串销售额,每天下班后要算销售总额,但列表 存在一堆不连续的内存块里,为了隐藏这种复杂性,操作系统会把内存地址进行 "虚拟化",这叫 "虚拟内存",程序可以假定内存总是从地址0开始,简单又一致,而实际物理位置,被操作系统隐藏和抽象了。

一层新的抽象!

用程序 B 来举例,它被分配了内存地址 1000 到 1999,对程序 B 而言,它看到的地址是 0 到 999,操作系统会自动处理,虚拟内存和物理内存之间的映射,如果程序 B 要地址 42,实际上是物理地址 1042,这种内存地址的虚拟化,对程序 A 甚至更有用。

在例子中,A 被分配了两块隔开的内存,程序 A 不知道这点,以 A 的视角,它有 2000 个连续地址,当程序 A 读内存地址 999 时,会刚好映射到物理内存地址 999。

但如果程序 A 读下一个地址 1000,会映射到物理地址 2000,这种机制使程序的内存大小可以灵活增减,叫"动态内存分配"。

对程序来说,内存看起来是连续的,它简化了一切,为操作系统同时运行多个程序,提供了极大的灵活性,给程序分配专用的内存范围,另一个好处是 这样隔离起来会更好。

如果一个程序出错,开始写乱七八糟的数据,它只能捣乱自己的内存,不会影响到其它程序,这叫 "内存保护"。

防止恶意软件(如病毒)也很有用。例如,我们不希望其他程序有能力读或改邮件程序的内存,如果有这种权限,恶意软件可能以你的名义发邮件,甚至窃取个人信息,一点都不好!

Atlas 既有"虚拟内存"也有"内存保护",是第一台支持这些功能的计算机和操作系统!

到 1970 年代,计算机足够快且便宜,大学会买电脑让学生用,计算机不仅能同时运行多个程序,还能让多用户能同时访问,多个用户用"终端"来访问计算机。

"终端"只是键盘+屏幕,连到主计算机,终端本身没有处理能力,冰箱大小的计算机可能有50个终端,能让50个用户使用,这时操作系统不但要处理多个程序,还要处理多个用户,为了确保其中一个人不会占满计算机资源,开发了“分时操作系统”。

意思是每个用户只能用一小部分处理器,内存等,因为电脑很快,即使拿到 1/50 的资源也足以完成许多任务。

早期分时操作系统中,最有影响力的是Multics(多任务信息与计算系统)于 1969 年发布。

Multics 是第一个,从设计时就考虑到安全的操作系统,开发人员不希望恶意用户访问不该访问的数据。比如学生假装成教授,访问期末考试的文件,这导致 Multics 的复杂度超过当时的平均水准。

操作系统会占大约 1 Mb 内存,这在当时很多!可能是内存的一半,只拿来运行操作系统!

Multics 的研究人员之一 Dennis Ritchie 曾说过,"阻碍 Multics 获得商业成功的一个明显问题是从某种方面来说,它被过度设计了,功能太多了"。

所以 Dennis 和另一个 Multics 研究员,Ken Thompson 联手打造新的操作系统,叫 Unix。

他们想把操作系统分成两部分:

首先是操作系统的核心功能,如内存管理,多任务和输入/输出处理,这叫"内核"。

第二部分是一堆有用的工具,但它们不是内核的一部分(比如程序和运行库),紧凑的内核意味着功能没有那么全面。

Multics 的另一个开发者 Tom Van Vleck 回忆说:"我对 Dennis 说,我在 Multics 写的一半代码都是错误恢复代码"。他说:"Unix 不会有这些东西,如果有错误发生,我们就让内核"恐慌"(panic),当调用它时,机器会崩溃,你得在走廊里大喊,"嘿,重启电脑"。

你可能听过 "内核恐慌"(kernel panic),这就是这个词的来源,内核如果崩溃,没有办法恢复,所以调用一个叫"恐慌"(panic)的函数,起初只是打印"恐慌"一词,然后无限循环。

这种简单性意味着,Unix 可以在更便宜更多的硬件上运行,使 Unix 在 Dennis 和 Ken 工作的贝尔实验室大受欢迎。

越来越多开发人员用 Unix 写程序和运行程序,工具数量日益增长。

1971 年发布后不久,就有人写了不同编程语言的编译器,甚至文字处理器,使得 Unix 迅速成为1970~80年代最流行的操作系统之一。

到 1980 年代早期,计算机的价格降到普通人买得起,这些叫"个人电脑"或"家庭电脑",这些电脑比大型主机简单得多,主机一般在大学,公司和政府,因此操作系统也得简单。

举例,微软的磁盘操作系统(MS-DOS)只有 160 kB,一张磁盘就可以容纳,于 1981 年发布,成为早期家用电脑最受欢迎的操作系统,虽然缺少"多任务"和"保护内存"这样功能,意味着程序经常使系统崩溃,虽然很讨厌但还可以接受,因为用户可以重启。

哪怕是微软 1985 年发布的早期 Windows,虽然在 90 年代很流行,但却缺乏"内存保护",当程序行为不当时,就会"蓝屏",代表程序崩溃的非常严重,把系统也带崩溃了。

幸运的是,新版Windows有更好的保护,不会经常崩溃。

如今的计算机 有现代操作系统,比如 Mac OS X,Windows 10 ,NLinux,iOS和Android。

操作系统依然有"多任务, "虚拟内存", "内存保护",因此可以同时运行多个程序:一边在浏览器看 YouTube,一边在 Photoshop 修图,用 Spotify 放音乐,同步 Dropbox。

如果没有操作系统这几十年的发展,这些都不可能,当然,我们也需要地方放程序,下节课会讨论。


以上内容就是 18. 操作系统 的内容,感兴趣的同学记得点赞、关注、转发、收藏哦!

我会不定期发布课程的讲解!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1375195.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【PaperReading】3. PTP

Category Content 论文题目 Position-guided Text Prompt for Vision-Language Pre-training Code: ptp 作者 Alex Jinpeng Wang (Sea AI Lab), Pan Zhou (Sea AI Lab), Mike Zheng Shou (Show Lab, National University of Singapore), Shuicheng Yan (Sea AI Lab) 另一篇…

Elasticsearch安装Windows版

目录 1.:下载安装包,选择指定的版本,这里选择了7.8.0,官网下载地址: ​编辑 2:下载好之后解压,解压之后是这样的: 3:配置环境变量,跟JDK一样,…

odoo16 销售中订单价格的设置

odoo16 销售中订单价格的设置 产品设置好销售价格后,在建销售订单时,却不显价格,需在设置中把价格表选上 不选客户时,价格表显示空白 每次如何设置默认价格呢,如你去改程序或其它法,就不对了&#xff0c…

String有没有最大长度限制?

大家都用过String字符串,有的人可能还不知道它的长度在某些方面是有一些限制。 public String(byte bytes[], int offset, int length);这是java.lang.String中的一个构造函数,可以看到它的长度是int类型,int的最大取值是2^31-1.但是我们却不…

RK3399平台入门到精通系列讲解(基础篇)__LITTLE_ENDIAN_BITFIELD 宏的使用

🚀返回总目录 文章目录 一、什么是字节序二、小端模式(Little-Endian)三、大端模式(Big-Endian)四、__LITTLE_ENDIAN_BITFIELD 使用案例一、什么是字节序 在计算机中,数据是以最原始的二进制 0 和 1 的方式被存储的。在大多数现代计算机体系架构中,计算机的最小可寻址数…

Java人脸识别

Java人脸识别 一.提出问题,引入SDK的概念 什么是SDK? 我们并不具备开发人脸识别的能力,但我们可以用大公司已经开发好的工具或者功能,来实现人脸识别,而大公司提供的就叫SDK(Software Development Kit)软件开发工具包…

【Docker】Linux中Docker技术入门与实战及实用的常规命令

目录 一、引言 1. 说明: 2. Linux介绍 3. Docker简介 二、Docker三要素 1. 镜像(Image) 2. 容器(Container) 3. 仓库(Repository) 三、实现案例 1. 创建 2. 设置镜像 3. 开启设置 …

Linux最常用的几个时间日期命令

文章目录 Linux最常用的几个时间日期命令一日难再晨及时当勉励 date默认输入显示时区世界协调时格式化日期 时光总是催人老 time语法示例 休息一会 sleep休息5分钟1小时后提醒我时分秒搭配使用倒计时计时器结合脚本 更多信息 Linux最常用的几个时间日期命令 桃花谢了春红&…

The Sandbox 线下联动|「友邦嘉年华」地主专享门票免费放送

我们很高兴与票务合作伙伴 0xMoongate 合作, 为各位地主们准备了免费的“友邦嘉年华”门票! “友邦嘉年华”介绍: The Sandbox 是香港最大户外盛事之一“友邦嘉年华”的荣誉合作伙伴! 我们将这份兴奋延伸到现实世界&#xff0c…

哈希-力扣454.四数相加Ⅱ

题目 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1&#xff1a; 输入&#xff1a;nums1 [1…

Realm Management Extension领域管理扩展之SMMU架构

SMMU架构已经扩展以支持颗粒保护检查。在本指南的本节中,我们描述了在启用RME的系统中如何使用SMMU以及对SMMU架构的主要更改。 RME启用的系统中的SMMU 一个系统包括几个可以独立访问内存的设备,例如DMA控制器或GPU。下面的简化系统示意图显示了这一点: 任何可以访问内存的…

RT-Thread 线程间通信 信号

信号 信号&#xff08;又称为软中断信号&#xff09;&#xff0c;在软件层次上是对中断机制的一种模拟&#xff0c;在原理上&#xff0c;一个线程收到一个信号与处理器收到一个中断请求可以说是类似的。 信号的工作机制 信号在RT-Thread中用作异步通信&#xff0c;POSIX标准…

Airtest-Selenium实操小课

1. 前言 上一课我们讲到用Airtest-Selenium爬取网站上我们需要的信息数据&#xff0c;还没看的同学可以戳这里看看~ 那么今天的推文&#xff0c;我们就来说说看&#xff0c;怎么实现看b站、刷b站的日常操作&#xff0c;包括点击暂停&#xff0c;发弹幕&#xff0c;点赞&#…

Python基础(二十四、JSON和pyecharts)

文章目录 一、JSON1.JSON介绍2.JSON格式数据转化3.示例 二、pyecharts1.安装pyecharts包2.查看官方示例 三、开发示例 一、JSON 1.JSON介绍 JSON是一种轻量级的数据交互格式&#xff0c;采用完全独立于编程语言的文本格式来存储和表示数据&#xff08;就是字符串&#xff09;…

使用MySQL的过程中,有没有遇到过count()比较慢的情况?

count(*)的实现方式 MyISAM引擎把一个表的总行数存在了磁盘上&#xff0c;执行count(*)的时候直接返回这个数&#xff0c;效率很高&#xff1b; InnoDB引擎执行count(*)的时候&#xff0c;需要把数据一行一行地从引擎里面读出来&#xff0c;然后累积计数。 上述说明是在没有…

03.C++内存管理笔记

1、C/C内存分布 ①内存分那么多区的原因&#xff1a;不同的数据&#xff0c;有不同的存储需求&#xff0c;各区域满足了不同的需求。 ②存放&#xff1a; 临时变量等临时用的变量&#xff1a;栈区&#xff1b; 动态申请的变量&#xff1a;堆区&#xff1b; 全局变量和静态变…

[渗透测试学习] Surveillance -HackTheBox

文章目录 信息搜集getshell提权信息搜集 nmap扫描端口 nmap -sV -sC -v -p- --min-rate 1000 10.10.11.245扫出来两个端口,其中80端口有http服务并且重定向到surveillance.htb 那么我们添加下域名然后访问80端口,发现是企业网站尝试扫描子域名和目录无果后,用Wappalyzer插…

紫光展锐5G扬帆出海 | Blade系列勇当拉美5G先锋

5G对拉丁美洲&#xff08;简称“拉美”&#xff09;绝大多数消费者来说还是一个新鲜技术。GSMA报告显示&#xff0c;过去五年&#xff0c;拉美运营商在移动网络方面的资本开支大部分用于部署4G网络。但在5G网络方面拉美也在积极大力投入中&#xff0c;紧跟全球5G发展大潮&#…

「 典型安全漏洞系列 」02.SQL注入详解

引言&#xff1a;SQL注入是一个老生常谈且又非常重要的漏洞&#xff0c;导致许多热点的数据泄露事件。尽管学习起来相对简单&#xff0c;但它可能用于某些高危漏洞的利用。这使得它成为初学者的兴趣点&#xff0c;甚至对于更有经验的用户来说&#xff0c;SQL注入也是基本知识。…

R语言下载安装及VScode配置

文章目录 1. R 下载和安装1.1 下载1.2 安装 2. VSCODE 配置2.1 安装R拓展2.2 安装R语言辅助功能包2.3 DEBUG 1. R 下载和安装 1.1 下载 网址&#xff1a;https://www.r-project.org/ 选择一个镜像地址下载 选择对应的版本 一般选择base即可 1.2 安装 下载安装包后按提示安装…