一、硬件支持系统 ,系统管理硬件
- 操作系统核心功能可以分为:
- 守护者:对硬件和软件资源的管理
- 协调者:通过机制,将各种各样的硬件资源适配给软件使用。
- 所以为了更好的管理硬件,操作系统引进了软件。其中3大核心部分是:
- 文件【我们需要知道怎么用文件来访问磁盘和I/O设备】
- 虚拟内存【虚拟内存是虚拟的,为应用程序提供远大于物理内存限制的虚拟地址空间。】
- 进程【真正用来访问资源的部分】
二、进程(process)
1、理解
进程就是一个正在执行的程序实例。
进程的结构
- 每个进程里都有一个
独立的地址空间
。
- 这个空间一开始是0 ,不断的运行,就成了连续的存储空间。在这个空间,不仅程序能运行起来,还能调用各种数据,等等。
- 每个进程都有相关的
资源
- 这些资源有PS , PC寄存器等等。
简而言之:进程就是一个被封装的容器,它有运行资源的一切信息。
如果 我开了QQ,又开了微信。那我的进程就有2个,它要如何合理地获得CPU资源?
- 操作系统通过时间片轮转等调度策略,周期性地挂起一个进程并启动另一个,确保所有进程都能公平地获得CPU资源。
- 当进程被暂时挂起,就必须保存状态了。以便未来某个时候可以继续使用。状态下的信息【比如寄存器,地址空间,上下文等等】都会被存储在
进程表
中。进程表
用于跟踪系统中所有进程的状态信息。
shell和进程
- 用户可以使用shell来控制进程。让一个进程产生更多进程(这些由进程产生的进程就是
子进程
)【可能有些抽象,可以这样理解,如下:】。- 我在shell使用
ls
命令,这个命令展现了当前路径有的文件件。我本来是在运行shell的linux环境虚拟机【当前一个主进程】,我想看文件夹,我为了看文件夹,使用了ls命令,在执行这个ls命令的过程就是子进程
。
- 所以进程就有树的样子了-----
进程树
。
- 用户可以使用shell来控制进程。让一个进程产生更多进程(这些由进程产生的进程就是
进程该如何通信?
- 当进程间协同工作完后,使用机制来交换信息,也就是
进程间通信(IPC)
机制。 - 除了
进程间通信(IPC)
外,操作系统还使用一系列的系统调用
来管理进程资源。
- 当进程间协同工作完后,使用机制来交换信息,也就是
进程接收信息,如果信息经常不能准时到达?
- 为了确保可靠传输,进程会采用
定时器
。【这种行为也就是异步】- 比如:进程在外部信息发送出去的第4秒还没有接收到。就发一个通知提醒,就可能重新发送了。
- 为了确保可靠传输,进程会采用
异步行为【分为软件异步、硬件异步】:
异步行为是指任务可以并发执行,不需要等待前一个任务完成。异步操作不会阻塞当前线程,任务完成后通过回调、Promise 或事件通知。
- 那么事件1发生什么事情?
- 事件1作用:保护现场。
- 保护的内容有
- PC值----由CPU保护
- PSW寄存器—操作系统软件保护
- 基础寄存器—操作系统软件保护
- 不过在现代有可以都用CPU保护的了。CortexM芯片等等。
- 事件2发生什么事情?
- 事件2作用:确定中断入口在哪里
- 硬件CPU来准备—操作系统OS和CPU都能来提供
中断向量表【中断处理函数的数组空间】
。
- 事件3发生什么事情?
- 事件3作用:中断处理函数
- 操作系统来准备。
- 事件4发生什么事情?
- 事件4作用:中断返回【普通函数返回】
- 软件实现,编译器来实现。
- 特定的汇编写,不能c语言。
- 普通函数
- PC值—>硬件保护
- PSW寄存器—>不需要保护。
- 基础寄存器—>编译器保护
- 普通函数
同步行为
同步行为是指任务按顺序执行,前一个任务完成后,才能开始下一个任务。同步操作会阻塞当前线程,直到任务完成。
三、虚拟内存
从下往上看,分为进程代码和数据区、堆数据区、共享库区、堆栈区、内核内存区。
这部分的基础先了解这个图片就行了。
常驻内存是指一直都在,不能删掉。
四、并发和并行
- 并发是指多个任务在同一时间段内交替执行,但在任意时刻可能只有一个任务在运行。并发通过任务切换(上下文切换)实现,给人一种多个任务同时运行的错觉。
- 如图:同一时间段内
时间轴: |----任务A----|----任务B----|----任务A----|----任务B----|
- 并行是指多个任务在同一时刻同时执行。并行需要多核 CPU 或多个处理器,每个任务运行在不同的核心上。
- 如图:同一时刻内
时间轴: |----任务A----|
|----任务B----|
|----任务C----|
五、系统调用【超重点】
通过上图能明白,硬件不能直接让用户使用它。
所以提出了系统调用
。
系统调用
- 定义:系统调用是操作系统内核(Kernel)为应用程序提供的一组接口,允许用户程序(运行在用户态)请求内核(运行在内核态)代为执行特权操作(如文件读写、进程创建等)。
- 系统调用依赖硬件和OS(操作系统)。
系统调用的工作原理
(1) 调用流程
- 用户程序触发调用
- 通过特定函数(如C标准库中的 printf() → 底层调用 write())或直接代码触发。
- 用户态 → 内核态切换
- 通过软中断(如 int 0x80)或专用指令(如 syscall)进入内核态。
- 执行内核服务
- 内核根据系统调用号(如 Linux 的 read 对应 0 号)调用对应的内核函数。
- 返回结果
- 内核将结果传递给用户程序,回到用户态继续执行。
- 用户程序触发调用
(2) 系统调用号(syscall number)
- 每个系统调用对应唯一编号,通过寄存器传递(如 x86-64 Linux 中,rax 存放系统调用号)。
- 示例:Linux 的 sys_write 在 x86-64 中的调用号是 1,可通过命令 grep __NR_write /usr/include/asm/unistd_64.h 查看。
(3) 参数传递
- 寄存器传递参数:参数按顺序放入 rdi, rsi, rdx, r10, r8, r9(x86-64 架构)。
- 寄存器传递参数:参数按顺序放入 rdi, rsi, rdx, r10, r8, r9(x86-64 架构)。