所有,
下面的代码来自“ Unix环境中的高级编程”,它创建一个新线程,并打印主线程和新线程的进程ID和线程ID。
在书中,它表示在linux中,此代码的输出将显示两个线程具有不同的进程ID,因为pthread使用轻量级进程来模拟线程。但是,当我在Ubuntu
12.04中运行此代码时,它具有内核3.2,并打印了相同的pid。
那么,新的Linux内核是否会更改pthread的内部实现?
#include "apue.h"
#include <pthread.h>
pthread_t ntid;
void printids(const char *s) {
pid_t pid;
pthread_t tid;
pid = getpid();
tid = pthread_self();
printf("%s pid %u tid %u (0x%x)\n",
s, (unsigned int)pid, (unsigned int)tid, (unsigned int)tid);
}
void *thread_fn(void* arg) {
printids("new thread: ");
return (void *)0;
}
int main(void) {
int err;
err = pthread_create(&ntid, NULL, thread_fn, NULL);
if (err != 0)
err_quit("can't create thread: %s\n", strerror(err));
printids("main thread: ");
sleep(1);
return 0;
}
在Linux上,请pthread
使用clone
带有特殊标志的syscall CLONE_THREAD
。
查看文档的clone
系统调用。
CLONE_THREAD(从Linux 2.4.0-test8开始)
如果设置了CLONE_THREAD,则将子级与调用进程放在同一线程组中。为了使CLONE_THREAD讨论的其余部分更具可读性,术语“线程”用于指代线程组中的进程。
线程组是Linux 2.4中添加的一项功能,用于支持 共享单个PID
的一组线程的POSIX线程概念。在内部,此共享PID是线程组的所谓线程组标识符(TGID)。从Linux
2.4开始,对getpid(2)的调用将返回调用者的TGID。
实际上,由于POSIX.1要求线程共享相同的进程ID
,因此Linux确实更改了其线程实现。
In the obsolete LinuxThreads implementation, each of the threads in a
process
has a different process ID. This is in violation of the POSIX
threads
specification, and is the source of many other nonconformances to the
standard; see pthreads(7).
问题内容: 在多处理器上,每个内核可以有自己的变量。我以为它们是在不同地址中的不同变量,尽管它们在同一过程中并且具有相同的名称。 但是我想知道,内核如何实现呢?它是否分配了一块内存来存放所有的percpu指针,并且每次它通过shift或其他方式将指针重定向到某个地址时? 问题答案: 普通全局变量不是每个CPU的。自动变量位于堆栈中,并且不同的CPU使用不同的堆栈,因此自然会得到单独的变量。 我猜您
问题内容: 我正在尝试为x86目标构建rootfs,这已经足够简单了。但是我不知道如何配置buildroot产生的内核。第一次运行是由menuconfig提出的,但此后一直缓存.config,我看不到在哪里进行更改。 约650MB的内核模块对嵌入式目标没有好处:P 有没有一种简单的方法可以在buildroot中配置内核?诸如目标之类的东西将是完美的。 问题答案: 答案是:
问题内容: 我有一个简单的字符设备驱动程序,可让您从自定义硬件设备中读取。它使用DMA将数据从设备内存复制到内核空间(然后由用户决定)。 该调用非常简单。它开始DMA写操作,然后在等待队列中等待。DMA完成后,中断处理程序将设置一个标志并唤醒等待队列。需要注意的重要一点是, 即使在设备要提供数据之前 ,我也可以随时启动DMA 。DMA引擎将坐下等待,直到有要复制的数据为止。这很好。我可以在用户空间
问题内容: 该功能在内部如何工作?考虑到内核确实具有访问用户内存空间的特权,它是否使用任何缓冲区还是完成了任何内存映射? 问题答案: 的实现高度依赖于体系结构。 在x86和x86-64上,它只是直接从用户空间地址进行读取并写入内核空间地址,同时如果已配置,则暂时禁用SMAP(超级用户模式访问阻止)。它的棘手部分是将代码放置在特殊区域中,以便页面错误处理程序可以识别其中何时发生错误。发生的内存保护错
问题内容: Linux内核开发人员如何在提交代码后在本地测试他们的代码?他们是否使用某种单元测试,构建自动化?测试计划? 问题答案: linux内核非常重视社区测试。 通常,任何开发人员都会在提交之前测试他们自己的代码,并且经常会使用Linus的内核开发版本,或者与他们的工作相关的项目使用其他不稳定/开发树之一。这意味着他们经常同时测试自己的变更和其他人的变更。 正式的测试计划的方式往往不多,但是
本文向大家介绍linux内核select/poll,epoll实现与区别,包括了linux内核select/poll,epoll实现与区别的使用技巧和注意事项,需要的朋友参考一下 下面文章在这段时间内研究 select/poll/epoll的内核实现的一点心得体会: select,poll,epoll都是多路复用IO的函数,简单说就是在一个线程里,可以同时处理多个文件描述符的读写。 select/