linux – 多处理器机器中posix线程的并发性
我对多处理器机器中posix线程的并发性有一些疑问.我在SO中发现了类似的问题,但没有找到确凿的答案.
以下是我的理解.我想知道我是否正确. > Posix线程是用户级线程,内核不知道它. 如果我的理解正确,请告诉我. 谢谢… 解决方法
由于您使用“
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)在创建另一个完整进程时使用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |