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

是否可以防止Linux用户空间pthread在关键代码中产生?

阎兴为
2023-03-14
问题内容

我正在使用2.6.24.3内核为嵌入式Linux项目开发用户空间应用程序。我的应用程序通过创建2个pthread在两个文件节点之间传递数据,每个pthread都hibernate,直到异步IO操作完成,然后唤醒并运行完成处理程序。

完成处理程序需要跟踪待处理的传输数量,并维护几个线程列表,一个线程将添加到该列表中,而另一个线程将删除该列表。

// sleep here until events arrive or time out expires
for(;;) {
    no_of_events = io_getevents(ctx, 1, num_events, events, &timeout);
    // Process each aio event that has completed or thrown an error
    for (i=0; i<no_of_events; i++) {
        // Get pointer to completion handler
        io_complete = (io_callback_t) events[i].data;
        // Get pointer to data object
        iocb = (struct iocb *) events[i].obj;
        // Call completion handler and pass it the data object
        io_complete(ctx, iocb, events[i].res, events[i].res2);
    }
}

我的问题是…

有没有一种简单的方法可以阻止当前活动的线程在运行完成处理程序时产生屈服,而不是沿着互斥/自旋锁定路线运行?

还是失败了,可以在持有互斥锁/自旋锁的情况下将Linux配置为防止产生pthread?


问题答案:

您可以使用sched_setscheduler()系统调用将线程的调度策略临时设置为SCHED_FIFO,然后再次将其重新设置。从sched_setscheduler()手册页:

SCHED_FIFO过程运行,直至其通过一个I / O请求阻塞,它是由较高优先级的进程抢占,或它调用sched_yield(2)

(在这种情况下,“进程”实际上是指“线程”)。

但是,这是一个可疑的要求。您希望解决什么问题?如果您只是试图保护完成处理程序的链接列表以防止并发访问,那么通常的互斥锁是可行的方法。让完成线程锁定互斥锁,删除列表项,解锁互斥锁,然后调用完成处理程序。



 类似资料:
  • 问题内容: 我在Linux内核代码中遇到了这两个宏。我知道它们是编译器(gcc)进行分支优化的指令。我的问题是,我们可以在用户空间代码中使用这些宏吗?会进行任何优化吗?任何示例都将非常有帮助。 问题答案: 是的他们可以。在Linux内核中,它们被定义为 __builtin_expect宏是使用分支预测的特定于GCC的宏;它们告诉处理器条件是否可能为真,以便处理器可以在分支的正确“侧”上预取指令。

  • 问题内容: 今天早些时候,有人问了有关Web应用程序中输入验证策略的问题。 在撰写本文时,最高答案建议仅使用和。 我的问题是:这是否总是足够?还有更多我们应该知道的吗?这些功能在哪里分解? 问题答案: 对于数据库查询,请始终尝试使用准备好的参数化查询。在和库支持这一点。这比使用转义功能(例如)更加安全。 是的,实际上只是一个字符串转义功能。这不是魔术子弹。它所要做的就是逃避危险字符,以便可以安全地

  • 问题内容: 我的应用程序中有一堆缓冲区(其中25到30个),它们很大(.5mb),可以同时访问simulataneousley。更糟糕的是,它们中的数据通常只读取一次,并且经常更新(例如每秒30次)。某种非最佳缓存使用的完美风暴。 无论如何,我想到,如果我可以将内存块标记为不可缓存,那将是很酷的……从理论上讲,这将为其他所有内容在缓存中留出更多空间。 那么,他们是否有办法获得在Linux中标记为不

  • 问题内容: 似乎在Windows 32位上,内核将从全部4G用户虚拟内存空间中保留1G虚拟内存,并将 某些 内核空间映射到此1G空间中。 所以我的问题是: 在32位Linux上是否有类似情况? 如果是这样,我们如何看到整个内存布局? 我认为 只能看到某些过程的用户空间布局。 谢谢! 问题答案: 实际上,在32位Windows上,如果没有引导选项,内核将映射到线性地址空间的前2GB,剩下2GB的空间

  • 问题内容: 出于调试目的,我需要测试一个指针以查看其是否指向有效的可读页面。目前,我正在解析/ proc / [pid] / maps来查看地址是否映射正确,但这似乎有点麻烦。有没有更好的办法?谢谢。 问题答案: 规范的方法是使用系统调用从页面读取(写入虚拟文件描述符)。如果传递给它的缓冲区不可读,它将返回with 而不是出错。