目录
-
冯诺依曼体系
- 五大硬件单元
- 运算器
- 控制器
- 存储器
- 输入设备
- 输出设备
- 所有硬件都是围绕内存工作的
- 五大硬件单元
-
操作系统
- 核心目的:高效管理与便捷交互
- 资源管理:优化硬件与软件的资源分配
- 提供抽象接口:屏蔽硬件复杂性
- 保障系统安全与稳定性
- 提供用户交互界面
- 定位:计算机系统的管理者与桥梁
- 如何管理:先描述再组织
- 库函数与系统调用的关系
- 系统调用:操作系统提供给用户程序访问内核服务的接口,是用户态程序进入内核态的唯一途径
- 库函数:封装在标准库或第三方库的函数,用于提供通用功能,可直接被应用程序调用
- 库函数可能封装系统调用,系统调用通过库函数暴露接口
- 核心目的:高效管理与便捷交互
-
进程概念
- 正在执行的程序
- 描述信息
- 一个程序运行时,从硬盘被加载到内存,操作系统为了能够管理好多个程序运行,因此每个程序的运行信息,通过这个描述信息来管理/控制程序运行,因此对于操作系统来说,进程就是pcb,Linux中pcb是task_sturt结构体
- task_struct内容
- 标识符
- 状态
- 优先级
- 程序计数器:即将被执行的下一条指令的地址
- 内存指针
- 上下文数据
- I/O状态信息
-
进程控制
- 进程创建
- fork
- 复制
- 返回值
- vfork:创建的子进程直接共享父进程的内存空间,而不是复制
- 创建一个进程的流程
- 系统调用入口(fork(),vfork()等)
- 分配进程控制块(PCB)
- 资源复制与共享
- 设置进程状态与调度
- 返回用户空间
- 写时拷贝技术:通常情况下,父子代码共享,父子在不写入时,数据也是共享的,当任意一方试图写入时,便以写实拷贝的方式各自一份副本
- fork
- 进程终止:指操作系统结束程序执行并释放资源的过程,是进程什生命的最后阶段
- 进程终止流程
- 资源释放阶段
- 向父进程返回状态
- init进程接管:若父进程在子进程前终止,子进程会被init进程(pid=1)收养
- 进程终止流程
- 进程等待:用于协调父子进程的执行顺序和资源回收
- 为什么需要进程等待
- 如果父进程不等待子进程,子进程会变成僵尸进程,僵尸进程会引起内存泄漏
- 如何等待
- 基本接口
- wait()
-
#include <sys/wait.h> pid_t wait(int *status);
-
- waitpid()
-
pid_t waitpid(pid_t pid, int *status, int options);
-
- wait()
- 基本接口
- 为什么需要进程等待
- 进程创建
-
进程状态
- 状态
- 运行状态(R)
- 睡眠状态(S/D)
- 可中断睡眠(S)
- 不可中断睡眠(D)
- 终止状态(Z/X)
- 僵尸进程(Z)
- 退出状态(X)
- 暂停状态(T)
- 关键转换场景
- 运行 -> 睡眠:进程发起I/O请求(如read()),进入S直到数据就绪
- 睡眠 -> 运行:I/O数据准备完成,内核唤醒进程,放入就绪队列等待调度
- 运行 -> 暂停:调试器通过ptrace系统调用暂停进程,或用户按Ctrl+Z发送SIGTSTP
- 运行 -> 僵尸:进程执行exit()或受到无法处理的信号(如SIGKILL),进入Z状态等待父进程回收
- 僵尸状态
- 危害:占用PID资源,父进程不回收,会一直存在,导致系统资源浪费
- 处理方案
- 父进程调用wait()/waitpid()回收子进程
- 注册SIGCHLD处理函数,在回调函数中循环调用非阻塞等待
- 若父进程已终止,子进程被init(PID=1)收养,init会自动回收
- 孤儿进程
- 父进程还没wait子进程就释放了,子进程变为孤儿进程
- 守护进程:长期运行于后台、独立终端控制的系统进程,常用于持续性服务(如Web服务器,数据库服务)
- 状态
-
环境变量
- 概念:是操作系统中存储的一系列键值对,用于向进程传递配置信息
- 常见环境变量
- PATH:系统查找可执行文件的路径列表
- HOME:用户主目录路径
- LANG:系统语言和字符集设置
- PWD:当前工作目录
- SHELL:默认shell程序路径
- USER:当前用户名
- 环境变量的分类于存储位置
- 系统级环境变量
- 作用范围:所有用户和进程
- 存储位置
- /etc/environment(全局配置)
- ~/.bash_profile、~/.bashrc(用户自定义配置)
- 进程级环境变量
- 作用范围:仅当前进程及其子进程
- 查看方式:env或printenv命令
- 系统级环境变量
- 环境变量的操作
- 查看环境变量
# 查看所有环境变量 env # 查看特定变量(如PATH) echo $PATH
- 临时设置环境变量(仅当前会话有效)
# 格式:export 变量名=值 export MY_VAR="hello world" # 定义新变量 export PATH=$PATH:/new/path # 追加路径到PATH
- 永久设置环境变量(修改配置文件)
echo 'export MY_VAR="permanent value"' >> ~/.bashrc source ~/.bashrc # 立即生效
- 删除环境变量
unset MY_VAR # 删除自定义变量
- 查看环境变量
- 代码中设置/获取环境变量
- getenv
- putenv
- setenv
-
虚拟地址空间(进程隔离与内存管理的基石)
- 本质:虚拟地址空间是操作系统为每个进程提供独立、连续地址视图,它将进程使用的地址(虚拟地址)与物理内存(物理地址)分离
- 核心作用
- 提高内存利用率
- 增加内存访问控制
- 保持进程独立性
- 虚拟地址空间的布局
- 用户空间(3GB):进程可直接访问的地址空间
- 内核空间(1GB):存储内核代码,数据结构和内核栈
- 如何通过虚拟地址找到物理地址
-
程序替换
- 功能:替换一个进程正在运行的程序
- 如何替换:详情点击查看程序替换函数