看完了Windows核心编程,有几个问题不是很理解,望高人指点

大脚板 2003-08-18 09:37:29
进程中的地址都是虚拟地址,物理存储器中的真实地址又是如何表示的呢

在多个线程同时访问一个函数,函数中的局部变量又是如何处理的

不甚感激

...全文
16 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
LocalVar 2003-08-21
  • 打赏
  • 举报
回复
执行一个函数将它的局部变量都拷贝到堆栈,执行另一个函数又将它的局部变量都拷贝入堆栈。

注意:不是拷贝,拷贝的开销太大了,实际做法是通过指针改变指向来切换堆栈,而这个指针用的是寄存器,所以速度很快
大脚板 2003-08-21
  • 打赏
  • 举报
回复
如茅塞顿开,非常感谢各位
sandrowjw 2003-08-21
  • 打赏
  • 举报
回复
执行一个函数将它的局部变量都拷贝到堆栈,执行另一个函数又将它的局部变量都拷贝入堆栈。
就是这样的,每次调用函数都要在堆栈中开辟一块空间存放所有的局部变量和临时变量,这块空间叫一个stack frame(对于象c++这样的语言,这块空间是可增长的)。所以对于局部变量,根本不存在访问冲突问题。
mfc168 2003-08-21
  • 打赏
  • 举报
回复
全局变量在预编译的时候就已经分配了物理地址空间,局部变量是使用堆栈,分配时PUSH,函数结束后,pop
大脚板 2003-08-21
  • 打赏
  • 举报
回复
to LocalVar(分乃身外之物,即使我回答对了,也别给分)
windows核心编程里讲堆栈的那一章,好象只提到了,对于c++运行期库的全局变量的处理,并没有局部变量的,两者应该有很大的不同
大脚板 2003-08-21
  • 打赏
  • 举报
回复
执行一个函数将它的局部变量都拷贝到堆栈,执行另一个函数又将它的局部变量都拷贝入堆栈吗??总觉的不是很能理解
flybird66 2003-08-21
  • 打赏
  • 举报
回复
问题:进程中的地址都是虚拟地址,物理存储器中的真实地址又是如何表示的呢

一般来说不会给你真实的地址的,原因:系统在分配内存是按一定的方法来分配的,并不是说你指定用哪段内存就让你用哪段内存,如果这样的话,很容易引起系统崩溃的。


问题:在多个线程同时访问一个函数,函数中的局部变量又是如何处理的
在调用函数时,系统自动分配一段内存空间来存放你局部函数的数据,局部函数用完之后就会把这段内存空间释放掉,但它不是将原有的内存清零,所以很多时候你再多次调用局部函数时它会记录上次操作的结果。
另外在同一时间内只有一个线程访问内存,因一个线程访问内存时,它就会把这段内存锁住,用完之后才会释放掉
LocalVar 2003-08-21
  • 打赏
  • 举报
回复
不是函数的拷贝,是局部变量的拷贝。
你说的队,对于x86系统来说,ebp, esp等寄存器用来指示堆栈,线程切换时,这些寄存器的内容就会改变从而指向正确的内存区
大脚板 2003-08-21
  • 打赏
  • 举报
回复
是不是每个线程的堆栈里都有函数的拷贝
比如 void f(){int i=0;i=10;}
两个线程在执行f()时,i的地址应该是不同的喽,系统是如何进行i地址的切换的
xiaohedou 2003-08-18
  • 打赏
  • 举报
回复
我想MS总是把一些东西隐藏起来,使得一些概念理解的不清,比如句柄的事。进程中的地址都是虚拟地址应该与操作系统的调度有关,是个调度地址。多个线程同时访问一个函数,好象不可能。记得书里说大约20ms操作系统给进程一次机会去执行任务,所以线程也是串行化了的。第7章线程的调度、优先级和亲缘性。
sandrowjw 2003-08-18
  • 打赏
  • 举报
回复
第一个问题:查页表
第二个问题:如楼上所言
LocalVar 2003-08-18
  • 打赏
  • 举报
回复
第一个问题:解释起来太麻烦,一般操作系统原理的书上都会或多或少的提到。
第二个问题:局部变量不会冲突,因为每个县城都有自己独立的栈空间(默认为1M),局部变量是在栈中的,这一点在该书上讲到了,不过在哪章我既不太轻了

1,649

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 非技术类
社区管理员
  • 非技术类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧