cpu模拟卡具体破解原理cpu风扇方向正确图有大佬有吗

AMD1700x 虚拟机安装 Mac OS X,报“客户机操作系统已禁用 CPU。请关闭或重置虚拟机”,有大佬知道怎么解决吗?
· 94 天前 · 1920 次点击
1.已确认虚拟化开启,主板是华擎 x370
2.vmware 版本是 14
3.网上的方法都试过,都不能解决该问题.
25 回复 &| &直到
18:34:49 +08:00
& &94 天前
好像 AMD 的 U 都会这样
& &94 天前
。。。那不是 AMD 就不能装 mac 虚拟机了。。。
& &94 天前
MAC 本来就非常难于安装虚拟机,因为苹果官方完全不支持也不想被做成虚拟机。AMD 的 CPU 直接安装黑苹果都有很大困难,更不要说虚拟机了。。。。
& &94 天前 via Android
amd64 的 U 不被苹果支持,用 Intel64 的 CPU。
& &94 天前 via Android
这就是我不用 AMD 的原因
& &94 天前
你可能需要用打了 AMD cpu patch 的 macOS 镜像试一试
& &94 天前
吓得我把 1700X 的订单取消了… 兼容性果然不行…
& &94 天前 via Android
楼上不知道用过 amd 装黑苹果没有,本人黑苹果新手,R,网上找几个资源都能装只是有些小毛病。现在用 10.13 基本完美。
& &94 天前 via Android
解决办法是换 intel
& &94 天前 via Android
ryzen 装黑苹果很容易,还用虚拟机的怕是
& &94 天前 via Android
ryzen 装黑苹果已经挺容易的了,而且也基本完美吧,还用虚拟机的怕是特殊需求吧
& &94 天前
@ 我感觉黑苹果折腾更加麻烦?之前搜索过一次觉得麻烦才想的装虚拟机,之前是一直用的 intel 的 cpu 装的虚拟机
& &94 天前
@ 为了性价比。。。。而且主要不是为了苹果开发,公司有 mac,只是想家里也把环境配起,有时候想用的时候可以用
& &93 天前
@ 有资源教程么?可否发一份?
& &93 天前
@ 那就装 os x 吧 虽然不看好 ryzen 但是似乎还是可以装的
& &93 天前
AMD 虚拟机是要比黑苹果难的,成功率不高。不过有部分 AMD 的老 U 是可以虚拟机安装成功的。
& &93 天前
@ T.T 下次试试, 我之前认知一直是虚拟机比黑苹果好装一些。不用找驱动
& &93 天前
黑蘋果比較靠譜,硬件都支持
& &93 天前
& &93 天前
@ 黑果虚拟机很卡的,建议还是别折腾了
& &93 天前 via Android
@ intel64 那是安腾,Intel 的 cpu 用的也是 amd64 的 ISA。
& &93 天前 via Android
@ ,视频介绍里面带链接。有个专门研究 amd 黑苹果的网站 .
& &93 天前
@ 哈哈,兄弟很心细呀,intel64 确实是安腾,已经淘汰了。。。
& &93 天前
@ #21
安腾的是叫做 IA64 和 IA32,Intel 从 AMD 那里拿到 amd64 后改名叫做 intel 64。其他厂商为了表示公正才用的 x64 或者 x86-64 的。具体的可以看这里
& &93 天前
这就是我不用 AMD 的原因
& · & 3057 人在线 & 最高记录 3541 & · &
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.0 · 76ms · UTC 06:01 · PVG 14:01 · LAX 23:01 · JFK 02:01? Do have faith in what you're doing.只需一步,快速开始
查看: 39730|回复: 425
全网首个真教程——Intel 100/200系列主板破解8系CPU正确姿势
TA的每日心情擦汗 16:28
新玩家您好,马上注册,结交更多好友,享用更多功能!
才可以下载或查看,没有帐号?
全网首个真教程——Intel 100/200系列主板破解8系CPU正确姿势
前言:本帖仅限于给有一定动手能力的人群,新手请绕道。本操作有一定危险性,XiaoFeng不负任何责任。本帖为本人的自己折腾的经验,转载需要得到本人同意且说明出处,本帖为SMXDiy所有。
本来XiaoFeng不玩任何“X”系列以外的平台的。受网友的鼓励,决定研究一下,首先需要感谢群友的支持(排名不分先后,名称多余符号已经去除):本群一霸、小花恸、飞天/zt、Canon~控、Sa、艾德希、& & 、病毒、白纸、清风、左手倒影、逆运霸天、pypypypypy、OS、晓风之恋、风光无限、Johnny、zerozerone、null。感谢你们的帮助!群友资助虽少,也是一份心意,XiaoFeng贴钱来完成此项工作。在CPU到货前,Canon~控(E5 V3破解多电压模块作者)说过他很早之前测试过换ME和微码(比传说中“初中大佬”更早),功能并不是十分正常,本着认真负责态度,一直没有发出来。还有听说什么初中“大佬”破解,去看了,并不知道讲的什么,有什么意义,换ME和微码是很常见的事情,其他可以看看XiaoFeng改的BIOS,哪个修改版BIOS没改ME和微码?那换的什么版本的ME没有明说,什么版本的微码。根据以往经验,换ME和微码,能点亮一个平台并不是难事,难的是该这么去修复,一些不能使用的东西。像X79完善微码,B0步进的ES CPU在新BIOS中也可以点亮,但NVME即会失效,如何修复就困难重重。我不否认那位玩家的研究精神,更换微码和ME能顺利点亮是他第一个发帖子的,毕竟是没有太多经验的人,摸索到这一步已经很值得鼓励了,同时也希望他能再接再厉,摸索出更好的东西来。但网络上就吹起来了,这让我想不明白,不就是更换ME和微码而已,这是改BIOS的常态,值得大张旗鼓宣传么?而且“初三大佬”的帖子,改个ME和微码,说明帖子为原创,帖子里还说追究法律责任,这个修改工具是你发明的不成?不过,各大媒体盗用图片,的确是不厚道,这个可以自己保护一下。至于修复,本帖子,会修复显卡和集显等一系列问题,这应该耳目一新了吧?本帖才是真正的教程,绝不盗图。CPU到货后,XiaoFeng花了1天时间来研究这个BIOS的修改,目前,破解工作已经达到90%,i3 8350K已经可以顺利的在Z170上运行,可以正常超频、开启XMP、使用集成显卡、使用独立显卡(美中不足的是只能使用副卡槽,主卡槽不能使用。值得一提的是,ASROCK主板在本破解,就可以全部完美,全部功能正常)。当然,本于不能忘本的精神,修改过的BIOS依然完美支持7系CPU的使用。本破解需要用到编程器来进行BIOS刷入。.
大家好,我是XiaoFeng,本期带来的教程贴是Intel 100/200系列主板破解8系列CPU的操作,本期的破解很需要有一定的动手能力,能不能玩,需要大家自己拿捏了。本教程尽量减少操作步骤,有许多步骤XiaoFeng已经给大家做了,详情见附件包,步骤精简,可能很多人看不懂,XiaoFeng只能尽量给大家说明清楚。
由于步骤精简了,本期只用到两个软件,MMTOOL、UEFITOOL。解压出来的文件如图所示(所有图片点击可以看大图):
001.jpg (6.07 KB, 下载次数: 45)
17:51 上传
准备好自己的BIOS文件,本教程以华硕Z170M-PLUS主板为例。
002.jpg (29.53 KB, 下载次数: 9)
17:51 上传
打开UEFITOOL,选择File,点击Open image file…打开要修改的ROM,如图所示:
003.jpg (39.65 KB, 下载次数: 3)
17:51 上传
展开AMI Aptio capsule,展开Intel image,即可看见ME region,如图所示:
004.jpg (48.6 KB, 下载次数: 4)
17:51 上传
右击ME region,选择Replace as is…,如图所示:
005.jpg (48.06 KB, 下载次数: 1)
17:51 上传
如果是ME大小特殊的主板,右侧的ME版本只要在11.6到11.7,可以不用替换。如果BIOS是11.8版本的ME固件,请下载该主板旧版的BIOS进行修改或者从相同系列主板提取。
选择模块文件文件夹里面的ME文件夹的ME1-11.7.0.1229.rgn文件(共享包有两个ME文件,一个2.5MB,一个2MB,大家需要自行辨认自己主板ME的大小),如图所示:
006.jpg (109.21 KB, 下载次数: 7)
13:47 上传
更换好后,如图所示:
007.jpg (49.01 KB, 下载次数: 10)
17:51 上传
按Ctrl+F键,出现如下窗口,如图所示:
008.jpg (54.84 KB, 下载次数: 2)
17:51 上传
选择GUID选择卡,如图所示:
009.jpg (55.93 KB, 下载次数: 1)
17:51 上传
输入F-44EF-8F4E-B09FFF46A070,如图所示:
010.jpg (56.68 KB, 下载次数: 1)
17:51 上传
搜索到三个结果,这样我们只需要修改后两个结果即可。如果是MSI等厂商的主板,可能只搜索到两个结果,那么只需要修改最后一个结果。如果是华擎等主板,只有一条结果,那么只用修改一条结果。如图所示:
011.jpg (67.31 KB, 下载次数: 5)
17:51 上传
双击第二个结果,即可跳转至该模块所在位置,如图所示:
012.jpg (99.89 KB, 下载次数: 3)
17:51 上传
右击上方窗口的F-44EF-8F4E-B09FFF46A070,弹出菜单,选择Replace body…,如图所示:
013.jpg (99.49 KB, 下载次数: 1)
17:51 上传
选择模块文件文件夹里面的MC文件夹里面的F-44EF-8F4E-B09FFF46A070.raw文件,如图所示:
014.jpg (51.71 KB, 下载次数: 4)
17:51 上传
更换好后,如图所示:
015.jpg (106.87 KB, 下载次数: 5)
17:51 上传
同样的道理,双击第三个结果,即可跳转至第三个的模块,如图所示:
016.jpg (105.54 KB, 下载次数: 4)
17:51 上传
同样的方法更换这个模块,如图所示:
017.jpg (108.29 KB, 下载次数: 4)
17:52 上传
如果做好的BIOS点不亮机器或者是华擎的主板,下面带&&*&&号部分,可以不做。华擎主板外,其他主板请先尝试更换,点不亮再取消这一步,大家请多做尝试。新版软件包已经取消了这个模块,需要的朋友可以到“历史版本”文件夹寻找旧版软件包,或者从同品牌相近板型的Z370的BIOS中提取。
* Ctrl+F调出搜索,GUID搜索502B04F3-71AB-47B4-BEAE-AA4,如图所示:
018.jpg (99.65 KB, 下载次数: 2)
17:52 上传
* 双击搜索结果,跳转到502B04F3-71AB-47B4-BEAE-AA4,如图所示:
019.jpg (117.75 KB, 下载次数: 1)
17:52 上传
* 用上面相同方法更换为模块文件文件夹的PCI文件夹的502B04F3-71AB-47B4-BEAE-AA4.bin,如图所示:
020.jpg (52.48 KB, 下载次数: 5)
17:52 上传
* 更换好后,如图所示:
021.jpg (115.05 KB, 下载次数: 1)
17:52 上传
根据翼王所述,已经提供不同品牌GPU修复文件。下面介绍的模块请根据不同品牌在“GPU”文件夹寻找自己的品牌的GOP模块(380B6B4F--A6D3-61D)和VBIOS模块(C5A4306E-E247-4ECD-A9D8-5B1985D3DCDA)。
Ctrl+F调出搜索,GUID搜索380B6B4F--A6D3-61D,如图所示:
022.jpg (106.08 KB, 下载次数: 1)
17:52 上传
双击搜索结果,跳转至380B6B4F--A6D3-61D,如图所示:
023.jpg (115.65 KB, 下载次数: 2)
17:52 上传
用上面相同方法更换为模块文件文件夹的GPU文件夹的380B6B4F--A6D3-61D.bin,如图所示:
024.jpg (55.23 KB, 下载次数: 1)
17:52 上传
更换好后,如图所示:
025.jpg (117.74 KB, 下载次数: 3)
17:52 上传
接着我们直接修改下面一个模块C5A4306E-E247-4ECD-A9D8-5B1985D3DCDA,如图所示:
026.jpg (118.65 KB, 下载次数: 3)
17:52 上传
用上面相同方法更换为模块文件文件夹的GPU文件夹的C5A4306E-E247-4ECD-A9D8-5B1985D3DCDA.bin,如图所示:
027.jpg (55.17 KB, 下载次数: 1)
17:52 上传
更换好后,如图所示:
028.jpg (119.41 KB, 下载次数: 2)
17:52 上传
点击File选择卡,选择Save image file…,如图所示:
029.jpg (112.89 KB, 下载次数: 1)
17:52 上传
保存修改好的BIOS,XiaoFeng就不覆盖原BIOS了,加了个2号标记,如图所示:
030.jpg (56.51 KB, 下载次数: 5)
17:52 上传
保存后会提示是否打开新的BIOS,点击Yes后即可关闭UEFITOOL了,如图所示:
031.jpg (116.1 KB, 下载次数: 1)
17:52 上传
打开MMTOOL这款软件,打开修改好的BIOS文件,如图所示:
032.jpg (67.5 KB, 下载次数: 4)
17:52 上传
打开BIOS文件后,点击CPU补丁选择卡看看是否已经拥有06E3、06E9、06EB、06EA四个微码,如图所示:
033.jpg (62.53 KB, 下载次数: 8)
17:52 上传
点击另存映像为…,保存为编程器可以识别的ROM格式,如图所示:
034.jpg (61.7 KB, 下载次数: 2)
17:52 上传
出现对话框保存无法通过校验的CAP BIOS,点击确定后即可关闭,如图所示:
035.jpg (53.61 KB, 下载次数: 2)
17:52 上传
现在有的文件,如图所示:
036.jpg (11.88 KB, 下载次数: 2)
17:52 上传
用编程器(每个编程器的软件不同,下面以优硕的编程器为例)打开刚刚修改好的ROM格式的BIOS文件,如图所示:
037.jpg (125.52 KB, 下载次数: 2)
17:52 上传
开始自动烧录,如图所示:
038.jpg (136.77 KB, 下载次数: 3)
17:52 上传
烧录完成啦,如图所示:
039.jpg (147.39 KB, 下载次数: 1)
17:52 上传
下面就是上机时间
XiaoFeng的测试平台是:
CPU:Intel Core i3 8350K @4.0GHz
主板:华硕 Z170M-PLUS
内存:芝奇 Ripjaws V 3200MHz x4
显卡:华硕 EAH6850 DC/2DIS/1GD5(修改支持UEFI)
SSD:三星 PM951 128GB NVME
电源:长城 巨龙 1250W
如图所示:
040.jpg (347.65 KB, 下载次数: 0)
17:52 上传
万事俱备,开机点亮,如图所示:
041.jpg (267.47 KB, 下载次数: 0)
17:52 上传
很好,i3 8350K成功在Z170平台点亮啦,下面是XiaoFeng的超频图:
042.jpg (264.3 KB, 下载次数: 1)
17:52 上传
写在最后:
经过修改,Z170主板确实可以点亮8系列CPU,目前破解工作已经达到90%,可以正常超频、开启XMP、使用集成显卡、使用独立显卡(美中不足的是部分主板只能使用副卡槽,主卡槽不能使用,ASROCK主板可以完美),不过日常使用已经完全足够,相信日后能完善BIOS的破解。通过本次教程,相信大家也可以掌握修改技巧,欢迎有能力的朋友也来试试。最后给大家放几张XiaoFeng的测试图,谢谢大家的支持!
043.jpg (320.4 KB, 下载次数: 0)
17:52 上传
044.jpg (241.54 KB, 下载次数: 0)
17:52 上传
045.jpg (266.93 KB, 下载次数: 0)
17:52 上传
软件包下载地址:
游客,如果您要查看本帖隐藏内容请游客,如果您要查看本帖隐藏内容请
反馈和提问的朋友,请到付费群和免费群,谢谢支持。
TA的每日心情擦汗 16:28
沙发自留,等待修改
TA的每日心情萌哒 20:18
我顶 我顶 我顶顶顶
TA的每日心情开心 23:30
感谢分享。。
TA的每日心情擦汗 21:29
TA的每日心情开心 18:46
过来占个座位,学习下,xiaofeng确实是高手中的高手。
TA的每日心情开心 22:39
支持xiaofeng大神!
该用户从未签到
支持xiaofeng大神!
TA的每日心情无聊半小时前
谢谢大神,闲置的板子有用武之地了
TA的每日心情无聊 22:36
大神,膜拜了·····JavaScript 运行机制详解:再谈Event Loop - 阮一峰的网络日志
JavaScript 运行机制详解:再谈Event Loop
一年前,我写了一篇,谈了我对Event Loop的理解。
上个月,我偶然看到了Philip Roberts的演讲。这才尴尬地发现,自己的理解是错的。我决定重写这个题目,详细、完整、正确地描述JavaScript引擎的内部运行机制。下面就是我的重写。
进入正文之前,插播一条消息。我的新书出版了(,,),铜版纸全彩印刷,非常精美,还附有索引(当然价格也比同类书籍略贵一点点)。预览和购买点击。
(日更新:本文已经做了较大修改,反映了我现在的认识。关于setTimeout的更多解释和示例,请参阅我正在写的。)
(日更新:朴灵老师对本文做了,详细得指出了文中存在的错误说法,建议阅读。)
一、为什么JavaScript是单线程?
JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊。
JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?
所以,为了避免复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征,将来也不会改变。
为了利用多核CPU的计算能力,HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得操作DOM。所以,这个新标准并没有改变JavaScript单线程的本质。
二、任务队列
单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。
如果排队是因为计算量大,CPU忙不过来,倒也算了,但是很多时候CPU是闲着的,因为IO设备(输入输出设备)很慢(比如Ajax操作从网络读取数据),不得不等着结果出来,再往下执行。
JavaScript语言的设计者意识到,这时主线程完全可以不管IO设备,挂起处于等待中的任务,先运行排在后面的任务。等到IO设备返回了结果,再回过头,把挂起的任务继续执行下去。
于是,所有任务可以分成两种,一种是同步任务(synchronous),另一种是异步任务(asynchronous)。同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。
具体来说,异步执行的运行机制如下。(同步执行也是如此,因为它可以被视为没有异步任务的异步执行。)
(1)所有同步任务都在主线程上执行,形成一个(execution context stack)。
(2)主线程之外,还存在一个"任务队列"(task
queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
(3)一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
(4)主线程不断重复上面的第三步。
下图就是主线程和任务队列的示意图。
只要主线程空了,就会去读取"任务队列",这就是JavaScript的运行机制。这个过程会不断重复。
三、事件和回调函数
"任务队列"是一个事件的队列(也可以理解成消息的队列),IO设备完成一项任务,就在"任务队列"中添加一个事件,表示相关的异步任务可以进入"执行栈"了。主线程读取"任务队列",就是读取里面有哪些事件。
"任务队列"中的事件,除了IO设备的事件以外,还包括一些用户产生的事件(比如鼠标点击、页面滚动等等)。只要指定过回调函数,这些事件发生时就会进入"任务队列",等待主线程读取。
所谓"回调函数"(callback),就是那些会被主线程挂起来的代码。异步任务必须指定回调函数,当主线程开始执行异步任务,就是执行对应的回调函数。
"任务队列"是一个先进先出的数据结构,排在前面的事件,优先被主线程读取。主线程的读取过程基本上是自动的,只要执行栈一清空,"任务队列"上第一位的事件就自动进入主线程。但是,由于存在后文提到的"定时器"功能,主线程首先要检查一下执行时间,某些事件只有到了规定的时间,才能返回主线程。
四、Event Loop
主线程从"任务队列"中读取事件,这个过程是循环不断的,所以整个的这种运行机制又称为Event Loop(事件循环)。
为了更好地理解Event Loop,请看下图(转引自Philip Roberts的演讲)。
上图中,主线程运行的时候,产生堆(heap)和栈(stack),栈中的代码调用各种外部API,它们在"任务队列"中加入各种事件(click,load,done)。只要栈中的代码执行完毕,主线程就会去读取"任务队列",依次执行那些事件所对应的回调函数。
执行栈中的代码(同步任务),总是在读取"任务队列"(异步任务)之前执行。请看下面这个例子。
var req = new XMLHttpRequest();
req.open('GET', url);
req.onload = function (){};
req.onerror = function (){};
req.send();
上面代码中的req.send方法是Ajax操作向服务器发送数据,它是一个异步任务,意味着只有当前脚本的所有代码执行完,系统才会去读取"任务队列"。所以,它与下面的写法等价。
var req = new XMLHttpRequest();
req.open('GET', url);
req.send();
req.onload = function (){};
req.onerror = function (){};
也就是说,指定回调函数的部分(onload和onerror),在send()方法的前面或后面无关紧要,因为它们属于执行栈的一部分,系统总是执行完它们,才会去读取"任务队列"。
五、定时器
除了放置异步任务的事件,"任务队列"还可以放置定时事件,即指定某些代码在多少时间之后执行。这叫做"定时器"(timer)功能,也就是定时执行的代码。
定时器功能主要由setTimeout()和setInterval()这两个函数来完成,它们的内部运行机制完全一样,区别在于前者指定的代码是一次性执行,后者则为反复执行。以下主要讨论setTimeout()。
setTimeout()接受两个参数,第一个是回调函数,第二个是推迟执行的毫秒数。
console.log(1);
setTimeout(function(){console.log(2);},1000);
console.log(3);
上面代码的执行结果是1,3,2,因为setTimeout()将第二行推迟到1000毫秒之后执行。
如果将setTimeout()的第二个参数设为0,就表示当前代码执行完(执行栈清空)以后,立即执行(0毫秒间隔)指定的回调函数。
setTimeout(function(){console.log(1);}, 0);
console.log(2);
上面代码的执行结果总是2,1,因为只有在执行完第二行以后,系统才会去执行"任务队列"中的回调函数。
总之,setTimeout(fn,0)的含义是,指定某个任务在主线程最早可得的空闲时间执行,也就是说,尽可能早得执行。它在"任务队列"的尾部添加一个事件,因此要等到同步任务和"任务队列"现有的事件都处理完,才会得到执行。
HTML5标准规定了setTimeout()的第二个参数的最小值(最短间隔),不得低于4毫秒,如果低于这个值,就会自动增加。在此之前,老版本的浏览器都将最短间隔设为10毫秒。另外,对于那些DOM的变动(尤其是涉及页面重新渲染的部分),通常不会立即执行,而是每16毫秒执行一次。这时使用requestAnimationFrame()的效果要好于setTimeout()。
需要注意的是,setTimeout()只是将事件插入了"任务队列",必须等到当前代码(执行栈)执行完,主线程才会去执行它指定的回调函数。要是当前代码耗时很长,有可能要等很久,所以并没有办法保证,回调函数一定会在setTimeout()指定的时间执行。
六、Node.js的Event Loop
Node.js也是单线程的Event Loop,但是它的运行机制不同于浏览器环境。
请看下面的示意图(作者)。
根据上图,Node.js的运行机制如下。
(1)V8引擎解析JavaScript脚本。
(2)解析后的代码,调用Node API。
(3)负责Node
API的执行。它将不同的任务分配给不同的线程,形成一个Event Loop(事件循环),以异步的方式将任务的执行结果返回给V8引擎。
(4)V8引擎再将结果返回给用户。
除了setTimeout和setInterval这两个方法,Node.js还提供了另外两个与"任务队列"有关的方法:和。它们可以帮助我们加深对"任务队列"的理解。
process.nextTick方法可以在当前"执行栈"的尾部----下一次Event Loop(主线程读取"任务队列")之前----触发回调函数。也就是说,它指定的任务总是发生在所有异步任务之前。setImmediate方法则是在当前"任务队列"的尾部添加事件,也就是说,它指定的任务总是在下一次Event Loop时执行,这与setTimeout(fn, 0)很像。请看下面的例子(via )。
process.nextTick(function A() {
console.log(1);
process.nextTick(function B(){console.log(2);});
setTimeout(function timeout() {
console.log('TIMEOUT FIRED');
// TIMEOUT FIRED
上面代码中,由于process.nextTick方法指定的回调函数,总是在当前"执行栈"的尾部触发,所以不仅函数A比setTimeout指定的回调函数timeout先执行,而且函数B也比timeout先执行。这说明,如果有多个process.nextTick语句(不管它们是否嵌套),将全部在当前"执行栈"执行。
现在,再看setImmediate。
setImmediate(function A() {
console.log(1);
setImmediate(function B(){console.log(2);});
setTimeout(function timeout() {
console.log('TIMEOUT FIRED');
上面代码中,setImmediate与setTimeout(fn,0)各自添加了一个回调函数A和timeout,都是在下一次Event Loop触发。那么,哪个回调函数先执行呢?答案是不确定。运行结果可能是1--TIMEOUT FIRED--2,也可能是TIMEOUT FIRED--1--2。
令人困惑的是,Node.js文档中称,setImmediate指定的回调函数,总是排在setTimeout前面。实际上,这种情况只发生在递归调用的时候。
setImmediate(function (){
setImmediate(function A() {
console.log(1);
setImmediate(function B(){console.log(2);});
setTimeout(function timeout() {
console.log('TIMEOUT FIRED');
// TIMEOUT FIRED
上面代码中,setImmediate和setTimeout被封装在一个setImmediate里面,它的运行结果总是1--TIMEOUT FIRED--2,这时函数A一定在timeout前面触发。至于2排在TIMEOUT FIRED的后面(即函数B在timeout后面触发),是因为setImmediate总是将事件注册到下一轮Event Loop,所以函数A和timeout是在同一轮Loop执行,而函数B在下一轮Loop执行。
我们由此得到了process.nextTick和setImmediate的一个重要区别:多个process.nextTick语句总是在当前"执行栈"一次执行完,多个setImmediate可能则需要多次loop才能执行完。事实上,这正是Node.js 10.0版添加setImmediate方法的原因,否则像下面这样的递归调用process.nextTick,将会没完没了,主线程根本不会去读取"事件队列"!
process.nextTick(function foo() {
process.nextTick(foo);
事实上,现在要是你写出递归的process.nextTick,Node.js会抛出一个警告,要求你改成setImmediate。
另外,由于process.nextTick指定的回调函数是在本次"事件循环"触发,而setImmediate指定的是在下次"事件循环"触发,所以很显然,前者总是比后者发生得早,而且执行效率也高(因为不用检查"任务队列")。
JavaScript 程序越来越复杂,调试工具的重要性日益凸显。客户端脚本有浏览器,Node 脚本怎么调试呢?
JavaScript 是单线程运行,异步操作特别重要。
2017年6月,TC39 委员会正式发布了《ES2017 标准》。
Web 技术突飞猛进,但是有一个领域一直无法突破 ---- 游戏。}

我要回帖

更多关于 模拟人生4女装大佬 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信