一、操作系统是啥玩意?
1、计算机操作系统就是:
- 操控、管理整个计算机软件和硬件的资源、并合理分配计算机工作、资源
(人话):操作系统是计算机系统资源的管理者
;
- 以给用户和其他软件提供更方便的接口和环境
(人话):它为上层提供服务
;
- 它是计算机系统中最基础的系统软件
(人话):是软件,是最接近底层硬件的一套软件
;
1)对于第一句话:【操控、管理整个计算机软件和硬件的资源,是计算机系统资源的管理者】的理解:
2)第二句话:【它为上层提供服务】
用户和软件无需关心底层硬件所要的0、1这些二进制代码,操作系统为用户操作软件提供了更有友好的“接口”,相当于中间商
3)第三句话:【是最接近底层硬件的一套软件】
例题:
1、操作系统是对( C )进行管理的软件
A、软件
B、硬件
C、计算机资源(软件、硬件、文件都统称 “计算机资源”)
D、应用程序
2、操作系统和用户间接口的定义
前面说了它是为上层提供服务,体现就是操作系统为用户操作软件提供了更有友好的“接口”,具体这个接口是啥呢?
一开始学的时候我也不是很理解,这块很抽象,但是在我做完题和一些开发经验,我总结了我的理解,按照面向的服务对象,我们主要分为两大类:
- 1、面向用户的:命令接口
- 2、面向程序员的:程序接口
1、命令接口
我用最简单的话解释!首先,我们要知道我们用户、软件这些要用计算机的资源(CPU、内存、摄像头设备...)一定一定是被操作系统隔开的,只能告诉【操作系统】让它来管理这些资源。
那么命令接口就是【人】能够直接告知、调用操作系统去执行一些任务的接口(注意是调用操作系统,不是调用计算机系统)
【命令接口】又分【联机命令接口】和【脱机命令接口】
;
【联机命令接口】就是大家常用的【Window + R】这种打开“黑窗口”输入命令来执行的操作,一般普通用户可能比较蠢就只会用鼠标点图标,但是程序员可能一般用得多一点,但是“执行命令” 跟 “鼠标点图标” 的效果是一样的
【联机命令接口】特点就是:命令一条一条的执行
例子:
;
【脱机命令接口】就是将大批大批的命令通过.bat文件执行
特点就是:命令可以一堆一堆的执行
例子:
误区:当时我一直困惑,那既然是多个命令大批大批的执行,那写个C语言、Python、java代码文件,然后整个文件执行,不也是一样的吗??不是!!!C语言、python这些代码写的只是代码,并不是调用操作系统执行任务的命令,就算是里面的库函数调用了操作系统,但是那也是由【程序】在运行时去执行的,“发出命令”的主体不是【人】
;
会有这个误区很正常,因为很多人没有接触过【.bat】、【.sh】文件,这些是专门用来写多条操作系统命令的文件,【.bat】是windows系统的、【.sh】是Linux系统的
(比如下面这个例子,这个.bat文件就三个命令,打开谷歌浏览器同时打开两个微信)
2、程序接口(又叫 “系统调用” 或 “广义指令”)
程序接口:就是【程序、app】这些东西去调用操作系统去执行一些任务的接口(注意是调用操作系统,不是调用计算机系统)
(看出区别了没?命令接口是人去执行命令来操作操作系统,“发出命令”的主体是【人】;程序接口是程序员写好的项目代码,在运行的时候这个程序去调用操作系统,“发出命令”的主体不是【人】。)
【程序接口】就记住是面向的对象是程序员、而不是普通用户,然后程序调用【程序接口】执行命令,“发出命令”的主体是【程序】
例子:
3、GUI接口
GUI也是操作系统提供给用户和操作系统之间交互的接口,但是记住GUI界面本身不属于操作系统,他也是【调用程序接口】来使用操作系统
虽然GUI图形接口不是操作系统一部分,但是他所用的系统调用是操作系统的一部分;
其中【GUI】就是搭建常用的图形化操作,点一下图标打开啊、右键删除、新建等等......
例子:
;
这里注意,常见的接口还应该加上【GUI】接口,也就是共3大类:【GUI】【命令接口】【程序接口】
(但是注意:【命令接口】和【程序接口】统称为用户接口)
3、人话总结:
看到这你肯定还是一脸懵逼不知道我再说什么玩意,我总结一下我自身的当时的困惑:
1、为什么【命令接口】是执行命令调用操作系统,但是反而说是 “面向用户” ?为什么【程序接口】是让程序自己调用操作系统命令,却说是 “面向对象是程序员”?
从通俗角度思考:
因为这里 【用户】指代:程序员+普通电脑使用者!!!你普通人也可以自己随便学点简单的命令(比如cd D:/进入D盘),程序人也是,所以命令接口面向普通用户;而你普通人不会自己为了实现一个功能来写一个软件吧?所以程序接口是面向程序员(比如你想调用操作系统打开播放器播放本地音乐,不可能写一个软件来实现吧?只有程序员可能会这样)
;
从三大类接口执行命令的【主体】来看:
【GUI接口】:一点命令都不会的电脑小白用户(当然程序员也不是神,也会点图标)
【命令接口】:普通用户+程序员(只要会敲点命令就行,普通人也可以敲命令)
【程序接口(系统调用)】:程序(是只有程序员才会用的,但是写代码完之后,执行命令时是程序自己主动的执行命令)
2、那我们写的C语言、python这些代码到底是不是【程序接口】?还是说他们本身就可以直接操作计算机系统资源?
不是!!他们也不能直接接触计算机系统的资源!!只有操作系统才可以碰计算机底层资源!那么对于C语言、python这些代码,他们会有一些 “库函数”,有的库函数只是简单的数学运算、数组排序...等等功能,但是有些库函数是可以调用操作系统执行一些命令操作的(比如:C语言
fork()
调用操作系统来创建一个新的进程、在Python中使用os.open()
函数来调用操作系统打开一个文件);
我来画个图来理解:这些库函数也是调用的操作系统自己提供的一些【系统调用的接口】,通过这些【系统调用(程序接口)】再向操作系统的【内核程序】请求服务,最终由【内核程序】操作、使用计算机系统的资源
内核程序会在后面章节讲到,有个了解先
3、那是不是命令接口那样直接敲命令就是直接调用计算机系统资源了?
再次强调!!没人能够直接跨过操作系统来接触计算机底层!!!命令接口是更加快、直接地操作【操作系统】!不管是命令接口还是程序接口还是GUI,都是操作【操作系统】!!!
结合题目加深印象:
1、用户可以通过( B )两种方式使用计算机
A、命令接口和函数
B、命令接口和程序接口 (用户接口就是“命令接口”和“程序接口”,用户包括了“普通用户”和“程序员”,当然用户还可以使用GUI图形化接口使用计算机,只不过它本身不属于操作系统的部分)
C、命令接口和文件管理
D、设备管理方式和系统调用
;
2、系统调用是由操作系统提供给用户的,它( B )
A、直接通过给键盘交互方式
B、只能通过用户程序间接使用(系统调用就是程序接口,是【程序】和操作系统之间的交互)
C、命令接口和文件管理
D、设备管理方式和系统调用
;
3、操作系统提供给程序员的接口是( C )
A、库函数
B、高级语言
C、系统调用(操作系统只是提供系统调用接口,至于代码、库函数这些都是高于操作系统层面之上的)
D、子程序
;
4、系统调用的目的是( A )
A、请求系统服务(B、C、D这种直接涉及系统资源的是操作系统内核程序干的事,其实系统调用的接口也是操作系统自己的一个“接口函数”,操作系统真正直接接触系统资源的是内核程序)
B、终止系统服务
C、申请系统资源
D、释放系统资源
;
5、下列选项,操作系统提供给应用程序的接口是( A )
A、系通调用(再次记住,库函数是高级语言提供的和操作系统的系统调用相对应的函数(虽然有的库函数和系统调用无关),但是库函数属于用户程序,是系统调用的上层)
B、中断
C、库函数
D、原语
二、操作系统的特征
前提知识点:这里需要知道的一个知识点后面可能会方便各位理解———程序是在内存中运行的
(这就是为什么当你的内存不够大时,运行多个程序会卡,而且一个程序运行下去可能要生成更多的临时数据资源,占用更多内存,导致电脑更卡)
1、总的4大特征:
(其中【并发】和【共享】是最基本的特征,二者互为存在条件)
2、并发
并发是指:两个或多个事件在同一时间间隔内同时发生
注意:这个【同时】是宏观上的同时,微观上是交替发生的,怎么解释呢?
那就要区分一下【并发】和【并行】两个概念
【并发】两个或多个事件在同一时间间隔内同时发生,也就是同时跟个千手观音一样干着N份活
;
【并行】是两个或多个事件在同一时刻同时发生,虽然是要一次性干这么多活,但是也得稍微有个前后顺序,在微观层面的某一小时刻还是只能执行一件事
用两渣男约会来比喻:
而【操作系统的并发性】就是【计算机中同时运行多个程序】(宏观同时,微观交替)
操作系统和程序并发是同时诞生的
但是留意:
1、在单处理机环境下(处理机就是CPU)
【CPU和I/O设备】、【I/O设备和I/O设备】、【CPU和通道】可以实现同时“并行”!!(通道也叫“I/O通道”,是一种特殊的处理器,可以独立于CPU去执行 输入/输出 指令,负责管理外部设备与内存之间的数据传输)
2、在流水线、多处理机(多个CPU)环境下也可以 “并行” (以后会解释)
;
例题:
1、单处理机系统中,可并行的是(Ⅱ、Ⅲ、Ⅳ )
Ⅰ、进程与进程(一个CPU一段时间只能执行一个进程,就算以极快的速度分时执行各个进程,那也是“并发”,而不是“并行”,并行是真的同时执行几个进程)
Ⅱ、处理机和设备
Ⅲ、处理机和通道
Ⅳ、设备和设备
3、共享
共享就是计算机的资源共享,系统中的资源可供内存中多个并发进程使用
(这里资源不仅仅指内存数据,还有什么音响啊、摄像头...等等都可以算资源)
这种 “同时” 跟并发一样,也是 “宏观上” 同时,“微观上” 分时共享
根据计算机系统的资源的区分,可以分为两种:【可同时共享的资源】和【临界资源】
这两种资源对应的共享方式也可细分为:【同时共享】和【互斥共享】两种共享方式
;
【互斥共享】——>【临界资源】
在一段时间内只允许一个进程访问、等到它访问完才允许给别的进程使用的资源就叫【临界资源】,对于这种资源的共享形式叫【互斥共享】
为什么要这样?比如qq、微信同时要视频通话,那摄像头资源就只能给一个应用使用,不然不是视频画面乱套了吗?网易云跟qq音乐同时要放歌,那音频播放器只能给一个应用使用;打印机被两个进程申请,如果同时共享的话,在一张纸上,A文件打印一行B文件打印一行,这像话吗?
;
【同时共享】——>【可同时共享的资源】
在一段时间内允许多个进程“同时”访问(虽然这里的“同时”是宏观相对这一段时间内的同时,微观上还是以几乎察觉不到的速度交替访问着资源)这种资源就叫【可同时共享的资源】,对于这种资源的共享形式叫【同时共享】
就是比如qq跟微信跟短信都可以同一时间给别人发送文件、照片......看似是同时进行的,但其实 “微观层面” 上其实是分时交替着读取内存资源
一些常见的【临界资源】和【可同时共享的资源】
【可同时共享的资源】:
还有用 “重入代码” 编写的文件....
;
【临界资源】:
大多数计算机的【物理设备】、还有软件里要用的栈、变量、表格
一定要记住:【并发】和【共享】是相互依存的,缺一不可
4、虚拟
虚拟就是将一个 “物理实体” 变成 若干个 “逻辑上的对应物”,物理实体是实际存在的(比如电脑运行内存大小、计算机的1个单核CPU),逻辑对应物是用户感受到的(比如玩游戏时感觉运行内存变得好大、打开多个软件以为是多个CPU同时工作)
注意:【虚拟性】依赖于【并发性】来体现,如果没了【并发性】,【虚拟性】就没有存在的意义
5、异步
这个对于java以及前端开发的兄弟们应该再熟悉不过了,异步就是多个进程并发运行,但是有限的资源被一个进程占用时,有的进程可能就需要等待,并不是所有进程都是一路顺利贯穿到底的
我自己的项目经验的例子是:
有的时候我们开发前端,当加载页面的时候有些图片资源是需要通过向后端发送请求获取的,那这跟时候加载页面会直接运行 “渲染静态数据”、“渲染样式”......等等进程,而“渲染图片”这个进程可能就要等待请求成功响应回数据之后,再渲染,页面就会出现空白或者预加载的假图片;
;
或者我们的setTimeout这种函数,就是异步,我们正常执行别的函数、进程,然后等我们设置的时间到了,才会触发setTimeout这个函数的进程开始。
;
;
《王道考研》里的例子是: