系统调用system call以及strace/dtruss

  1. 计算机系统的各种硬件资源是有限的,在现代多任务操作系统上同时运行的多个进程都需要访问这些资源,进程是不允许直接操作这些资源的,所有对这些资源的访问都必须有操作系统控制。也就是说操作系统是使用这些资源的唯一入口,而这个入口就是操作系统提供的系统调用(System Call)。在linux中系统调用是用户空间访问内核的唯一手段。

  2. 一般情况下程序猿通过API,而不是直接通过系统调用来编程。在Unix世界,最流行的API是基于POSIX标准的。

  3. 操作系统一般是通过中断从用户态切换到内核态。中断就是一个硬件或软件请求,要求CPU暂停当前的工作,去处理更重要的事情。比如,在x86机器上可以通过int指令进行软件中断,而在磁盘完成读写操作后会向CPU发起硬件中断。

  4. linux内核中设置了一组用于实现系统功能的子程序,称为系统调用。系统调用和普通库函数调用非常相似,只是系统调用由操作系统核心提供,运行于内核态,而普通的函数调用由函数库或用户自己提供,运行于用户态

  5. 平时说的系统调用开销大,主要是相对于函数调用来说的。

内核Linux系统调用的列表分类

  1. 进程控制
  2. 文件系统控制
  3. 系统控制
  4. 内存管理
  5. 网络管理
  6. socket控制
  7. 用户管理
  8. 进程间通信

strace/dtruss根据某个进程的pid的系统调用情况

  1. linux使用strace命令
  2. mac系统使用dtruss命令

strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间

strace -cp pid

https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/strace.html

一次系统调用开销到底有多大?

系统调用

来源:
https://blog.csdn.net/gatieme/article/details/50779184
https://arthurchiao.github.io/blog/system-call-definitive-guide-zh/
http://man7.org/linux/man-pages/man2/syscalls.2.html

posted @ 2019-10-03 18:31  脚本小娃子  阅读(829)  评论(0编辑  收藏  举报