文章目录
一、冯诺依曼体系结构
我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。冯诺依曼是计算机之父。
冯诺依曼体系结构=>描述了一台计算机是如何构成的(99%的计算机都是冯诺依曼结构)=>硬件的特点会对软件开发造成直接影响。
而图灵是奠定了计算机工作原理的理论基础。
注意:
1.输入设备输入进去的内容都会保存在内存中。输出设备的输出内容都是从内存中提取的。
2.有些设备既是输入设备也是输出设备。如触摸屏、网卡。(网卡能将数据上传到网络,能从网络中下载数据到本地)
关于冯诺依曼,必须强调几点:
1.这里的存储器指的是内存
2.不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)
3.外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。
一句话,所有设备都只能直接和内存打交道。
二、操作系统(Operator System)
1.概念
任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:
- 内核(进程管理,内存管理,文件管理,驱动管理)
- 其他程序(例如函数库,shell程序等等)
操作系统是一个软件(搞管理的软件),一方面是管理计算机的硬件设备,另一方面管理计算机的软件资源。一个完整的操作系统=内核+配套的应用程序。
内存和外村的对比:
1.内存的存储空间较小,外村的存储空间较大。
2.内存的访问速度较快(ns级别),外村的访问速度较慢(us),大概差了三四个数量级
3.内存的成本较高,外存的成本较低。
4.内存如果断电了,数据就丢失了,外村如果断电了,内存不丢失(持久化存储)
2.OS的设计
可以分为三部分:一部分为应用程序(软件),一部分为操作系统内核负责的部分,一部分为硬件设备。
系统调用接口是操作系统内核对外提供的编程接口。每个硬件都有对应的驱动程序来驱动。
例如在屏幕中输出“hello world”,应用程序会写这样的代码:System.out.println(hello world);
,本质上需要操作显示器这个硬件设备来完成。但是代码真正的执行步骤:println会进入库代码中->通过相关的系统调用进入到内核中执行代码->内核根据代码来调用显卡驱动程序->再由显卡驱动程序来具体操作内核->让内核代码来执行“让显示器输出”这样的动作。
操作系统的管理:
1.描述:描述每个硬件设备
2.组织:借助数据结构将硬件设备组织到一起
例如发奖学金:
1.校长得先知道每个同学的基本信息(姓名,班级,学号,成绩)=>描述数据,它相当于创建了一个Student类,类中包含一些需要的属性,再根据当前的数据创建一堆Student的实例
2.再在所有同学信息中进行筛选,选出若干个成绩最好的同学=>组织数据,它借助一定的数据结构,把这些Student类的实例放到一起,然后再按照一定的规则来筛选。
三、进程(Process)
1.概念
进程也可以称为任务(task),它是操作系统中非常重要的软件资源。
把一个可执行程序跑起来,系统中就会创建一个对应的进程。
如果这个程序执行结束了,系统就会随之销毁对应的进程。
进程可以看作是一个程序执行的“过程”。
在任务管理器中可以看到每个进程:
2.时间片
操作系统(如Windows、Linux)的任务调度是采用时间片轮转的抢占式调度方式,也就是说一个任务执行一小段时间后强制暂停去执行下一个任务,每个任务轮流执行。
任务执行的一小段时间叫做时间片,任务正在执行时的状态叫运行状态,任务执行一段时间后强制暂停去执行下一个任务,被暂停的任务就处于就绪状态等待下一个属于它的时间片的到来。
3.区分“程序/可执行文件”与“进程”
.exe文件就是一个可执行文件,它是一个静态的文件,如果不去动它,它就不会发生变化。
下面的就算一个进程,当双击exe文件时,操作系统就会加载这个可执行程序。加载的时候,把exe文件中的很多内容都加载到内存中了,分配一些资源,并开始执行这个可执行程序中包含的指令。这个过程就是一个进程。
进程也可以认为是操作系统进行资源分配的最小单位。
4.进程的管理
PID指的是进程id的标识符,例如:先双击qq,得到一个新的进程id p1,再关闭qq,进程id为p1的进程会消失,此时再双击qq,得到一个新的进程id p2,此时会发现p1!=p2。
进程的管理跟操作系统的管理类似:
1.描述:用一个类来描述
2.组织:用一定的数据结构组织进程
下面以Linux为例:
内核中使用一个 task_struct/PCB(进程控制块)结构体来描述进程(C语言)
每创建一个进程,就同时创建一个PCB这样的类的实例。
那么它是如何组织进程的呢?
答:使用双向链表把所有的PCB对象串到一起。
例如:
双击一个exe文件,创建一个进程的时候,本质上就是在内核中,先创建了一个PCB对象,然后把这个对象加入到链表中。
关闭一个程序,结束一个进程的时候,本质上就是在内核中,找到这个对应的PCB对象,然后从链表上删掉,并且释放该对象。
通过任务管理器查看到的所有的进程信息,本质上就是在遍历内核中的这个链表,依次读取对应PCB中的结点信息。
5.PCB中包含的信息
1.pid(进程id):进程的身份标识
2.一组内存指针:指向该进程持有的一些重要数据在内存中的位置。
重要的数据包括:a)执行的指令都有啥 b)这些指令依赖的数据都是啥。
内存是操作系统给该进程分配资源的一部分。
3.状态:
R:就绪状态,正在CPU上执行的,或者即将执行
S:睡眠状态,这些进程没在CPU上执行,而是在等待执行
D:深度睡眠状态,进程在长时间的忙于IO操作,没精力理会CPU
X:退出状态,进程已经被销毁了
4.优先级
5.进程的记账信息
6.上下文
4,5,6都在下面介绍。
注意:3,4,5,6点都是为了实现进程调度。当然吗,如果资源非常充裕,那么就不需要调度,但是实际上是资源不太充裕,而需要资源的进程又非常多。那么进程调度就是为了让各种进程能够很好的在CPU上进行并发执行。
操作系统中实现进程调度的模块叫做“调度器”,实现具体的调度的时候有很多策略,这些策略都要依赖PCB中的对应的属性。
例如:一台机器的8核CPU当前的进程已经过百了,那么如何让这么多进程在8个CPU上很好地工作?就是靠进程调度来完成的,它是一个并发式执行的过程。
并发式执行:
注意:CPU在同一时刻只能执行一个程序的指令,不能执行多个。由于CPU执行指令的速度很快,虽然它实际上是先执行指令1,执行一会后执行指令2,以此类推。但是这个时间相对人来说是非常快的,人感知不到而已。
并发式与并行式:
并发式微观上来说是先执行一个再执行另一个…宏观上来说人感知不到那个时间,看似是同一时间执行的。并行式微观上来说是一起执行的,宏观上来说也是一起执行的。如并行就是两个CPU可以同时执行两个进程的指令。
优先级:哪个进程指令比较重要的就先执行哪个进程指令。
进程的记账信息:避免进程指令的执行重复,要雨露均沾。不能让某个进程一直霸占CPU。
上下文:保存了上次进程在CPU上执行的进度,以便下次进程上CPU的时候能够继续执行。
6.内核态和用户态
一般的操作系统(如Windows、Linux)对执行权限进行分级:用户态和内核态。
如上图所示,操作系统内核作为直接控制硬件设备的底层软件,权限最高,称为内核态,或核心态。用户程序的权限最低,称为用户态。
之前的操作系统是不分内核态和用户态的,现在有分则是为了在用户态中只能进行一些风险比较低的操作。而内存态中一个不小心的误操作可能会对计算机造成很大 的伤害。