【“计算机科学与技术”专业小白成长系列】 计算机操作系统简介
计算机操作系统简介
目标
- 了解操作系统的发展历史
- 知道 Linux 内核及发行版的区别
- 知道 Linux 的应用领域
任何计算机都必须在加载相应的操作系统之后,才能构成一个可以运转的、完整的计算机系统。操作系统的功能是否强大,决定了计算机系统的综合能力;操作系统的性能高低,决定了整个计算机系统的性能;操作系统本身的安全可靠程度,决定了整个计算机系统的安全性和可靠性。操作系统是软件技术的核心和基础运行平台。因此,计算机科学技术专业的学生需要学习和掌握操作系统的基本原理和专业知识。
本课程的教学目标是:
1.掌握操作系统的基本概念、功能组成、系统结构及运行环境;
2.熟悉并运用操作系统工作原理、设计方法和实现技术,理解有代表性、典型的操作系统实例(如UNIX、Linux和Windows);
3.了解操作系统的演化过程、发展研究动向、新技术以及新思想,为后续相关课程的学习打下良好基础,为后续职业发展奠定基石。
1. 操作系统的发展历史
1.1 Unix
1965 年之前的时候,电脑并不像现在一样普遍,它可不是一般人能碰的起的,除非是军事或者学院的研究机构,而且当时大型主机至多能提供30台终端(30个键盘、显示器),连接一台电脑:

为了解决数量不够用的问题
- 1965 年左后由 贝尔实验室 加入了 麻省理工学院 以及 通用电气 合作的计划 —— 该计划要建立一套 多使用者(multi-user)、多任务(multi-processor)、多层次(multi-level) 的 MULTICS 操作系统,想让大型主机支持 300 台终端
- 1969 年前后这个项目进度缓慢,资金短缺,贝尔实验室退出了研究
- 1969 年从这个项目中退出的 Ken Thompson 当时在实验室无聊时,为了让一台空闲的电脑上能够运行 "星际旅行(Space Travel)" 游行,在 8 月份左右趁着其妻子探亲的时间,用了 1 个月的时间,使用汇编写出了 Unix 操作系统的原型
- 1970 年,美国贝尔实验室的 Ken Thompson,以 BCPL 语言为基础,设计出很简单且很接近硬件的 B 语言(取BCPL的首字母),并且他用 B 语言 写了第一个 UNIX 操作系统
- 1971 年,同样酷爱 "星际旅行(Space Travel)" 的 Dennis M.Ritchie 为了能早点儿玩上游戏,加入了 Thompson 的开发项目,合作开发 UNIX,他的主要工作是改造 B 语言,因为B 语言 的跨平台性较差
- 1972 年,Dennis M.Ritchie 在 B 语言 的基础上最终设计出了一种新的语言,他取了 BCPL 的第二个字母作为这种语言的名字,这就是 C 语言
- 1973 年初,C 语言的主体完成,Thompson 和 Ritchie 迫不及待地开始用它完全重写了现在大名鼎鼎的 Unix 操作系统

肯·汤普逊(左)和丹尼斯·里奇(右)
C 语言
- 在把 UNIX 移植到其他类型的计算机上使用时,C 语言强大的移植性(Portability)在此显现
- 机器语言和汇编语言都不具有移植性,为 x86 开发的程序,不可能在 Alpha,SPARC 和 ARM 等机器上运行
- 而 C 语言程序则可以使用在任意架构的处理器上,只要那种架构的处理器具有对应的 C 语言编译器和库,然后将 C 源代码编译、连接成目标二进制文件之后即可运行
Unix 家谱

1.2 Minix
- 因为 AT&T(通用电气) 的政策改变,在 Version 7 Unix 推出之后,发布新的使用条款,将 UNIX 源代码私有化,在大学中不再能使用 UNIX 源代码
- Andrew S. Tanenbaum(塔能鲍姆) 教授为了能 在课堂上教授学生操作系统运作的细节,决定在不使用任何 AT&T 的源代码前提下,自行开发与 UNIX 兼容的操作系统,以避免版权上的争议
- 以 小型 UNIX(mini-UNIX)之意,将它称为 MINIX
1.3 Linux
- 1991 年 林纳斯(Linus) 就读于赫尔辛基大学期间,对 Unix 产生浓厚兴趣,尝试着在Minix 上做一些开发工作
- 因为 Minix 只是教学使用,因此功能并不强,林纳斯 经常要用他的终端 仿真器(Terminal Emulator) 去访问大学主机上的新闻组和邮件,为了方便读写和下载文件,他自己编写了磁盘驱动程序和文件系统,这些在后来成为了 Linux 第一个内核的雏形,当时,他年仅 21 岁!
- 林纳斯 利用 GNU 的 bash 当做开发环境,gcc 当做编译工具,编写了 Linux 内核,一开始 Linux 并不能兼容 Unix
- 即 Unix 上跑的应用程序不能在 Linux 上跑,即应用程序与内核之间的接口不一致
- 一开始 Linux 只适用于 386,后来经过全世界的网友的帮助,最终能够兼容多种硬件

2. Linux 内核及发行版
2.1 Linux 内核版本
- 内核(kernel)是系统的心脏,是运行程序和管理像磁盘和打印机等硬件设备的核心程序,它提供了一个在裸设备与应用程序间的抽象层
- Linux 内核版本又分为 稳定版 和 开发版,两种版本是相互关联,相互循环
- 稳定版:具有工业级强度,可以广泛地应用和部署。新的稳定版相对于较旧的只是修正一些 bug 或加入一些新的驱动程序
- 开发版:由于要试验各种解决方案,所以变化很快
- 内核源码网址:http://www.kernel.org
所有来自全世界的对 Linux 源码的修改最终都会汇总到这个网站,由 Linus 领导的开源社区对其进行甄别和修改最终决定是否进入到 Linux 主线内核源码中
2.2 Linux 发行版本
- Linux 发行版(也被叫做 GNU/Linux 发行版)通常包含了包括桌面环境、办公套件、媒体播放器、数据库等应用软件
常见的发行版本如下:
- Ubuntu
- Redhat
- Fedora
- openSUSE
- Linux Mint
- Debian
- Manjaro
- Mageia
- CentOS
- Arch
十大 Linux 服务器发行版排行榜:http://os.51cto.com/art/201612/526126.htm
在几乎每一份与 Linux 有关的榜单上,基于 Debian 的 Ubuntu 都占有一席之位。Canonical 的Ubuntu 胜过其他所有的 Linux 服务器发行版 ―― 从简单安装、出色的硬件发现,到世界级的商业支持,Ubuntu确立了难以企及的严格标准
3. Linux 的应用领域
3.1 服务器领域
- Linux 在服务器领域的应用是其重要分支
- Linux 免费、稳定、高效等特点在这里得到了很好的体现
- 早期因为维护、运行等原因同样受到了很大的限制
- 近些年来 Linux 服务器市场得到了飞速的提升,尤其在一些高端领域尤为广泛
3.2 嵌入式领域
- 近些年来 Linux 在嵌入式领域的应用得到了飞速的提高
- Linux 运行稳定、对网络的良好支持性、低成本,且可以根据需要进行软件裁剪,内核最小可以达到几百 KB 等特点,使其近些年来在嵌入式领域的应用得到非常大的提高
主要应用:机顶盒、数字电视、网络电话、程控交换机、手机、PDA、等都是其应用领域,得到了 Google、三星、摩托罗拉、NEC 等公司的大力推广
3.3 个人桌面领域
- 此领域是传统 Linux 应用最薄弱的环节
- 传统 Linux 由于界面简单、操作复杂、应用软件少的缺点,一直被 Windows 所压制
- 近些年来随着 Ubuntu、Fedora 等优秀桌面环境的兴起,同时各大硬件厂商对其支持的加大,Linux 在个人桌面领域的占有率在逐渐的提高。
4.操作系统的架构
UNIX
UNIX 与 Linux 之间的关系是一个很有意思的话题。在目前主流的服务器端操作系统中,UNIX 诞生于 20 世纪 60 年代末,Windows 诞生于 20 世纪 80 年代中期,Linux 诞生于 20 世纪 90 年代初,可以说 UNIX 是操作系统中的"老大哥",后来的 Windows 和 Linux 都参考了 UNIX。
UNIX是一个多用户、多任务的操作系统。 UNIX系统由硬件、内核、Shell和应用程序组成。 用户通过shell向内核发出命令。 UNIX文件系统是树状层次结构。
诞生
1965年时,贝尔实验室(Bell Labs)加入一项由通用电气(General Electric)和麻省理工学院(MIT)合作
图1-1 PDP-7计算机
的计划;该计划要建立一套多使用者、多任务、多层次(multi-user、multi-processor、multi-level)的MULTICS操作系统 [1] 。直到1969年,因MULTICS计划的工作进度太慢,该计划被停了下来。当时,Ken Thompson(后被称为UNIX之父)已经有一个称为"星际旅行"的程序在GE-635的机器上跑,但是反应非常慢,正巧被他发现了一部被闲置的PDP-7(Digital的主机),Ken Thompson和Dernis Ritchie就将"星际旅行"的程序移植到PDP-7上。而这部PDP-7(如图1-1所示)就此在整个计算机历史上留下了芳名。
MULTICS其实是"Multiplexed Information and Computing Service"的缩写,在1970年时,那部PDP-7却只能支持两个使用者,当时,Brian Kernighan就开玩笑地称他们的系统其实是:"UNiplexed Information and Computing Service",缩写为"UNICS",后来,大家取其谐音,就称其为"UNIX"了。1970年可称为"UNIX元年"。
流行
写了Unix的第三版内核。至此,Unix这个操作系统修改、移植相当便利,为Unix日后的普及打下了坚实的基础。而Unix和C结合成为一个统一体,C与Unix很快成为世界的主导。
在严格意义上,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境,一般而言,我们称此种软件为内核(kenel),它相对较小,位于环境的中心。
内核的接口被称为系统调用(system call)。公用函数库构建在系统调用接口之上,应用软件既可使用公用函数库,也可以使用系统调用。
Shell是一种特殊的应用程序,它提供接口来运行其他的应用程序。
广义上来说,操作系统是内核和所有其他的软件的集合,其让一个计算机变得有用以及给计算机以个性。其他的软件包括系统工具,应用程序,shells,通用函数库等等。
Unix文件系统是对存储设备上的数据和元数据进行组织的机制。UNIX文件系统是UNIX系统的心脏部分,提供了层次结构的目录和文件。
Unix内核基本上是按模块进行设计的,比如文件子系统,进程控制子系统等等,各个子系统相对比较独立,但在有必要的时候又可以进行彼此的沟通交流。下图就说明了早期Unix的系统内核框架。
文件子系统概要
文件系统是一个逻辑(看不见,摸不着)上的概念,而磁盘是一个物理(真实存在,看得见,摸得着)上的概念。
一套系统装置可以有若干个物理磁盘设备,每一个物理设备上可以包含一个或者多个文件系统(如下图所示),当然也可以不包含任何文件系统(那你买它干啥?)。下面涉及到的文件系统都是在 Unix 上的。
一个文件系统的结构包括引导块(boot block)、超级块(super block)、索引节点表(inode list)以及数据块(data blocks)(如下图所示)。
引导块:在文件系统的开头,典型地一般为一个扇区。如果操作系统装在该文件系统中,则该块包含了引导或初启操作系统的引导代码。如果没该文件系统没安装操作系统,则这个块的内容可能是空的。
数据块:真正存放数据的地方。目录(PS:也是一个文件)在数据块中保存的数据是一系列的索引节点 <-> 文件名的 item。
内核中维护着三种表结构,分别是用户文件描述符表(user file descriptor table)、文件表(file table)和索引节点表(inode table)。
Linux
随后出现了各种版本的 UNIX 系统,目前常见的有 Sun Solaris、FreeBSD、IBM AIX、HP-UX 等。
Linux操作系统的诞生、发展和成长过程始终依赖着五个重要支柱:Unix操作系统、MINIX操作系统、GNU计划、POSIX标准和Internet网络。
李纳斯•托瓦兹没有保留 Linux 源代码的版权,公开了代码,并邀请他人一起完善 Linux。与 Windows 及其他有专利权的操作系统不同,Linux 开放源代码,任何人都可以免费使用它。
李纳斯•托瓦兹无疑是这个世界上最伟大的程序员之一,何况,他还搞出了全世界最大的程序员交友社区 GitHub (开源代码库及版本控制系统)。
关于 Linux Logo 的由来是一个很有意思的话题,它是一只企鹅。
为什么选择企鹅,而不是选择狮子、老虎或者小白兔?有人说因为李纳斯•托瓦兹是芬兰人,所以选择企鹅,有人说因为其他动物图案都被用光了,李纳斯•托瓦兹只好选择企鹅。
- UNIX 系统大多是与硬件配套的,也就是说,大多数 UNIX 系统如 AIX、HP-UX 等是无法安装在 x86 服务器和个人计算机上的,而 Linux 则可以运行在多种硬件平台上;
- UNIX 是商业软件,而 Linux 是开源软件,是免费、公开源代码的。
- 它属于开源软件,用户不用支付可费用就可以获得它和它的源代码,并且可以根据自己的需要对它进行必要的修改,无偿使用,无约束地继续传播;
- 它具有 UNIX 的全部功能,任何使用 UNIX 操作系统或想要学习 UNIX 操作系统的人都可以从 Linux 中获益。
开源软件是不同于商业软件的一种模式,从字面上理解,就是开放源代码,大家不用担心里面会搞什么猫腻,这会带来软件的革新和安全。
另外,开源其实并不等同于免费,而是一种新的软件盈利模式。目前很多软件都是开源软件,对计算机行业与互联网影响深远。
近年来,Linux 已经青出于蓝而胜于蓝,以超常的速度发展,从一个丑小鸭变成了一个拥有庞大用户群的真正优秀的、值得信赖的操作系统。历史的车轮让 Linux 成为 UNIX 最优秀的传承者。
相比于 UNIX,Linux 最大的创新是开源免费,这是它能够蓬勃发展的最重要原因;而目前的 UNIX 大部分都是收费的,小公司和个人都难以承受。
正是由于 Linux 和 UNIX 有着千丝万缕的联系,所以人们把 Linux 叫做“类UNIX系统”,下节我们将会着重讲解。
X Window 与微软的 Windows 图形环境有很大的区别:
- UNIX/Linux 系统与 X Window 没有必然捆绑的关系,也就是说,UNIX/Linux 可以安装 X Window,也可以不安装;而微软的 Windows 图形环境与内核捆绑密切。
- UNIX/Linux 系统不依赖图形环境,依然可以通过命令行完成 100% 的功能,而且因为不使用图形环境还会节省大量的系统资源。
Linux 的发行版说简单点就是将 Linux 内核与应用软件做一个打包。
目前市面上较知名的发行版有:Ubuntu、RedHat、CentOS、Debian、Fedora、SuSE、OpenSUSE、Arch Linux、SolusOS 等。
今天各种场合都有使用各种 Linux 发行版,从嵌入式设备到超级计算机,并且在服务器领域确定了地位
尽管大多数文件系统代码在内核中(后面讨论的用户空间文件系统除外),但是图 1 所示的体系结构显示了用户空间和内核中与文件系统相关的主要组件之间的关系。
这就是 VFS 和文件系统组件的高层情况。现在,讨论实现这个子系统的主要结构。
VFS 作为文件系统接口的根层。VFS 记录当前支持的文件系统以及当前挂装的文件系统。
VFS 中维护的另一个结构是挂装的文件系统(见图 3)。这个结构提供当前挂装的文件系统(见 linux/include/linux/fs.h)。它链接下面讨论的超级块结构。
Windows
上面这个系统结构图在很多书上都有,它就是windows2000的结构图,下面我们就来详细说说各个部分的功能:
(1) 子系统进程:win32子系统在windows2000中是以一个进程的形式出现的(csrss.exe)。它负责所有win32用户进程,线程的创建与撤消,建立与撤消临时文件,以及控制台的管理。
(2)子系统动态链接库:win32子系统用的动态链接库,里面有子系统所需要的大部分功能。
用户进程并不直接地调用系统服务,它们直接调用子系统动态链接库,当一个程序调用子系统动态链接库的一个功能时,可能会发生以下三中情形之一:
(1)所要求的功能全部是由子系统动态链接库提供,也就是说程序完全运行于用户态。
(3)需要子系统进程的协助才能完成,这时,用户进程向子系统进程发送一C/S请求,具体工作由子系统进程来完成。
特别说明,当用户进程调用系统服务时实际上是通过设置一个陷阱陷入到核心态来运行,将运行权交给系统服务调度程序来调度,并不用通过创建新的进程,线程来实现。
(1)可以从用户态直接调用的函数,这些在NTDLL中文档化(前面已说过),这些中大多数都可以调用某个WIN32 API来启动所对应的服务。
(2)只能从核心态调用的函数,其中有一些在DDK中已文档化,编写windows上驱动程序的人员必须熟悉的
(3)安全引用监视器:在本地计算机上执行安全策略,保护计算机的资源
(4)I/O管理器:实现I/O的设备无关性,并负责把I/O请求分配给相应的设备驱动程序以进一步处理
(6)电源管理:协调电源时间,通过合理的配置,使得CPU降低电源消耗
(7)缓冲管理器:将最近使用过的数据留在CACHE中来提高系统的整体性能
(8)虚拟内存管理:这是最为让人激动的地方,对于这个部分的理解会影响我们对整个系统结构的理解,我们会在以后详细解说
(9)WDM管理方法例程:可以让设备驱动程序发布性能和配置信息以及从用户态的WMI服务接受命令
硬件支持:
内核的另一主要功能是使得执行体和设备驱动独立于硬件,这个工作包含处理多个方面的差异:中断处理,异常处理,多处理器同步方式的差异
Android
iOS
框架是一个目录,这个目录包含了共享库,访问共享库里代码的头文件,和其它的图片和声音的资源文件。一个共享库定义的方法或函数可以被应用程序调用。
看看HelloWorld.xcodeproj项目里都包含了哪些框架(注:HelloWorld.xcodeproj是《Your First iOS App tutorial 》这篇教程里的一个项目)
1.在XCode里打开HelloWorld.xcodeproj项目(如果还没有打开)
2. 在project navigator窗口里点击,点击Frameworks目录前面的三角形图标。你会看到:
UIKit.framework,Foundation.framework, 和CoreGraphics.framework
3. 点击任意一个framework前面的三角,然后再点击Headers前面的三角,可以看到框架里的头文件。
每个框架对应IOS系统里的一层,每层建立在它下面层的上面。应该尽量使用上层的框架来代替下面的框架。更高层次的框架是对底层框架基于对象的抽象。
iOS应用程序基于Foundation和UIKit框架
在你开发程序时,主要使用框架就是Foundation和UIKit,因为它们包含了你需要的大部分东西。
Foundation框架为所有的应用程序提供基本系统服务
你的应用程序,UIKit和其它的框架都是建立在Foundation框架上面的。Foundation框架是用Object-C对Core Foundation框架里许多特性的封装。
使用Foundation可以:
- 创建和管理集合,比如数组和字典
- 访问存储在应用程序里的图片和其它资源
- 创建和管理字符串
- 提交和接收通知
- 创建日期和时间对象
- 自动发现IP网络上的设备
- 操作URL流
- 执行异步代码
你已经在《Your First iOS App》里使用到了Foundation框架。比如,你使用一个NSString类的实例存储用户输入的userName。你还使用了Foundation框架的initWithFormat方法创建了一个字符串。
UIKit框架提供创建基于触摸用户界面的类
所有的iOS应用程序都基于UIKit,你不能是应用程序脱离这个框架。UIKit提供了在屏幕上绘制的机制,捕获事件,和创建通用用户界面元素。UIKit也通过管理显示在屏幕上的组件来组织复杂的项目。
使用UIKit可以:
- 构建和管理你的用户界面
- 捕获触摸和基于移动的事件
- 呈现文字和web内容
- 优化你的多任务程序
- 创建定制的用户界面元素
在《YouFirst iOS App Tutorial》里,你也使用到了UIKit。当你仔细查看程序是怎么运行起来的时候,你会看到UIApplicationMain函数创建一个UIApplication类的实例,这个实例会捕获进来的用户事件。你实现UITextFieldDelegate协议,然后在用户按下Done时隐藏键盘。实际上,你是在使用UIKit创建用户界面上的UITextField, UILabel,和UIButton类。
你需要知道的其它重要的框架
Core Data , Core Graphics, Core Animation,和OpenGLES框架都是高级的技术。所以这些框架对于你开发应用程序也是很重要的,它们都需要时间去学习和掌握。
Core Data框架管着理应用程序数据模型
Core Data提供对象的管理,使用Core Data,你可以创建模型对象,并管理这些对象。你管理这这些对象间的联系并修改数据。Core Data提供的内建SQLlite技术可以高效的管理数据。
使用Core Data可以:
- 在库里存储和接收对象
- 提供基本的undo/redo
- 自动验证属性值
- 过滤、分组和优化内存中的数据
- 用[NSFetchedResultsController]管理表视图中的结果
- 支持基于文档的应用程序
Core Graphics框架帮助你创建图形
高质量的图形对于所有的iOS应用程序都是很重要的。在iOS中最简单且最快捷的创建图形的方式是使用UIKit框架提供的基于预渲染图形的视图和控件,然后让UIKit和iOS完成绘制。但是当你需要创建复杂的图形时,Core Graphics则提供了更底层的库来帮助你。
使用Core Graphics可以:
- 创建基于路径的绘图
- 抗锯齿渲染
- 添加梯度、图片和颜色
- Use coordinate-space transformations.
- 创建、显示和分析PDF文档
Core Animation允许你创建高级的动画和虚拟效果
UIKit提供建立在Core Animation之上的动画。如果你需要比UIKit能力更高级的功能,可以直接使用Core Animation。Core Animation接口包含在Quartz Core框架里。使用Core Animation可以创建嵌套的对象,并且可以对它们操作、旋转、缩放和转换。使用Core animation,你可以创建动态的用户界面而不用使用更底层的图形API,如OpenGL ES。
使用Core Animation可以:
- 创建定制动画
- 添加定时函数和图形
- 支持帧动画
- Specify graphical layout constraints.
- Group multiple-layer changes into anatomic update.
OpenGL ES 框架提供2D和3D绘图工具
OpenGL ES支持2D和3D绘图,Apple的OpenGL ES实现通过硬件提供了高速的全屏游戏式的应用程序。
使用OpenGL ES可以:
- 创建2D和3D图形
- 创建更复杂的图形,比如数据虚拟化、模拟飞行,或者视频游戏
- 访问底层图形设备
根据需要向项目中添加其它框架
还有许多框架可以添加到你的程序里。当你决定使用一个框架但项目里却没有引入这个框架时,你就需要将它加入到你的项目里。
计算机科学与技术
数学基础
高等数学
线性代数
概率论与数理统计
离散数学
数值分析
数据库系统
计算机网络
网络安全
数据结构与算法
编译原理
操作系统
是什么?
- operating system,OS。管理计算机硬件与软件资源的程序。操作系统处理如管理与配置内存、决定系统资源供需的优先次序、控制输入设备与输出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系统交互的操作界面。
组成部分
- 内核、驱动程序、接口库、外围
常见系统
- Windows,macOS,Linux,iOS,Android
特 征:并发、共享、虚拟、异步
- 并发:同一段时间内多个程序执行(注意区别并行和并发,前者是同一时刻的多个事件,后者是同一时间段内的多个事件)
- 共享:系统中的资源可以被内存中多个并发执行的进线程共同使用
- 虚拟:通过时分复用(如分时系统)以及空分复用(如虚拟内存)技术实现把一个物理实体虚拟为多个
- 异步:系统中的进程是以走走停停的方式执行的,且以一种不可预知的速度推进
功 能:处理器管理、存储器管理、设备管理、文件管理
- ①进程管理,其工作主要是进程调度,在单用户单任务的情况下,处理器仅为一个用户的一个任务所独占, 进程管理的工作十分简单。但在多道程序或多用户的情况 下,组织多个作业或任务时,就要解决处理器的调度、 分配和回收等问题 。
- ②存储管理分为几种功能:存储分配、存储共享、存储保护 、存储扩张。
- ③设备管理分有以下功能:设备分配、设备传输控制 、设备独立性。
- ④文件管理:文件存储空间的管理、目录管理 、文件操作管理、文件保护。
- ⑤作业管理是负责处理用户提交的任何要求。
基本类型:批处理系统、分时操作系统、实时操作系
统体系结构:模块组合结构、层次结构、微内核结构
简史
- 批量模式
- 分时机制
- 多处理器
- 分布式
设计哲学
- 模块化
- 结构化
- 通讯接口
- 层次式结构
操作系统虚拟化
- 容器的核心技术
操作系统实例
嵌入式系统
- VxWorks、eCos、Symbian OS及Palm OS
iOS
- 以Darwin为基础,属于类Unix 的商业操作系统。
Android
- 基于Linux
类Unix系统
- System V、BSD与Linux
- 惠普的HP-UX以及IBM的AIX仅设计用于自家的硬件产品上
- SUN的Solaris可安装于自家的硬件或x86计算机上
- 苹果计算机的Mac OS X是一个从NeXTSTEP、Mach以及FreeBSD共同派生出来的微内核BSD系统
微软Windows
- Microsoft Windows系列操作系统是在微软给IBM机器设计的MS-DOS的基础上设计的图形操作系统。现在的Windows系统,如Windows 2000、Windows XP皆是创建于现代的Windows NT内核。NT内核是由OS/2和OpenVMS等系统上借用来的。
MacOS X
- Mac OS是首个在商用领域成功的图形用户界面系统。Macintosh开发成员包括比尔·阿特金森(Bill Atkinson)、杰夫·拉斯金(Jef Raskin)和安迪·赫茨菲尔德(Andy Hertzfeld)。
Chrome OS
- Google的轻型的、基于网络的计算机操作系统计划,其基于Google的浏览器Google Chrome的Linux内核。
进程与线程
进程
- 1)PCB(Process Control Block):用来记录进程信息的数据结构(管理进程的核心,包含了PID等进程的所有关键信息)
- 2)进程的状态:1:就绪状态,2:执行状态,3:阻塞状态(多线程时也是这些状态)
- 3)队列:就绪队列、等待(阻塞)队列。
通信
- 共享存储
- 消息传递
- 管道通信:固定大小,半双工通信,即某一时刻只能单向传输。
- 共享文件
线程
TCB(thread control block线程控制块)
包括PC程序计数器,SP栈,State状态,和寄存器,线程id。
线程有内核级线程和用户级线程,我们一般说的都是用户级线程,内核级线程由内核管理。
发挥多核性能
- 1)只有内核级线程才能发挥多核性能,因为内核级线程共用一套MMU(即内存映射表),统一分配核1核2(即有多个CPU,可以一个CPU执行一个内核级线程)。进程无法发挥多核性能,因为进程切换都得切MMU。
- 2)为什么需要内核级线程?如果只有用户级线程,在内核中只能看到进程,所以当用户级线程中一个线程进行IO读写阻塞时,内核会将该线程所在的进程直接切换。
用户级线程
内核级线程
进程和线程的对比
- 进程是系统进行资源调度和分配的基本单位;线程是CPU调度的基本单位。
- 进程 = 资源 (包括寄存器值,PCB,内存映射表)+ TCB(栈结构)
- 线程 = TCB(栈结构)
- 线程 的资源是共享的
- 进程 间的资源是分隔独立的,内存映射表不同,占用物理内存地址是分隔的
- 线程 的切换只是切换PC,切换了TCB(栈结构)
- 进程 的切换不仅要切换PC,还包括切换资源,即切换内存映射表
进程间通信
同步
- 经典的进程同步问题:生产者-消费者问题;哲学家进餐问题;读者-写者问题
- 同步的解决方案:管程,信号量。
死锁
- 在两个或多个并发进程中,如果每个进程持有某种资源而又都等待别的进程释放它或它们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。通俗地讲,就是两个或多个进程被无限期地阻塞、相互等待的一种状态。
产生条件:
- 1:互斥条件:一个资源一次只能被一个进程使用
- 2:请求保持条件 : 一个进程因请求资源而阻塞时,对已经获得资源保持不放
- 3:不可抢占条件 : 进程已获得的资源在未使用完之前不能强行剥夺
- 4:循环等待条件 :若干进程之间形成一种头尾相接的循环等待资源的关系
死锁处理:
- 预防死锁:破坏产生死锁的4个必要条件中的一个或者多个;实现起来比较简单,但是如果限制过于严格会降低系统资源利用率以及吞吐量
- 避免死锁:在资源的动态分配中,防止系统进入不安全状态(可能产生死锁的状态)-如银行家算法
- 检测死锁:允许系统运行过程中产生死锁,在死锁发生之后,采用一定的算法进行检测,并确定与死锁相关的资源和进程,采取相关方法清除检测到的死锁。实现难度大
- 解除死锁:与死锁检测配合,将系统从死锁中解脱出来(撤销进程或者剥夺资源)。对检测到的和死锁相关的进程以及资源,通过撤销或者挂起的方式,释放一些资源并将其分配给处于阻塞状态的进程,使其转变为就绪态。实现难度大
- 死锁忽略: windows,Linux个人版都不做死锁处理,直接忽略,大不了重启就好了,小概率事件,代价可以接受
CPU调度算法:在就绪队列中,怎么挑选进程让CPU执行?
- 先来先服务调度算法FCFS:按作业或者进程到达的先后顺序依次调度;(平均周转时间可能会很长 )
- 短作业优先调度算法SJF:算法从就绪队列中选择估计时间最短的作业进行处理,直到得出结果或者无法继续执行(周转时间短,但是响应时间长 )
- 高相应比算法HRN:响应比=(等待时间+要求服务时间)/要求服务时间;
- 时间片轮转调度RR:按到达的先后对进程放入队列中,然后给队首进程分配CPU时间片,时间片用完之后计时器发出中断,暂停当前进程并将其放到队列尾部,循环 ;(响应时间可以得到保证)
- 多级反馈队列调度算法:目前公认较好的调度算法;设置多个就绪队列并为每个队列设置不同的优先级,第一个队列优先级最高,其余依次递减。优先级越高的队列分配的时间片越短,进程到达之后按FCFS放入第一个队列,如果调度执行后没有完成,那么放到第二个队列尾部等待调度,如果第二次调度仍然没有完成,放入第三队列尾部…。只有当前一个队列为空的时候才会去调度下一个队列的进程。
内存管理
分段
- 一个程序分成多个段(每个段特性不同为了方便管理,例如代码段只读、数据段等等),当然这都是逻辑上的。
- 管理段的结构叫段表,段表保存中进程的PCB中。
页表
- 把程序按段分对程序员是友好的,但是如果物理存储也按段存,则会导致大块的内存碎片,例如现在需要分个10M的段但是连续的存储空间只有8M/9M/5M三个。
- 解决办法: 将段细化到页 Page,存到页中。不要对内存进行连续的分配,将内存划分成1页1页,按页分配,1页4kb大小,最多浪费的也就4KB。这样不会有内存碎片,也不会出现没有符合要求大小的内存可以申请的情况,因为可以打散了分散到一页一页中。
- 进程需要有自己的“页表”,里面映射双方是程序的逻辑地址中的页号和系统分给这給程序的页框号。
段页结合的内存管理
- 页号加偏移称为虚拟地址,MMU负载从虚拟地址到物理地址的转换,同时也负责权限检查。
请求调页内存换入
- CPU对数据进行请求时,才会进行映射(虚拟内存到物理内存)。例如进程1正在运行,进行映射拿数据,查页表发现页框号中没有数据或有进程2的数据,则需要页表调入内存。
内存换出
- 有页表需要调入,那么谁被调出?
页面置换算法
- 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,说明在定时时间片内没有备访问,该页可以被替换了。
软件工程
电路原理
模拟电子技术
数字逻辑系统
微机原理
系统仿真和虚拟现实
大数据技术
数据采集与处理
Web前/后端开发
机器学习&人工智能
自然语言处理
【“计算机科学与技术”专业小白成长系列】 计算机操作系统简介相关推荐
- 【“计算机科学与技术”专业小白成长系列】计算机科学与技术主要学什么?
计算机科学与技术专业:主要学什么? 本文主要包括如下内容: 程序员职位要求 CS 专业课程列表 怎样寻找资源学习? 程序员高薪排行榜 程序员职位要求 看课程之前,我们先来看看 BAT 的招聘岗位 JD ...
- 【“计算机科学与技术”专业小白成长系列】SICP 读书笔记: The Elements of Programming
SICP 读书笔记: The Elements of Programming 编程元素 强大的编程语言不仅仅是一种指示计算机执行任务的方法.语言也可以作为一个框架,我们可以在其中组织关于过程的想法.当 ...
- 【“计算机科学与技术”专业小白成长系列】Linux Shell 编程 极简教程
Linux Shell 编程 极简教程 内容摘要 本文是 Linux Shell 编程简单入门.主要内容: Linux 简介 Shell 编程入门 Kotlin 脚本与 Shell 脚本 Linux ...
- 山东大学计算机科学与技术专业全国排名,全国计算机专业大学排名
以下是教育部最新第四轮计算机科学与技术学科评估具体排名,其中排名前4的大学是北京大学.清华大学.浙江大学.国防科技大学, 这是国内目前计算机专业排名第一梯队,能力不相上下,以下具体榜单,还比较权威,供 ...
- 计算机科学与技术专业修读指南,计算机类专业培养方案修读指南.pdf
文档介绍: 博学远志明德至诚--福州大学校训前 言 同学们,欢迎你们踏入福州大学校门,成为数学与计算机科学学院的一名新成员."大学到底是什么样的,我能学到什么,四年后我能成为什么样的人--& ...
- 计算机科学与技术专业的英文作文,计算机专业英语:科技交流与科技论文写作...
计算机专业英语:科技交流与科技论文写作 语音 编辑 锁定 讨论 上传视频 < 计算机专业英语:科技交流与科技论文写作>是2010年9月1日出版的图书.本书结合作者长期在国外使用英语从事研究 ...
- 计算机科学与技术专业软考考什么,计算机专业软考考什么
原标题:计算机专业软考考什么 盛泰鼎盛 通过考试获得证书的人员,表明其已具备从事相应专业岗位工作的水平和能力,用人单位可根据工作需要从获得证书的人员中择优聘任相应专业技术职务(技术员.助理工程师.工程 ...
- 计算机科学与技术专业北上广,学计算机专业是不是只能在北上广工作?
又到了每年的招生季,计算机专业依然是最热专业之一,有些学生在选择该专业的时候,会问到是不是只能在北上广工作?担心自己不适应大城市的生活,压力太大,想要考虑其他的地方找工作,今天小编就来介绍一下. 其实 ...
- 计算机科学技术主业人才培养模式,计算机科学和技术专业人才培养模式改革和创新.doc...
计算机科学和技术专业人才培养模式改革和创新 计算机科学和技术专业人才培养模式改革和创新 摘要:当前,计算机信息技术得到广泛应用,社会需要大量的应用型人才,以此为基础,高等学校要全面提高教育质量,需要创 ...
- 淮阴工学院计算机科学与技术咋样,淮阴工学院计算机学院计算机科学与技术专业(NIIT)人才培养方案介绍...
发布时间:2020-04-28 编辑:考研派小莉 推荐访问: 淮阴工学院计算机学院计算机科学与技术专业(NIIT)人才培养方案介绍内容如下,更多考研资讯请关注我们网站的更新!敬请收藏本站,或下载我们的 ...
最新文章
- c++与python 数据类型对应
- python queue 调试_python:如何创建用于调试的持久内存结构
- linux 复制分区文件,dd复制分区后目标分区的大小变成原分区了
- 耳机不支持android,安卓手机为什么不能用EarPods耳机 原因分析【图解】
- 腾讯《王者荣耀》禁止未满12周岁用户充值;B站发布16款新品游戏;华为注册姚安娜商标被驳回|极客头条...
- 腾讯技术运营岗实习面试面经
- 如何在Mac上控制对日历的访问?
- 聊聊 print 的前世今生
- 拓端tecdat|使用R语言做极大似然估计实例
- 安卓listview点击空白事件_王者荣耀安卓苹果ios改空白名;重复名字特殊昵称教程...
- 分享240道有意思的逻辑思维题
- lumia 1520Android刷机包,诺言基亚Lumia 1520官方体系破开格提升固件释出产
- 计算机考试excel基础试题,计算机基础(Excel2010)试题及答案解析
- 一文读懂声纹采集、声纹识别、声纹数据库系统等声纹识别技术在公安业务领域的应用场景
- isPrime()函数:判断素数,构造素数表
- 从零开始制作游戏外挂
- 利用Python实现Excel合并单元格
- 关于locale的设定
- Java jdt 编辑_JDT:打开Java编辑器并显示特定成员
- 详解ELF可执行文件格式:读取头部信息和程序表头