首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux调度: OS vs "virtual“

Linux调度: OS vs "virtual“
EN

Stack Overflow用户
提问于 2012-06-04 14:15:01
回答 4查看 184关注 0票数 0

如何在c下的linux fedora中实现多线程单进程模型,其中单个调度器用于“主”核心读取i/o可用性(例如,tcp/ip,udp),然后有一个每个核心的单线程(从init开始),“执行线程”,解析数据,然后更新少量的信息更新到共享内存空间(我的理解是pthread在单个进程下共享数据)。

我相信我的选择是:

Pthread或linux OS调度程序

我在脑海中有一个朴素的模型,由启动一定数量的执行线程和单个调度程序线程组成。

当我知道我可以使用这种模型时,人们能想到的最佳解决方案是什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-06-08 18:43:42

完成Benoit的回答,为了在主线程和工作线程之间进行通信,您可以使用条件变量。工人们做了一些类似的事情:

代码语言:javascript
复制
while (true)
{
    pthread_mutex_lock(workQueueMutex);
    while (workQueue.empty())
        pthread_cond_wait(workQueueCond, workQueueMutex);
    /* if we get were then (a) we have work (b) we hold workQueueMutex */
    work = pop(workQueue);
    pthread_mutex_unlock(workQueueMutex);
    /* do work */
}

和主控:

代码语言:javascript
复制
/* I/O received */
pthread_mutex_lock(workQueueMutex);
push(workQueue, work);
pthread_cond_signal(workQueueCond);
pthread_mutex_unlock(workQueueMutex);

这将唤醒一个空闲的工作,以立即处理请求。如果没有工作进程可用,该工作将被出队并在稍后进行处理。

票数 1
EN

Stack Overflow用户

发布于 2012-06-08 18:31:44

修改Linux调度器是一项相当困难的工作。我就忘了这件事。Pthread通常是首选的。如果我理解得很好,您希望有一个专门用于控制计划的核心,以及一个专门用于数据计划处理的其他核心池吗?然后从您的主线程创建一个线程池,并使用pthread_setaffinity_np(...)为这些从线程设置核心亲和性。

事实上,一个进程的线程共享相同的地址空间,并且该进程的任何线程都可以访问全局变量。

票数 1
EN

Stack Overflow用户

发布于 2012-06-08 19:17:11

在我看来,您有一个只有一个消费者的producer-consumer problem版本,它聚合了n生产者的结果。这是一个非常标准的问题,所以我绝对认为pthread对您来说已经足够了。你不需要去摆弄调度器。

作为答案的一种状态,像here描述的线程安全队列很好地解决了这类问题。你最初的想法是产生一堆线程,这是一个好主意。您似乎担心线程共享全局状态的能力会给您带来问题。我不认为这是一个问题,如果您将共享状态保持在最低限度,并使用合理的锁定规则。只要你负责任地这样做,共享状态就很好。

最后,除非您真的知道自己在做什么,否则我建议不要手动处理线程亲和性。只需生成线程并让调度程序处理线程何时在哪个内核上运行即可。需要优化的是你使用的线程的数量。如果其他线程正在运行,则每个内核一个线程实际上可能不是最快的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10877039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档