目录
操作系统的定位
介绍进程之前我们先简单介绍一下操作系统
操作系统是一个搞管理的软件,它对下管理硬件设备,对上给软件提供稳定的运行环境,操作系统是:软件 硬件 用户之间交互的媒介
我们熟悉的操作系统有:Window Linux Mac......
进程的概念
一个正在运行的程序,就是一个进程.
比如我们打开任务管理器,这些都是进程,它们对应着一些cpu,内存,磁盘,网络资源,
进程是操作系统资源分配的基本单位.
进程是一个重要的软件资源,由操作系统负责管理的
操作系统是如何管理的呢?
简单来说就是,描述和组织进程,讲清楚进程有哪些属性和特征,通过一定的数据结构把多个这样的
基本单位串联起来.
如何描述进程?
使用结构体来描述进程,
用来描述进程的结构体我们称之为PCB(进程控制块)
如何组织进程?
通过双向链表,把多个PCB串联在一起,
创建一个进程,本质上就是创建一个pcb这样的结构体对象,把它插入到双向链表当中
销毁一个进程,本质上就是把链表上的pcb节点删除掉
用任务管理器查看进程,本质上就是遍历整个pcb链表
进程的特征
我们用pcb这个结构体来描述进程,那么pcb描述了进程的哪些特征?
1.pid
进程的身份标识符,是唯一的一串数字
2.内存指针
指向了说自己要用到哪些内存
3.文件描述符
硬盘上的文件等其他资源
4.进程调度的相关属性
(1)进程的状态
就绪状态:随叫随到,随时准备到cpu上取执行
运行状态:正在cpu上执行
堵塞状态:短时间内无法在cpu上执行
(2)优先级
进程也是有优先级的.谁先排,谁后排也是有一定的算法逻辑的
(3)上下文
简单来说就是"存档"和"读档",操作系统在进行切换的时候,就需要把中间状态给记录下来,
下次这个进程再上cpu上执行时,就可以恢复上次的状态继续往下执行了.
本质上,进程的上下文,就是cpu中的各个寄存器的值.
寄存器:cpu内置的存储数据模块,保存的就是程序运行的中间结果
保存上下文:就是把这些cpu寄存器的值,记录到内存中
恢复上下文:就是把内存中这些cpu寄存的值,恢复回去
(4)记账信息
操作系统,统计在每个进程在cpu上占用的时间,和执行的指令数目,
根据这个来决定,下一阶段该如何调度.
进程是如何利用cpu资源的?
内存指针和文件描述符,其实就是描述了,进程持有了哪些硬件资源
进程的调度的相关属性,其实就描述了进程是如何利用cpu资源的.
硬件资源,内存,硬盘,网卡等比较好分,而cpu资源不好分,
一般我们的电脑进程有上百个,而cpu只有一个,尽管现在cpu是多核的,每个核心都可以看作一个独立的cpu,但是往往也就是8核,12核,16核......还是不够进程分!
狼多肉少,这些进程都希望能够同时运行,这时我们就要用到并行核并发了.
并行:微观上,同一时刻,俩个核心上的进程,就是同时执行的
并发:微观上同一时刻,一个核心上只能运行一个进程,但是能够进行快速切换
比如一个cpu核心上,先运行谷歌浏览器,再运行qq音乐,再运行微信......
只有切换速度足够快,宏观上,让人感知不到
操作系统内核处理的应用程序,我们感知不到是并行还是并发
因此,往往把并行和并发统称为并发
操作系统也有一个重要的模块调度器,负责让有限的cpu调度执行这么多的进程.
进程的虚拟地址
物理地址
内存:物理上是一条内存条,可以存很多数据,
内存可以想象成一条大走廊,有很多房间,每个房间的大小都是1Byte
每个房间都有一个编号,从0开始依次累加
这个内存编号,就是地址,
这个地址我们称之为物理地址.
内存随机访问的特性
随机访问:访问内存上任意地址的数据,速度都极快,时间上都差不多.
数组取下标时间复杂度是O(1),也是因为内存随机访问的特点.
为什么程序不直接获取内存的物理地址?
虚拟地址
使用物理地址有个明显的弊端,如果出bug了,明明是进程1的bug,可能会把其它进程给搞坏.
所以我们针对进程使用的内存空间,进行"隔离",使用虚拟地址空间,
由操作系统和专门的硬件设备(MMU),负责进行虚拟地址,到物理地址的转换
一旦访问越界了,比如进程1的指针地址成了0x3000
操作系统内核会发现这里的地址超出了进程1的访问范围了
此时就会直接反馈一个错误
因此,谁出bug,影响谁,其它进程不受影响.