在linux文件夹中找不到pthread.c



我已经下载了内核,内核位于名为Linux-2.6.32.28的文件夹中,我可以在其中找到/kernel/Kthread.c我找到了Kthread.c,但在Linux-2.6.32.28中找不到pthread.c我在Linux-3.13/Kernel和Linux-4.7.2/Kernel 中找到了Kthread.c

定位pthread.c可以在安装Ubuntu时附带的Computer/usr文件夹中找到文件pthread-c,但在下载的文件夹Linux-2.6.32.28、Linux-3.13、Linux-4.7.2 中找不到pthread.c

更多:有两组函数调用。1.系统调用2。图书馆电话。

计算机要完成任何任务都必须使用硬件资源。那么,库调用和系统调用有何不同?

系统调用总是使用内核,这意味着硬件。库调用意味着不使用内核或硬件?

我知道库调用有时可能会解析为系统调用。

我想知道的是,如果每组函数调用都使用硬件,那么与库调用相比,系统调用将在多大程度上使用硬件资源,反之亦然。

无论函数调用是System还是Library,至少都必须使用RAM等硬件资源。正确的

先读取pthreads(7)。它向您解释了pthreads是在C标准库中作为nptl(7)实现的。

C标准库是Linux系统的基石,您可能有它的几个变体;然而,大多数Linux发行版只有一个libc,通常是GNUglibc,它包含NPTL。您可以使用另一个C标准库(如musl-libc或dietlibc)。只要小心,您就可以在系统中共存多个C标准库。

C标准库(以及每个用户空间程序)正在使用系统调用与内核交互。它们列在系统调用(2)中。顺便说一句,Linux上的大多数C标准库实现都是免费软件,所以如果你想的话,你可以研究(甚至改进)它们的源代码。你经常通过C标准库中的小包装器C函数(例如write(2))来使用系统调用,甚至更常见的是通过你的C标准库提供的一些更高级的函数(例如fprintf(3))。

Pthread(在glibc的NPTL层中)是使用诸如clone(2)和futex(7)之类的低级内容以及一些汇编代码来实现的。但是,除非您正在实现线程库(如NPTL),否则通常不会直接使用这些。

大多数程序都使用libc并与它链接(也与crt0链接)作为共享库,这就是我的Debian/Sid/x86-64上的/lib/x86_64-linux-gnu/libc.so.6。然而,您可以(但通常不会)通过一些汇编代码直接调用系统调用(例如,使用SYSCALLSYSENTER机器指令)。另请参见此。


该问题已编辑为也询问

我想知道的是,如果每组函数调用都使用硬件,那么系统调用将在多大程度上使用硬件资源

请阅读更多关于操作系统的信息。因此,请仔细阅读操作系统:三个简单的部分(一本免费下载的教科书),并阅读有关指令集体系结构和计算机体系结构的内容。研究其中的几个,例如x86-64和RISC-V(或ARM、PowerPC等)。了解CPU模式和虚拟内存。

您会发现操作系统管理物理资源(包括RAM和处理器内核)。每个进程都有自己的虚拟地址空间。因此,从用户空间的角度来看,进程不直接使用硬件(例如,它在虚拟地址空间中运行,而不是在RAM中),它在系统调用和ISA(无特权机器指令)定义的一些虚拟机(由操作系统内核提供)中运行。

无论函数调用是System还是Library,都必须至少使用RAM等硬件资源。正确的

从用户空间的角度来看,这是错误的。所有硬件资源(根据定义)都由操作系统管理(通过系统调用提供抽象)。一个普通的应用程序可执行程序使用OS提供的抽象和软件资源(文件、进程、文件描述符、套接字、内存映射、虚拟地址空间等)。

(因此需要几本书才能真正回答您的问题;我提供了一些参考资料,请按照它们阅读更多;我们无法在这里解释所有内容)

关于第二组问题:计算机所做的一切最终都是由硬件完成的。但是,我们可以在计算机中不同类型的硬件和不同类型的程序以不同的方式与它们交互之间进行一些区分。

现代计算机可以分为三个主要组件:中央处理器(CPU)、主存储器(随机存取存储器,RAM)和"外围设备",如磁盘、网络收发器、显示器、图形卡、键盘、鼠标等。CPU和RAM可以在不涉及外围设备的情况下自行完成的事情被称为计算。任何涉及至少一个外围设备的操作都被称为输入/输出(I/O)。所有程序都同时执行这两种操作,但有些程序主要执行计算,而其他程序主要执行I/O。

现代操作系统还分为两个主要组件:内核,这是一个独立的程序,被赋予了其他程序所没有的特殊能力(例如与外围设备通信的能力和控制RAM分配的能力),并负责监督所有其他程序的执行;以及用户空间,这是一组没有这种特殊能力的无限程序。

用户空间程序可以自己进行计算,但要进行I/O,它们必须要求内核为它们进行计算。系统调用是用户空间程序向内核发出的请求。许多系统调用都是执行I/O的请求,但内核也可以被请求做其他事情,例如提供一般信息、在程序之间设置通信通道、分配RAM等。是用户空间程序的一个组件。本质上,它是别人为你编写的一组"函数",你可以像自己编写一样使用它们。有很多图书馆,它们中的大多数都不做任何不同寻常的事情。例如,zlib是一个用于压缩和解压缩数据的库。

然而,"C库"是特殊的,因为(在所有现代操作系统上,除了Windows)它负责直接与内核交互。几乎所有程序和几乎所有库本身都不会进行系统调用;他们会要求C库为他们做这件事。正因为如此,试图判断一个特定的C库函数是否自己完成了它的所有工作,或者它是否"包装"了一个或多个系统调用,往往会让人感到困惑。pthreads函数尤其倾向于两者的复杂纠缠。如果你想了解操作系统是如何在较低级别组合在一起的,我建议你从更简单的开始,例如stdio.h的"缓冲I/O"例程(fopenfclosefreadfwriteputs等)如何最终调用unistd.h/fcntl.h的"原始I/O"例行程序(openclosereadwrite等),以及后一组函数如何包装系统调用。

(将包装系统调用的任务分配给C编程语言的运行库是一个历史事故,如果我们要从头开始,我们可能不会再这样做了。)

pthread是POSIX线程。它是一个帮助应用程序在操作系统中创建线程的库。内核源代码中的Kthread用于linux中的内核线程。

POSIX是IEEE定义的一个标准,用于维护不同操作系统之间的兼容性。

因此pthread源代码在linux内核源代码中看不到。

您可以参考这个链接来获取pthread源代码http://www.gnu.org/software/hurd/libpthread.html

最新更新