操作系统
操作系统是一组做计算机资源管理的软件的统称。
两大功能:
1、对下管理各种硬件设备
2、对上给软件提供稳定的运行环境
详细解释操作系统范畴的三大部分:
1、系统调用:操作系统提供的API (应用程序需要调用这里的API才能完成一些具体的工作)
2、操作系统内核:实现了操作系统最核心功能 :内存隔离,硬盘管理,进程管理…
3、驱动:适配各种硬件厂商。目的就是为了让操作系统识别这些驱动,一般驱动软件由厂商提供。
进程管理
什么是进程?
跑起来的程序就是进程。QQ.exe叫做可执行程序,双击跑起来就是进程
以下这些都是跑出来的程序,也就是进程:
如何管理进程?
同一时刻,操作系统的进程有很多,就得有办法去管理。那么如何管理?
1、描述:
详细表示清楚一个进程有哪些属性。
(一般是由一个结构体来描述一个进程的各种信息,这样的一个结构体被称为PCB(进程控制块))。
2、组织:
通过一定的数据结构,把若干用来描述的实体放到一起,并且进行增删查改。(一般使用双向链表)
当一个可执行程序被运行起来时候,相当于创建一个进程;
创建一个进程可以理解为创建PCB并且加入到链表上;
销毁一个进程本质就是从链表中删除对应PCB节点;
查看任务管理器本质上是在遍历这个链表。
值得注意的是,一个进程可能是一个PCB,也可能对应多个,系统这里管理的PCB的链表也不一定是一个。
PCB(进程)里面的关键属性
1、pid进程的身份标识
一个主机,同一个时刻,这些进程的pid是唯一的,通过pid来区分一个进程。
2、内存指针
描述进程持有的内存资源
一个可执行程序,双击后开始运行,操作系统把文件中的核心数据加载到内存中;
既然要创建进程,势必要给进程分配内存空间然后在这个内存空间上就有很多区域;有的用来放指令,有的用来放数据,还有的用来维护运行状态。
3、文件描述符表
描述进程持有的文件资源
每个进程,都可以打开一些文件,文件描述符变里面就记录了当前进程都打开了哪些文件。(打开来之后就可以后续针对这些文件进行读写操作)。
四大属性与进程调度有关属性:
4、进程状态
进程分为阻塞状态和就绪状态
5、进程优先级
系统调度的时候会很久优先级来给进程进行安排时间
创建进程的时候,可以通过一些系统调用来干预优先级。
6、进程上下文
进程在CPU上执行了一会之后,要切换给别的进程,就需要保存当前运行的中间结果(存档),下次再轮到它执行的时候,就恢复之前的中间结果(读档)继续往下执行。
对于进程来说,上下文就是CPU中寄存器的值,寄存器的值就包含了运行的中间结果,需要把这些结果保存到PCB的上下文信息中(内存)
7、进程进账信息
每个进程在CPU上执行了多久,统计信息来辅助调度的效果。
执行进程的时候,虽然有优先级,但是也不希望有些进程一直轮不到它执行。
什么是进程调度?
CPU资源是有限的,而进程有成千上百个。
进程调度就是通过并行和并发的方式让计算机可以同时执行多个任务。
并行执行:
每个CPU核心上,都可以独立的运行一个进程(运行进程的相关指令)
多个CPU核心上,都可以同时独立的运行多个进程。
并发执行:
一个CPU核心,先运行一下进程1,在运行进程2,在运行进程3,只要微观上切换的足够快,宏观上看起来就好像是3个进程同时运行。
关键概念:虚拟地址空间
通过一个案例来初识虚拟地址空间:
有两个进程,操作系统会给每个进程分配一些内存资源如下图:
这种分法其实是有问题的,如果哪一天进程1突然内存访问越界到进程2对应的内存去(解引用 野指针)那么进程2就会因为bug而崩溃。
我的天呀,进程2好好的运行着突然被你进程1搞死了,那还得了,这个操作系统还能稳定运行么,这里根本不能给软件提供稳定的运行环境啊。违背了操作系统的对上原则。
改进,引入MMU:
为了解决这个问题,就需要让每个进程都有各自的内存空间 (活动范围)不要让这些进程的活动范围重叠;
给每个进程划分的内存空间,都叫做“虚拟地址空间”(不是真实的物理内存地址)。
通过专门的设备 MMU 来完成 虚拟地址,到物理地址之间的 映射!!
MMU作用:MMU针对进程访问的虚拟地址进行校验;如果非法地址,就直接通知进程从而及时止损,避免影响到其他进程的运行。
例如:针对进程1和进程2来说,能够访问的虚拟内存空间就是0x0 到 0xFFF这段。如果不小心访问了更大的内存空间,在MMU映射的时候,就能够及时发现,从而避免对物理内存产生影响。
隔离性:
使用虚拟地址空间,就认为进程之间存在了隔离性。
一个进程是不能直接访问另一个进程的内存数据的。
隔离性的作用:防干扰的操作,提高了系统的稳定性,不会说某个进程bug了影响到了别人。
新问题:进程之间的通信
需求是多种多样的,当我们遇到多个进程相互配合的时候,进程隔离了,此时的进程就很难进行交互了!
操作系统为此引入了一个新机制:进程间的通信
进程是要求要有独立性的,相互之间不影响,进程如果需要进行通信,就需要和使用特定的进程间的通信机制(基于文件,基础socket(网卡))找到一个进程之间都能访问到的公共资源,如何基于公共资源来交换数据。
进程间的通信*
进程是要求要有独立性的,相互之间不影响,进程如果需要进行通信,就需要和使用特定的进程间的通信机制(基于文件,基础socket(网卡))找到一个进程之间都能访问到的公共资源,如何基于公共资源来交换数据。