现代的计算机,大多数都是遵守冯诺依曼体系结构的
冯诺依曼体系结构 主要由 五大部件 组成:
操作系统 (Operating System) 简称 OS.
操作系统是一组做计算机资源管理的软件的统称。
目前常见的操作系统有:Windows系列、Unix系列、Linux系列、OSX系列、Android系列、iOS系列、鸿蒙等
OS分类
进程(process) 也叫做 任务(task).对于操作系统来说 一个任务就是一个进程
进程 就是一个"正在运行"的程序,换言之,可以把进程看做程序的一次运行过程;
同时,在操作系统内部,进程又是操作系统进行资源分配的基本单位。
要想让进程跑起来,就得给这个进程分配一定的系统的硬件资源: CPU,内存,磁盘,网络宽带,...
管理 = 描述(PCB) + 组织
查看进程列表: 本质上就是遍历操作系统内核中的这个链表,并显示其中的属性.
创建一个进程: 本质上就是创建一个PCB对象,后加入到内核的链表中
销毁一个进程: 本质上就是删除内核链表中的这个PCB对象.
进程控制块(PCB Process Control Block) ,我们可以把进程控制块看作 一个类 或 C语言的结构体.
一个PCB对象就对应一个进程
PCB中有哪些属性?
例子:
现有一个有钱的,但是长得丑的男 A,一个没钱的,但是长得帅的男 B, 以及一个没钱的长得丑,但是会舔的男 C.
要想同时和 A B C 三个人一起交往该如何实现?
今天和A一起吃饭逛街
明天和B一起看电影
后天和C一起去上课
…
只要安排的合理 A B C 就不知道互相的存在.
从宏观上来看(以一年为单位): 同时与3个人进行交往
从微观上来看(以一天为单位): 同一时间只与一个人交往
由于CPU的运行速度非常快,虽然CPU在进行切换,但是用户却看不见这切换的过程.从宏观上来看是同时进行的,从微观上来看是交换进行的.
因为多核CPU可以同时执行多个程序,如 8核CPU 可以 同时执行8个程序.
CPU1执行了 进程1
CPU2执行了 进程2
进程1 和 进程2 不论从宏观上来看还是从微观上来看都是同时执行的
进程的优先级 就是 安排时间表的时候,优先给谁安排
例如 现有12块时间.
最喜欢 B ,就给 B 分配了 7块时间
其次最喜欢 C , 就给 C 分配了 4块时间
最不喜欢 A ,就给 A 分配了 1块时间
这样就优先给 B 其次是 C 最后是 A
进程的上下文 : 简单说来就是一个环境,进程在时间片轮转切换时,由于每个进程运行环境不同,就涉及到转换前后的上下文环境的切换,就是一个进程在执行的时候, CPU的所有寄存器中的值、进程的状态以及堆栈上的内容。切换时需要保存当前进程的所有状态,即保存当前进程的进程上下文,以便再次执行该进程时,能够恢复切换时的状态,继续执行。
记录当前这个进程在CPU上执行了多久了,用来辅助决定这个进程是继续在CPU上执行,还是说要调度出去.
一般的操作系统(如Windows、 Linux)对执行权限进行分级:用户态和内核态。
例如 : 张三去银行办理业务,首先需要去填表(个人信息),这就是用户态
填好表后,交给银行的工作人员,让工作人员帮你办理业务,这就是内核态.
为啥要搞一个"虚拟地址空间"
为啥不让进程直接访问真实的物理地址?
为了一定程度减少内存访问越界带来的后果.
例如进程1 的内存范围是 0x100~0x400 ,此时如果尝试修改0x401的地址数据,这个操作就是越界访问.
在真实的物理地址的情况下,如果修改了 0x401 ,这个地址可能是进程2的,此时进程2就可能出bug了.
在虚拟地址的情况下,如果修改了 0x401 ,此时进行 0x401 的页表查询,由于0x401是非法地址,就查找不到, 于是就让 这个进程崩溃,防止影响其他的进程.
这样就让进程和进程之间相互影响的可能性变小了,隔离性增加了,进程也更稳定了.缺点就是两个进程需要相互配合的时候,沟通起来就麻烦了.