文章目录
操作系统的内容涵盖操作系统结构、中断及系统及系统调用,内存管理、进程与线程、处理机调度、同步互斥、文件系统和I/O子系统。
操作系统内核的基本功能
进程管理:进程控制进程同步、进程通信、死锁处理、处理机调度等。
内存管理:内存分配、地址映射、内存保护与共享、虚拟内存等。
文件管理:文件存储空间的管理、目录管理、文件读写管理和保护等。
设备管理:完成I/O请求、方便用户使用各种设备、并提高设备的利用率。主要包括缓冲管理、设备分配、设备处理和虚拟设备。
操作系统的内核特征
1. 并发
并发是指宏观上在一段时间内能同时运行多个程序,而并行则指同一时刻能运行多个指令。
并行需要硬件支持,如多流水线、多核处理器或者分布式计算系统。
操作系统通过引入进程和线程,使得程序能够并发运行。
2. 共享
共享是指系统中的资源可以被多个并发进程共同使用。
有两种共享方式:互斥共享和同时共享。
互斥共享的资源称为临界资源,例如打印机等,在同一时刻只允许一个进程访问,需要用同步机制来实现互斥访问。
3. 虚拟
利用多道程序设计技术,让每个用户都觉得有一个计算机专门为他服务。时分复用技术和空分复用技术。多进程在一个cpu上时间轮片运行。
虚拟内存使用了空分复用技术,它将物理内存抽象为地址空间,每个进程都有各自的地址空间。地址空间的页被映射到物理内存,地址空间的页并不需要全部在物理内存中,当使用到一个没有在物理内存的页时,执行页面置换算法,将该页置换到内存中。
4. 异步
异步指进程不是一次性执行完毕,而是走走停停,以不可知的速度向前推进。
计算机体系结构
1、 操作系统启动流程
1.BIOS部分
电脑接通电源——>CPU通电,对寄存器做初始化——>CPU去内存中ROM部分(有RAM and ROM)里找指令——>ROM有个0-1MB的20位地址空间,BIOS就放在这里面,CPU此时会使用CS和IP(CS:IP,CS左移4位加IP)找到并访问地址为=FFFFFFF0的指令,该指令又会跳到BIOS的初始代码处——>此时BIOS相当于就启动起来了,此时会提供以下功能(基本输入输出,系统设置,系统启动程序)——>BIOS系统自检——>此时如果我们不进入BIOS使用它的功能,BIOS会执行默认设置的系统启动程序
2.加载操作系统部分
将主引导记录(BIOS-MBR,再后来是BIOS-GPT,现在基本98%都是UEFI标准)从磁盘的引导扇区(512B)加载进BIOS的0X:7C00位置——>跳转到0000:7C00——>控制权交给主引导记录Bootloader——>检查分区表是否正确——>加载分区引导记录——>控制权交给分区引导记录——>跳入加载程序——>加载程序从启动配置中读取启动配置信息——>依据启动配置信息,加载程序从磁盘中读取操作系统代码和数据(内核镜像)——>跳到操作系统代码的起始位置——>控制权交给操作系统内核代码
2. 中断、异常和系统调用
1.为什么需要中断、异常和系统调用
- 在计算机运行中,内核是被信任的第三方
- 只有内核可以执行特权指令
- 方便应用程序
2. 中断,异常,系统调用希望解决的问题
中断:有外设来发送请求了,来自不同的硬件设备的计时器和网络的中断
异常:为了应对应用程序处理意想不到的行为,非法指令或者坏的处理状态
系统调用:应用程序主动向OS发出服务请求system call,一种特殊指令,希望得到系统服务。
3. 三者的区别
1. 源头不一样。
网卡声卡显卡等等产生事件—中断;
应用软件意想不到的行为—异常;
应用程序主动请求OS提供服务—系统调用。
2. 处理时间不一样。
中断:异步;
异常:同步;
系统调用:同步或异步。
异步的含义:当一个事件发生时,应用软件并不知道它什么时候会发生。
异常和系统调用都是一个特定指令触发了事件,同步时间点。
系统调用也有可能异步,当发出请求后返回的时间是异步的。如果APP在发出请求后没有等待,而是干别的去了,返回点是异步的。而请求的点是同步的。
3.响应状态
中断:持续,对用户应用程序是透明的,感觉不到
异常:杀死或重新执行应用程序的异常指令
系统调用:等待和持续,不会重复执行
4.系统调用
系统调用的实现
①每个系统调用对应一个系统调用号,系统调用接口根据系统调用号来维护表的索引
②系统调用接口调用内核态中的系统调用功能实现,并返回系统调用的状态和结果
③用户不需要知道系统调用的实现,只需要设置调用参数和获取返回结果
④操作系统接口的细节大部分都隐藏在应用编程接口后,通过应用程序支持的库进行管理。
操作系统给定了两种处理器状态:
①用户态(目态)
低权限状态,此时CPU只能执行非特权指令
②内核态(管态)
高权限状态,此时CPU无论是特权指令还是非特权指令都可以执行
系统调用与传统的函数调用区别:
应用程序发出函数调用时,在一个栈空间完成了函数的传参和返回,不会进入内核态。
系统调用时,切换至内核态,应用程序和OS内核各自拥有堆栈,有栈的堆栈和特权级的转换,需要开销大于函数调用,但相对更安全可靠。
Linux 的系统调用主要有以下这些:
Task | Commands |
---|---|
进程控制 | fork(); exit(); wait(); |
进程通信 | pipe(); shmget(); mmap(); |
文件操作 | open(); read(); write(); |
设备操作 | ioctl(); read(); write(); |
信息维护 | getpid(); alarm(); sleep(); |
安全 | chmod(); umask(); chown(); |