RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 662902
Accepted
xperious
xperious
Asked:2020-05-07 09:59:29 +0000 UTC2020-05-07 09:59:29 +0000 UTC 2020-05-07 09:59:29 +0000 UTC

任务和本机线程

  • 772

你好,我不明白从操作系统的角度来看什么是任务......他们到处都写到基于任务的并行性从池中获取“任务”......但是“任务”是什么意思?这是一个有自己的堆栈的本机线程......我是否正确理解任务是“没有自己的堆栈的线程”,即 光流?如果是这样,它是如何在操作系统方面实现的?我假设 async/await 以某种方式使用轻量级线程的概念是否正确?

c#
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    VladD
    2020-05-07T19:03:57Z2020-05-07T19:03:57Z

    不,你不太明白。

    对于初学者来说,正如@PetSerAl 正确指出的那样,它Task是 .NET 的内部概念,不以任何方式映射到操作系统对象。

    那么,“基于任务的并行性从池中获取一个“任务””的信息是完全错误的。最容易将其Task视为一个承诺(它确实是)。

    您应该只将它视为Task在某个时间点结束的对象。“完成”一词仅表示它进入状态Completed,并且调用var result = await task;也随之终止。这await不是阻塞调用,它会停止当前代码的执行,并在 promise 结束时恢复执行。

    事实上,它是如何实现Task的,在什么情况下它实际上是运行在某个线程(或任何线程)中的代码,以及它根本不运行的代码(例如订阅了某个事件的代码,并完成了任务当此事件到达时)。您应该只对完成并产生结果(或异常)的承诺的语义感兴趣。

    它看起来像一个轻量级线程,但它不是:线程不产生结果,而只是简单地运行,不像任务,它以某种方式在某个遥远的时间点接收结果。但是在这两种情况下,都没有专门的栈来为它服务:毕竟线程和栈是一个更底层的概念。


    Task一个不占用任何线程的 'a的例子很容易构造:

    Task Delay(int milliseconds)
    {
        var tcs = new TaskCompletionSource<object>();
        var timer = new System.Threading.Timer(
            _ => {
                     tcs.SetCompleted(null); timer.Dispose();
                 }, null, milliseconds, System.Threading.Timeout.Infinite);
        return tcs.Task;
    }
    

    这个是类似的Task.Delay。

    有关该主题的更多信息:

    • 没有线程(原文:没有线程)。
    • 等待异步如何工作
    • 您是否需要异步/等待?
    • 8
  2. Alexander Petrov
    2020-05-07T21:16:18Z2020-05-07T21:16:18Z

    Vlad 在他的回答中强调了任务的高级概念,而据我了解,topikstarter 从内部对设备更感兴趣。我将描述我的看法。

    编程中的所有任务都可以有条件地分为两种类型:

    • CPU 绑定 - CPU 负载、计算任务;
    • IO-bound - I/O 操作,向/从文件/网络发送/接收数据等。

    对于第二个任务,不需要单独的线程。它们在特殊的输入输出完成端口——IOCP(IO 完成端口)上执行。粗略地说,处理器给控制器一个命令:从某某地址复制一段内存到这样的流,之后它就可以继续处理它的业务了。当控制器完成它的工作时,它向CPU发送一个硬件中断(IRQ)(相当于头上的一个屁股)任务已经完成。CPU 以一种或另一种方式对此做出反应。

    对于繁重的计算,需要一个线程。创建一个线程是一个相当昂贵的操作,所以系统维护一个运行线程池(它的大小可以改变)。你可以创建一个新线程,你可以从池中取出它。

    当通过调用or创建计算任务时,线程将从池中取出。您可以在方法中指定一个参数- 在这种情况下,将创建一个新线程,而不是从池中获取。事实是,长时间占用池中的线程是不可取的,因为其他应用程序可能随时需要它们。因此,习惯上对池中的线程执行相对较短的操作。Task.Factory.StartNewTask.RunStartNewTaskCreationOptions.LongRunning

    应该注意的是,当在单独的线程中执行冗长的 IO 操作时,操作系统能够跟踪情况:它会自动将它们传输到 IOCP。当池中的一个线程(长时间占用是非常不受欢迎的!)在 I/O 上挂起时,池调度程序会自动向池中添加一个新线程(它可以检测到这一点)以防止所谓的饥饿系统的。

    目前,compute Task直接对应于 managed flow Thread。但是,这可能会随时更改,因此不应依赖。反过来,托管线程直接对应于本机操作系统线程。同样,它可以随时更改,不能抵押。

    • 7

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5