Go SYSCALL

本文基于Go 1.13。
Golang runtime库有一套完全基于用户态的协程(goroutine)调度框架。为了配合协程调度框架,提升系统调用时的并发性能,Go对SYSCALL调用机制进行了封装。
通常一个系统调用,在类platform OS上都会进行地址空间的切换,这相当于一个大型的Context Switch,先不论具体是哪个SYSCALL,即使这样一次Context Switch的损耗也是很大的。所以Go的SYSCALL机制,利用了操作系统的并行计算(parallelism)来缓和这一开销,而将其对并发的损害降低。

TEXT ·Syscall(SB),NOSPLIT,$0-28
	BL	runtime·entersyscall(SB)
	...
	SWI	$0
	...
	BL	runtime·exitsyscall(SB)

Syscall总接口定义在操作系统相关的文件。Linux平台是go/src/syscall/asm_linux_arm.s
Go框架在真正的进内核调用系统调用前后进行接管,插入了配合调度的代码。

entersyscall

假设调用Syscall之前,GPM运行的状态如下图:

PM解绑

当调用了Syscall以后,进入entersyscall,P和M会解绑,变成下面这张图:

这张图不是很准确,当M1和P解绑时,M2并没有立即上位,P处于_Psyscall状态。P是否与新的M绑定由sysmon这个特殊M来完成。后面sysmon一节会专门介绍。

	pp := _g_.m.p.ptr()
	pp.m = 0
	_g_.m.oldp.set(pp)
	_g_.m.p = 0

此时原先的P被记入了m.oldp,未来会用到。

exitsyscall

当系统调用结束以后,调用Syscall的G需要归位

PHN2ZyBpZD0iZG1xZ2ppdWNrMXYiIHdpZHRoPSIxMDAlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXgtd2lkdGg6IDM0Mi44OTA2MjVweDsiIHZpZXdCb3g9IjAgMCAzNDIuODkwNjI1IDMyNy40MDYyNSI+PHN0eWxlPgoKCiNkbXFnaml1Y2sxdiAubGFiZWwgewogIGZvbnQtZmFtaWx5OiAndHJlYnVjaGV0IG1zJywgdmVyZGFuYSwgYXJpYWw7CiAgY29sb3I6ICMzMzM7IH0KCiNkbXFnaml1Y2sxdiAubm9kZSByZWN0LAojZG1xZ2ppdWNrMXYgLm5vZGUgY2lyY2xlLAojZG1xZ2ppdWNrMXYgLm5vZGUgZWxsaXBzZSwKI2RtcWdqaXVjazF2IC5ub2RlIHBvbHlnb24gewogIGZpbGw6ICNFQ0VDRkY7CiAgc3Ryb2tlOiAjOTM3MERCOwogIHN0cm9rZS13aWR0aDogMXB4OyB9CgojZG1xZ2ppdWNrMXYgLm5vZGUuY2xpY2thYmxlIHsKICBjdXJzb3I6IHBvaW50ZXI7IH0KCiNkbXFnaml1Y2sxdiAuYXJyb3doZWFkUGF0aCB7CiAgZmlsbDogIzMzMzMzMzsgfQoKI2RtcWdqaXVjazF2IC5lZGdlUGF0aCAucGF0aCB7CiAgc3Ryb2tlOiAjMzMzMzMzOwogIHN0cm9rZS13aWR0aDogMS41cHg7IH0KCiNkbXFnaml1Y2sxdiAuZWRnZUxhYmVsIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZThlOGU4OyB9CgojZG1xZ2ppdWNrMXYgLmNsdXN0ZXIgcmVjdCB7CiAgZmlsbDogI2ZmZmZkZSAhaW1wb3J0YW50OwogIHN0cm9rZTogI2FhYWEzMyAhaW1wb3J0YW50OwogIHN0cm9rZS13aWR0aDogMXB4ICFpbXBvcnRhbnQ7IH0KCiNkbXFnaml1Y2sxdiAuY2x1c3RlciB0ZXh0IHsKICBmaWxsOiAjMzMzOyB9CgojZG1xZ2ppdWNrMXYgZGl2Lm1lcm1haWRUb29sdGlwIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIG1heC13aWR0aDogMjAwcHg7CiAgcGFkZGluZzogMnB4OwogIGZvbnQtZmFtaWx5OiAndHJlYnVjaGV0IG1zJywgdmVyZGFuYSwgYXJpYWw7CiAgZm9udC1zaXplOiAxMnB4OwogIGJhY2tncm91bmQ6ICNmZmZmZGU7CiAgYm9yZGVyOiAxcHggc29saWQgI2FhYWEzMzsKICBib3JkZXItcmFkaXVzOiAycHg7CiAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgei1pbmRleDogMTAwOyB9CgojZG1xZ2ppdWNrMXYgLmFjdG9yIHsKICBzdHJva2U6ICNDQ0NDRkY7CiAgZmlsbDogI0VDRUNGRjsgfQoKI2RtcWdqaXVjazF2IHRleHQuYWN0b3IgewogIGZpbGw6IGJsYWNrOwogIHN0cm9rZTogbm9uZTsgfQoKI2RtcWdqaXVjazF2IC5hY3Rvci1saW5lIHsKICBzdHJva2U6IGdyZXk7IH0KCiNkbXFnaml1Y2sxdiAubWVzc2FnZUxpbmUwIHsKICBzdHJva2Utd2lkdGg6IDEuNTsKICBzdHJva2UtZGFzaGFycmF5OiAnMiAyJzsKICBzdHJva2U6ICMzMzM7IH0KCiNkbXFnaml1Y2sxdiAubWVzc2FnZUxpbmUxIHsKICBzdHJva2Utd2lkdGg6IDEuNTsKICBzdHJva2UtZGFzaGFycmF5OiAnMiAyJzsKICBzdHJva2U6ICMzMzM7IH0KCiNkbXFnaml1Y2sxdiAjYXJyb3doZWFkIHsKICBmaWxsOiAjMzMzOyB9CgojZG1xZ2ppdWNrMXYgI2Nyb3NzaGVhZCBwYXRoIHsKICBmaWxsOiAjMzMzICFpbXBvcnRhbnQ7CiAgc3Ryb2tlOiAjMzMzICFpbXBvcnRhbnQ7IH0KCiNkbXFnaml1Y2sxdiAubWVzc2FnZVRleHQgewogIGZpbGw6ICMzMzM7CiAgc3Ryb2tlOiBub25lOyB9CgojZG1xZ2ppdWNrMXYgLmxhYmVsQm94IHsKICBzdHJva2U6ICNDQ0NDRkY7CiAgZmlsbDogI0VDRUNGRjsgfQoKI2RtcWdqaXVjazF2IC5sYWJlbFRleHQgewogIGZpbGw6IGJsYWNrOwogIHN0cm9rZTogbm9uZTsgfQoKI2RtcWdqaXVjazF2IC5sb29wVGV4dCB7CiAgZmlsbDogYmxhY2s7CiAgc3Ryb2tlOiBub25lOyB9CgojZG1xZ2ppdWNrMXYgLmxvb3BMaW5lIHsKICBzdHJva2Utd2lkdGg6IDI7CiAgc3Ryb2tlLWRhc2hhcnJheTogJzIgMic7CiAgc3Ryb2tlOiAjQ0NDQ0ZGOyB9CgojZG1xZ2ppdWNrMXYgLm5vdGUgewogIHN0cm9rZTogI2FhYWEzMzsKICBmaWxsOiAjZmZmNWFkOyB9CgojZG1xZ2ppdWNrMXYgLm5vdGVUZXh0IHsKICBmaWxsOiBibGFjazsKICBzdHJva2U6IG5vbmU7CiAgZm9udC1mYW1pbHk6ICd0cmVidWNoZXQgbXMnLCB2ZXJkYW5hLCBhcmlhbDsKICBmb250LXNpemU6IDE0cHg7IH0KCiNkbXFnaml1Y2sxdiAuYWN0aXZhdGlvbjAgewogIGZpbGw6ICNmNGY0ZjQ7CiAgc3Ryb2tlOiAjNjY2OyB9CgojZG1xZ2ppdWNrMXYgLmFjdGl2YXRpb24xIHsKICBmaWxsOiAjZjRmNGY0OwogIHN0cm9rZTogIzY2NjsgfQoKI2RtcWdqaXVjazF2IC5hY3RpdmF0aW9uMiB7CiAgZmlsbDogI2Y0ZjRmNDsKICBzdHJva2U6ICM2NjY7IH0KCgojZG1xZ2ppdWNrMXYgLnNlY3Rpb24gewogIHN0cm9rZTogbm9uZTsKICBvcGFjaXR5OiAwLjI7IH0KCiNkbXFnaml1Y2sxdiAuc2VjdGlvbjAgewogIGZpbGw6IHJnYmEoMTAyLCAxMDIsIDI1NSwgMC40OSk7IH0KCiNkbXFnaml1Y2sxdiAuc2VjdGlvbjIgewogIGZpbGw6ICNmZmY0MDA7IH0KCiNkbXFnaml1Y2sxdiAuc2VjdGlvbjEsCiNkbXFnaml1Y2sxdiAuc2VjdGlvbjMgewogIGZpbGw6IHdoaXRlOwogIG9wYWNpdHk6IDAuMjsgfQoKI2RtcWdqaXVjazF2IC5zZWN0aW9uVGl0bGUwIHsKICBmaWxsOiAjMzMzOyB9CgojZG1xZ2ppdWNrMXYgLnNlY3Rpb25UaXRsZTEgewogIGZpbGw6ICMzMzM7IH0KCiNkbXFnaml1Y2sxdiAuc2VjdGlvblRpdGxlMiB7CiAgZmlsbDogIzMzMzsgfQoKI2RtcWdqaXVjazF2IC5zZWN0aW9uVGl0bGUzIHsKICBmaWxsOiAjMzMzOyB9CgojZG1xZ2ppdWNrMXYgLnNlY3Rpb25UaXRsZSB7CiAgdGV4dC1hbmNob3I6IHN0YXJ0OwogIGZvbnQtc2l6ZTogMTFweDsKICB0ZXh0LWhlaWdodDogMTRweDsgfQoKCiNkbXFnaml1Y2sxdiAuZ3JpZCAudGljayB7CiAgc3Ryb2tlOiBsaWdodGdyZXk7CiAgb3BhY2l0eTogMC4zOwogIHNoYXBlLXJlbmRlcmluZzogY3Jpc3BFZGdlczsgfQoKI2RtcWdqaXVjazF2IC5ncmlkIHBhdGggewogIHN0cm9rZS13aWR0aDogMDsgfQoKCiNkbXFnaml1Y2sxdiAudG9kYXkgewogIGZpbGw6IG5vbmU7CiAgc3Ryb2tlOiByZWQ7CiAgc3Ryb2tlLXdpZHRoOiAycHg7IH0KCgoKI2RtcWdqaXVjazF2IC50YXNrIHsKICBzdHJva2Utd2lkdGg6IDI7IH0KCiNkbXFnaml1Y2sxdiAudGFza1RleHQgewogIHRleHQtYW5jaG9yOiBtaWRkbGU7CiAgZm9udC1zaXplOiAxMXB4OyB9CgojZG1xZ2ppdWNrMXYgLnRhc2tUZXh0T3V0c2lkZVJpZ2h0IHsKICBmaWxsOiBibGFjazsKICB0ZXh0LWFuY2hvcjogc3RhcnQ7CiAgZm9udC1zaXplOiAxMXB4OyB9CgojZG1xZ2ppdWNrMXYgLnRhc2tUZXh0T3V0c2lkZUxlZnQgewogIGZpbGw6IGJsYWNrOwogIHRleHQtYW5jaG9yOiBlbmQ7CiAgZm9udC1zaXplOiAxMXB4OyB9CgoKI2RtcWdqaXVjazF2IC50YXNrVGV4dDAsCiNkbXFnaml1Y2sxdiAudGFza1RleHQxLAojZG1xZ2ppdWNrMXYgLnRhc2tUZXh0MiwKI2RtcWdqaXVjazF2IC50YXNrVGV4dDMgewogIGZpbGw6IHdoaXRlOyB9CgojZG1xZ2ppdWNrMXYgLnRhc2swLAojZG1xZ2ppdWNrMXYgLnRhc2sxLAojZG1xZ2ppdWNrMXYgLnRhc2syLAojZG1xZ2ppdWNrMXYgLnRhc2szIHsKICBmaWxsOiAjOGE5MGRkOwogIHN0cm9rZTogIzUzNGZiYzsgfQoKI2RtcWdqaXVjazF2IC50YXNrVGV4dE91dHNpZGUwLAojZG1xZ2ppdWNrMXYgLnRhc2tUZXh0T3V0c2lkZTIgewogIGZpbGw6IGJsYWNrOyB9CgojZG1xZ2ppdWNrMXYgLnRhc2tUZXh0T3V0c2lkZTEsCiNkbXFnaml1Y2sxdiAudGFza1RleHRPdXRzaWRlMyB7CiAgZmlsbDogYmxhY2s7IH0KCgojZG1xZ2ppdWNrMXYgLmFjdGl2ZTAsCiNkbXFnaml1Y2sxdiAuYWN0aXZlMSwKI2RtcWdqaXVjazF2IC5hY3RpdmUyLAojZG1xZ2ppdWNrMXYgLmFjdGl2ZTMgewogIGZpbGw6ICNiZmM3ZmY7CiAgc3Ryb2tlOiAjNTM0ZmJjOyB9CgojZG1xZ2ppdWNrMXYgLmFjdGl2ZVRleHQwLAojZG1xZ2ppdWNrMXYgLmFjdGl2ZVRleHQxLAojZG1xZ2ppdWNrMXYgLmFjdGl2ZVRleHQyLAojZG1xZ2ppdWNrMXYgLmFjdGl2ZVRleHQzIHsKICBmaWxsOiBibGFjayAhaW1wb3J0YW50OyB9CgoKI2RtcWdqaXVjazF2IC5kb25lMCwKI2RtcWdqaXVjazF2IC5kb25lMSwKI2RtcWdqaXVjazF2IC5kb25lMiwKI2RtcWdqaXVjazF2IC5kb25lMyB7CiAgc3Ryb2tlOiBncmV5OwogIGZpbGw6IGxpZ2h0Z3JleTsKICBzdHJva2Utd2lkdGg6IDI7IH0KCiNkbXFnaml1Y2sxdiAuZG9uZVRleHQwLAojZG1xZ2ppdWNrMXYgLmRvbmVUZXh0MSwKI2RtcWdqaXVjazF2IC5kb25lVGV4dDIsCiNkbXFnaml1Y2sxdiAuZG9uZVRleHQzIHsKICBmaWxsOiBibGFjayAhaW1wb3J0YW50OyB9CgoKI2RtcWdqaXVjazF2IC5jcml0MCwKI2RtcWdqaXVjazF2IC5jcml0MSwKI2RtcWdqaXVjazF2IC5jcml0MiwKI2RtcWdqaXVjazF2IC5jcml0MyB7CiAgc3Ryb2tlOiAjZmY4ODg4OwogIGZpbGw6IHJlZDsKICBzdHJva2Utd2lkdGg6IDI7IH0KCiNkbXFnaml1Y2sxdiAuYWN0aXZlQ3JpdDAsCiNkbXFnaml1Y2sxdiAuYWN0aXZlQ3JpdDEsCiNkbXFnaml1Y2sxdiAuYWN0aXZlQ3JpdDIsCiNkbXFnaml1Y2sxdiAuYWN0aXZlQ3JpdDMgewogIHN0cm9rZTogI2ZmODg4ODsKICBmaWxsOiAjYmZjN2ZmOwogIHN0cm9rZS13aWR0aDogMjsgfQoKI2RtcWdqaXVjazF2IC5kb25lQ3JpdDAsCiNkbXFnaml1Y2sxdiAuZG9uZUNyaXQxLAojZG1xZ2ppdWNrMXYgLmRvbmVDcml0MiwKI2RtcWdqaXVjazF2IC5kb25lQ3JpdDMgewogIHN0cm9rZTogI2ZmODg4ODsKICBmaWxsOiBsaWdodGdyZXk7CiAgc3Ryb2tlLXdpZHRoOiAyOwogIGN1cnNvcjogcG9pbnRlcjsKICBzaGFwZS1yZW5kZXJpbmc6IGNyaXNwRWRnZXM7IH0KCiNkbXFnaml1Y2sxdiAuZG9uZUNyaXRUZXh0MCwKI2RtcWdqaXVjazF2IC5kb25lQ3JpdFRleHQxLAojZG1xZ2ppdWNrMXYgLmRvbmVDcml0VGV4dDIsCiNkbXFnaml1Y2sxdiAuZG9uZUNyaXRUZXh0MyB7CiAgZmlsbDogYmxhY2sgIWltcG9ydGFudDsgfQoKI2RtcWdqaXVjazF2IC5hY3RpdmVDcml0VGV4dDAsCiNkbXFnaml1Y2sxdiAuYWN0aXZlQ3JpdFRleHQxLAojZG1xZ2ppdWNrMXYgLmFjdGl2ZUNyaXRUZXh0MiwKI2RtcWdqaXVjazF2IC5hY3RpdmVDcml0VGV4dDMgewogIGZpbGw6IGJsYWNrICFpbXBvcnRhbnQ7IH0KCiNkbXFnaml1Y2sxdiAudGl0bGVUZXh0IHsKICB0ZXh0LWFuY2hvcjogbWlkZGxlOwogIGZvbnQtc2l6ZTogMThweDsKICBmaWxsOiBibGFjazsgfQoKI2RtcWdqaXVjazF2IGcuY2xhc3NHcm91cCB0ZXh0IHsKICBmaWxsOiAjOTM3MERCOwogIHN0cm9rZTogbm9uZTsKICBmb250LWZhbWlseTogJ3RyZWJ1Y2hldCBtcycsIHZlcmRhbmEsIGFyaWFsOwogIGZvbnQtc2l6ZTogMTBweDsgfQoKI2RtcWdqaXVjazF2IGcuY2xhc3NHcm91cCByZWN0IHsKICBmaWxsOiAjRUNFQ0ZGOwogIHN0cm9rZTogIzkzNzBEQjsgfQoKI2RtcWdqaXVjazF2IGcuY2xhc3NHcm91cCBsaW5lIHsKICBzdHJva2U6ICM5MzcwREI7CiAgc3Ryb2tlLXdpZHRoOiAxOyB9CgojZG1xZ2ppdWNrMXYgLmNsYXNzTGFiZWwgLmJveCB7CiAgc3Ryb2tlOiBub25lOwogIHN0cm9rZS13aWR0aDogMDsKICBmaWxsOiAjRUNFQ0ZGOwogIG9wYWNpdHk6IDAuNTsgfQoKI2RtcWdqaXVjazF2IC5jbGFzc0xhYmVsIC5sYWJlbCB7CiAgZmlsbDogIzkzNzBEQjsKICBmb250LXNpemU6IDEwcHg7IH0KCiNkbXFnaml1Y2sxdiAucmVsYXRpb24gewogIHN0cm9rZTogIzkzNzBEQjsKICBzdHJva2Utd2lkdGg6IDE7CiAgZmlsbDogbm9uZTsgfQoKI2RtcWdqaXVjazF2ICNjb21wb3NpdGlvblN0YXJ0IHsKICBmaWxsOiAjOTM3MERCOwogIHN0cm9rZTogIzkzNzBEQjsKICBzdHJva2Utd2lkdGg6IDE7IH0KCiNkbXFnaml1Y2sxdiAjY29tcG9zaXRpb25FbmQgewogIGZpbGw6ICM5MzcwREI7CiAgc3Ryb2tlOiAjOTM3MERCOwogIHN0cm9rZS13aWR0aDogMTsgfQoKI2RtcWdqaXVjazF2ICNhZ2dyZWdhdGlvblN0YXJ0IHsKICBmaWxsOiAjRUNFQ0ZGOwogIHN0cm9rZTogIzkzNzBEQjsKICBzdHJva2Utd2lkdGg6IDE7IH0KCiNkbXFnaml1Y2sxdiAjYWdncmVnYXRpb25FbmQgewogIGZpbGw6ICNFQ0VDRkY7CiAgc3Ryb2tlOiAjOTM3MERCOwogIHN0cm9rZS13aWR0aDogMTsgfQoKI2RtcWdqaXVjazF2ICNkZXBlbmRlbmN5U3RhcnQgewogIGZpbGw6ICM5MzcwREI7CiAgc3Ryb2tlOiAjOTM3MERCOwogIHN0cm9rZS13aWR0aDogMTsgfQoKI2RtcWdqaXVjazF2ICNkZXBlbmRlbmN5RW5kIHsKICBmaWxsOiAjOTM3MERCOwogIHN0cm9rZTogIzkzNzBEQjsKICBzdHJva2Utd2lkdGg6IDE7IH0KCiNkbXFnaml1Y2sxdiAjZXh0ZW5zaW9uU3RhcnQgewogIGZpbGw6ICM5MzcwREI7CiAgc3Ryb2tlOiAjOTM3MERCOwogIHN0cm9rZS13aWR0aDogMTsgfQoKI2RtcWdqaXVjazF2ICNleHRlbnNpb25FbmQgewogIGZpbGw6ICM5MzcwREI7CiAgc3Ryb2tlOiAjOTM3MERCOwogIHN0cm9rZS13aWR0aDogMTsgfQoKI2RtcWdqaXVjazF2IC5jb21taXQtaWQsCiNkbXFnaml1Y2sxdiAuY29tbWl0LW1zZywKI2RtcWdqaXVjazF2IC5icmFuY2gtbGFiZWwgewogIGZpbGw6IGxpZ2h0Z3JleTsKICBjb2xvcjogbGlnaHRncmV5OyB9CgoKCiNkbXFnaml1Y2sxdiAubGFiZWx7CiAgY29sb3I6IzE4QjE0RTsKfQojZG1xZ2ppdWNrMXYgLnRlLW1kLWNvbnRhaW5lci0tZGFyayAubm9kZSByZWN0IHsKICBmaWxsOiByZWQ7Cn0KCiNkbXFnaml1Y2sxdiAubm9kZSByZWN0LAojZG1xZ2ppdWNrMXYgLm5vZGUgY2lyY2xlLAojZG1xZ2ppdWNrMXYgLm5vZGUgZWxsaXBzZSwKI2RtcWdqaXVjazF2IC5ub2RlIHBvbHlnb24gewogIGZpbGw6ICNGOUZGRkI7OwogIHN0cm9rZTogIzJEQkQ2MDsKICBzdHJva2Utd2lkdGg6IDEuNXB4Owp9CiNkbXFnaml1Y2sxdiAuYXJyb3doZWFkUGF0aHsKICBmaWxsOiAjMkRCRDYwOwp9CiNkbXFnaml1Y2sxdiAuZWRnZVBhdGggLnBhdGggewogIHN0cm9rZTogIzJEQkQ2MDsKICBzdHJva2Utd2lkdGg6IDFweDsKfQojZG1xZ2ppdWNrMXYgLmVkZ2VMYWJlbCB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKfQojZG1xZ2ppdWNrMXYgLmNsdXN0ZXIgcmVjdCB7CiAgZmlsbDogI0Y5RkZGQiAhaW1wb3J0YW50OwogIHN0cm9rZTogIzJEQkQ2MCAhaW1wb3J0YW50OwogIHN0cm9rZS13aWR0aDogMXB4ICFpbXBvcnRhbnQ7Cn0KCiNkbXFnaml1Y2sxdiAuY2x1c3RlciB0ZXh0IHsKICBmaWxsOiAjRjlGRkZCOwp9CgojZG1xZ2ppdWNrMXYgZGl2Lm1lcm1haWRUb29sdGlwIHsKICBiYWNrZ3JvdW5kOiAjRjlGRkZCOwogIGJvcmRlcjogMXB4IHNvbGlkICMyREJENjA7Cn0KCgojZG1xZ2ppdWNrMXYgLmFjdG9yIHsKICBzdHJva2U6ICMyREJENjA7CiAgZmlsbDogI0Y5RkZGQjsKfQoKI2RtcWdqaXVjazF2IHRleHQuYWN0b3IgewogIGZpbGw6ICMyREJENjA7CiAgc3Ryb2tlOiBub25lOwp9CgojZG1xZ2ppdWNrMXYgLmFjdG9yLWxpbmUgewogIHN0cm9rZTogIzJEQkQ2MDsKfQoKI2RtcWdqaXVjazF2IC5tZXNzYWdlTGluZTAgewogIHN0cm9rZS13aWR0aDogMS41OwogIHN0cm9rZS1kYXNoYXJyYXk6ICcyIDInOwogIG1hcmtlci1lbmQ6ICd1cmwoI2Fycm93aGVhZCknOwogIHN0cm9rZTogIzJEQkQ2MDsKfQoKI2RtcWdqaXVjazF2IC5tZXNzYWdlTGluZTEgewogIHN0cm9rZS13aWR0aDogMS41OwogIHN0cm9rZS1kYXNoYXJyYXk6ICcyIDInOwogIHN0cm9rZTogIzJEQkQ2MDsKfQoKI2RtcWdqaXVjazF2ICNhcnJvd2hlYWQgewogIGZpbGw6ICMyREJENjA7Cn0KCiNkbXFnaml1Y2sxdiAjY3Jvc3NoZWFkIHBhdGggewogIGZpbGw6ICMyREJENjAgIWltcG9ydGFudDsKICBzdHJva2U6ICMyREJENjAgIWltcG9ydGFudDsKfQoKI2RtcWdqaXVjazF2IC5tZXNzYWdlVGV4dCB7CiAgZmlsbDogIzJEQkQ2MDsKICBzdHJva2U6IG5vbmU7Cn0KCiNkbXFnaml1Y2sxdiAubGFiZWxCb3ggewogIHN0cm9rZTogIzJEQkQ2MDsKICBmaWxsOiAjRjlGRkZCOwp9CgojZG1xZ2ppdWNrMXYgLmxhYmVsVGV4dCB7CiAgZmlsbDogIzJEQkQ2MDsKICBzdHJva2U6ICMyREJENjA7Cn0KCiNkbXFnaml1Y2sxdiAubG9vcFRleHQgewogIGZpbGw6ICMyREJENjA7CiAgc3Ryb2tlOiAjMkRCRDYwOwp9CgojZG1xZ2ppdWNrMXYgLmxvb3BMaW5lIHsKICBzdHJva2Utd2lkdGg6IDI7CiAgc3Ryb2tlLWRhc2hhcnJheTogJzIgMic7CiAgbWFya2VyLWVuZDogJ3VybCgjYXJyb3doZWFkKSc7CiAgc3Ryb2tlOiAjMkRCRDYwOwp9CgojZG1xZ2ppdWNrMXYgLm5vdGUgewogIHN0cm9rZTogIzJEQkQ2MDsKICBmaWxsOiAjRjlGRkZCOwp9CgojZG1xZ2ppdWNrMXYgLm5vdGVUZXh0IHsKICBmaWxsOiAjMkRCRDYwOwogIHN0cm9rZTogIzJEQkQ2MDsKfQoKCiNkbXFnaml1Y2sxdiAuc2VjdGlvbnsKICBvcGFjaXR5OjE7Cn0KI2RtcWdqaXVjazF2IC5zZWN0aW9uMCwjZG1xZ2ppdWNrMXYgIC5zZWN0aW9uMiB7CiAgZmlsbDogI0VDRjdGMDsKfQoKI2RtcWdqaXVjazF2IC5zZWN0aW9uMSwKI2RtcWdqaXVjazF2IC5zZWN0aW9uMyB7CiAgZmlsbDogI0ZGRjsKfQojZG1xZ2ppdWNrMXYgLnRhc2tUZXh0MCwKI2RtcWdqaXVjazF2IC50YXNrVGV4dDEsCiNkbXFnaml1Y2sxdiAudGFza1RleHQyLAojZG1xZ2ppdWNrMXYgLnRhc2tUZXh0MyB7CiAgZmlsbDogI2ZmZjsKfQoKI2RtcWdqaXVjazF2IC50YXNrMCwKI2RtcWdqaXVjazF2IC50YXNrMSwKI2RtcWdqaXVjazF2IC50YXNrMiwKI2RtcWdqaXVjazF2IC50YXNrMyB7CiAgZmlsbDogIzJEQkQ2MDsKICBzdHJva2U6ICMzNTlGNUE7Cn0KPC9zdHlsZT48c3R5bGU+I2RtcWdqaXVjazF2IHsKICAgIGNvbG9yOiByZ2IoMjQ0LCAyNDQsIDI0NCk7CiAgICBmb250OiBub3JtYWwgbm9ybWFsIG5vcm1hbCBub3JtYWwgMTRweC8yMi4zOTk5OTk2MTg1MzAyNzNweCBtb25vc3BhY2U7CiAgfTwvc3R5bGU+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEyLCAtMTIpIj48ZyBjbGFzcz0ib3V0cHV0Ij48ZyBjbGFzcz0iY2x1c3RlcnMiPjwvZz48ZyBjbGFzcz0iZWRnZVBhdGhzIj48ZyBjbGFzcz0iZWRnZVBhdGgiIHN0eWxlPSJvcGFjaXR5OiAxOyI+PHBhdGggY2xhc3M9InBhdGgiIGQ9Ik0yMDguMTUyMzQzNzUsNTYuMjgxMjVMMjA4LjE1MjM0Mzc1LDgxLjI4MTI1TDIwOC4xNTIzNDM3NSwxMDYuMjgxMjUiIG1hcmtlci1lbmQ9InVybCgjYXJyb3doZWFkMTY1MykiIHN0eWxlPSJzdHJva2U6ICMzMzM7IHN0cm9rZS13aWR0aDogMS41cHg7ZmlsbDpub25lIj48L3BhdGg+PGRlZnM+PG1hcmtlciBpZD0iYXJyb3doZWFkMTY1MyIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI5IiByZWZZPSI1IiBtYXJrZXJVbml0cz0ic3Ryb2tlV2lkdGgiIG1hcmtlcldpZHRoPSI4IiBtYXJrZXJIZWlnaHQ9IjYiIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTSAwIDAgTCAxMCA1IEwgMCAxMCB6IiBjbGFzcz0iYXJyb3doZWFkUGF0aCIgc3R5bGU9InN0cm9rZS13aWR0aDogMXB4OyBzdHJva2UtZGFzaGFycmF5OiAxcHgsIDBweDsiPjwvcGF0aD48L21hcmtlcj48L2RlZnM+PC9nPjxnIGNsYXNzPSJlZGdlUGF0aCIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48cGF0aCBjbGFzcz0icGF0aCIgZD0iTTE3NC44MjEyOTQ0MTg0MTg2MywxNDIuNTYyNUwxMTMuOTI5Njg3NSwxNzUuNzAzMTI1TDExMy45Mjk2ODc1LDIwOC44NDM3NSIgbWFya2VyLWVuZD0idXJsKCNhcnJvd2hlYWQxNjU0KSIgc3R5bGU9InN0cm9rZTogIzMzMzsgc3Ryb2tlLXdpZHRoOiAxLjVweDtmaWxsOm5vbmUiPjwvcGF0aD48ZGVmcz48bWFya2VyIGlkPSJhcnJvd2hlYWQxNjU0IiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlclVuaXRzPSJzdHJva2VXaWR0aCIgbWFya2VyV2lkdGg9IjgiIG1hcmtlckhlaWdodD0iNiIgb3JpZW50PSJhdXRvIj48cGF0aCBkPSJNIDAgMCBMIDEwIDUgTCAwIDEwIHoiIGNsYXNzPSJhcnJvd2hlYWRQYXRoIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxcHg7IHN0cm9rZS1kYXNoYXJyYXk6IDFweCwgMHB4OyI+PC9wYXRoPjwvbWFya2VyPjwvZGVmcz48L2c+PGcgY2xhc3M9ImVkZ2VQYXRoIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxwYXRoIGNsYXNzPSJwYXRoIiBkPSJNMjQxLjQ4MzM5MzA4MTU4MTM3LDE0Mi41NjI1TDMwMi4zNzUsMTc1LjcwMzEyNUwzMDIuMzc1LDIwOC44NDM3NSIgbWFya2VyLWVuZD0idXJsKCNhcnJvd2hlYWQxNjU1KSIgc3R5bGU9InN0cm9rZTogIzMzMzsgc3Ryb2tlLXdpZHRoOiAxLjVweDtmaWxsOm5vbmUiPjwvcGF0aD48ZGVmcz48bWFya2VyIGlkPSJhcnJvd2hlYWQxNjU1IiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlclVuaXRzPSJzdHJva2VXaWR0aCIgbWFya2VyV2lkdGg9IjgiIG1hcmtlckhlaWdodD0iNiIgb3JpZW50PSJhdXRvIj48cGF0aCBkPSJNIDAgMCBMIDEwIDUgTCAwIDEwIHoiIGNsYXNzPSJhcnJvd2hlYWRQYXRoIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxcHg7IHN0cm9rZS1kYXNoYXJyYXk6IDFweCwgMHB4OyI+PC9wYXRoPjwvbWFya2VyPjwvZGVmcz48L2c+PGcgY2xhc3M9ImVkZ2VQYXRoIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxwYXRoIGNsYXNzPSJwYXRoIiBkPSJNMTEzLjkyOTY4NzUsMjQ1LjEyNUwxMTMuOTI5Njg3NSwyNzAuMTI1TDE3OS4yMTQ4NDM3NSwzMDAuMDE2MzUwNTA4ODkyNyIgbWFya2VyLWVuZD0idXJsKCNhcnJvd2hlYWQxNjU2KSIgc3R5bGU9InN0cm9rZTogIzMzMzsgc3Ryb2tlLXdpZHRoOiAxLjVweDtmaWxsOm5vbmUiPjwvcGF0aD48ZGVmcz48bWFya2VyIGlkPSJhcnJvd2hlYWQxNjU2IiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlclVuaXRzPSJzdHJva2VXaWR0aCIgbWFya2VyV2lkdGg9IjgiIG1hcmtlckhlaWdodD0iNiIgb3JpZW50PSJhdXRvIj48cGF0aCBkPSJNIDAgMCBMIDEwIDUgTCAwIDEwIHoiIGNsYXNzPSJhcnJvd2hlYWRQYXRoIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxcHg7IHN0cm9rZS1kYXNoYXJyYXk6IDFweCwgMHB4OyI+PC9wYXRoPjwvbWFya2VyPjwvZGVmcz48L2c+PGcgY2xhc3M9ImVkZ2VQYXRoIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxwYXRoIGNsYXNzPSJwYXRoIiBkPSJNMzAyLjM3NSwyNDUuMTI1TDMwMi4zNzUsMjcwLjEyNUwyMzcuMDg5ODQzNzUsMzAwLjAxNjM1MDUwODg5MjciIG1hcmtlci1lbmQ9InVybCgjYXJyb3doZWFkMTY1NykiIHN0eWxlPSJzdHJva2U6ICMzMzM7IHN0cm9rZS13aWR0aDogMS41cHg7ZmlsbDpub25lIj48L3BhdGg+PGRlZnM+PG1hcmtlciBpZD0iYXJyb3doZWFkMTY1NyIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI5IiByZWZZPSI1IiBtYXJrZXJVbml0cz0ic3Ryb2tlV2lkdGgiIG1hcmtlcldpZHRoPSI4IiBtYXJrZXJIZWlnaHQ9IjYiIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTSAwIDAgTCAxMCA1IEwgMCAxMCB6IiBjbGFzcz0iYXJyb3doZWFkUGF0aCIgc3R5bGU9InN0cm9rZS13aWR0aDogMXB4OyBzdHJva2UtZGFzaGFycmF5OiAxcHgsIDBweDsiPjwvcGF0aD48L21hcmtlcj48L2RlZnM+PC9nPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVscyI+PGcgY2xhc3M9ImVkZ2VMYWJlbCIgdHJhbnNmb3JtPSIiIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSIgY2xhc3M9ImxhYmVsIj48cmVjdCByeD0iMCIgcnk9IjAiIHdpZHRoPSIwIiBoZWlnaHQ9IjAiIHN0eWxlPSJmaWxsOiNlOGU4ZTg7Ij48L3JlY3Q+PHRleHQ+PHRzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGR5PSIxZW0iIHg9IjEiPjwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTEzLjkyOTY4NzUsMTc1LjcwMzEyNSkiIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI4LjUwNzgxMjUsLTguMDA3ODEyNSkiIGNsYXNzPSJsYWJlbCI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB3aWR0aD0iNDQuNDIxODc1IiBoZWlnaHQ9IjE2LjI5Njg3NSIgc3R5bGU9ImZpbGw6I2U4ZThlODsiPjwvcmVjdD48dGV4dD48dHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZHk9IjFlbSIgeD0iMSI+c3VjY2VzczwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzAyLjM3NSwxNzUuNzAzMTI1KSIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTYuMzU5Mzc1LC04LjAwNzgxMjUpIiBjbGFzcz0ibGFiZWwiPjxyZWN0IHJ4PSIwIiByeT0iMCIgd2lkdGg9IjE5Ljc4MTI1IiBoZWlnaHQ9IjE2LjI5Njg3NSIgc3R5bGU9ImZpbGw6I2U4ZThlODsiPjwvcmVjdD48dGV4dD48dHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZHk9IjFlbSIgeD0iMSI+ZmFpbDwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCIgdHJhbnNmb3JtPSIiIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSIgY2xhc3M9ImxhYmVsIj48cmVjdCByeD0iMCIgcnk9IjAiIHdpZHRoPSIwIiBoZWlnaHQ9IjAiIHN0eWxlPSJmaWxsOiNlOGU4ZTg7Ij48L3JlY3Q+PHRleHQ+PHRzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGR5PSIxZW0iIHg9IjEiPjwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCIgdHJhbnNmb3JtPSIiIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSIgY2xhc3M9ImxhYmVsIj48cmVjdCByeD0iMCIgcnk9IjAiIHdpZHRoPSIwIiBoZWlnaHQ9IjAiIHN0eWxlPSJmaWxsOiNlOGU4ZTg7Ij48L3JlY3Q+PHRleHQ+PHRzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGR5PSIxZW0iIHg9IjEiPjwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PC9nPjxnIGNsYXNzPSJub2RlcyI+PGcgY2xhc3M9Im5vZGUiIGlkPSJBIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMDguMTUyMzQzNzUsMzguMTQwNjI1KSIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48cmVjdCByeD0iMCIgcnk9IjAiIHg9Ii00MC45OTIxODc1IiB5PSItMTguMTQwNjI1IiB3aWR0aD0iODEuOTg0Mzc1IiBoZWlnaHQ9IjM2LjI4MTI1Ij48L3JlY3Q+PGcgY2xhc3M9ImxhYmVsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDApIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzAuOTkyMTg3NSwtOC4xNDA2MjUpIj48dGV4dD48dHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZHk9IjFlbSIgeD0iMSI+ZXhpdHN5c2NhbGw8L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48ZyBjbGFzcz0ibm9kZSIgaWQ9IkIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIwOC4xNTIzNDM3NSwxMjQuNDIxODc1KSIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48cmVjdCByeD0iMCIgcnk9IjAiIHg9Ii01Mi4yNjU2MjUiIHk9Ii0xOC4xNDA2MjUiIHdpZHRoPSIxMDQuNTMxMjUiIGhlaWdodD0iMzYuMjgxMjUiPjwvcmVjdD48ZyBjbGFzcz0ibGFiZWwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC00Mi4yNjU2MjUsLTguMTQwNjI1KSI+PHRleHQ+PHRzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGR5PSIxZW0iIHg9IjEiPmV4aXRzeXNjYWxsZmFzdDwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PC9nPjxnIGNsYXNzPSJub2RlIiBpZD0iQyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTEzLjkyOTY4NzUsMjI2Ljk4NDM3NSkiIHN0eWxlPSJvcGFjaXR5OiAxOyI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB4PSItOTMuOTI5Njg3NSIgeT0iLTE4LjE0MDYyNSIgd2lkdGg9IjE4Ny44NTkzNzUiIGhlaWdodD0iMzYuMjgxMjUiPjwvcmVjdD48ZyBjbGFzcz0ibGFiZWwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC04My45Mjk2ODc1LC04LjE0MDYyNSkiPjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj5fZ186IF9Hc3lzY2FsbCA9Jmd0OyBfR3J1bm5pbmc8L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48ZyBjbGFzcz0ibm9kZSIgaWQ9IkQiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDMwMi4zNzUsMjI2Ljk4NDM3NSkiIHN0eWxlPSJvcGFjaXR5OiAxOyI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB4PSItNDQuNTE1NjI1IiB5PSItMTguMTQwNjI1IiB3aWR0aD0iODkuMDMxMjUiIGhlaWdodD0iMzYuMjgxMjUiPjwvcmVjdD48ZyBjbGFzcz0ibGFiZWwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0zNC41MTU2MjUsLTguMTQwNjI1KSI+PHRleHQ+PHRzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGR5PSIxZW0iIHg9IjEiPmV4aXRzeXNjYWxsMDwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PC9nPjxnIGNsYXNzPSJub2RlIiBpZD0iRSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjA4LjE1MjM0Mzc1LDMxMy4yNjU2MjUpIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxyZWN0IHJ4PSIwIiByeT0iMCIgeD0iLTI4LjkzNzUiIHk9Ii0xOC4xNDA2MjUiIHdpZHRoPSI1Ny44NzUiIGhlaWdodD0iMzYuMjgxMjUiPjwvcmVjdD48ZyBjbGFzcz0ibGFiZWwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xOC45Mzc1LC04LjE0MDYyNSkiPjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj5yZXR1cm48L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48L2c+PC9nPjwvZz48L3N2Zz4=

这其中涉及两个重要函数:

  • exitsyscallfast
  • exitsyscall0

exitsyscallfast

该函数会尝试先绑定oldp,如果不成功,会在尝试其他idlep。M绑定P使用wirep函数。
如果P,M绑定成功,那么G是不需要切换任何队列,G会继续运行。
如果无法绑定,则会停止M,并找到地方放置G。这一过程在exitsyscall0。

exitsyscall0

PHN2ZyBpZD0iZHF5emhzenN2N2giIHdpZHRoPSIxMDAlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXgtd2lkdGg6IDMxNC4xNzE4NzVweDsiIHZpZXdCb3g9IjAgMCAzMTQuMTcxODc1IDU4Ni4yNSI+PHN0eWxlPgoKCiNkcXl6aHN6c3Y3aCAubGFiZWwgewogIGZvbnQtZmFtaWx5OiAndHJlYnVjaGV0IG1zJywgdmVyZGFuYSwgYXJpYWw7CiAgY29sb3I6ICMzMzM7IH0KCiNkcXl6aHN6c3Y3aCAubm9kZSByZWN0LAojZHF5emhzenN2N2ggLm5vZGUgY2lyY2xlLAojZHF5emhzenN2N2ggLm5vZGUgZWxsaXBzZSwKI2RxeXpoc3pzdjdoIC5ub2RlIHBvbHlnb24gewogIGZpbGw6ICNFQ0VDRkY7CiAgc3Ryb2tlOiAjOTM3MERCOwogIHN0cm9rZS13aWR0aDogMXB4OyB9CgojZHF5emhzenN2N2ggLm5vZGUuY2xpY2thYmxlIHsKICBjdXJzb3I6IHBvaW50ZXI7IH0KCiNkcXl6aHN6c3Y3aCAuYXJyb3doZWFkUGF0aCB7CiAgZmlsbDogIzMzMzMzMzsgfQoKI2RxeXpoc3pzdjdoIC5lZGdlUGF0aCAucGF0aCB7CiAgc3Ryb2tlOiAjMzMzMzMzOwogIHN0cm9rZS13aWR0aDogMS41cHg7IH0KCiNkcXl6aHN6c3Y3aCAuZWRnZUxhYmVsIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZThlOGU4OyB9CgojZHF5emhzenN2N2ggLmNsdXN0ZXIgcmVjdCB7CiAgZmlsbDogI2ZmZmZkZSAhaW1wb3J0YW50OwogIHN0cm9rZTogI2FhYWEzMyAhaW1wb3J0YW50OwogIHN0cm9rZS13aWR0aDogMXB4ICFpbXBvcnRhbnQ7IH0KCiNkcXl6aHN6c3Y3aCAuY2x1c3RlciB0ZXh0IHsKICBmaWxsOiAjMzMzOyB9CgojZHF5emhzenN2N2ggZGl2Lm1lcm1haWRUb29sdGlwIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIG1heC13aWR0aDogMjAwcHg7CiAgcGFkZGluZzogMnB4OwogIGZvbnQtZmFtaWx5OiAndHJlYnVjaGV0IG1zJywgdmVyZGFuYSwgYXJpYWw7CiAgZm9udC1zaXplOiAxMnB4OwogIGJhY2tncm91bmQ6ICNmZmZmZGU7CiAgYm9yZGVyOiAxcHggc29saWQgI2FhYWEzMzsKICBib3JkZXItcmFkaXVzOiAycHg7CiAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgei1pbmRleDogMTAwOyB9CgojZHF5emhzenN2N2ggLmFjdG9yIHsKICBzdHJva2U6ICNDQ0NDRkY7CiAgZmlsbDogI0VDRUNGRjsgfQoKI2RxeXpoc3pzdjdoIHRleHQuYWN0b3IgewogIGZpbGw6IGJsYWNrOwogIHN0cm9rZTogbm9uZTsgfQoKI2RxeXpoc3pzdjdoIC5hY3Rvci1saW5lIHsKICBzdHJva2U6IGdyZXk7IH0KCiNkcXl6aHN6c3Y3aCAubWVzc2FnZUxpbmUwIHsKICBzdHJva2Utd2lkdGg6IDEuNTsKICBzdHJva2UtZGFzaGFycmF5OiAnMiAyJzsKICBzdHJva2U6ICMzMzM7IH0KCiNkcXl6aHN6c3Y3aCAubWVzc2FnZUxpbmUxIHsKICBzdHJva2Utd2lkdGg6IDEuNTsKICBzdHJva2UtZGFzaGFycmF5OiAnMiAyJzsKICBzdHJva2U6ICMzMzM7IH0KCiNkcXl6aHN6c3Y3aCAjYXJyb3doZWFkIHsKICBmaWxsOiAjMzMzOyB9CgojZHF5emhzenN2N2ggI2Nyb3NzaGVhZCBwYXRoIHsKICBmaWxsOiAjMzMzICFpbXBvcnRhbnQ7CiAgc3Ryb2tlOiAjMzMzICFpbXBvcnRhbnQ7IH0KCiNkcXl6aHN6c3Y3aCAubWVzc2FnZVRleHQgewogIGZpbGw6ICMzMzM7CiAgc3Ryb2tlOiBub25lOyB9CgojZHF5emhzenN2N2ggLmxhYmVsQm94IHsKICBzdHJva2U6ICNDQ0NDRkY7CiAgZmlsbDogI0VDRUNGRjsgfQoKI2RxeXpoc3pzdjdoIC5sYWJlbFRleHQgewogIGZpbGw6IGJsYWNrOwogIHN0cm9rZTogbm9uZTsgfQoKI2RxeXpoc3pzdjdoIC5sb29wVGV4dCB7CiAgZmlsbDogYmxhY2s7CiAgc3Ryb2tlOiBub25lOyB9CgojZHF5emhzenN2N2ggLmxvb3BMaW5lIHsKICBzdHJva2Utd2lkdGg6IDI7CiAgc3Ryb2tlLWRhc2hhcnJheTogJzIgMic7CiAgc3Ryb2tlOiAjQ0NDQ0ZGOyB9CgojZHF5emhzenN2N2ggLm5vdGUgewogIHN0cm9rZTogI2FhYWEzMzsKICBmaWxsOiAjZmZmNWFkOyB9CgojZHF5emhzenN2N2ggLm5vdGVUZXh0IHsKICBmaWxsOiBibGFjazsKICBzdHJva2U6IG5vbmU7CiAgZm9udC1mYW1pbHk6ICd0cmVidWNoZXQgbXMnLCB2ZXJkYW5hLCBhcmlhbDsKICBmb250LXNpemU6IDE0cHg7IH0KCiNkcXl6aHN6c3Y3aCAuYWN0aXZhdGlvbjAgewogIGZpbGw6ICNmNGY0ZjQ7CiAgc3Ryb2tlOiAjNjY2OyB9CgojZHF5emhzenN2N2ggLmFjdGl2YXRpb24xIHsKICBmaWxsOiAjZjRmNGY0OwogIHN0cm9rZTogIzY2NjsgfQoKI2RxeXpoc3pzdjdoIC5hY3RpdmF0aW9uMiB7CiAgZmlsbDogI2Y0ZjRmNDsKICBzdHJva2U6ICM2NjY7IH0KCgojZHF5emhzenN2N2ggLnNlY3Rpb24gewogIHN0cm9rZTogbm9uZTsKICBvcGFjaXR5OiAwLjI7IH0KCiNkcXl6aHN6c3Y3aCAuc2VjdGlvbjAgewogIGZpbGw6IHJnYmEoMTAyLCAxMDIsIDI1NSwgMC40OSk7IH0KCiNkcXl6aHN6c3Y3aCAuc2VjdGlvbjIgewogIGZpbGw6ICNmZmY0MDA7IH0KCiNkcXl6aHN6c3Y3aCAuc2VjdGlvbjEsCiNkcXl6aHN6c3Y3aCAuc2VjdGlvbjMgewogIGZpbGw6IHdoaXRlOwogIG9wYWNpdHk6IDAuMjsgfQoKI2RxeXpoc3pzdjdoIC5zZWN0aW9uVGl0bGUwIHsKICBmaWxsOiAjMzMzOyB9CgojZHF5emhzenN2N2ggLnNlY3Rpb25UaXRsZTEgewogIGZpbGw6ICMzMzM7IH0KCiNkcXl6aHN6c3Y3aCAuc2VjdGlvblRpdGxlMiB7CiAgZmlsbDogIzMzMzsgfQoKI2RxeXpoc3pzdjdoIC5zZWN0aW9uVGl0bGUzIHsKICBmaWxsOiAjMzMzOyB9CgojZHF5emhzenN2N2ggLnNlY3Rpb25UaXRsZSB7CiAgdGV4dC1hbmNob3I6IHN0YXJ0OwogIGZvbnQtc2l6ZTogMTFweDsKICB0ZXh0LWhlaWdodDogMTRweDsgfQoKCiNkcXl6aHN6c3Y3aCAuZ3JpZCAudGljayB7CiAgc3Ryb2tlOiBsaWdodGdyZXk7CiAgb3BhY2l0eTogMC4zOwogIHNoYXBlLXJlbmRlcmluZzogY3Jpc3BFZGdlczsgfQoKI2RxeXpoc3pzdjdoIC5ncmlkIHBhdGggewogIHN0cm9rZS13aWR0aDogMDsgfQoKCiNkcXl6aHN6c3Y3aCAudG9kYXkgewogIGZpbGw6IG5vbmU7CiAgc3Ryb2tlOiByZWQ7CiAgc3Ryb2tlLXdpZHRoOiAycHg7IH0KCgoKI2RxeXpoc3pzdjdoIC50YXNrIHsKICBzdHJva2Utd2lkdGg6IDI7IH0KCiNkcXl6aHN6c3Y3aCAudGFza1RleHQgewogIHRleHQtYW5jaG9yOiBtaWRkbGU7CiAgZm9udC1zaXplOiAxMXB4OyB9CgojZHF5emhzenN2N2ggLnRhc2tUZXh0T3V0c2lkZVJpZ2h0IHsKICBmaWxsOiBibGFjazsKICB0ZXh0LWFuY2hvcjogc3RhcnQ7CiAgZm9udC1zaXplOiAxMXB4OyB9CgojZHF5emhzenN2N2ggLnRhc2tUZXh0T3V0c2lkZUxlZnQgewogIGZpbGw6IGJsYWNrOwogIHRleHQtYW5jaG9yOiBlbmQ7CiAgZm9udC1zaXplOiAxMXB4OyB9CgoKI2RxeXpoc3pzdjdoIC50YXNrVGV4dDAsCiNkcXl6aHN6c3Y3aCAudGFza1RleHQxLAojZHF5emhzenN2N2ggLnRhc2tUZXh0MiwKI2RxeXpoc3pzdjdoIC50YXNrVGV4dDMgewogIGZpbGw6IHdoaXRlOyB9CgojZHF5emhzenN2N2ggLnRhc2swLAojZHF5emhzenN2N2ggLnRhc2sxLAojZHF5emhzenN2N2ggLnRhc2syLAojZHF5emhzenN2N2ggLnRhc2szIHsKICBmaWxsOiAjOGE5MGRkOwogIHN0cm9rZTogIzUzNGZiYzsgfQoKI2RxeXpoc3pzdjdoIC50YXNrVGV4dE91dHNpZGUwLAojZHF5emhzenN2N2ggLnRhc2tUZXh0T3V0c2lkZTIgewogIGZpbGw6IGJsYWNrOyB9CgojZHF5emhzenN2N2ggLnRhc2tUZXh0T3V0c2lkZTEsCiNkcXl6aHN6c3Y3aCAudGFza1RleHRPdXRzaWRlMyB7CiAgZmlsbDogYmxhY2s7IH0KCgojZHF5emhzenN2N2ggLmFjdGl2ZTAsCiNkcXl6aHN6c3Y3aCAuYWN0aXZlMSwKI2RxeXpoc3pzdjdoIC5hY3RpdmUyLAojZHF5emhzenN2N2ggLmFjdGl2ZTMgewogIGZpbGw6ICNiZmM3ZmY7CiAgc3Ryb2tlOiAjNTM0ZmJjOyB9CgojZHF5emhzenN2N2ggLmFjdGl2ZVRleHQwLAojZHF5emhzenN2N2ggLmFjdGl2ZVRleHQxLAojZHF5emhzenN2N2ggLmFjdGl2ZVRleHQyLAojZHF5emhzenN2N2ggLmFjdGl2ZVRleHQzIHsKICBmaWxsOiBibGFjayAhaW1wb3J0YW50OyB9CgoKI2RxeXpoc3pzdjdoIC5kb25lMCwKI2RxeXpoc3pzdjdoIC5kb25lMSwKI2RxeXpoc3pzdjdoIC5kb25lMiwKI2RxeXpoc3pzdjdoIC5kb25lMyB7CiAgc3Ryb2tlOiBncmV5OwogIGZpbGw6IGxpZ2h0Z3JleTsKICBzdHJva2Utd2lkdGg6IDI7IH0KCiNkcXl6aHN6c3Y3aCAuZG9uZVRleHQwLAojZHF5emhzenN2N2ggLmRvbmVUZXh0MSwKI2RxeXpoc3pzdjdoIC5kb25lVGV4dDIsCiNkcXl6aHN6c3Y3aCAuZG9uZVRleHQzIHsKICBmaWxsOiBibGFjayAhaW1wb3J0YW50OyB9CgoKI2RxeXpoc3pzdjdoIC5jcml0MCwKI2RxeXpoc3pzdjdoIC5jcml0MSwKI2RxeXpoc3pzdjdoIC5jcml0MiwKI2RxeXpoc3pzdjdoIC5jcml0MyB7CiAgc3Ryb2tlOiAjZmY4ODg4OwogIGZpbGw6IHJlZDsKICBzdHJva2Utd2lkdGg6IDI7IH0KCiNkcXl6aHN6c3Y3aCAuYWN0aXZlQ3JpdDAsCiNkcXl6aHN6c3Y3aCAuYWN0aXZlQ3JpdDEsCiNkcXl6aHN6c3Y3aCAuYWN0aXZlQ3JpdDIsCiNkcXl6aHN6c3Y3aCAuYWN0aXZlQ3JpdDMgewogIHN0cm9rZTogI2ZmODg4ODsKICBmaWxsOiAjYmZjN2ZmOwogIHN0cm9rZS13aWR0aDogMjsgfQoKI2RxeXpoc3pzdjdoIC5kb25lQ3JpdDAsCiNkcXl6aHN6c3Y3aCAuZG9uZUNyaXQxLAojZHF5emhzenN2N2ggLmRvbmVDcml0MiwKI2RxeXpoc3pzdjdoIC5kb25lQ3JpdDMgewogIHN0cm9rZTogI2ZmODg4ODsKICBmaWxsOiBsaWdodGdyZXk7CiAgc3Ryb2tlLXdpZHRoOiAyOwogIGN1cnNvcjogcG9pbnRlcjsKICBzaGFwZS1yZW5kZXJpbmc6IGNyaXNwRWRnZXM7IH0KCiNkcXl6aHN6c3Y3aCAuZG9uZUNyaXRUZXh0MCwKI2RxeXpoc3pzdjdoIC5kb25lQ3JpdFRleHQxLAojZHF5emhzenN2N2ggLmRvbmVDcml0VGV4dDIsCiNkcXl6aHN6c3Y3aCAuZG9uZUNyaXRUZXh0MyB7CiAgZmlsbDogYmxhY2sgIWltcG9ydGFudDsgfQoKI2RxeXpoc3pzdjdoIC5hY3RpdmVDcml0VGV4dDAsCiNkcXl6aHN6c3Y3aCAuYWN0aXZlQ3JpdFRleHQxLAojZHF5emhzenN2N2ggLmFjdGl2ZUNyaXRUZXh0MiwKI2RxeXpoc3pzdjdoIC5hY3RpdmVDcml0VGV4dDMgewogIGZpbGw6IGJsYWNrICFpbXBvcnRhbnQ7IH0KCiNkcXl6aHN6c3Y3aCAudGl0bGVUZXh0IHsKICB0ZXh0LWFuY2hvcjogbWlkZGxlOwogIGZvbnQtc2l6ZTogMThweDsKICBmaWxsOiBibGFjazsgfQoKI2RxeXpoc3pzdjdoIGcuY2xhc3NHcm91cCB0ZXh0IHsKICBmaWxsOiAjOTM3MERCOwogIHN0cm9rZTogbm9uZTsKICBmb250LWZhbWlseTogJ3RyZWJ1Y2hldCBtcycsIHZlcmRhbmEsIGFyaWFsOwogIGZvbnQtc2l6ZTogMTBweDsgfQoKI2RxeXpoc3pzdjdoIGcuY2xhc3NHcm91cCByZWN0IHsKICBmaWxsOiAjRUNFQ0ZGOwogIHN0cm9rZTogIzkzNzBEQjsgfQoKI2RxeXpoc3pzdjdoIGcuY2xhc3NHcm91cCBsaW5lIHsKICBzdHJva2U6ICM5MzcwREI7CiAgc3Ryb2tlLXdpZHRoOiAxOyB9CgojZHF5emhzenN2N2ggLmNsYXNzTGFiZWwgLmJveCB7CiAgc3Ryb2tlOiBub25lOwogIHN0cm9rZS13aWR0aDogMDsKICBmaWxsOiAjRUNFQ0ZGOwogIG9wYWNpdHk6IDAuNTsgfQoKI2RxeXpoc3pzdjdoIC5jbGFzc0xhYmVsIC5sYWJlbCB7CiAgZmlsbDogIzkzNzBEQjsKICBmb250LXNpemU6IDEwcHg7IH0KCiNkcXl6aHN6c3Y3aCAucmVsYXRpb24gewogIHN0cm9rZTogIzkzNzBEQjsKICBzdHJva2Utd2lkdGg6IDE7CiAgZmlsbDogbm9uZTsgfQoKI2RxeXpoc3pzdjdoICNjb21wb3NpdGlvblN0YXJ0IHsKICBmaWxsOiAjOTM3MERCOwogIHN0cm9rZTogIzkzNzBEQjsKICBzdHJva2Utd2lkdGg6IDE7IH0KCiNkcXl6aHN6c3Y3aCAjY29tcG9zaXRpb25FbmQgewogIGZpbGw6ICM5MzcwREI7CiAgc3Ryb2tlOiAjOTM3MERCOwogIHN0cm9rZS13aWR0aDogMTsgfQoKI2RxeXpoc3pzdjdoICNhZ2dyZWdhdGlvblN0YXJ0IHsKICBmaWxsOiAjRUNFQ0ZGOwogIHN0cm9rZTogIzkzNzBEQjsKICBzdHJva2Utd2lkdGg6IDE7IH0KCiNkcXl6aHN6c3Y3aCAjYWdncmVnYXRpb25FbmQgewogIGZpbGw6ICNFQ0VDRkY7CiAgc3Ryb2tlOiAjOTM3MERCOwogIHN0cm9rZS13aWR0aDogMTsgfQoKI2RxeXpoc3pzdjdoICNkZXBlbmRlbmN5U3RhcnQgewogIGZpbGw6ICM5MzcwREI7CiAgc3Ryb2tlOiAjOTM3MERCOwogIHN0cm9rZS13aWR0aDogMTsgfQoKI2RxeXpoc3pzdjdoICNkZXBlbmRlbmN5RW5kIHsKICBmaWxsOiAjOTM3MERCOwogIHN0cm9rZTogIzkzNzBEQjsKICBzdHJva2Utd2lkdGg6IDE7IH0KCiNkcXl6aHN6c3Y3aCAjZXh0ZW5zaW9uU3RhcnQgewogIGZpbGw6ICM5MzcwREI7CiAgc3Ryb2tlOiAjOTM3MERCOwogIHN0cm9rZS13aWR0aDogMTsgfQoKI2RxeXpoc3pzdjdoICNleHRlbnNpb25FbmQgewogIGZpbGw6ICM5MzcwREI7CiAgc3Ryb2tlOiAjOTM3MERCOwogIHN0cm9rZS13aWR0aDogMTsgfQoKI2RxeXpoc3pzdjdoIC5jb21taXQtaWQsCiNkcXl6aHN6c3Y3aCAuY29tbWl0LW1zZywKI2RxeXpoc3pzdjdoIC5icmFuY2gtbGFiZWwgewogIGZpbGw6IGxpZ2h0Z3JleTsKICBjb2xvcjogbGlnaHRncmV5OyB9CgoKCiNkcXl6aHN6c3Y3aCAubGFiZWx7CiAgY29sb3I6IzE4QjE0RTsKfQojZHF5emhzenN2N2ggLnRlLW1kLWNvbnRhaW5lci0tZGFyayAubm9kZSByZWN0IHsKICBmaWxsOiByZWQ7Cn0KCiNkcXl6aHN6c3Y3aCAubm9kZSByZWN0LAojZHF5emhzenN2N2ggLm5vZGUgY2lyY2xlLAojZHF5emhzenN2N2ggLm5vZGUgZWxsaXBzZSwKI2RxeXpoc3pzdjdoIC5ub2RlIHBvbHlnb24gewogIGZpbGw6ICNGOUZGRkI7OwogIHN0cm9rZTogIzJEQkQ2MDsKICBzdHJva2Utd2lkdGg6IDEuNXB4Owp9CiNkcXl6aHN6c3Y3aCAuYXJyb3doZWFkUGF0aHsKICBmaWxsOiAjMkRCRDYwOwp9CiNkcXl6aHN6c3Y3aCAuZWRnZVBhdGggLnBhdGggewogIHN0cm9rZTogIzJEQkQ2MDsKICBzdHJva2Utd2lkdGg6IDFweDsKfQojZHF5emhzenN2N2ggLmVkZ2VMYWJlbCB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKfQojZHF5emhzenN2N2ggLmNsdXN0ZXIgcmVjdCB7CiAgZmlsbDogI0Y5RkZGQiAhaW1wb3J0YW50OwogIHN0cm9rZTogIzJEQkQ2MCAhaW1wb3J0YW50OwogIHN0cm9rZS13aWR0aDogMXB4ICFpbXBvcnRhbnQ7Cn0KCiNkcXl6aHN6c3Y3aCAuY2x1c3RlciB0ZXh0IHsKICBmaWxsOiAjRjlGRkZCOwp9CgojZHF5emhzenN2N2ggZGl2Lm1lcm1haWRUb29sdGlwIHsKICBiYWNrZ3JvdW5kOiAjRjlGRkZCOwogIGJvcmRlcjogMXB4IHNvbGlkICMyREJENjA7Cn0KCgojZHF5emhzenN2N2ggLmFjdG9yIHsKICBzdHJva2U6ICMyREJENjA7CiAgZmlsbDogI0Y5RkZGQjsKfQoKI2RxeXpoc3pzdjdoIHRleHQuYWN0b3IgewogIGZpbGw6ICMyREJENjA7CiAgc3Ryb2tlOiBub25lOwp9CgojZHF5emhzenN2N2ggLmFjdG9yLWxpbmUgewogIHN0cm9rZTogIzJEQkQ2MDsKfQoKI2RxeXpoc3pzdjdoIC5tZXNzYWdlTGluZTAgewogIHN0cm9rZS13aWR0aDogMS41OwogIHN0cm9rZS1kYXNoYXJyYXk6ICcyIDInOwogIG1hcmtlci1lbmQ6ICd1cmwoI2Fycm93aGVhZCknOwogIHN0cm9rZTogIzJEQkQ2MDsKfQoKI2RxeXpoc3pzdjdoIC5tZXNzYWdlTGluZTEgewogIHN0cm9rZS13aWR0aDogMS41OwogIHN0cm9rZS1kYXNoYXJyYXk6ICcyIDInOwogIHN0cm9rZTogIzJEQkQ2MDsKfQoKI2RxeXpoc3pzdjdoICNhcnJvd2hlYWQgewogIGZpbGw6ICMyREJENjA7Cn0KCiNkcXl6aHN6c3Y3aCAjY3Jvc3NoZWFkIHBhdGggewogIGZpbGw6ICMyREJENjAgIWltcG9ydGFudDsKICBzdHJva2U6ICMyREJENjAgIWltcG9ydGFudDsKfQoKI2RxeXpoc3pzdjdoIC5tZXNzYWdlVGV4dCB7CiAgZmlsbDogIzJEQkQ2MDsKICBzdHJva2U6IG5vbmU7Cn0KCiNkcXl6aHN6c3Y3aCAubGFiZWxCb3ggewogIHN0cm9rZTogIzJEQkQ2MDsKICBmaWxsOiAjRjlGRkZCOwp9CgojZHF5emhzenN2N2ggLmxhYmVsVGV4dCB7CiAgZmlsbDogIzJEQkQ2MDsKICBzdHJva2U6ICMyREJENjA7Cn0KCiNkcXl6aHN6c3Y3aCAubG9vcFRleHQgewogIGZpbGw6ICMyREJENjA7CiAgc3Ryb2tlOiAjMkRCRDYwOwp9CgojZHF5emhzenN2N2ggLmxvb3BMaW5lIHsKICBzdHJva2Utd2lkdGg6IDI7CiAgc3Ryb2tlLWRhc2hhcnJheTogJzIgMic7CiAgbWFya2VyLWVuZDogJ3VybCgjYXJyb3doZWFkKSc7CiAgc3Ryb2tlOiAjMkRCRDYwOwp9CgojZHF5emhzenN2N2ggLm5vdGUgewogIHN0cm9rZTogIzJEQkQ2MDsKICBmaWxsOiAjRjlGRkZCOwp9CgojZHF5emhzenN2N2ggLm5vdGVUZXh0IHsKICBmaWxsOiAjMkRCRDYwOwogIHN0cm9rZTogIzJEQkQ2MDsKfQoKCiNkcXl6aHN6c3Y3aCAuc2VjdGlvbnsKICBvcGFjaXR5OjE7Cn0KI2RxeXpoc3pzdjdoIC5zZWN0aW9uMCwjZHF5emhzenN2N2ggIC5zZWN0aW9uMiB7CiAgZmlsbDogI0VDRjdGMDsKfQoKI2RxeXpoc3pzdjdoIC5zZWN0aW9uMSwKI2RxeXpoc3pzdjdoIC5zZWN0aW9uMyB7CiAgZmlsbDogI0ZGRjsKfQojZHF5emhzenN2N2ggLnRhc2tUZXh0MCwKI2RxeXpoc3pzdjdoIC50YXNrVGV4dDEsCiNkcXl6aHN6c3Y3aCAudGFza1RleHQyLAojZHF5emhzenN2N2ggLnRhc2tUZXh0MyB7CiAgZmlsbDogI2ZmZjsKfQoKI2RxeXpoc3pzdjdoIC50YXNrMCwKI2RxeXpoc3pzdjdoIC50YXNrMSwKI2RxeXpoc3pzdjdoIC50YXNrMiwKI2RxeXpoc3pzdjdoIC50YXNrMyB7CiAgZmlsbDogIzJEQkQ2MDsKICBzdHJva2U6ICMzNTlGNUE7Cn0KPC9zdHlsZT48c3R5bGU+I2RxeXpoc3pzdjdoIHsKICAgIGNvbG9yOiByZ2IoMjQ0LCAyNDQsIDI0NCk7CiAgICBmb250OiBub3JtYWwgbm9ybWFsIG5vcm1hbCBub3JtYWwgMTRweC8yMi4zOTk5OTk2MTg1MzAyNzNweCBtb25vc3BhY2U7CiAgfTwvc3R5bGU+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEyLCAtMTIpIj48ZyBjbGFzcz0ib3V0cHV0Ij48ZyBjbGFzcz0iY2x1c3RlcnMiPjwvZz48ZyBjbGFzcz0iZWRnZVBhdGhzIj48ZyBjbGFzcz0iZWRnZVBhdGgiIHN0eWxlPSJvcGFjaXR5OiAxOyI+PHBhdGggY2xhc3M9InBhdGgiIGQ9Ik0xNTMuNTUwNzgxMjUsNTYuMjgxMjVMMTUzLjU1MDc4MTI1LDgxLjI4MTI1TDE1My41NTA3ODEyNSwxMDYuMjgxMjUiIG1hcmtlci1lbmQ9InVybCgjYXJyb3doZWFkMTY5MykiIHN0eWxlPSJzdHJva2U6ICMzMzM7IHN0cm9rZS13aWR0aDogMS41cHg7ZmlsbDpub25lIj48L3BhdGg+PGRlZnM+PG1hcmtlciBpZD0iYXJyb3doZWFkMTY5MyIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI5IiByZWZZPSI1IiBtYXJrZXJVbml0cz0ic3Ryb2tlV2lkdGgiIG1hcmtlcldpZHRoPSI4IiBtYXJrZXJIZWlnaHQ9IjYiIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTSAwIDAgTCAxMCA1IEwgMCAxMCB6IiBjbGFzcz0iYXJyb3doZWFkUGF0aCIgc3R5bGU9InN0cm9rZS13aWR0aDogMXB4OyBzdHJva2UtZGFzaGFycmF5OiAxcHgsIDBweDsiPjwvcGF0aD48L21hcmtlcj48L2RlZnM+PC9nPjxnIGNsYXNzPSJlZGdlUGF0aCIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48cGF0aCBjbGFzcz0icGF0aCIgZD0iTTE1My41NTA3ODEyNSwxNDIuNTYyNUwxNTMuNTUwNzgxMjUsMTY3LjU2MjVMMTUzLjU1MDc4MTI1LDE5Mi41NjI1IiBtYXJrZXItZW5kPSJ1cmwoI2Fycm93aGVhZDE2OTQpIiBzdHlsZT0ic3Ryb2tlOiAjMzMzOyBzdHJva2Utd2lkdGg6IDEuNXB4O2ZpbGw6bm9uZSI+PC9wYXRoPjxkZWZzPjxtYXJrZXIgaWQ9ImFycm93aGVhZDE2OTQiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOSIgcmVmWT0iNSIgbWFya2VyVW5pdHM9InN0cm9rZVdpZHRoIiBtYXJrZXJXaWR0aD0iOCIgbWFya2VySGVpZ2h0PSI2IiBvcmllbnQ9ImF1dG8iPjxwYXRoIGQ9Ik0gMCAwIEwgMTAgNSBMIDAgMTAgeiIgY2xhc3M9ImFycm93aGVhZFBhdGgiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDFweDsgc3Ryb2tlLWRhc2hhcnJheTogMXB4LCAwcHg7Ij48L3BhdGg+PC9tYXJrZXI+PC9kZWZzPjwvZz48ZyBjbGFzcz0iZWRnZVBhdGgiIHN0eWxlPSJvcGFjaXR5OiAxOyI+PHBhdGggY2xhc3M9InBhdGgiIGQ9Ik0xNTMuNTUwNzgxMjUsMjI4Ljg0Mzc1TDE1My41NTA3ODEyNSwyNTMuODQzNzVMMTUzLjU1MDc4MTI1LDI3OC44NDM3NSIgbWFya2VyLWVuZD0idXJsKCNhcnJvd2hlYWQxNjk1KSIgc3R5bGU9InN0cm9rZTogIzMzMzsgc3Ryb2tlLXdpZHRoOiAxLjVweDtmaWxsOm5vbmUiPjwvcGF0aD48ZGVmcz48bWFya2VyIGlkPSJhcnJvd2hlYWQxNjk1IiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlclVuaXRzPSJzdHJva2VXaWR0aCIgbWFya2VyV2lkdGg9IjgiIG1hcmtlckhlaWdodD0iNiIgb3JpZW50PSJhdXRvIj48cGF0aCBkPSJNIDAgMCBMIDEwIDUgTCAwIDEwIHoiIGNsYXNzPSJhcnJvd2hlYWRQYXRoIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxcHg7IHN0cm9rZS1kYXNoYXJyYXk6IDFweCwgMHB4OyI+PC9wYXRoPjwvbWFya2VyPjwvZGVmcz48L2c+PGcgY2xhc3M9ImVkZ2VQYXRoIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxwYXRoIGNsYXNzPSJwYXRoIiBkPSJNMTIyLjc1OTUyOTk2NDU3OTUzLDMxNS4xMjVMNjYuNTA3ODEyNSwzNDguMjY1NjI1TDY2LjUwNzgxMjUsMzgxLjQwNjI1IiBtYXJrZXItZW5kPSJ1cmwoI2Fycm93aGVhZDE2OTYpIiBzdHlsZT0ic3Ryb2tlOiAjMzMzOyBzdHJva2Utd2lkdGg6IDEuNXB4O2ZpbGw6bm9uZSI+PC9wYXRoPjxkZWZzPjxtYXJrZXIgaWQ9ImFycm93aGVhZDE2OTYiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOSIgcmVmWT0iNSIgbWFya2VyVW5pdHM9InN0cm9rZVdpZHRoIiBtYXJrZXJXaWR0aD0iOCIgbWFya2VySGVpZ2h0PSI2IiBvcmllbnQ9ImF1dG8iPjxwYXRoIGQ9Ik0gMCAwIEwgMTAgNSBMIDAgMTAgeiIgY2xhc3M9ImFycm93aGVhZFBhdGgiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDFweDsgc3Ryb2tlLWRhc2hhcnJheTogMXB4LCAwcHg7Ij48L3BhdGg+PC9tYXJrZXI+PC9kZWZzPjwvZz48ZyBjbGFzcz0iZWRnZVBhdGgiIHN0eWxlPSJvcGFjaXR5OiAxOyI+PHBhdGggY2xhc3M9InBhdGgiIGQ9Ik0xODQuMzQyMDMyNTM1NDIwNSwzMTUuMTI1TDI0MC41OTM3NSwzNDguMjY1NjI1TDI0MC41OTM3NSwzODEuNDA2MjUiIG1hcmtlci1lbmQ9InVybCgjYXJyb3doZWFkMTY5NykiIHN0eWxlPSJzdHJva2U6ICMzMzM7IHN0cm9rZS13aWR0aDogMS41cHg7ZmlsbDpub25lIj48L3BhdGg+PGRlZnM+PG1hcmtlciBpZD0iYXJyb3doZWFkMTY5NyIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI5IiByZWZZPSI1IiBtYXJrZXJVbml0cz0ic3Ryb2tlV2lkdGgiIG1hcmtlcldpZHRoPSI4IiBtYXJrZXJIZWlnaHQ9IjYiIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTSAwIDAgTCAxMCA1IEwgMCAxMCB6IiBjbGFzcz0iYXJyb3doZWFkUGF0aCIgc3R5bGU9InN0cm9rZS13aWR0aDogMXB4OyBzdHJva2UtZGFzaGFycmF5OiAxcHgsIDBweDsiPjwvcGF0aD48L21hcmtlcj48L2RlZnM+PC9nPjxnIGNsYXNzPSJlZGdlUGF0aCIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48cGF0aCBjbGFzcz0icGF0aCIgZD0iTTY2LjUwNzgxMjUsNDE3LjY4NzVMNjYuNTA3ODEyNSw0NDIuNjg3NUw2Ni41MDc4MTI1LDQ2Ny42ODc1IiBtYXJrZXItZW5kPSJ1cmwoI2Fycm93aGVhZDE2OTgpIiBzdHlsZT0ic3Ryb2tlOiAjMzMzOyBzdHJva2Utd2lkdGg6IDEuNXB4O2ZpbGw6bm9uZSI+PC9wYXRoPjxkZWZzPjxtYXJrZXIgaWQ9ImFycm93aGVhZDE2OTgiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOSIgcmVmWT0iNSIgbWFya2VyVW5pdHM9InN0cm9rZVdpZHRoIiBtYXJrZXJXaWR0aD0iOCIgbWFya2VySGVpZ2h0PSI2IiBvcmllbnQ9ImF1dG8iPjxwYXRoIGQ9Ik0gMCAwIEwgMTAgNSBMIDAgMTAgeiIgY2xhc3M9ImFycm93aGVhZFBhdGgiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDFweDsgc3Ryb2tlLWRhc2hhcnJheTogMXB4LCAwcHg7Ij48L3BhdGg+PC9tYXJrZXI+PC9kZWZzPjwvZz48ZyBjbGFzcz0iZWRnZVBhdGgiIHN0eWxlPSJvcGFjaXR5OiAxOyI+PHBhdGggY2xhc3M9InBhdGgiIGQ9Ik02Ni41MDc4MTI1LDUwMy45Njg3NUw2Ni41MDc4MTI1LDUyOC45Njg3NUw2Ni41MDc4MTI1LDU1My45Njg3NSIgbWFya2VyLWVuZD0idXJsKCNhcnJvd2hlYWQxNjk5KSIgc3R5bGU9InN0cm9rZTogIzMzMzsgc3Ryb2tlLXdpZHRoOiAxLjVweDtmaWxsOm5vbmUiPjwvcGF0aD48ZGVmcz48bWFya2VyIGlkPSJhcnJvd2hlYWQxNjk5IiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlclVuaXRzPSJzdHJva2VXaWR0aCIgbWFya2VyV2lkdGg9IjgiIG1hcmtlckhlaWdodD0iNiIgb3JpZW50PSJhdXRvIj48cGF0aCBkPSJNIDAgMCBMIDEwIDUgTCAwIDEwIHoiIGNsYXNzPSJhcnJvd2hlYWRQYXRoIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxcHg7IHN0cm9rZS1kYXNoYXJyYXk6IDFweCwgMHB4OyI+PC9wYXRoPjwvbWFya2VyPjwvZGVmcz48L2c+PGcgY2xhc3M9ImVkZ2VQYXRoIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxwYXRoIGNsYXNzPSJwYXRoIiBkPSJNMjQwLjU5Mzc1LDQxNy42ODc1TDI0MC41OTM3NSw0NDIuNjg3NUwyNDAuNTkzNzUsNDY3LjY4NzUiIG1hcmtlci1lbmQ9InVybCgjYXJyb3doZWFkMTcwMCkiIHN0eWxlPSJzdHJva2U6ICMzMzM7IHN0cm9rZS13aWR0aDogMS41cHg7ZmlsbDpub25lIj48L3BhdGg+PGRlZnM+PG1hcmtlciBpZD0iYXJyb3doZWFkMTcwMCIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI5IiByZWZZPSI1IiBtYXJrZXJVbml0cz0ic3Ryb2tlV2lkdGgiIG1hcmtlcldpZHRoPSI4IiBtYXJrZXJIZWlnaHQ9IjYiIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTSAwIDAgTCAxMCA1IEwgMCAxMCB6IiBjbGFzcz0iYXJyb3doZWFkUGF0aCIgc3R5bGU9InN0cm9rZS13aWR0aDogMXB4OyBzdHJva2UtZGFzaGFycmF5OiAxcHgsIDBweDsiPjwvcGF0aD48L21hcmtlcj48L2RlZnM+PC9nPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVscyI+PGcgY2xhc3M9ImVkZ2VMYWJlbCIgdHJhbnNmb3JtPSIiIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSIgY2xhc3M9ImxhYmVsIj48cmVjdCByeD0iMCIgcnk9IjAiIHdpZHRoPSIwIiBoZWlnaHQ9IjAiIHN0eWxlPSJmaWxsOiNlOGU4ZTg7Ij48L3JlY3Q+PHRleHQ+PHRzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGR5PSIxZW0iIHg9IjEiPjwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCIgdHJhbnNmb3JtPSIiIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSIgY2xhc3M9ImxhYmVsIj48cmVjdCByeD0iMCIgcnk9IjAiIHdpZHRoPSIwIiBoZWlnaHQ9IjAiIHN0eWxlPSJmaWxsOiNlOGU4ZTg7Ij48L3JlY3Q+PHRleHQ+PHRzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGR5PSIxZW0iIHg9IjEiPjwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCIgdHJhbnNmb3JtPSIiIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSIgY2xhc3M9ImxhYmVsIj48cmVjdCByeD0iMCIgcnk9IjAiIHdpZHRoPSIwIiBoZWlnaHQ9IjAiIHN0eWxlPSJmaWxsOiNlOGU4ZTg7Ij48L3JlY3Q+PHRleHQ+PHRzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGR5PSIxZW0iIHg9IjEiPjwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNjYuNTA3ODEyNSwzNDguMjY1NjI1KSIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzYuNjA5Mzc1LC04LjAwNzgxMjUpIiBjbGFzcz0ibGFiZWwiPjxyZWN0IHJ4PSIwIiByeT0iMCIgd2lkdGg9IjUyLjU5Mzc1IiBoZWlnaHQ9IjE2LjI4MTI1IiBzdHlsZT0iZmlsbDojZThlOGU4OyI+PC9yZWN0Pjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj5ubyBpZGxlIFA8L3RzcGFuPjwvdGV4dD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI0MC41OTM3NSwzNDguMjY1NjI1KSIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNDQuNzEwOTM3NSwtOC4wMDc4MTI1KSIgY2xhc3M9ImxhYmVsIj48cmVjdCByeD0iMCIgcnk9IjAiIHdpZHRoPSI2MS40NTMxMjUiIGhlaWdodD0iMTYuMjgxMjUiIHN0eWxlPSJmaWxsOiNlOGU4ZTg7Ij48L3JlY3Q+PHRleHQ+PHRzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGR5PSIxZW0iIHg9IjEiPmZpbmQgaWRsZSBQPC90c3Bhbj48L3RleHQ+PC9nPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVsIiB0cmFuc2Zvcm09IiIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDApIiBjbGFzcz0ibGFiZWwiPjxyZWN0IHJ4PSIwIiByeT0iMCIgd2lkdGg9IjAiIGhlaWdodD0iMCIgc3R5bGU9ImZpbGw6I2U4ZThlODsiPjwvcmVjdD48dGV4dD48dHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZHk9IjFlbSIgeD0iMSI+PC90c3Bhbj48L3RleHQ+PC9nPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVsIiB0cmFuc2Zvcm09IiIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDApIiBjbGFzcz0ibGFiZWwiPjxyZWN0IHJ4PSIwIiByeT0iMCIgd2lkdGg9IjAiIGhlaWdodD0iMCIgc3R5bGU9ImZpbGw6I2U4ZThlODsiPjwvcmVjdD48dGV4dD48dHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZHk9IjFlbSIgeD0iMSI+PC90c3Bhbj48L3RleHQ+PC9nPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVsIiB0cmFuc2Zvcm09IiIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDApIiBjbGFzcz0ibGFiZWwiPjxyZWN0IHJ4PSIwIiByeT0iMCIgd2lkdGg9IjAiIGhlaWdodD0iMCIgc3R5bGU9ImZpbGw6I2U4ZThlODsiPjwvcmVjdD48dGV4dD48dHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZHk9IjFlbSIgeD0iMSI+PC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PGcgY2xhc3M9Im5vZGVzIj48ZyBjbGFzcz0ibm9kZSIgaWQ9IkEiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE1My41NTA3ODEyNSwzOC4xNDA2MjUpIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxyZWN0IHJ4PSIwIiByeT0iMCIgeD0iLTQ0LjUxNTYyNSIgeT0iLTE4LjE0MDYyNSIgd2lkdGg9Ijg5LjAzMTI1IiBoZWlnaHQ9IjM2LjI4MTI1Ij48L3JlY3Q+PGcgY2xhc3M9ImxhYmVsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDApIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzQuNTE1NjI1LC04LjE0MDYyNSkiPjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj5leGl0c3lzY2FsbDA8L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48ZyBjbGFzcz0ibm9kZSIgaWQ9IkIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE1My41NTA3ODEyNSwxMjQuNDIxODc1KSIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48cmVjdCByeD0iMCIgcnk9IjAiIHg9Ii05NC42MDkzNzUiIHk9Ii0xOC4xNDA2MjUiIHdpZHRoPSIxODkuMjE4NzUiIGhlaWdodD0iMzYuMjgxMjUiPjwvcmVjdD48ZyBjbGFzcz0ibGFiZWwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC04NC42MDkzNzUsLTguMTQwNjI1KSI+PHRleHQ+PHRzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGR5PSIxZW0iIHg9IjEiPmdwOiBfR3N5c2NhbGwgPSZndDsgX0dydW5uYWJsZTwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PC9nPjxnIGNsYXNzPSJub2RlIiBpZD0iQyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTUzLjU1MDc4MTI1LDIxMC43MDMxMjUpIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxyZWN0IHJ4PSIwIiByeT0iMCIgeD0iLTI3LjE5NTMxMjUiIHk9Ii0xOC4xNDA2MjUiIHdpZHRoPSI1NC4zOTA2MjUiIGhlaWdodD0iMzYuMjgxMjUiPjwvcmVjdD48ZyBjbGFzcz0ibGFiZWwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xNy4xOTUzMTI1LC04LjE0MDYyNSkiPjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj5kcm9wZzwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PC9nPjxnIGNsYXNzPSJub2RlIiBpZD0iRCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTUzLjU1MDc4MTI1LDI5Ni45ODQzNzUpIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxyZWN0IHJ4PSIwIiByeT0iMCIgeD0iLTM0Ljc0MjE4NzUiIHk9Ii0xOC4xNDA2MjUiIHdpZHRoPSI2OS40ODQzNzUiIGhlaWdodD0iMzYuMjgxMjUiPjwvcmVjdD48ZyBjbGFzcz0ibGFiZWwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNC43NDIxODc1LC04LjE0MDYyNSkiPjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj5waWRsZWdldDwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PC9nPjxnIGNsYXNzPSJub2RlIiBpZD0iRSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNjYuNTA3ODEyNSwzOTkuNTQ2ODc1KSIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48cmVjdCByeD0iMCIgcnk9IjAiIHg9Ii00Ni41MDc4MTI1IiB5PSItMTguMTQwNjI1IiB3aWR0aD0iOTMuMDE1NjI1IiBoZWlnaHQ9IjM2LjI4MTI1Ij48L3JlY3Q+PGcgY2xhc3M9ImxhYmVsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDApIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzYuNTA3ODEyNSwtOC4xNDA2MjUpIj48dGV4dD48dHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZHk9IjFlbSIgeD0iMSI+Z2xvYnJ1bnFwdXQ8L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48ZyBjbGFzcz0ibm9kZSIgaWQ9IkYiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI0MC41OTM3NSwzOTkuNTQ2ODc1KSIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48cmVjdCByeD0iMCIgcnk9IjAiIHg9Ii03Ny41NzgxMjUiIHk9Ii0xOC4xNDA2MjUiIHdpZHRoPSIxNTUuMTU2MjUiIGhlaWdodD0iMzYuMjgxMjUiPjwvcmVjdD48ZyBjbGFzcz0ibGFiZWwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC02Ny41NzgxMjUsLTguMTQwNjI1KSI+PHRleHQ+PHRzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGR5PSIxZW0iIHg9IjEiPmFxdWlyZXAgJmFtcDsgZXhlY3V0ZShncCk8L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48ZyBjbGFzcz0ibm9kZSIgaWQ9IkciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDY2LjUwNzgxMjUsNDg1LjgyODEyNSkiIHN0eWxlPSJvcGFjaXR5OiAxOyI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB4PSItMjguNDc2NTYyNSIgeT0iLTE4LjE0MDYyNSIgd2lkdGg9IjU2Ljk1MzEyNSIgaGVpZ2h0PSIzNi4yODEyNSI+PC9yZWN0PjxnIGNsYXNzPSJsYWJlbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE4LjQ3NjU2MjUsLTguMTQwNjI1KSI+PHRleHQ+PHRzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGR5PSIxZW0iIHg9IjEiPnN0b3BtPC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PGcgY2xhc3M9Im5vZGUiIGlkPSJIIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg2Ni41MDc4MTI1LDU3Mi4xMDkzNzUpIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxyZWN0IHJ4PSIwIiByeT0iMCIgeD0iLTM2LjUiIHk9Ii0xOC4xNDA2MjUiIHdpZHRoPSI3MyIgaGVpZ2h0PSIzNi4yODEyNSI+PC9yZWN0PjxnIGNsYXNzPSJsYWJlbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2LjUsLTguMTQwNjI1KSI+PHRleHQ+PHRzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGR5PSIxZW0iIHg9IjEiPnNjaGVkdWxlPC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PGcgY2xhc3M9Im5vZGUiIGlkPSJJIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNDAuNTkzNzUsNDg1LjgyODEyNSkiIHN0eWxlPSJvcGFjaXR5OiAxOyI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB4PSItNTYuOTc2NTYyNSIgeT0iLTE4LjE0MDYyNSIgd2lkdGg9IjExMy45NTMxMjUiIGhlaWdodD0iMzYuMjgxMjUiPjwvcmVjdD48ZyBjbGFzcz0ibGFiZWwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC00Ni45NzY1NjI1LC04LjE0MDYyNSkiPjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj5uZXZlciByZXR1cm4gLi4uPC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PC9nPjwvZz48L2c+PC9zdmc+

exitsyscall0仍然会尝试获取P,如果能获取到,则会acquirep,acquirep会调用wirep完成P和M的绑定。之后调用execute函数,并且不会再返回。因为在execute G的时候,仍然会遇到调度点。
注:如果没有遇到调度点的情况没有想明白。

如果exitsyscall0仍然没有获取P,则会调用stopm来停止当前M,直到被唤醒。唤醒之后会直接进入调度。

sysmon

sysmon是一个由runtime启动的M,也叫监控线程,它无需P也可以运行,它每20us~10ms唤醒一次,主要执行:

  • 释放闲置超过5分钟的span物理内存;
  • 如果超过2分钟没有垃圾回收,强制执行;
  • 将长时间未处理的netpoll结果添加到任务队列;
  • 向长时间运行的G任务发出抢占调度;
  • 收回因syscall长时间阻塞的P;
    入口在src/runtime/proc.go:sysmon函数。
    因为我主要关注的是Go调度框架,所以sysmon中关于GC,CGO,trace等部分都忽略掉了。所以只剩下retake函数。retake会对syscall和长时间运行的G进行接管。

retake

retake会遍历所有的P,即allp数组,做两件事。

  1. 抢占运行过久的G
  2. handoff处于_Psyscall过久的P

preempt G

这里表示在某一个P上,即一个某个CPU核上运行的G运行时间过于久。
判断G运行过久的方法是:

  • retake传入的参数now = noontime()
  • retake会记录每次调用retake的时间点在_p_.sysmontick.schedwhen中
  • 如果schedwhen+forcePreemptNS <= now表示G运行过久,其中forcePreemptNS = 10ms

handoff P

与上一节类似,此处要判断P处于_Psyscall的时间过久。
每一次retake,记录时间到_p_.sysmontick.schedwhen。当发生下面的情况,则表示P处于_Psyscall时间太久:
syscallwhen+10*1000*1000 <= now
之后将P的状态切换为_Pidle,然后调用handoffp来绑定P和一个新的M。
实际上这里才完成了这幅图上M2与P的绑定:

参考文献

%E6%9C%AC%E6%96%87%E5%9F%BA%E4%BA%8EGo%201.13%E3%80%82%0AGolang%20runtime%E5%BA%93%E6%9C%89%E4%B8%80%E5%A5%97%E5%AE%8C%E5%85%A8%E5%9F%BA%E4%BA%8E%E7%94%A8%E6%88%B7%E6%80%81%E7%9A%84%E5%8D%8F%E7%A8%8B%EF%BC%88goroutine%EF%BC%89%E8%B0%83%E5%BA%A6%E6%A1%86%E6%9E%B6%E3%80%82%E4%B8%BA%E4%BA%86%E9%85%8D%E5%90%88%E5%8D%8F%E7%A8%8B%E8%B0%83%E5%BA%A6%E6%A1%86%E6%9E%B6%EF%BC%8C%E6%8F%90%E5%8D%87%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8%E6%97%B6%E7%9A%84%E5%B9%B6%E5%8F%91%E6%80%A7%E8%83%BD%EF%BC%8CGo%E5%AF%B9SYSCALL%E8%B0%83%E7%94%A8%E6%9C%BA%E5%88%B6%E8%BF%9B%E8%A1%8C%E4%BA%86%E5%B0%81%E8%A3%85%E3%80%82%0A%E9%80%9A%E5%B8%B8%E4%B8%80%E4%B8%AA%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8%EF%BC%8C%E5%9C%A8%E7%B1%BBplatform%20OS%E4%B8%8A%E9%83%BD%E4%BC%9A%E8%BF%9B%E8%A1%8C%E5%9C%B0%E5%9D%80%E7%A9%BA%E9%97%B4%E7%9A%84%E5%88%87%E6%8D%A2%EF%BC%8C%E8%BF%99%E7%9B%B8%E5%BD%93%E4%BA%8E%E4%B8%80%E4%B8%AA%E5%A4%A7%E5%9E%8B%E7%9A%84Context%20Switch%EF%BC%8C%E5%85%88%E4%B8%8D%E8%AE%BA%E5%85%B7%E4%BD%93%E6%98%AF%E5%93%AA%E4%B8%AASYSCALL%EF%BC%8C%E5%8D%B3%E4%BD%BF%E8%BF%99%E6%A0%B7%E4%B8%80%E6%AC%A1Context%20Switch%E7%9A%84%E6%8D%9F%E8%80%97%E4%B9%9F%E6%98%AF%E5%BE%88%E5%A4%A7%E7%9A%84%E3%80%82%E6%89%80%E4%BB%A5Go%E7%9A%84SYSCALL%E6%9C%BA%E5%88%B6%EF%BC%8C%E5%88%A9%E7%94%A8%E4%BA%86%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E7%9A%84%E5%B9%B6%E8%A1%8C%E8%AE%A1%E7%AE%97%EF%BC%88parallelism%EF%BC%89%E6%9D%A5%E7%BC%93%E5%92%8C%E8%BF%99%E4%B8%80%E5%BC%80%E9%94%80%EF%BC%8C%E8%80%8C%E5%B0%86%E5%85%B6%E5%AF%B9%E5%B9%B6%E5%8F%91%E7%9A%84%E6%8D%9F%E5%AE%B3%E9%99%8D%E4%BD%8E%E3%80%82%0A%0A%60%60%60go%0ATEXT%20%C2%B7Syscall(SB)%2CNOSPLIT%2C%240-28%0A%09BL%09runtime%C2%B7entersyscall(SB)%0A%09...%0A%09SWI%09%240%0A%09...%0A%09BL%09runtime%C2%B7exitsyscall(SB)%0A%60%60%60%0ASyscall%E6%80%BB%E6%8E%A5%E5%8F%A3%E5%AE%9A%E4%B9%89%E5%9C%A8%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E7%9B%B8%E5%85%B3%E7%9A%84%E6%96%87%E4%BB%B6%E3%80%82Linux%E5%B9%B3%E5%8F%B0%E6%98%AFgo%2Fsrc%2Fsyscall%2Fasm_linux_arm.s%0AGo%E6%A1%86%E6%9E%B6%E5%9C%A8%E7%9C%9F%E6%AD%A3%E7%9A%84%E8%BF%9B%E5%86%85%E6%A0%B8%E8%B0%83%E7%94%A8%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8%E5%89%8D%E5%90%8E%E8%BF%9B%E8%A1%8C%E6%8E%A5%E7%AE%A1%EF%BC%8C%E6%8F%92%E5%85%A5%E4%BA%86%E9%85%8D%E5%90%88%E8%B0%83%E5%BA%A6%E7%9A%84%E4%BB%A3%E7%A0%81%E3%80%82%0A%0A%23%23%20entersyscall%0A%E5%81%87%E8%AE%BE%E8%B0%83%E7%94%A8Syscall%E4%B9%8B%E5%89%8D%EF%BC%8CGPM%E8%BF%90%E8%A1%8C%E7%9A%84%E7%8A%B6%E6%80%81%E5%A6%82%E4%B8%8B%E5%9B%BE%EF%BC%9A%0A!%5B747549a28a7a627a3cbd98fffe728fad.png%5D(evernotecid%3A%2F%2F22617523-9521-4D00-B771-5F27B85F00EB%2Fappyinxiangcom%2F161681%2FENResource%2Fp6071)%0A%0A%23%23%23%20PM%E8%A7%A3%E7%BB%91%0A%E5%BD%93%E8%B0%83%E7%94%A8%E4%BA%86Syscall%E4%BB%A5%E5%90%8E%EF%BC%8C%E8%BF%9B%E5%85%A5entersyscall%EF%BC%8CP%E5%92%8CM%E4%BC%9A%E8%A7%A3%E7%BB%91%EF%BC%8C%E5%8F%98%E6%88%90%E4%B8%8B%E9%9D%A2%E8%BF%99%E5%BC%A0%E5%9B%BE%EF%BC%9A%0A!%5B96630c3dd34a06fbc5ed5f8b4c8bdfbc.png%5D(evernotecid%3A%2F%2F22617523-9521-4D00-B771-5F27B85F00EB%2Fappyinxiangcom%2F161681%2FENResource%2Fp6072)%0A%0A%E8%BF%99%E5%BC%A0%E5%9B%BE%E4%B8%8D%E6%98%AF%E5%BE%88%E5%87%86%E7%A1%AE%EF%BC%8C%E5%BD%93M1%E5%92%8CP%E8%A7%A3%E7%BB%91%E6%97%B6%EF%BC%8CM2%E5%B9%B6%E6%B2%A1%E6%9C%89%E7%AB%8B%E5%8D%B3%E4%B8%8A%E4%BD%8D%EF%BC%8CP%E5%A4%84%E4%BA%8E_Psyscall%E7%8A%B6%E6%80%81%E3%80%82P%E6%98%AF%E5%90%A6%E4%B8%8E%E6%96%B0%E7%9A%84M%E7%BB%91%E5%AE%9A%E7%94%B1sysmon%E8%BF%99%E4%B8%AA%E7%89%B9%E6%AE%8AM%E6%9D%A5%E5%AE%8C%E6%88%90%E3%80%82%E5%90%8E%E9%9D%A2sysmon%E4%B8%80%E8%8A%82%E4%BC%9A%E4%B8%93%E9%97%A8%E4%BB%8B%E7%BB%8D%E3%80%82%0A%0A%60%60%60go%0A%09pp%20%3A%3D%20_g_.m.p.ptr()%0A%09pp.m%20%3D%200%0A%09_g_.m.oldp.set(pp)%0A%09_g_.m.p%20%3D%200%0A%60%60%60%0A%E6%AD%A4%E6%97%B6%E5%8E%9F%E5%85%88%E7%9A%84P%E8%A2%AB%E8%AE%B0%E5%85%A5%E4%BA%86m.oldp%EF%BC%8C%E6%9C%AA%E6%9D%A5%E4%BC%9A%E7%94%A8%E5%88%B0%E3%80%82%0A%0A%23%23%20exitsyscall%0A%E5%BD%93%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8%E7%BB%93%E6%9D%9F%E4%BB%A5%E5%90%8E%EF%BC%8C%E8%B0%83%E7%94%A8Syscall%E7%9A%84G%E9%9C%80%E8%A6%81%E5%BD%92%E4%BD%8D%0A!%5B5530edf8c481aee13a40ff0b55e8e1ed.png%5D(evernotecid%3A%2F%2F22617523-9521-4D00-B771-5F27B85F00EB%2Fappyinxiangcom%2F161681%2FENResource%2Fp6073)%0A%E4%B8%8A%E5%9B%BE%E4%B8%ADG1%E8%A2%AB%E6%94%BE%E5%88%B0%E4%BA%86oldp%E7%9A%84%E9%98%9F%E5%88%97%E9%87%8C%EF%BC%8C%E5%AE%9E%E9%99%85%E5%B9%B6%E4%B8%8D%E4%B8%80%E5%AE%9A%E5%A6%82%E6%AD%A4%E3%80%82%0Aexitsyscall%E7%9A%84%E8%B0%83%E7%94%A8%E6%B5%81%E7%A8%8B%E5%A6%82%E4%B8%8B%EF%BC%9A%0A%0A%60%60%60mermaid%0Agraph%20TD%0AA%5Bexitsyscall%5D%20--%3E%20B%5Bexitsyscallfast%5D%0AB%20--%3E%20%7Csuccess%7C%20C%5B_g_%3A%20_Gsyscall%20%3D%3E%20_Grunning%5D%0AB%20--%3E%20%7Cfail%7C%20D%5Bexitsyscall0%5D%0AC%20--%3E%20E%5Breturn%5D%0AD%20--%3E%20E%0A%60%60%60%0A%E8%BF%99%E5%85%B6%E4%B8%AD%E6%B6%89%E5%8F%8A%E4%B8%A4%E4%B8%AA%E9%87%8D%E8%A6%81%E5%87%BD%E6%95%B0%EF%BC%9A%0A-%20exitsyscallfast%0A-%20exitsyscall0%0A%0A%23%23%23%20exitsyscallfast%0A%E8%AF%A5%E5%87%BD%E6%95%B0%E4%BC%9A%E5%B0%9D%E8%AF%95%E5%85%88%E7%BB%91%E5%AE%9Aoldp%EF%BC%8C%E5%A6%82%E6%9E%9C%E4%B8%8D%E6%88%90%E5%8A%9F%EF%BC%8C%E4%BC%9A%E5%9C%A8%E5%B0%9D%E8%AF%95%E5%85%B6%E4%BB%96idlep%E3%80%82M%E7%BB%91%E5%AE%9AP%E4%BD%BF%E7%94%A8wirep%E5%87%BD%E6%95%B0%E3%80%82%0A%E5%A6%82%E6%9E%9CP%EF%BC%8CM%E7%BB%91%E5%AE%9A%E6%88%90%E5%8A%9F%EF%BC%8C%E9%82%A3%E4%B9%88G%E6%98%AF%E4%B8%8D%E9%9C%80%E8%A6%81%E5%88%87%E6%8D%A2%E4%BB%BB%E4%BD%95%E9%98%9F%E5%88%97%EF%BC%8CG%E4%BC%9A%E7%BB%A7%E7%BB%AD%E8%BF%90%E8%A1%8C%E3%80%82%0A%E5%A6%82%E6%9E%9C%E6%97%A0%E6%B3%95%E7%BB%91%E5%AE%9A%EF%BC%8C%E5%88%99%E4%BC%9A%E5%81%9C%E6%AD%A2M%EF%BC%8C%E5%B9%B6%E6%89%BE%E5%88%B0%E5%9C%B0%E6%96%B9%E6%94%BE%E7%BD%AEG%E3%80%82%E8%BF%99%E4%B8%80%E8%BF%87%E7%A8%8B%E5%9C%A8exitsyscall0%E3%80%82%0A%0A%23%23%23%20exitsyscall0%0A%60%60%60mermaid%0Agraph%20TD%0AA%5Bexitsyscall0%5D%20--%3E%20B%5Bgp%3A%20_Gsyscall%20%3D%3E%20_Grunnable%5D%0AB%20--%3E%20C%5Bdropg%5D%0AC%20--%3E%20D%5Bpidleget%5D%0AD%20--%3E%20%7Cno%20idle%20P%7C%20E%5Bglobrunqput%5D%0AD%20--%3E%20%7Cfind%20idle%20P%7C%20F%5B%22aquirep%20%26%20execute(gp)%22%5D%0AE%20--%3E%20G%5Bstopm%5D%0AG%20--%3E%20H%5Bschedule%5D%0AF%20--%3E%20I%5Bnever%20return%20...%5D%0A%60%60%60%0Aexitsyscall0%E4%BB%8D%E7%84%B6%E4%BC%9A%E5%B0%9D%E8%AF%95%E8%8E%B7%E5%8F%96P%EF%BC%8C%E5%A6%82%E6%9E%9C%E8%83%BD%E8%8E%B7%E5%8F%96%E5%88%B0%EF%BC%8C%E5%88%99%E4%BC%9Aacquirep%EF%BC%8Cacquirep%E4%BC%9A%E8%B0%83%E7%94%A8wirep%E5%AE%8C%E6%88%90P%E5%92%8CM%E7%9A%84%E7%BB%91%E5%AE%9A%E3%80%82%E4%B9%8B%E5%90%8E%E8%B0%83%E7%94%A8execute%E5%87%BD%E6%95%B0%EF%BC%8C%E5%B9%B6%E4%B8%94%E4%B8%8D%E4%BC%9A%E5%86%8D%E8%BF%94%E5%9B%9E%E3%80%82%E5%9B%A0%E4%B8%BA%E5%9C%A8execute%20G%E7%9A%84%E6%97%B6%E5%80%99%EF%BC%8C%E4%BB%8D%E7%84%B6%E4%BC%9A%E9%81%87%E5%88%B0%E8%B0%83%E5%BA%A6%E7%82%B9%E3%80%82%0A***%E6%B3%A8%EF%BC%9A%E5%A6%82%E6%9E%9C%E6%B2%A1%E6%9C%89%E9%81%87%E5%88%B0%E8%B0%83%E5%BA%A6%E7%82%B9%E7%9A%84%E6%83%85%E5%86%B5%E6%B2%A1%E6%9C%89%E6%83%B3%E6%98%8E%E7%99%BD%E3%80%82***%0A%0A%E5%A6%82%E6%9E%9Cexitsyscall0%E4%BB%8D%E7%84%B6%E6%B2%A1%E6%9C%89%E8%8E%B7%E5%8F%96P%EF%BC%8C%E5%88%99%E4%BC%9A%E8%B0%83%E7%94%A8stopm%E6%9D%A5%E5%81%9C%E6%AD%A2%E5%BD%93%E5%89%8DM%EF%BC%8C%E7%9B%B4%E5%88%B0%E8%A2%AB%E5%94%A4%E9%86%92%E3%80%82%E5%94%A4%E9%86%92%E4%B9%8B%E5%90%8E%E4%BC%9A%E7%9B%B4%E6%8E%A5%E8%BF%9B%E5%85%A5%E8%B0%83%E5%BA%A6%E3%80%82%0A%0A%23%23%20sysmon%0Asysmon%E6%98%AF%E4%B8%80%E4%B8%AA%E7%94%B1runtime%E5%90%AF%E5%8A%A8%E7%9A%84M%EF%BC%8C%E4%B9%9F%E5%8F%AB%E7%9B%91%E6%8E%A7%E7%BA%BF%E7%A8%8B%EF%BC%8C%E5%AE%83%E6%97%A0%E9%9C%80P%E4%B9%9F%E5%8F%AF%E4%BB%A5%E8%BF%90%E8%A1%8C%EF%BC%8C%E5%AE%83%E6%AF%8F20us~10ms%E5%94%A4%E9%86%92%E4%B8%80%E6%AC%A1%EF%BC%8C%E4%B8%BB%E8%A6%81%E6%89%A7%E8%A1%8C%3A%0A%0A-%20%E9%87%8A%E6%94%BE%E9%97%B2%E7%BD%AE%E8%B6%85%E8%BF%875%E5%88%86%E9%92%9F%E7%9A%84span%E7%89%A9%E7%90%86%E5%86%85%E5%AD%98%EF%BC%9B%0A-%20%E5%A6%82%E6%9E%9C%E8%B6%85%E8%BF%872%E5%88%86%E9%92%9F%E6%B2%A1%E6%9C%89%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%EF%BC%8C%E5%BC%BA%E5%88%B6%E6%89%A7%E8%A1%8C%EF%BC%9B%0A-%20%E5%B0%86%E9%95%BF%E6%97%B6%E9%97%B4%E6%9C%AA%E5%A4%84%E7%90%86%E7%9A%84netpoll%E7%BB%93%E6%9E%9C%E6%B7%BB%E5%8A%A0%E5%88%B0%E4%BB%BB%E5%8A%A1%E9%98%9F%E5%88%97%EF%BC%9B%0A-%20%E5%90%91%E9%95%BF%E6%97%B6%E9%97%B4%E8%BF%90%E8%A1%8C%E7%9A%84G%E4%BB%BB%E5%8A%A1%E5%8F%91%E5%87%BA%E6%8A%A2%E5%8D%A0%E8%B0%83%E5%BA%A6%EF%BC%9B%0A-%20%E6%94%B6%E5%9B%9E%E5%9B%A0syscall%E9%95%BF%E6%97%B6%E9%97%B4%E9%98%BB%E5%A1%9E%E7%9A%84P%EF%BC%9B%0A%E5%85%A5%E5%8F%A3%E5%9C%A8src%2Fruntime%2Fproc.go%3Asysmon%E5%87%BD%E6%95%B0%E3%80%82%0A%E5%9B%A0%E4%B8%BA%E6%88%91%E4%B8%BB%E8%A6%81%E5%85%B3%E6%B3%A8%E7%9A%84%E6%98%AFGo%E8%B0%83%E5%BA%A6%E6%A1%86%E6%9E%B6%EF%BC%8C%E6%89%80%E4%BB%A5sysmon%E4%B8%AD%E5%85%B3%E4%BA%8EGC%EF%BC%8CCGO%EF%BC%8Ctrace%E7%AD%89%E9%83%A8%E5%88%86%E9%83%BD%E5%BF%BD%E7%95%A5%E6%8E%89%E4%BA%86%E3%80%82%E6%89%80%E4%BB%A5%E5%8F%AA%E5%89%A9%E4%B8%8Bretake%E5%87%BD%E6%95%B0%E3%80%82retake%E4%BC%9A%E5%AF%B9syscall%E5%92%8C%E9%95%BF%E6%97%B6%E9%97%B4%E8%BF%90%E8%A1%8C%E7%9A%84G%E8%BF%9B%E8%A1%8C%E6%8E%A5%E7%AE%A1%E3%80%82%0A%0A%23%23%23%20retake%0Aretake%E4%BC%9A%E9%81%8D%E5%8E%86%E6%89%80%E6%9C%89%E7%9A%84P%EF%BC%8C%E5%8D%B3allp%E6%95%B0%E7%BB%84%EF%BC%8C%E5%81%9A%E4%B8%A4%E4%BB%B6%E4%BA%8B%E3%80%82%0A1.%20%E6%8A%A2%E5%8D%A0%E8%BF%90%E8%A1%8C%E8%BF%87%E4%B9%85%E7%9A%84G%0A2.%20handoff%E5%A4%84%E4%BA%8E_Psyscall%E8%BF%87%E4%B9%85%E7%9A%84P%0A%0A%23%23%23%23%20preempt%20G%0A%E8%BF%99%E9%87%8C%E8%A1%A8%E7%A4%BA%E5%9C%A8%E6%9F%90%E4%B8%80%E4%B8%AAP%E4%B8%8A%EF%BC%8C%E5%8D%B3%E4%B8%80%E4%B8%AA%E6%9F%90%E4%B8%AACPU%E6%A0%B8%E4%B8%8A%E8%BF%90%E8%A1%8C%E7%9A%84G%E8%BF%90%E8%A1%8C%E6%97%B6%E9%97%B4%E8%BF%87%E4%BA%8E%E4%B9%85%E3%80%82%0A%E5%88%A4%E6%96%ADG%E8%BF%90%E8%A1%8C%E8%BF%87%E4%B9%85%E7%9A%84%E6%96%B9%E6%B3%95%E6%98%AF%EF%BC%9A%0A-%20retake%E4%BC%A0%E5%85%A5%E7%9A%84%E5%8F%82%E6%95%B0now%20%3D%20noontime()%0A-%20retake%E4%BC%9A%E8%AE%B0%E5%BD%95%E6%AF%8F%E6%AC%A1%E8%B0%83%E7%94%A8retake%E7%9A%84%E6%97%B6%E9%97%B4%E7%82%B9%E5%9C%A8_p_.sysmontick.schedwhen%E4%B8%AD%20%0A-%20%E5%A6%82%E6%9E%9C%60schedwhen%2BforcePreemptNS%20%3C%3D%20now%60%E8%A1%A8%E7%A4%BAG%E8%BF%90%E8%A1%8C%E8%BF%87%E4%B9%85%EF%BC%8C%E5%85%B6%E4%B8%ADforcePreemptNS%20%3D%2010ms%0A%0A%23%23%23%23%20handoff%20P%0A%E4%B8%8E%E4%B8%8A%E4%B8%80%E8%8A%82%E7%B1%BB%E4%BC%BC%EF%BC%8C%E6%AD%A4%E5%A4%84%E8%A6%81%E5%88%A4%E6%96%ADP%E5%A4%84%E4%BA%8E_Psyscall%E7%9A%84%E6%97%B6%E9%97%B4%E8%BF%87%E4%B9%85%E3%80%82%0A%E6%AF%8F%E4%B8%80%E6%AC%A1retake%EF%BC%8C%E8%AE%B0%E5%BD%95%E6%97%B6%E9%97%B4%E5%88%B0_p_.sysmontick.schedwhen%E3%80%82%E5%BD%93%E5%8F%91%E7%94%9F%E4%B8%8B%E9%9D%A2%E7%9A%84%E6%83%85%E5%86%B5%EF%BC%8C%E5%88%99%E8%A1%A8%E7%A4%BAP%E5%A4%84%E4%BA%8E_Psyscall%E6%97%B6%E9%97%B4%E5%A4%AA%E4%B9%85%EF%BC%9A%0A%60syscallwhen%2B10*1000*1000%20%3C%3D%20now%20%60%0A%E4%B9%8B%E5%90%8E%E5%B0%86P%E7%9A%84%E7%8A%B6%E6%80%81%E5%88%87%E6%8D%A2%E4%B8%BA_Pidle%2C%E7%84%B6%E5%90%8E%E8%B0%83%E7%94%A8handoffp%E6%9D%A5%E7%BB%91%E5%AE%9AP%E5%92%8C%E4%B8%80%E4%B8%AA%E6%96%B0%E7%9A%84M%E3%80%82%0A%E5%AE%9E%E9%99%85%E4%B8%8A%E8%BF%99%E9%87%8C%E6%89%8D%E5%AE%8C%E6%88%90%E4%BA%86%E8%BF%99%E5%B9%85%E5%9B%BE%E4%B8%8AM2%E4%B8%8EP%E7%9A%84%E7%BB%91%E5%AE%9A%EF%BC%9A%0A!%5B96630c3dd34a06fbc5ed5f8b4c8bdfbc.png%5D(evernotecid%3A%2F%2F22617523-9521-4D00-B771-5F27B85F00EB%2Fappyinxiangcom%2F161681%2FENResource%2Fp6072)%0A%0A%23%23%20%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE%0A-%20%5BScheduling%20In%20Go%20%3A%20Part%20II%20-%20Go%20Scheduler%5D(https%3A%2F%2Fwww.ardanlabs.com%2Fblog%2F2018%2F08%2Fscheduling-in-go-part2.html)%0A-%20%5BGo%20%E8%B0%83%E5%BA%A6%E6%A8%A1%E5%9E%8B%5D(https%3A%2F%2Fwudaijun.com%2F2018%2F01%2Fgo-scheduler%2F)%0A%0A%0A
打赏代表您对我的认可,这会激励我继续向前!
Ben Zhou WeChat Pay WeChat Pay
Ben Zhou Alipay Alipay
Welcome to my other publishing channels