操作系统初识

冯诺依曼体系结构

描述了一台计算机是如何构成的(又称为普林斯顿体系结构)

(99% 的计算机都是冯诺依曼体系结构的,硬件的特点会对软件开发造成直接的影响)

 

操作系统初识_第1张图片

内存

过去几十年,CPU的发展速度十分迅猛

“摩尔定律”:18个月,芯片集成程度提高一倍,运算能力提高一倍,成本降低一半。

但是,现在这个定律失效了,因为 CPU 集成程度更高,就需要让单个原件尽量小,现在最厉害的工艺 7nm 级别,这样的空间尺度上,经典物理已经接近失效,主要靠量子力学,现在解决这个问题的办法是,人海战术——一个  CPU 没办法再提高速度,那么就只能多搞几个 CPU 来解决,也就是现在的多核

GPU 是一种特殊的 CPU ,专门针对一些特定场景进行优化计算(矩阵等)

 

Java中写得多代码,主要都是在内存中,new 出来的对象就是在内存上申请空间,后面介绍的 IO流,就知道了如何让程序和内存打交道

内存和外存的对比

  1. 内存的存储空间比较少,外存的存储空间比较大
  2. 内存的访问速度较快(ns级别),外存的访问速度比较慢(μs),大概查了三四个数量级
  3. 内存的成本比较高,外存的额成本比较低
  4. 内存如果断电,数据就丢失了,外存如果断电了,数据不丢失(持久化存储)

 

操作系统

是一个搞管理的软件。一方面管理计算机的硬件设备,另一方面管理计算机的软件资源。

一个完整的操作系统 = 内核 + 配置的应用程序

 

OS定位

在操作系统中的定位是:一款纯正的搞管理的软件

 

例如:System.out.println("hello world!");

代码真正执行的时候,println 会进入到依赖的库当中,本质上需要操作显示器这个硬件设备来完成,println 然后就会通过相关的系统调用进入到内核当中来执行代码。这个内核中的代码再来执行“让显示器输出”这样的动作。最后,内核调用显卡驱动程序具体操作显示器。

 

操作系统具体怎么管理?

所谓管理核心工作主要是两个方面:

  1. 描述:相当于是创建了一个 Student 类,类中包含一些需要的属性,再根据当前的数据创建一堆 Student的实例
  2. 组织:借助一定的数据结构,把这些Student 的实例放到一起,然后在按照一定的规则来筛选

 

进程(process)/任务(Task)

进程是一种操作系统中非常重要的软件资源。把一个可执行程序跑起来,系统中就会创建一个对应的进程,如果这个程序执行结束了,系统就会随之销毁对应的进程,进程就可以看成是一个程序的执行的“过程”。

 

注意区分程序和进程,程序也可以成为可执行文件:

  • 执行文件就是一个磁盘上的文件,静态的,如果不去操作就不会发生变化
  • 当双击某个 exe 文件时,操作系统就会加载这个可执行程序,(加载:把 exe 文件中的很多内容都加载到内存中,分配了一些资源,并开始执行这个可执行程序中包含的指令),执行过程中就是一个进程。

进程也可以认为是操作系统进行资源分配的最小单位。

PID 是进程 id 的身份标识符,关闭一个程序后再次打开,两次产生的PID是不同的

 

进程管理

管理:先描述,再组织。

以 Linux 为例:

  • 内核中使用一个 task_struct /PCB(进程控制块)结构体来描述进程
  • 每创建一个进程,就同时创建了一个 PCB 这样的类的实例。
  • 组织方式:使用双向链表把所有的 PCB 对象串到一起。

双击一个 exe ,创建一个进程的时候,本质上就是在内核中,县创建一个 PCB 对象,然后把这个对象加入到链表中。

关闭一个程序,结束一个进程的时候,本质上就是在内核中,找到这个对应的 PCB 对象,然后从链表上删除,并且释放该对象

通过任务管理器查看到的所有的进程信息,本质上就是在遍历内核中的这个链表,一次读取对应 PCB 中的节点信息

 

PCB 里面包含哪些信息呢?

  1. pid(进程id):进程的身份标识
  2. 一组内存指针,指向该进程持有的一些重要数据在内存中得到位置。
  3. 状态
  4. 优先级
  5. 进程的记账信息
  6. 上下文

上述中3~6 为了实现“进程调度”,如果资源非常充裕,那么不需要调度。事实上是进程多,系统给进程分配的资源(CPU)很少,目的就是为了让大量的进程能够很好的在有限的 CPU 上进行并发执行

 

并发:同一时刻 CPU 上只能执行一个程序的指令,由于CPU 计算/执行指令速度极快,我们就可以让 CPU 这样工作:先执行进程1 的指令,执行了一段时间后,执行进程2 的指令,再执行进程3 的指令……过一段时间后再继续执行进程1 的指令,期间的时间间隔十分短,宏观上来看,是在同时运行这些进程,但是微观上来看,这些指令是串行执行的,只不过 CPU 切换速度极快,人宏观上感知不到,这就是并发。

并行:是宏观上是同时执行,微观上也是同时进行。(两个CPU 就可以同时执行两个进行的指令)

实际工作中一般不会严格区分并行和并发,两个术语可能会混淆使用。

 

操作系统中实现进程调度的模块叫做“调度器”,实现具体调度的时候有很多策略,这些策略都依赖 PCB 的属性

 

一个进程的状态有这些状态:

  • R:就绪状态。正在 CPU 上执行,或者即将执行
  • S:睡眠状态。这些进程没法在 CPU 上执行,而是在等待。
  • D:深度睡眠状态。进程在长时间的忙于 IO 操作,没精力理会 CPU
  • X:退出状态。进程已经被销毁了
  • T
  • t
  • Z
  • ……

你可能感兴趣的:(Java,操作系统)