一.操作系统
操作系统(计算机管理控制程序):是管理计算机硬件与软件资源的极端及程序.
功能:
- 进程管理: 主要是进程调度
- 存储管理: 存储分配,存储共享,存储保护,存储扩张
- 设备管理: 设备分配,设备传输控制,设备独立性
- 文件管理: 文件存储空间的管理,目录管理,文件操作管理,文件保护
- 作业管理: 负责处理用户提交的任何要求
二.用户态与内核态
在学习使用Linux的过程中,经常会说到用户态与内核态,但是用户态与内核态究竟代表着什么呢?
那么接下来就让我们一起探讨总结一下:
由上图可以看出通过系统调用将Linux整个体系分为用户态和内核态(或者说是用户空间和内核空间).
内核态: 本质上来说是我们所说的内核,是一种特殊的软件程序. 控制计算机的硬件资源,例如:协调CPU资源,分配内存资源,并且提供稳定的环境供应用程序运行.
用户态: 就是提供应用程序运行的空间,为了使应用程序访问到内核管理的资源如:CPU,内存,I/O等.内核必须提供一组通用的访问接口,这些接口就叫做系统调用.
系统调用
系统调用是操作系统的最小功能单位,这些系统调用组成了用户态和内核态交互的基本接口.
库函数
库函数实际上是对系统调用进行封装,提供简单的基本接口给用户,屏蔽了复杂的底层实现细节,增强了程序的灵活性. 对于简单的接口,也可以直接使用系统调用访问资源.例如:open(),write(),read()等
库函数根据不同的标准有不同的版本:glibc库,POSIX库等
shell
shell是一种特殊的应用程序,俗称命令行.为了方便用户和系统交互,一般一个shell对应一个终端,呈现给用户交互窗口.
内核控制并且管理硬件资源,包括进程的调度和管理、内存管理、文件系统管理、设备驱动管理、网络管理等等。并且提供应用程序统一的系统调用接口。这种分层的架构,极大的提升了系统的稳定性和扩展性,兼容性。
二.用户态是如何切换到内核态的
系统的资源通常是固定的,比如内存(8G),CPU固定,磁盘2TB,网络接口固定.所以就需要操作系统对资源进行有效的利用.假设某个应用程序过分的访问这些资源,就会导致整个系统的资源被占用,如果不对这种行为进行限制和区分,就会导致资源访问的冲突。所以,Linux的设计的初衷:给不同的操作给与不同的权限。
Linux操作系统就将权限等级分为了2个等级,分别就是内核态和用户态。
用户态与内核态区别的本质: 权限不同.用户态的进程能够访问的资源受到了极大的控制,而运行在内核态的进程却不受控制。一个进程可以运行在用户态也可以运行在内核态,那它们之间肯定存在用户态和内核态切换的过程。打一个比方:C库接口malloc申请动态内存,malloc的实现内部最终还是会调用brk()或者mmap()系统调用来分配内存。
从用户态到内核态切换可以通过三种方式:
- 系统调用:系统调用本身就是中断,但是软件中断,跟硬中断不同。
- 异常:如果当前进程运行在用户态,如果这个时候发生了异常事件,就会触发切换。例如:缺页异常。
- 外设中断:当外设完成用户的请求时,会向CPU发送中断信号。