Questions tagged «threads»

4
一般而言,哪些线程共享?
好吧,这是一个普遍的问题。而且,如果有人想使其实现特定,那么我将更喜欢Unix相关的东西。但首先需要普遍了解以下问题: 我读到单个进程可以有多个线程。同一进程的多个线程确实在它们之间共享事物。我想知道他们分享什么,不分享什么。考虑到进程由地址空间,堆栈,堆,全局变量,代码,数据,OS资源组成,线程之间共享哪些资源?我有以下猜测: 全局变量-我已读取线程共享全局变量。同样,在用Java和C#编程时,我创建了线程来共享类级变量。因此,我认为线程共享全局变量(尽管不能确定高级编程语言中的概念是否可以转换为低操作系统级别的事实)。 堆-由于全局变量存储在堆中,因此堆在线程之间共享。 堆栈-由于每个线程可以具有自己的执行序列/代码,因此它必须具有自己的堆栈,可以在该堆栈上推入/弹出程序计数器的内容(在发生函数调用和返回的情况下)。因此,同一进程的线程不共享堆栈。 现在我不确定以下内容的共享 地址空间-不确定在地址空间中到底要算什么。但是我想地址空间通常用于进程而不是线程的上下文中。而且,由于同一进程的所有线程与父进程位于同一地址空间,因此可以说线程共享地址空间。(但是,然后它们在同一地址空间内维护不同的堆栈吗?) 操作系统资源-我猜这可能是特定于实现的。例如,父进程可以选择性地将同一文件的句柄分配给它的某些线程,而不是全部。还是我误会了,操作系统资源意味着文件以外的东西? 代码-线程可以具有不同的代码,因此共享代码并非总是如此。 数据-不确定要在数据下考虑什么。但是请确保全局变量在线程之间共享。并确保不会局部共享局部变量。 总体而言,由于术语含糊,操作系统书籍中的超级概括以及在线提供的额外的实现特定细节,我感到非常困惑。因此,我试图找到一些令我满意的答案。

3
为什么大多数互斥量实现不公平?
我的理解是,互斥锁的大多数流行实现(例如C ++中的std :: mutex)都不保证公平性 -也就是说,它们不保证在争用的情况下线程将按其获取锁的顺序进行操作。称为lock()。实际上,甚至有可能(尽管希望很罕见)在争用较高的情况下,某些等待获取互斥锁的线程可能永远无法获取它。 对我而言,这似乎是无益的行为-在我看来,公平的互斥体所产生的行为更符合程序员的期望/期望。 给出互斥量通常不被实现为公平的原因是“性能”,但我想更好地理解这意味着什么-特别是,放宽互斥量的公平性要求如何提高性能?看起来“公平”的互斥锁似乎是微不足道的实现-只需将lock()将调用线程附加到互斥锁的链表的末尾,然后再将其置于睡眠状态,然后使unlock()从下一个弹出线程相同列表的开头并将其唤醒。 我在这里缺少什么互斥体实现的见解,可以解释为什么认为为了提高性能而牺牲公平性是值得的吗?

1
为什么使用超线程会导致性能下降
我在不同的地方,如阅读此,超线程导致性能下降。 我无法弄清楚超线程导致退化的原因或原因。 为什么这样,即使在超线程允许OS使用免费资源的情况下,降级也会发生。 尽管基准测试确实表明超线程是罪魁祸首,但是有人可以向我解释其原因。 谢谢

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.