Linux   发布时间:2022-04-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了linux – 多处理器机器中posix线程的并发性大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我对多处理器机器中posix线程的并发性有一些疑问.我在SO中发现了类似的问题,但没有找到确凿的答案. 以下是我的理解.我想知道我是否正确. > Posix线程是用户级线程,内核不知道它. >内核调度程序会将Process(及其所有线程)视为一个调度实体.它是线程库,它反过来选择运行哪个线程.它可以在可运行的线程中分割内核给出的CPU时间. >用户线程可以在不同的cpu核心上运行.即让线程T1&
我对多处理器机器中posix线程的并发性有一些疑问.我在SO中发现了类似的问题,但没有找到确凿的答案.

以下是我的理解.我想知道我是否正确.

> Posix线程是用户级线程,内核不知道它.
>内核调度程序会将Process(及其所有线程)视为一个调度实体.它是线程库,它反过来选择运行哪个线程.它可以在可运行的线程中分割内核给出的cpu时间.
>用户线程可以在不同的cpu核心上运行.即让线程T1& T2由进程(T)创建,然后T1可以在cpu1中运行,T2可以在cpu2中运行但是它们不能同时运行.

如果我的理解正确,请告诉我.

谢谢…

解决方法

由于您使用Linux标记标记了您的问题,我将根据linux下的标准pthreads实现来回答它.如果您正在谈论 “green” threads,它们是在VM /语言级而不是操作系统上安排的,那么您的答案大多是正确的.但我在下面的评论是关于Linux pthreads.

不,这当然不正确. Linux内核和pthreads库一起管理线程.内核执行上下文切换,调度,内存管理,缓存内存管理等.当然,在用户级别还有其他管理,但没有内核,pthreads的大部分功能都会丢失.

不,内核将每个进程线程视为一个实体.它有自己的关于时间切片的规则,它将进程(和进程优先级)虑在内,但每个子进程线程都是一个可调度的实体.

不可以.多线程程序需要并发执行.这就是为什么同步和互斥体如此重要以及程序员为什么忍受多线程编程的复杂性的原因.

向您证明这一点的一种方法是使用-L选项查看ps的输出显示关联的线程. ps通常将多个线程进程包装成一行但是使用-L可以看到内核为每个线程都有一个单独的虚拟进程ID:

ps -ef | grep 20587
foo    20587     1  1 Apr09 ?        00:16:39 java -server -Xmx1536m ...

ps -eLf | grep 20587
foo    20587     1 20587  0  641 Apr09 ?    00:00:00 java -server -Xmx1536m ...
foo    20587     1 20588  0  641 Apr09 ?    00:00:30 java -server -Xmx1536m ...
foo    20587     1 20589  0  641 Apr09 ?    00:00:03 java -server -Xmx1536m ...
...

我不确定Linux线程是否仍然这样做,但历史上pthreads使用clone(2)系统调用来创建自己的另一个线程副本:

这与fork(2)不同,fork(2)在创建另一个完整进程时使用.

大佬总结

以上是大佬教程为你收集整理的linux – 多处理器机器中posix线程的并发性全部内容,希望文章能够帮你解决linux – 多处理器机器中posix线程的并发性所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。