标签:java multithreading process process-management
从本书Advanced programming in the Unix environment 开始,我阅读了关于Unix系统中线程的以下内容
All the threads within a process share the same address space, file
descriptors, stacks, and process-related attributes.Because they can
access the same memory,the threads need to synchronize access to
shared data among themselves to avoid inconsistencies.
作者对堆栈的意思是什么?我做Java编程,知道每个线程都有自己的堆栈.所以我对共享堆栈概念感到困惑.
解决方法:
在Unix或Linux进程的上下文中,短语“堆栈”可能意味着两件事.
首先,“堆栈”可以表示控制流的调用序列的后进先出记录.当进程执行时,首先调用main(). main()可能会调用printf().编译器生成的代码将格式字符串的地址和printf()的任何其他参数写入某些内存位置.然后代码写入printf()完成后应返回的控制流的地址.然后代码调用一个跳转或分支到printf()的开头.每个线程都有这些功能激活记录堆栈之一.请注意,许多CPU都有用于设置和维护堆栈的硬件指令,但是其他CPU(IBM 360或其他任何称为CPU)实际上使用了可能分散在地址空间中的链表.
其次,“堆栈”可以指CPU向函数写入参数的内存位置,以及调用函数应返回的地址. “堆栈”指的是进程的地址空间的连续部分.
Unix或Linux或* BSD进程中的内存是一个非常长的行,从大约0x400000开始,到大约0x7fffffffffff(在x86_64 CPU上)结束.堆栈地址空间从最大的数字地址开始.每次调用一个函数时,函数激活的堆栈记录“向下”:进程代码将函数参数和返回地址放在激活记录的堆栈上,并递减堆栈指针,一个用于跟踪的特殊CPU寄存器在堆栈的地址空间中,进程当前变量的值存在.
每个线程都获得一块“堆栈”(堆栈地址空间),供自己用作函数激活记录堆栈.在0x7fffffffffff和较低地址之间的某处,每个线程都有一个保留用于函数调用的内存区域.通常这只是通过约定而不是硬件来强制执行,所以如果你的线程在嵌套函数之后调用函数,那么该线程的堆栈的底部可以覆盖另一个线程堆栈的顶部.
因此每个线程都有一个“堆栈”内存区域,这就是“共享堆栈”术语的来源.这是一个进程地址空间是单个线性内存块的结果,以及术语“堆栈”的两种用法.我很确定一些旧的JVM(真的很古老)实际上只有一个线程. Java代码中的任何线程都是由单个真实线程完成的.较新的JVM,即调用实线程来执行Java线程的JVM,将具有我在上面描述的相同“共享堆栈”. Linux和Plan 9有一个进程启动系统调用(Linux的clone(),计划9中的rfork()),它可以设置共享部分地址空间的进程,也可能是不同的堆栈地址空间,但是这种类型的线程从未真正流行过.
标签:java,multithreading,process,process-management 来源: https://codeday.me/bug/20190812/1645132.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。