有人可能觉得这个答案比较不符合直觉或者教科书,那么在反对之前,先思考一下:
1. 如果没有驱动,硬件资源还存在吗?
2. 驱动是否是操作系统必需的一部分?
-----------------------原回答-----------------------
首先,得定义什么是资源。民用设备上的资源可能有:
1. 硬件资源:外设资源(键盘、鼠标、显卡……);总线资源(PCI/USB……);CPU资源(时钟、中断、CPU时间……)……
2. 软件资源:内存、信号量、地址空间、管道、共享内存……
对于现代民用操作系统来说,操作系统的主要意义可以总结为两句话:
1. 隔离任务(进程)间的数据,使其不能互相直接访问;
2. 授权任务(进程)间的通信,使其能够互相访问;
从这里可以看出来,操作系统的主要功能跟“资源分配”并不搭边。操作系统能直接掌控的“资源”主要都是软件资源,这些资源包括:
1、给进程分配内存资源和地址空间;
2、允许进程调度(信号量);
3、允许进程间通信。
一般来说,操作系统直接分配的资源只有这类软件资源,这些资源对于普通用户来说,其实并不是很直观的表现出来。对于普通用户可见的硬件资源,主要由驱动负责管理和分配,操作系统的主要角色是前面提到的“授权任务(进程)间的通信,使其能够互相访问”,操作系统起到的是一个中介的作用。
某个游戏希望显示一个图像,于是通过操作系统的进程间通信机制(某些API)去访问显示框架的API,最终把图像输出在屏幕上。也就是说,真正负责分配操作硬件工作的,其实是驱动,或者说,是驱动框架。操作系统只是负责传递用户任务(进程)的请求,操作系统对这些请求进行封装和隔离。
从宏观的角度上看,操作系统确实有能力决定某个进程是否有权限去访问某个硬件资源,但要说“分配”这个行为,主要还是驱动来做的,操作系统只是对驱动提供的资源接口进行封装和编号。
当然,在没有驱动的时代,用户任务确实可以直接操作硬件,比如DOS时代的一些软件(游戏),都是自带驱动的,但现代操作系统已经基本上都实现了隔离。
所以,准确的说:
1. 软件资源:主要由操作系统负责分配和控制;
2. 硬件资源:主要由对应的硬件驱动(包括驱动框架)负责分配,操作系统在其中只是作为一个中介的角色存在。