当前位置: 首页 > 面试题库 >

如何在Linux内核3.2中实现pthread?

郑衡
2023-03-14
问题内容

所有,

下面的代码来自“ 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/