如何在Golang中搭建GraphQL?
|
1.全局解释锁 如题: Python的多线程为什么不能利用多核处理器? 全局解释器锁(Global Interpreter Lock)是计算机程序设计语言解释器用于同步线程的一种机制,它使得任何时刻仅有一个线程在执行。 即便在多核处理器上,使用 GIL 的解释器也只允许同一时间执行一个线程,常见的使用 GIL 的解释器有CPython与Ruby MRI。
可以看到GIL并不是Python独有的特性,是解释型语言处理多线程问题的一种机制而非语言特性。 Windows上的一些区别 下面简单介绍下Windows上这一流程的一些差异。 首先是创建进程的环节,Windows系统将fork+exec两步合并了一步,通过CreateProcess系列函数一步到位,在其参数中指定子进程的可执行文件路径。 不同于Linux上进程和线程的边界模糊,在Windows操作系统上,内核是有明确的进程和线程概念定义,进程用EPROCESS结构表示,线程用ETHREAD结构表示。 所以在Windows上,进程相关的工作准备就绪后,还需要单独创建一个参与内核调度的执行单元,也就是进程中的第一个线程:主线程。当然,这个工作也封装在了CreateProcess系列函数中了。 新进程的主线程创建完成后,便开始参与系统调度了。主线程从哪里开始执行呢?内核在创建时就明确进行了指定:nt!KiThreadStartup,这是一个内核函数,线程启动后就从这里开始执行。 线程从这里启动后,再通过Windows的异步过程调用APC机制执行提前插入的APC,进而将执行流程引入应用层,去执行Windows进程应用程序的初始化工作,比如一些核心DLL文件的加载(Kernel32.dll、ntdll.dll)等等。 随后,再次通过APC机制,再转向去执行可执行文件的入口点。 这后面和Linux上的机制类似,同样没有直接到main函数,而是需要先进行C/C++运行时库的初始化,这之后经过运行时函数的包装,才最终来到我们的main函数。
下面是Windows上,从创建进程到我们的main函数的完整流程(高清大图 可以看到,入口地方是一个叫做 _start 的函数,并不是我们的main函数。 在_start的结尾,调用了 __libc_start_main 函数,而这个函数,位于libc.so中。 你可能疑惑,这个函数是哪里冒出来的,我们的代码中并没有用到它呢? 其实,在进入main函数之前,还有一个重要的工作要做,这就是:C/C++运行时库的初始化。上面的 __libc_start_main 就是在完成这一工作。
在通过GCC进行编译时,编译器将自动完成运行时库的链接,将我们的main函数封装起来,由它来调用。 (编辑:淮安站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
