程序员面试用户态内核态与系统调用,面试官

现在大多数的互联网公司,后台都是Linux操作系统,所以,Linux操作系统在程序员面试中,也占有一定的位置。今天我们来看看Linux操作系统关于用户态/内核态以及系统调用的一些常见面试题。

常见的面试题有:

如何理解Linux操作系统的用户态与内核态?

什么是系统调用?

一次系统调用的开销大概是多少?

在公司,每个每个人都有不同的权限,举个简单的例子,你想要操作现网Mysql的某个配置,一般是不能够直接登录到机器上进行操作,而是需要把你这个需求提给开发组长或者运维同学,由他们代替你去操作。如果每个人都能随意登录到现网机处理,那毋庸置疑,早晚出故障。

在计算机里面也是如此,如果每个程序都能够随意的读写硬盘,操作各种设备,那么很快也会乱套。而且,计算机的底层其实是硬件的交互,不同的硬件还有可能有不同的差异,如果让程序自己来处理,那程序员的脑子不知道要背诵多少接口。所以操作系统屏蔽了这些复杂的操作,让用户可以通过系统调用,操作这些底层的接口。

所以,我们把需要执行高权限的CPU指令,例如IO操作,内存操作,硬件操作等,需要交给Linux操作系统内核运行,称之为内核态。

从上图可以看出,从应用程序访问到系统内核资源,我们称之为系统调用。当一个程序从需要操作系统资源的时候,实际上是从--这样的一个过程。在这个过程中,需要一定的开销。

简单来说有下面几点:

保存用户态现场

复制用户态参数

参数校验

执行内核态代码

复制执行结果

恢复用户态现场

那么,我们如何监控一次系统调用的开销呢?我们可以使用下面这些命令。

首先是strace命令,我们可以使用strace-cp查看一个进程一段时间内的系统调用,我们可以看到每个系统调用的次数以及总时间。

或者,我们可以重复调用某一个系统调用,然后使用time命令,从systime除以对应的次数,也可大致获得该系统调用的时间。

总结

用户态/内核态实际上是程序运行的两种不同的权限模式,用户态可以通过系统调用,切换到内核态,我们可以使用strace等命令,查看相关的系统调用的开销。




转载请注明:http://www.aierlanlan.com/rzgz/4424.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了