Articles of multithreading

NPTL在65528处限制最大线程数?

下面的代码应该是100,000个线程: /* compile with: gcc -lpthread -o thread-limit thread-limit.c */ /* originally from: http://www.volano.com/linuxnotes.html */ #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <pthread.h> #include <string.h> #define MAX_THREADS 100000 int i; void run(void) { sleep(60 * 60); } int main(int argc, char *argv[]) { int rc = 0; pthread_t thread[MAX_THREADS]; printf("Creating threads …\n"); for (i = […]

multithreadingrandom_r比单线程版本慢

以下程序基本上与此处所述的程序相同。 当我使用两个线程(NTHREADS == 2)运行和编译程序时,我得到以下运行时间: real 0m14.120s user 0m25.570s sys 0m0.050s 当它只用一个线程(NTHREADS == 1)运行时,即使只使用一个内核,运行时间也会显着提高。 real 0m4.705s user 0m4.660s sys 0m0.010s 我的系统是双核的,我知道random_r是线程安全的,我很确定它是非阻塞的。 当同样的程序在没有random_r的情况下运行并且余弦和正弦的计算被用作replace时,双线程版本运行的时间大约是预期的1/2。 #include <pthread.h> #include <stdlib.h> #include <stdio.h> #define NTHREADS 2 #define PRNG_BUFSZ 8 #define ITERATIONS 1000000000 void* thread_run(void* arg) { int r1, i, totalIterations = ITERATIONS / NTHREADS; for (i = 0; i < totalIterations; […]

如何杀死多处理模块创build的僵尸进程?

我对multiprocessing模块很multiprocessing 。 我只是试图创build以下内容:我有一个进程是从RabbitMQ获取消息并将其传递给内部队列( multiprocessing.Queue )。 然后,我想要做的是:当新消息进来时产生一个进程。它可以工作,但是在作业完成后,它会留下一个没有被父节点终止的僵尸进程。 这是我的代码: 主要stream程: #!/usr/bin/env python import multiprocessing import logging import consumer import producer import worker import time import base conf = base.get_settings() logger = base.logger(identity='launcher') request_order_q = multiprocessing.Queue() result_order_q = multiprocessing.Queue() request_status_q = multiprocessing.Queue() result_status_q = multiprocessing.Queue() CONSUMER_KEYS = [{'queue':'product.order', 'routing_key':'product.order', 'internal_q':request_order_q}] # {'queue':'product.status', # 'routing_key':'product.status', # 'internal_q':request_status_q}] def main(): […]

如何在Linux上对clone()系统调用进行mmap映射?

Linux上的clone()系统调用需要一个指向堆栈的参数,供新创build的线程使用。 做到这一点的显而易见的方法是简单地malloc一些空间,并通过它,但是你必须确保你已经malloc'd尽可能多的堆栈空间,因为该线程将使用(很难预测)。 我记得使用pthreads时,我不必这样做,所以我很好奇它做了什么。 我遇到这个网站 ,它解释说:“Linux pthreads实现使用的最好的解决scheme是使用mmap分配内存,标记指定了使用时分配的内存区域,这样内存分配给如果系统不能分配额外的内存,则会发生分段违规。 我曾经听过mmap用过的唯一的上下文是将文件映射到内存中,并且确实读取了mmap手册页,它使用文件描述符。 这怎么可以用来分配一个dynamic长度的堆栈给clone()? 这个网站是疯了吗? ;) 无论哪种情况,内核都不需要知道如何为新的堆栈find一堆免费的内存,因为这是用户启动新进程时必须要做的事情。 为什么一个堆栈指针甚至需要首先指定,如果内核已经可以解决这个问题呢?

在Linux中使用硬件性能计数器

我想使用Intel和AMD x86_64多核处理器附带的硬件性能计数器来计算程序退役的商店数量。 我希望每个线程分别计算退休的商店。 可以这样做吗? 如果是这样,如何在C / C ++?

gdb:multithreading

我有一个使用两个线程的程序。 我已经把这个断点放在了两个线程中。 在gdb下运行程序时,我想在线程之间切换并使其运行。 (线程t1处于活动状态并正在运行,线程t2;在断点处暂停时,我想停止T1运行并运行T2)。 有什么办法可以在gdb中安排线程吗? 谢谢Arpit

在linux中的内存分配是否无阻塞?

我很好奇,知道是否使用默认的新运算符分配内存是一个非阻塞操作。 例如 struct Node { int a,b; }; … Node foo = new Node(); 如果多个线程试图创build一个新的节点,并且如果其中一个线程在分配过程中被操作系统暂停,是否会阻止其他线程的进展? 我问的原因是因为我有一个并发的数据结构,创build新的节点。 然后我修改了algorithm来回收节点。 这两种algorithm的吞吐量性能在24核心机器上几乎是相同的。 然后,我创build了一个在所有系统内核上运行的干扰程序,以便尽可能多地创build操作系统。 创build新节点的algorithm的吞吐量性能相对于再循环节点的algorithm减less了5倍。 我很想知道为什么会发生这种情况。 谢谢。 *编辑:指向我的Linux内存分配器的代码也将有所帮助。 我试图在发布这个问题之前寻找,但无法find它。

Linux系统调用创build进程和线程

我在一篇论文中读到,创build进程和线程的底层系统调用实际上是相同的,因此通过线程创build进程的成本并不是很高。 首先,我想知道创build进程/线程的系统调用是什么(可能是示例代码或链接?) 其次,作者是否正确地认为创build进程而不是线程是便宜的? 编辑: 引用文章: 使用进程replacepthread是非常便宜的,特别是在使用相同的底层系统调用调用pthread和进程的Linux上。

抢先线索与非抢先线索

有人可以解释抢先线程模型和非抢先线程模型之间的区别吗? 根据我的理解: 非抢占式线程模型:线程一旦启动就不能停止,或者控制不能被其他线程转移,直到线程完成其任务。 抢占式线程模型:运行时被允许介入并随时从一个线程控制到另一个线程。 优先级较高的线程优先于较低优先级的线程。 有人可以请: 说明理解是否正确。 解释两种模式的优缺点。 什么时候使用真正有用的例子。 如果我在Linux(system v或Pthread)中创build一个线程而不提及任何选项(有没有?),默认情况下使用的线程模型是抢先线程模型?

Java I / O与使用Linux NPTL的Java新I / O(NIO)

我的web服务器使用通常的Java I / O和每个连接机制的线程。 现在,他们正在增加用户(长轮询连接)的膝盖。 但是,连接大多是空闲的。 虽然这可以通过添加更多的Web服务器来解决,但是我一直在努力对NIO实现进行一些研究。 我对此有了一个混合的印象。 我已经阅读了基准testing,其中Linux中的新NPTL库的常规I / O性能优于NIO。 用Java I / Oconfiguration和使用最新的NPTL for Linux的真实生活经验是什么? 有没有增加的performance? 而在一个更大的范围问题上: 在一个标准的服务器级机器(带有四核处理器的戴尔)中,我们希望正常运行(使用Linux NPTL库?)的I / O和阻塞线程(我们在Tomcat线程池中configuration的)的最大数量是多less? 如果线程池变得非常大,说1000多个线程会有什么影响? 任何引用和指针将非常感激。