一、操作系统
1、操作系统的定义
操作系统是一个搞管理的软件。
对下,要管理硬件设备;对上,要给软件提供稳定的运行环境。
操作系统是软件、硬件、用户之间交互的媒介。
2、常见的操作系统
Windows、Linux、Mac
3、操作系统的定位
我们平时所说的操作系统,指的是系统调用,操作系统内核,驱动程序这三个部分。
应用程序 | java运行在JVM上,属于应用程序 |
系统调用 | 操作系统给应用程序提供的API 比如,有个程序想操作一下硬件设备,就需要先通过系统调用, 把操作命令告诉给系统内核,内核调用驱动程序,进一步操作硬件设备 比如,你写了一个System.out.println("hello world"),想要在显示器上打印hello world 也是这个流程,print这个方法在底层一定调用了系统调用,系统调用通知操作系统内核, 内核通过驱动程序找到显卡,最终把数据渲染到界面上。 |
操作系统内核 | 操作系统的核心功能,管理功能。 对下,要管理硬件设备;对上,要给软件提供稳定的运行环境。 |
驱动程序 | 因为硬件设备种类繁多,厂商各异, 硬件厂商开发硬件时会提供对应的驱动。 电脑装了对应的驱动,才能让系统正确识别硬件设备。 |
硬件设备 | 也就是硬件,电脑后盖打开,能看到的都是硬件设备 |
4、并行和并发
并行:微观上同一时刻,两个CPU核心上的进程,就是同时执行的。
并发:微观上同一时刻,一个核心上只能运行一个进程,但是它能够对进程进行快速的切换。(比如先运行一下QQ,再运行一下画图板,再运行一下CCtalk,非常快速的切换。)宏观上看起来就像是几个进程在同时运行。
究竟是并行和并发,是由操作系统内核负责处理的,我们宏观上感知不到。
因此,往往把并行和并发,统称为并发!!除非显示声明,谈到并发,就是指并行和并发。
二、进程
1、进程的定义
进程(process),也叫任务(task),一个“跑起来”的程序就是一个进程。也就是说,一个正在运行的程序是一个进程,不在运行中的不叫进程,只能说是程序。
如何看电脑上运行了多少进程?
打开任务管理器,就可以看到你电脑上正在运行的所有进程。
每个进程都对应一些资源,进程是操作系统资源分配的基本单位。
2、操作系统内核是如何管理进程的?
进程是一个重要的“软件资源”,由操作系统内核负责管理。
操作系统内核是如何管理进程的呢?
通过描述+组织的方式。
描述:就是讲清楚进程有哪些属性特征。
使用结构体(C语言的结构体)来描述进程属性,给这个结构体起了个特殊的名字,叫做PCB,即进程控制块。
那么可以说,操作系统内核通过PCB来描述进程的属性。
组织:通过一定的数据结构,把多个这样的基本单位给串起来。
通过双向链表,把多个PCB给串起来。
也就是说,我们在任务管理器上看到的进程列表,本质上就是遍历这个PCB链表。
创建一个进程,本质上就是创建一个PCB这样的结构体对象,把它插入到链表中。
销毁一个进程,本质上就是把链表上的PCB结点删除掉。
3、PCB这个结构体中哪些属性 用来描述进程属性特征?
PCB里包含的用来描述进程特征的属性是非常多的,下述这些都是核心的属性:
- pid
- 内存指针
- 文件描述符表
- 进程调度相关的属性:(1)进程的状态(2)优先级(3)上下文(4)记账信息
下面分别进行详细介绍:
PCB中的核心属性 | 说明 | ||||||||
pid | 进程的身份标识符,是唯一的数字 | ||||||||
内存指针 | 指向了分配给自己的内存是哪些,描述了进程持有哪些内存资源 | ||||||||
文件描述符表 | 硬盘上的文件等其他资源,描述了进程持有哪些文件等其他资源 | ||||||||
进程调度相关的属性
| 进程调度: 操作系统决定让哪个进程上CPU运行,给进程分配CPU资源 进程调度相关的属性: 本质上是为了解决“狼多肉少”的问题,通过并发,让大量的进程可以在少数的CPU上同时运行 操作系统里有一个重要的模块调度器,就是负责让有限的CPU来调度执行这么多进程的,而实现这个模块调度器,就需要PCB提供进程调度相关的属性来完成进程调度。 |
4、进程的虚拟地址空间
程序中获取到的内存地址,并非是真实的物理内存的地址,而是经过了一层抽象的虚拟地址。
那么,什么是物理地址,为什么不使用物理地址而是使用虚拟地址呢?
物理地址:
内存,物理上就是个内存条,内存条上的内存编号就是“地址”,也就是真是的“物理地址”。
内存有个重要的特点:支持随机访问。正是因为这个特点,所以数组取下标操作是O(1)
使用真实的物理地址时,当你写的程序出现了内存越界,反而把人家的Chrome或者其他程序给搞坏了,明明是进程1出的问题,反而把进程二给搞坏了。这就很难受了。
所以为了避免进程之间相互产生影响,在代码中不在使用“物理地址”,而是使用“虚拟地址”。
由操作系统和专门的硬件设备MMU(MMU很多时候也是集成在CPU里的)负责进行虚拟地址到物理地址的转换。
一旦进程访问越界了,这个越界的地址MMU硬件设备就翻译不了了,操作系统内核发现地址超过进程的访问范围,直接会向进程反馈一个错误,引起进程的崩溃。谁出了bug,谁崩溃,其他进程不受影响。
使用虚拟地址解决了进程之间相互影响的问题。
5、进程间的通信
搞一个多个进程都能访问到的“公共空间”,基于这个公共空间来进行交互数据。
通信方式/公共空间有很多具体的体现形式,比如说:基于文件、基于网络。