现在大多数的互联网公司,后台都是Linux操作系统,所以,Linux操作系统在程序员面试中,也占有一定的位置。今天我们来看看Linux操作系统关于用户态/内核态以及系统调用的一些常见面试题。
常见的面试题有:
如何理解Linux操作系统的用户态与内核态?
什么是系统调用?
一次系统调用的开销大概是多少?
在公司,每个每个人都有不同的权限,举个简单的例子,你想要操作现网Mysql的某个配置,一般是不能够直接登录到机器上进行操作,而是需要把你这个需求提给开发组长或者运维同学,由他们代替你去操作。如果每个人都能随意登录到现网机处理,那毋庸置疑,早晚出故障。
在计算机里面也是如此,如果每个程序都能够随意的读写硬盘,操作各种设备,那么很快也会乱套。而且,计算机的底层其实是硬件的交互,不同的硬件还有可能有不同的差异,如果让程序自己来处理,那程序员的脑子不知道要背诵多少接口。所以操作系统屏蔽了这些复杂的操作,让用户可以通过系统调用,操作这些底层的接口。
所以,我们把需要执行高权限的CPU指令,例如IO操作,内存操作,硬件操作等,需要交给Linux操作系统内核运行,称之为内核态。
从上图可以看出,从应用程序访问到系统内核资源,我们称之为系统调用。当一个程序从需要操作系统资源的时候,实际上是从--这样的一个过程。在这个过程中,需要一定的开销。
简单来说有下面几点:
保存用户态现场
复制用户态参数
参数校验
执行内核态代码
复制执行结果
恢复用户态现场
那么,我们如何监控一次系统调用的开销呢?我们可以使用下面这些命令。
首先是strace命令,我们可以使用strace-cp查看一个进程一段时间内的系统调用,我们可以看到每个系统调用的次数以及总时间。
或者,我们可以重复调用某一个系统调用,然后使用time命令,从systime除以对应的次数,也可大致获得该系统调用的时间。
总结用户态/内核态实际上是程序运行的两种不同的权限模式,用户态可以通过系统调用,切换到内核态,我们可以使用strace等命令,查看相关的系统调用的开销。