【问题标题】:Trigger the invocations of system call in Linux, C program?在Linux,C程序中触发系统调用的调用?
【发布时间】:2016-01-21 17:08:30
【问题描述】:

下面的C程序在Linux下运行时,执行哪一行必须触发系统调用,为什么?什么是调用系统调用?

void main()
{
    double x=1;
    double y;
    double *z;

    z=(double *)malloc(sizeof(double)); // line 1
    scanf("%f", &y);                    // line 2
    *z=sqrt(y);                         // line 3
    y=y*2.0;                            // line 4
    printf("y=%f, *z=%f\n", y, *z);     // line 5
    y=y/x;                              // line 6 
    printf("y=%f",y);                   // line 7
}

【问题讨论】:

    标签: c linux operating-system


    【解决方案1】:

    malloc 的调用会调用系统调用,因为操作系统管理内存。

    调用scanfprintf 调用系统调用,因为操作系统管理i/o 操作。

    系统调用的调用是对操作系统服务的调用。

    【讨论】:

    • 在大多数情况下,malloc() 只能到达管理 C 堆空间的子分配器。 malloc() 调用可以调用系统调用来尝试扩展堆空间。
    • malloc() 不是 C 语言的一部分。它是libc 库的一部分,该库由系统调用包装器和定义组成。所以调用malloc()总是会导致系统调用
    • @user3629249 我猜你们中的一个应该提供一个链接。
    • @MartinJames 你们中的一个应该提供一个链接,我猜。
    【解决方案2】:

    上面对人们的困惑是 syscall 与 libc。并非每个 malloc 都需要系统调用 - 事实上,大多数不需要。

    堆:LibC 需要管理分配给堆的内存。这是您所有个人 malloc() 分配的来源区域。当堆耗尽时,libc 将调用内核空间的系统调用来请求更多内存/重新分配/释放页面等。

    Malloc:LibC 提供用户级代码来分配堆内的内存块。它处理分配和释放此内存的所有单独方式。如果无法在现有堆容量内完成分配,则会触发 Heap 系统调用。

    如果您查看 libc malloc 代码,您会发现它在 __libc_malloc() 和 _int_malloc() 之间是如何工作的。在 _int_malloc() 中,它将回退到 sysmalloc(),然后执行内核内存堆更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-06
      • 2013-12-18
      • 2013-04-01
      • 2016-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多