目录
一、操作系统
操作系统说白了就是一种搞管理的软件,所谓的管理,就是“描述+组织”。它对硬件设备和软件资源进行管理,而进程就是属于一种软件资源。
二、进程
1、进程的理解
进程是操作系统对一个正在运行的程序的一种抽象,换言之,可以把进程看做程序的一次运行过程,也可以把进程理解成一个“正在进行”的程序,(如图:QQ音乐,QQ); 同时,在操作系统内部,进程又是操作系统进行资源分配的基本单位。要想让进程跑起来。就得给进程分配一定的系统硬件资源:CPU、内存、磁盘、网络。
2、进程的管理
前边说管理=描述+组织。这里的描述就是PCB,也是进程控制块,这相当于一个类,也相当于一个C语言的结构体,一个结构体对象就对应一个进程。进程使用一定的数据结构来组织,一种常见的做法就是使用双向链表。
查看进程列表,本质上就是遍历操作系统内核中的这个链表,并显示其中的属性;
创建一个进程,本质上就是创建一个PCB对象,加入到内核的链表中;
销毁一个进程,本质上就是把这个PCB对象从内核链表中删除。
2.1、PCB的属性
pid:一个进程的身份标识,一个机器同一时刻不可能有两个进程的pid相同;
内存指针:描述了这个进程使用的内存空间是哪个范围;
文件描述符表:描述了这个进程都打开了哪些文件。系统中打开一个文件,其实就得到了一个“文件描述符”,这个文件描述符(整数)就像一个“遥控器一样”,文件数据是在磁盘上,代码中操作磁盘数据不像操作内存数据那么方便,所以往往是借助这种“遥控器”的方式来操作。
并发式执行:1个CPU运行多个进程,宏观上是同时执行,微观上是顺序执行
并行式执行:多个CPU运行多个进程(CPU1运行进程1,CPU2运行进程2),进程1 和进程2在宏观上、微观上都是同时执行
3、进程的调度过程
3.1、进程的状态(R、S、X)
3.2、进程的优先级
3.3、进程的上下文
需要记住上次运行到哪个指令了,方便下次调度的时候能够继续从这个位置来运行,也就是通常说的存档和读档。进程的上下文主要是存储调度出CPU之前寄存器中的信息,把寄存器中的信息保存到内存中,等到这个进程下次恢复到CPU上执行的时候,就把内存保存好的数据恢复到寄存器中。操作系统何时进行进程调度(把进程放到CPU,把进行切换出CPU),这个对于进程本身是感知不到的
3.4、进程的记账信息
记录这个信息在CPU执行了多久,用来辅助决定这个进程是继续在CPU上执行,还是说要调度出去。
4、进程的虚拟地址空间
一个进程要想运行,就需要给他分配一些系统资源,内存就是一个核心的资源。为了一定程度的减少内存访问越界带来的后果,我们引进了虚拟地址空间。
如果进程1的内存范围是01x100 - 0x800,如果我们的代码尝试修改0x801的地址的数据,这个操作就是越界访问。如果这是一个真实的物理地址(真实的内存地址),这就会把0x801修改成功,如果这个0x801是进程2要使用的内存,此时进程2可能就出现bug,如果进程访问的是虚拟地址,也尝试修改0x801,此时系统会针对0x801来查询页表,找到对应的物理地址,由于0x801是非法地址,在页表中查询不到,系统就会明白这是在越界访问,于是让这个进程出现崩溃,防止影响其他进程。这样做就让进程与进程之间相互影响可能性变小了,隔离性增加了,进程也就更稳定了。不过当两个进程需要相互交流沟通时,就很困难了。
页表:一种数据结构,相当于hash,实现虚拟地址和物理地址进行一种映射关系。好比对每个班级学生进行编号,编号这就是虚拟地址,教务系统就是页表,学号就是物理地址。