操作系统的启动
(1)操作系统一开始并不是放在内存中直接让cpu去执行的,而是放在硬盘中的。
(2)bios(基本I/O处理系统):当我们按下电源开机后,让计算机系统开始检测各种各样的外设。将bootloader从硬盘移到内存中去,开始运行boot loader。
(3)bootloader:将os从硬盘移到内存中去,实现os的启动。
操作系统与设备和程序交互
为什么应用程序不能直接去访问我们的外设,为什么要通过操作系统?
(1)安全方面:有些恶意程序会对我们整个系统造成破坏。而我们信任操作系统,信任操作系统能给我们一个安全的服务。
(2)便捷方面:操作系统为上层软件提供更为简洁、统一的接口。使软件不需要在意device的差异和细节,使其更加通用。
我们需要明白以下定义:
- 系统调用(来源于应用程序):应用程序主动向操作系统发出服务请求。
- 异常(来源于不良的应用程序):非法指令或者其他原因导致当前指令执行失败(如:内存出错)
- 中断(来源于外设):来自硬件设备的处理请求
处理时间:
- 系统调用:异步或同步
- 异常:同步
- 中断:异步
响应:
- 系统调用:等待和持续
- 异常:杀死或重新执行异常的指令
- 中断:持续、对用户应用程序是透明的
我们实现的功能可以通过函数调用,也可以通过系统调用:
函数调用:可以理解为调用我们的库函数,但该函数中可能封装了一个或多个系统调用,也可能没有封装系统调用进行服务。
系统调用:向操作系统内核请求需要更高权限运行的服务。
函数调用与系统调用的区别?
系统调用更安全,但开销更大(因为需要进行用户态向内核态的转变(这种转变是为了安全考虑,二者的堆栈并不相同))。
很多库函数本身都调用了系统调用,那为什么直接调用系统调用的开销较大呢?转载自该文
这得益于双缓冲的实现,在用户态和内核态,都应用了缓冲技术,对于文件读写来说,调用库函数,可以大大减少调用系统调用的次数。而用户进程调用系统调用需要在用户空间和内核空间进行上下文切换,开销较大。如此以来,库函数的开销也就会比直接调用系统调用小了。另外一方面,库函数同样会对系统调用的性能进行优化。