解析库函数调用与系统调用的区别

基于上一篇文章,系统调用的实现原理,计算机系统的各种硬件资源是有限的,而在现代多任务操作系统上的多个进程都需要这些资源,为了更好的管理这些资源,进程是不允许直接访问的,而是在操作系统的控制下访问,因此操作系统是使用这些资源的唯一入口,而这个入口就是操作系统的系统调用,系统调用属于系统内核的一部分,因此运行在内核态的进程可以直接访问这些资源,而用户态的进程如果想要访问需要先通过中断切换为内核态才可以访问。 Linux中处理系统调用的方式与中断类似。每个系统调用都有相应的系统调用号作为唯一的标识,内核维护一张系统调用表,表中的元素是系统调用函数的起始地址,而系统调用号就是系统调用在调用表的偏移量。在进行系统调用是只要指定对应的系统调用号,就可以明确的要调用哪个系统调用,这就完成了系统调用的函数名称的转换。对于参数传递,Linux是通过寄存器完成的。系统调用很耗时,第一,系统调用通过中断实现,需要完成栈切换。第二,使用寄存器传参,这需要额外的保存和恢复的过程。

而库函数处于用户态,库函数是对于系统调用的封装。这样的话,就可以减少系统调用栈切换的时间消耗。 但是不是所有的库函数都有对应的系统调用, 当然,还有很多库函数对应于一条系统调用,比如exec()。

以存储器分配函数malloc为例。有多种方法可以进行存储器分配及与其相关的无用区收集操作(最佳适应,首次适应等),并不存在对所有程序都最佳的一种技术。Unix系统调用中处理存储器分配的是sbrk(2),它不是一个通用的存储器管理器。它增加或减少指定字节数的进程地址空间。如何管理该地址空间却取决于进程。存储器分配函数malloc(3)实现一种特定类型的分配。如果我们不喜欢其操作方式,则我们可以定义自己的malloc函数,极 其可能,它还是要调用sbrk系统调用。事实上,有很多软件包,它们实现自己的存储器分配算法,但仍使用sbrk系统调用。从中可见,两者职责不同,相互分开,要核中的系统调用分配另外一块空间给进程,而库函数malloc则管理这种空间。

系统调用是操作系统的一部分,各个操作系统的系统调用是不同的,而在所有的ANSI C编译器版本中,C库函数是相同的,系统调用是调用系统内核的服务,在内核地址空间运行,需要在用户空间和内核上下文环境切换,开销较大。而库函数调用属于过程调用,开销较小,典型的C函数库调用:system
fprintf malloc。典型的系统调用:chdir fork write brk;

时间: 2024-10-12 06:37:04

解析库函数调用与系统调用的区别的相关文章

函数库调用和系统调用的区别

函数库调用和系统调用的区别. 操作系统层面上:系统调用是调用操作系统内核的一部分.系统调用,每个操作系统会存在不同. 速度上:系统调用一次需要35微秒.函数库一次调用耗费半微秒. 系统调用大概有70个. 文件描述符和文件指针的区别 将会进行干嘛呢. 文件描述符是一个整型数字.操作系统的系统调用,都需要传递这个值进去. 作者建议,要使用标准的i/o库调用.这样会出现移植性. 文件指针则是一个内存地址,指向了一个数据结构.结构里面保持哪些内容?描述符,可以有很多种描述办法. 用途不同,文件描述符是进

Linux系统调用和库函数调用的区别

Linux下对文件操作有两种方式:系统调用(system call)和库函数调用(Library functions).系统调用实际上就是指最底层的一个调用,在linux程序设计里面就是底层调用的意思.面向的是硬件.而库函数调用则面向的是应用开发的,相当于应用程序的api,采用这样的方式有很多种原因,第一:双缓冲技术的实现.第二,可移植性.第三,底层调用本身的一些性能方面的缺陷.第四:让api也可以有了级别和专门的工作面向. 1.系统调用 系统调用提供的函数如open, close, read,

第二篇:库函数和系统调用的区别

前言 这是一对非常容易混淆的概念.对于用户( 应用程序开发者 )来说,并不一定要严格区分其意义.因为在用户看来,它们都是以C函数的形式出现的.但了解二者的区别对我们掌握整个计算机系统有很大帮助. 区别 1. 一部分库函数实现需要使用系统调用( 如 printf 库函数需要调用 write 系统调用 ) 2. 另一部分库函数实现不需要使用系统调用( 如strcpy 库函数不需要使用系统调用因为它不需要使用CPU特权指令 ) 3. 系统调用一定在内核空间执行,而库函数只有其中的系统调用部分执行时才会

使用系统调用的原因以及其与库函数(api)的区别

为什么需要系统调用?主要有以下两方面原因. (1)系统调用可以为用户空间提供访问硬件资源的统一接口,以至于应用程序不必去关注具体的硬件访问操作.比如,读写文件时,应用程序不用去管磁盘类型,甚至于不用关心是哪种文件系统. (2)系统调用可以对系统进行保护,保证系统的稳定和安全.系统调用的存在规定了用户进程进入内核的具体方式,换句话说,用户访问内核的路径是事先规定好的,只能从规定位置进入内核,而不准许肆意跳入内核.有了这样的进入内核的统一访问路径限制才能保证内核的安全. (3)系统调用具有更强的功能

C库函数和系统调用的区别

Linux下对文件操作有两种方式:系统调用(system call)和库函数调用(Library functions) fork完后: (1)有两个返回值,子进程返回0,父进程返回子进程的id (2)父子进程谁先运行不确定,由调度系统说了算,但是期望子进程先退出,并且父进程在子进程退出时读取子进程的状态 (3)代码区域: 打印与循环的关系,例如父子进程各自++,第一次打印2个,第二次由2变4,一共打印6次 Fopen(标准C库函数提供)--返回值是FILE* FILE* stdin:  输入  

微服务间的调用和应用内调用的有啥区别

摘要 目前大部分的系统架构都是微服务架构,就算没有注册中心.服务管理,也肯定是多个服务,单体服务比较少了. 大家平时需要在应用内调用rpc接口也比较多,那么有没有思考过微服务之间的调用和应用内直接调用有什么区别呢?面试时是不是经常被被问到微服务呢,本篇文章针对微服务间的方法调用和应用内方法调用的有啥区别这个很小的点,谈谈我的经验 微服务调用特点 先从单体应用说起 单体应用 单体引用通过一个服务节点直接组装好数据,返回给调用者.所有的方法调用都发生在应用内部. 微服务应用 商品详情服务需要调用商品

说说你知道的XML文件的解析方式,它们有什么区别

说说你知道的XML文件的解析方式,它们有什么区别 DOM(document object model)解析 将整个xml全部读到内存中去,形成树状结构. 优点:解析效率高,且可以对文档进行增删的操作 缺点:当xml文件很大,会导致内存溢出. SAX(Simple API for XML)解析 读取一行,解析一行,基于事件驱动 优点:不会造成内存溢出 缺点:解析效率较慢,且只能进行查阅的操作 原文地址:https://www.cnblogs.com/javaisbest/p/11588010.ht

exit库函数和_exit系统调用对标准输出的影响

#include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <stdlib.h> int globvar = 6; char buf[] = "a write to stdout\n"; int main(void) { int var; pid_t pid; var = 88; if(write(STDOUT_FILENO, buf, sizeof(buf

异步调用与多线程的区别

转载:http://kb.cnblogs.com/page/85931/ 随着拥有多个硬线程CPU(超线程.双核)的普及,多线程和异步操作等并发程序设计方法也受到了更多的关注和讨论.本文主要是想探讨一下如何使用并发来最大化程序的性能. 多线程和异步操作的异同 多线程和异步操作两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性.甚至有些时候我们就认为多线程和异步操作是等同的概念.但是,多线程和异步操作还是有一些区别的.而这些区别造成了使用多线程和异步操作的时机的区别.多线程是实现异步的一