Memory management CPython中使用的堆栈是什么?

Memory management CPython中使用的堆栈是什么?,memory-management,kernel,cpython,Memory Management,Kernel,Cpython,据我所知: 创建线程时,每个系统级线程的操作系统内核(如Linux)始终 CPython以将a用于其对象而闻名,可能包括for Python子例程 如果是这样的话,那么CPython中使用的堆栈是什么?CPython是一个普通的C程序。运行Python脚本/module/REPL/whatever没有什么神奇之处:每段代码都必须在循环中读取、解析和解释,直到完成为止。每个Python表达式和语句背后都有一大堆处理器指令 每一件“简单”的顶级事情(字节码的解析和生成、GIL管理、属性查找、控制

据我所知:

  • 创建线程时,每个系统级线程的操作系统内核(如Linux)始终
  • CPython以将a用于其对象而闻名,可能包括for Python子例程

如果是这样的话,那么CPython中使用的堆栈是什么?CPython是一个普通的
C
程序。运行Python脚本/module/REPL/whatever没有什么神奇之处:每段代码都必须在循环中读取、解析和解释,直到完成为止。每个Python表达式和语句背后都有一大堆处理器指令

每一件“简单”的顶级事情(字节码的解析和生成、GIL管理、属性查找、控制台I/O等)都是非常复杂的。如果包含函数,调用其他函数,调用其他函数。。。这意味着涉及到堆栈。说真的,你自己:有些源文件跨越几千行代码

仅仅到达解释器的主循环本身就是一次冒险。以下是从代码库的各个部分拼凑而成的要点:

#ifdef MS_窗口
内部wmain(内部argc,wchar\u t**argv)
{
返回主管道(argc、argv);
}
#否则
//标准C入口点
#恩迪夫
内部管道主管道(内部argc、wchar\u t**argv)
{
_PyArgv args=/*…*/;
返回pymain_main(&args);
}
静态int pymain_main(_PyArgv*args)
{
//…调用一些初始化例程并检查错误。。。
返回Py_RunMain();
}
int Py_RunMain(无效)
{
int-exitcode=0;
pymain_run_python(&exitcode);
//……清理。。。
返回exitcode;
}
静态void pymain_run_python(int*exitcode)
{
//…正在初始化解释器状态和启动配置。。。
//…正在确定主导入路径。。。
如果(配置->运行命令){
*exitcode=pymain\u run\u命令(配置->run\u命令,&cf);
}
else if(配置->运行模块){
*exitcode=pymain\u运行模块(配置->运行模块,1);
}
else if(主导入器路径!=NULL){
*exitcode=pymain\U run\U模块(L“\uuuuu main\uuuuuuu”),0;
}
否则,如果(配置->运行文件名!=NULL){
*exitcode=pymain\u run\u文件(配置,&cf);
}
否则{
*exitcode=pymain\u run\u stdin(配置,&cf);
}
//…清理
}
int PyRun_AnyFileExFlags(文件*fp,常量char*文件名,int closeit,PyCompilerFlags*标志)
{
//…甚至更多的路由。。。
int err=PyRun_InteractiveLoopFlags(fp、文件名、标志);
// ...
}
int PyRun_InteractiveLopFlags(文件*fp,常量字符*filename_str,PyCompilerFlags*标志)
{
//…更多初始化。。。
做{
ret=PyRun_InteractiveOneObjectEx(fp、文件名、标志);
//…错误处理。。。
}while(ret!=E_EOF);
// ...
}

明白了,所以仅仅因为CPython在Python函数调用中使用Python对象和数据结构的私有堆,当然这并不妨碍CPython使用操作系统为这些C调用提供的堆栈,对吧?@Josh Python脚本在CPython(解释器)上运行,而CPython在CPU上运行。CPython不能在自己的python堆栈上运行,因为这些堆栈不兼容,它们使用不同的数据结构——一个由C定义,另一个由CPython定义。此外,CPython使用OS提供的堆栈不是因为它可以,而是因为它必须这样做。提供堆栈的方式并不重要。我的意思是,从理论上讲,编写不使用堆栈的C程序是可能的,但那将是受虐狂的可怕练习。