我有几个小问题。
首先,多线程和多核之间有区别吗?它们是完全不同的两个东西,还是多线程在需要时使用多个内核?
其次,大多数内核都有两个线程,但在分析我的应用程序时,我注意到许多不同的线程,从线程 128 到线程 3460。什么决定了您的计算机有多少线程?
谢谢
最佳答案
Firstly is there a difference between multithreading and multicore?
是的。
多线程和多核是适用于不同计算领域的不同术语。
多核是指具有多个逻辑 CPU 内核的计算机或处理器,并且可以同时在物理上执行多条指令。计算机的“核心数”是计算机拥有的核心总数:计算机可能有多个处理器,每个处理器可能有多个核心;核心数是所有处理器上的核心总数。
多线程是指可以通过同时在多个内核上运行来利用多核计算机的程序。一般来说,两倍的内核等于两倍的计算能力(对于支持多线程的程序),尽管有些问题受到 CPU 使用率以外的因素的限制;这些问题不会像多线程那样获得巨大的 yield 。
请务必注意,性能并不是程序使用多线程的唯一原因。稍后会详细介绍。
Are they two completely different things or does multithreading use more than one core if it needs?
它们是相关的,但又是分开的。
如果有多个内核可用,支持多线程的程序可以使用多个内核。
Most cores have two threads but when profiling my app I noticed lots of different threads ranging from thread 128 to thread 3460.
操作系统会分配线程编号,以便跟踪它们。
您将运行的大多数程序都不需要同时运行 3400 个线程。此外,正在运行的线程将消耗所有内核。你的 CPU 没有一直 100% 运行的唯一原因是操作系统知道如何暂停处理器,这基本上使它停止一切并等待某些事情发生(例如 IO 事件或时钟滴答声)。一次只能在一个内核上运行一个线程。不同的线程运行实际上只是线程跳到CPU上运行一小段时间,然后被其他同样需要运行的线程切换出去。
What dictates how many threads your computer has?
所有进程中的线程总数。此外,大多数操作系统都有硬性限制,即不能超过的现有线程的最大数量。
一个进程就是一个程序(你可能知道这一点)。多线程是每个进程拥有多个线程的过程(许多进程不会创建多个线程,因为它们不必这样做)。 Windows 对您可以创建的线程数没有硬性限制(至少自 XP 以来没有。不会对 w98 和以前的版本说任何话),但是您可以创建的线程数当然受到内存量的限制你有。
You said some programs use multiple threads for reasons other than performance.
有时能够同时执行多项任务也很不错。
有时程序需要在特定时间做特定的事情。一个经常被引用的例子是一个带有可见窗口的程序。该程序可能会进行密集的后台数字运算,但如果它仍然可以响应用户事件(例如单击按钮和调整其大小),它将使它受益。这可以通过异步处理来完成,这将需要你的一个线程每隔一段时间重复检查 GUI 工作,暂停它正在做的事情,并处理一段时间的 GUI。很多事情都是这样做的。
另一种可能更好的处理方法是使用线程。您的程序不必担心在数字运算和 GUI 管理之间来回切换,操作系统会为您管理。即使您只有一个内核,您仍然可以运行多个线程,并且您的操作系统将尽最大努力确保所有正在运行的进程中的所有正在运行的线程都获得其公平份额的 CPU 时间。
关于c++ - 多线程和多核的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11835046/
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行
我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
我正在尝试使用ruby编写一个双线程客户端,一个线程从套接字读取数据并将其打印出来,另一个线程读取本地数据并将其发送到远程服务器。我发现的问题是Ruby似乎无法捕获线程内的错误,这是一个示例:#!/usr/bin/rubyThread.new{loop{$stdout.puts"hi"abc.putsefsleep1}}loop{sleep1}显然,如果我在线程外键入abc.putsef,代码将永远不会运行,因为Ruby将报告“undefinedvariableabc”。但是,如果它在一个线程内,则没有错误报告。我的问题是,如何让Ruby捕获这样的错误?或者至少,报告线程中的错误?
转自:spring.profiles.active和spring.profiles.include的使用及区别说明下文笔者讲述spring.profiles.active和spring.profiles.include的区别简介说明,如下所示我们都知道,在日常开发中,开发|测试|生产环境都拥有不同的配置信息如:jdbc地址、ip、端口等此时为了避免每次都修改全部信息,我们则可以采用以上的属性处理此类异常spring.profiles.active属性例:配置文件,可使用以下方式定义application-${profile}.properties开发环境配置文件:application-dev
打印1:defsum(i)i=i+[2]end$x=[1]sum($x)print$x打印12:defsum(i)i.push(2)end$x=[1]sum($x)print$x后者是修改全局变量$x。为什么它在第二个例子中被修改而不是在第一个例子中?类Array的任何方法(不仅是push)都会发生这种情况吗? 最佳答案 变量范围在这里无关紧要。在第一段代码中,您仅使用赋值运算符=为变量i赋值,而在第二段代码中,您正在修改$x(也称为i)使用破坏性方法push。赋值从不修改任何对象。它只是提供一个名称来引用一个对象。方法要么是破坏性
我是ruby的新手,我认为重新构建一个我用C#编写的简单聊天程序是个好主意。我正在使用Ruby2.0.0MRI(Matz的Ruby实现)。问题是我想在服务器运行时为简单的服务器命令提供I/O。这是从示例中获取的服务器。我添加了使用gets()获取输入的命令方法。我希望此方法在后台作为线程运行,但该线程正在阻塞另一个线程。require'socket'#Getsocketsfromstdlibserver=TCPServer.open(2000)#Sockettolistenonport2000defcommandsx=1whilex==1exitProgram=gets.chomp