• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
qianye0905
博客园    首页    新随笔    联系   管理    订阅  订阅
函数库调用和系统调用的区别
函数库调用是语言或应用程序的一部分,而系统调用是操作系统的一部分,不管是java还是python的I/O最后都是通过read和write这样的系统调用来完成的
 
系统调用是用户程序和内核交互的接口
| 函数库调用                                  | 系统调用                                     |
|---------------------------------------------+----------------------------------------------|
| 在所有的ansi c编译器版本中,c库函数是相同的 | 各个操作系统的系统调用时不同的               |
| 它调用函数库中的一个程序                    | 它调用系统内核的服务                         |
| 与用户程序相联系           important        | 是操作系统的一个入口点                       |
| 在用户地址空间执行         important        | 在内核地址空间执行                           |
| 它的运行时间属于用户时间    important       | 它的运行时间属于系统时间                     |
| 属于过程调用,开销较小      important       | 需要切换到内核上下文环境然后再切换回来开销大 |
| 在C函数库libc中有大约300个程序              | 在unix中有大约90个系统调用(MS-DOS)中少一些   |
 
自己总结
| 函数库调用             | 系统调用             |
|------------------------+----------------------|
| 通常提供比较复杂的功能 | 通常提供一种最小界面 |
 
system是一个库函数 strlen并不调用任何系统调用
 
int main()
{
    int fd = create("filename",0666);
    exit(0);
}
 
在执行main函数时,是在user mode下执行,当遇到create函数时,继续在user mode下执行,然后将filename和0666两个参数压入栈中寄存器,接着调用库函数create,系统仍然处于user mode。这里的库函数create实际上调用了内核的系统调用create,执行到这里后,系统将create系统调用的unique number压入寄存器,然后执行指令trap使系统进入kernel mode(执行int $0x80产生中断)。这时系统意识到要进行系统调用的invoke,于是从刚才的寄存器中取出create系统调用的unique number,从系统调用表中得知要invoke的系统调用是create,然后执行。执行完毕返回库函数create的调用,库函数负责检查系统调用的执行情况(检查某些寄存器的值),然后库函数create根据检查的结果返回响应的值。
 
这里trap指令类似于一个系统中断并且是软中断,而系统调用create类似于一个中断处理函数所有的系统调用都与上边的情况类似,靠中断机制切换到内核模式实现。
 
系统调用通常比库函数要慢,因为要把上下文环境切换到内核模式。
posted on 2012-11-24 21:05  qianye0905  阅读(938)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3