为什么协程需要的内存比线程少?

问题描述 投票:0回答:1

人们常说协程可以被认为是“轻线程”,因为它们消耗更少的内存。但是,我无法找到任何解释来解释为什么会出现这种情况。线程存储哪些协程不存储的内容?特别是当我们谈论堆栈协程时,它们仍然需要自己的堆栈,就像线程一样。

multithreading concurrency coroutine goroutine c++-coroutine
1个回答
0
投票

需要什么样的数据结构来支持线程?

这是一个临时的、不完整的列表,是从我的...呃,...对各种不同操作系统的记忆中拉出来的。

每线程数据:

以下所有内容都可以捆绑到单个“线程”对象中,该对象可以是全局“线程表”中的槽的成员,或者可以由全局“线程表”中的槽引用。

  1. 线程的上下文。每当线程被挂起时,其上下文包含必须加载到硬件寄存器中才能恢复运行的所有值。

  2. 线程的 状态。 通常,状态要么是

    running
    (如果它实际上正在运行),要么是
    runnable
    (如果唯一阻止它运行的是缺少可用的 CPU),或者是
    blocked 
    通过某事。如果它被阻塞,那么状态可能包含一个指向任何队列描述符的指针(见下文)最终将解锁它。根据操作系统的不同,可能还有其他可能的状态,例如与调试相关的状态。

  3. 对“父线程”或“进程”或两者的引用。在大多数桌面/服务器/移动操作系统中,每个线程都属于一个进程,并且在操作系统代码中的某些地方,找到对线程的引用后,需要找到该线程所属的进程。

  4. 其他属性:线程可能具有“优先级”、“base优先级”、“好值”、“名称”、“处理器关联性”……任何其他满足特定操作系统需求的属性。

队列:

只要一个线程不是

running
,那么它一定在等待某些东西,并且在一般情况下,可能有其他线程在等待同一件事。对等待线程的引用通常保存在队列中。

  1. 全局运行队列包含对系统中所有

    runnable
    线程的引用

  2. 阻塞线程的队列:互斥体将包含等待锁定互斥体的线程队列,具有其他名称的同步对象,“邮件槽”,“信号量”,“事件”,“条件变量”等。它们所有线程队列都因某种原因而等待。

在大多数情况下,“队列”不仅仅是严格的 FIFO 队列,因为 (a) 通常需要将高优先级线程移到队列的头部,并且 (b) 有时需要从队列中删除线程队列的中间(例如,如果拥有它的进程被强行终止。)

© www.soinside.com 2019 - 2024. All rights reserved.