内容纲要
概念
- 进程地址空间(进程虚拟地址)
- 用户空间与内核空间(Linux)
- 内核可以访问受保护内存空间,也有访问底层所有设备的权限
- 为了保证内核安全(保证用户进程不能直接操作内核),将虚拟空间划分为用户空间和内核空间
- 32位操作系统:2^32 = 4GB;内核空间 1GB(从虚拟地址0xC0000000到0xFFFFFFFF),用户空间 3GB(从虚拟地址0x00000000到0xBFFFFFFF)
- 64位操作系统:2^48(不需要64那么大、过大会导致资源浪费) = 256T;内核、用户空间分别占128T
- 进程切换(任何进程都在操作系统的内核支持下运行)
- 可以挂起在 CPU 上运行的进程
- 保存上下文(计数器、寄存器等)
- 更新 PCB(进程控制块)信息
- 把进程 PCB 移入相应的队列(就绪、在某事件阻塞等队列)
- 可以恢复以前挂起的进程
- 选择一个进程执行,更新其 PCB
- 更新内存管理的数据结构
- 恢复上下文
- 进程阻塞、唤醒
- 进程状态
- 运行态:进程获得 CPU 并运行
- 就绪态:进程具备运行条件,但尚未获得 CPU
- 阻塞态:进程因等待某事件发生而暂时不能运行
- 正在运行的进程,由于提出系统服务请求(如 I/O 操作)未得到系统的立即响应,该进程会调用阻塞原语把自己阻塞,等待相应事件出现后被唤醒
- 只有处于获得 CPU 的进程才能将其转换为阻塞状态
- 阻塞
- 请求系统服务、I/O 操作等未得到即时响应
- 找到要被阻塞进程的标识号对应的 PCB
- 停止执行
- 若该进程为运行状态(获得 CPU),则保护现场,改变状态为阻塞状态
- 把 PCB 插入相应阻塞队列
- 唤醒
- 阻塞原因期待的事件出现
- 把被阻塞的进程移出阻塞队列
- 将 PCB 状态改为就绪状态
- 将 PCB 插入到就绪队列中
- 文件描述符(FD)(适用于 Unix、Linux;Windows 中通常叫 Handle)
- 在 Linux 中,一切皆文件
- 对所有文件(目录、字符设备、块设备、套接字、打印机、进程、线程、管道等)操作,读写都可用fopen()/fclose()/fwrite()/fread()等函数进行处理
- 用于表述指向文件的引用的抽象化概念
- 标准文件描述符
- 0:标准输入;1:标准输出;2:标准错误
- 缓存 I/O(标准I/O)
- 工作过程
- Linux 中,操作系统会将 I/O 的数据缓存在文件系统的页缓存中
- 数据先被拷贝到操作系统内核缓冲区中
- 再从内核缓冲区拷贝到应用程序地址空间
- 缺点:开销大
- 基于缓存 I/O 出现的模型
- 阻塞 I/O
- 非阻塞 I/O
- I/O 多路复用
- 信号驱动 I/O(不常用)
- 异步 I/O