首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >先发制人线程与非抢占线程

先发制人线程与非抢占线程
EN

Stack Overflow用户
提问于 2010-11-10 09:30:10
回答 4查看 31.3K关注 0票数 70

有人能解释一下先发制人的线程模型和非抢占线程模型的区别吗?

根据我的理解:

  • Non抢占式线程模型:一旦线程启动,就不能停止,或者在线程完成其任务之前不能将控件传输到其他线程。
  • Preemptive线程模型:运行时允许在任何时候从一个线程进入并将控制交给另一个线程。优先级较高的线程优先于优先级较低的线程。

谁能请你:

如果理解是correct.

  • Explain,那么
  1. 解释了这两种模型的优点和缺点。
  2. 是什么时候使用真正有帮助的东西的例子。如果我在Linux (system或P线程)中创建线程,而没有提到任何选项(有吗?),
  3. ?默认情况下,所使用的线程模型是抢占式线程模型??

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-11-10 09:56:44

  1. 不,你的理解不完全正确。非抢占线程(也称合作线程)通常会手动生成控制,让其他线程在完成之前运行(尽管要由该线程调用yield() (或其他什么)来使该线程更简单。协作线程具有较少的overhead.
  2. Normally使用抢占性。如果您发现您的设计有很多线程切换开销,协作线程将是一种可能的优化。在许多(大多数?)不过,在这种情况下,这将是一笔相当大的投资,但回报却微乎其微。
  3. 是的,默认情况下,你会得到先发制人的线程处理,尽管如果你四处看看CThreads包,它支持协作线程。没有多少人(现在)想要合作线程,但我不确定它是否在过去十年中更新过.
票数 54
EN

Stack Overflow用户

发布于 2010-11-10 09:47:44

非抢占性线程也称为协作线程.POE (Perl)就是一个例子。另一个例子是经典的Mac (在OS之前)。协作线程只有在放弃CPU之前才能使用CPU。然后,调度程序选择另一个线程来运行。

抢占式线程可以像协作线程一样自愿地放弃CPU,但是当它们不这样做时,就会从它们那里取出CPU,调度程序就会启动另一个线程。POSIX & SysV线程属于这一类别。

协作线程的最大优点是效率更高(至少在单核机器上)和更容易地处理并发性:只有当您放弃控制时,它才存在,因此不需要锁定。

先发制人线程的最大优点是更好的容错性:单个线程不能产生结果并不能阻止所有其他线程的执行。通常情况下,在多核机器上工作更好,因为多个线程一次执行。最后,你不必为确保自己不断地屈服而担心。这可能是非常恼人的内部,例如,一个沉重的数字处理循环。

你当然可以把它们混合起来。单个抢占线程可以在其中运行多个协作线程。

票数 30
EN

Stack Overflow用户

发布于 2014-11-22 03:22:22

如果使用non-preemptive,并不意味着流程在等待I/O时不执行上下文切换,调度程序将根据调度模型选择另一个进程。我们必须相信这个过程。

non-preemptive:

  1. 减少上下文切换,减少非抢占模型

中的开销

  1. 易于处理,因为它可以使用单核处理器

来处理。

抢占式

优势:

在这个模型中,我们有一个优先级,可以帮助我们更好地控制运行中的进程(

)。

  1. 更好的并发性是

的奖励

  1. 处理系统调用而不阻塞整个系统

劣势:

  1. 需要更复杂的同步算法,关键部分的处理是不可避免的。

一起带来的开销

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4147221

复制
相关文章
线程的调度方式——抢占式、非抢占式
在抢占模式下,操作系统负责分配CPU时间给各个进程,一旦当前的进程使用完分配给自己的CPU时间,操作系统将决定下一个占用CPU时间的是哪一个线程。因此操作系统将定期的中断当前正在执行的线程,将CPU分配给在等待队列的下一个线程。所以任何一个线程都不能独占CPU。每个线程占用CPU的时间取决于进程和操作系统。进程分配给每个线程的时间很短,以至于我们感觉所有的线程是同时执行的。实际上,系统运行每个进程的时间有2毫秒,然后调度其他的线程。它同时他维持着所有的线程和循环,分配很少量的CPU时间给线程。线程的的切换和调度是如此之快,以至于感觉是所有的线程是同步执行的。
MickyInvQ
2020/09/27
5.9K0
thread 守护线程_守护线程与非守护线程
  Java中线程分为用户线程(user thread)和守护线程(daemon thread),它们通过Thread的daemon属性标识:true表示守护线程,false表示用户线程。   一个Thread初始默认为用户线程(daemon默认为false),创建Thread的时候默认从当前线程”继承”daemon属性,见Thread.init方法:
全栈程序员站长
2022/11/04
5140
笔记 35 | java线程之线程安全与非线程安全
地址 CSDN http://blog.csdn.net/xiangyong_1521/article/details/78541142 ---- 线程安全与非线程安全 ArrayList和Vecto
项勇
2018/06/19
6520
守护线程和非守护线程_java守护线程的作用
Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)
全栈程序员站长
2022/11/04
5720
守护线程和非守护线程_java守护线程的作用
PHP的线程安全ZTS与非线程(NTS)安全版本的区别
Windows版的PHP从版本5.2.1开始有Thread Safe(线程安全)和None Thread Safe(NTS,非线程安全)之分,这两者不同在于何处?到底应该用哪种?这里做一个简单的介绍。
全栈程序员站长
2022/02/17
1.3K0
线程与Java线程
对于程序的运行过程,操作系统中最重要的两个概念是进程和CPU,进程就是运行程序的一个抽象,CPU主要工作就是对进程的调度。需要理解的是,一个CPU在一个瞬间,只能执行一个进程,通常这个时间片段是几十毫秒或几百毫秒,但对于用户来讲,就像多个程序同时运行,这就是伪并行(对于一个CPU来讲)。进程包含几乎程序运行的所需要的所有信息,包括程序计数器、堆栈指针、程序对应地址空间(存放可执行程序、程序的数据、程序的堆栈等)的读写操作以及其他资源的信息。进程的执行有三个状态:正在运行的进程是运行态,还包括就绪态(可运行,CPU正在执行别的进程)、阻塞态(等待某个资源或某个事件发生之前的进程的状态)。三种状态的切换如下图所示:
搬砖俱乐部
2019/06/15
1.8K0
线程与线程安全
电脑中时会有很多单独运行的程序,每个程序有一个独立的进程,而进程之间是相互独立存在的。比如下图中的QQ、酷狗播放器、电脑管家等等。
狼啸风云
2019/11/28
7320
非线程安全对象�
今天的微博有人讨论到对象池,我想到之前项目的实现,应该用模板来实现啊,唉,还是被前人的想法给框定了,只是实现一个特别简单,花了几分钟写了个:
全栈程序员站长
2022/07/12
2540
Java 线程与多线程
一个进程上可以创建多个线程,线程比进程更快的处理单元,而且所占用的资源也小,多线程的应用也是性能最高的。
Mirror王宇阳
2020/11/12
1.9K0
如何让Task在非线程池线程中执行?
Task承载的操作需要被调度才能被执行,由于.NET默认采用基于线程池的调度器,所以Task默认在线程池线程中执行。但是有的操作并不适合使用线程池,比如我们在一个ASP.NET Core应用中承载了一些需要长时间执行的后台操作,由于线程池被用来处理HTTP请求,如果这些后台操作也使用线程池来调度,就会造成相互影响。在这种情况下,使用独立的一个或者多个线程来执行这些后台操作可能是一个更好的选择。
蒋金楠
2023/05/31
9170
如何让Task在非线程池线程中执行?
内核线程与用户线程
?
Dean0731
2020/09/18
8620
内核线程与用户线程
Java线程与内核线程
本篇文章探究下Java线程与内核线程的关系. 在Java中,一个Java的线程对应一个内核的线程,实际的业务代码是由内核线程来执行的,而Java线程只是一个傀儡. 先通过一个简单的实验热热
书唐瑞
2022/06/02
1.1K0
Java线程与内核线程
用户线程与守护线程
在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程) 
大学里的混子
2019/03/27
6870
python多线程与线程
考虑一个场景:浏览器,网易云音乐以及notepad++ 三个软件只能顺序执行是怎样一种场景呢?另外,假如有两个程序A和B,程序A在执行到一半的过程中,需要读取大量的数据输入(I/O操作),而此时CPU只能静静地等待任务A读取完数据才能继续执行,这样就白白浪费了CPU资源。你是不是已经想到在程序A读取数据的过程中,让程序B去执行,当程序A读取完数据之后,让程序B暂停。聪明,这当然没问题,但这里有一个关键词:切换。
超蛋lhy
2018/08/31
1K0
python多线程与线程
守护线程与线程中断区别_守护线程和主线程
关于中断线程,调用interrupt()不会让线程立即中断,只是线程的中断状态发生变化,系统会在后续中断该线程。
全栈程序员站长
2022/11/07
6990
多线程快速入门与多线程与线程高级(多线程实战【三】)
初始化状态 就绪状态 运行状态 死亡状态 阻塞状态 超时等待 等待状态
高大北
2022/06/14
3590
多线程快速入门与多线程与线程高级(多线程实战【三】)
线程与线程池干货分享
3.开始在线程池里创建线程(假定 线程池内最多创建4个线程),线程池会请求队列,将缓存队列里的runnable 加载到线程中 如图:
CatEatFish
2020/07/09
3530
线程与线程池干货分享
守护线程和非守护线程的区别以及用法_python多线程守护进程
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/03
6030
线程、多线程与线程池面试题
多线程:解决多任务同时执行的需求,合理使用CPU资源。多线程的运行是根据CPU切换完成,如何切换由CPU决定,因此多 线程运行具有不确定性。
全栈程序员站长
2022/08/24
2640
点击加载更多

相似问题

抢占与非抢占核与抢占与非抢占调度

13

关于非抢占式线程的查询

16

协作式/非抢占式线程避免死锁?

21

linux -内核线程抢占

11

系统线程与非系统线程

35
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档