linux中到底有多少个系统空间堆栈?? Linux/Unix社区 / 内核及驱动程序研究...

来源:百度文库 编辑:神马文学网 时间:2024/04/26 18:16:47
内核堆栈

您查询的关键词是:linux 用户栈 大小  。如果打开速度慢,可以尝试;如果想保存快照,可以。
(百度和网页的作者无关,不对其内容负责。百度快照谨为网络故障时之索引,不代表被搜索网站的即时页面。)
CSDN首页空间新闻论坛Blog下载读书网摘搜索.NETJava视频接项目求职在线学习买书程序员通知
【经验总结】不能实施并行处理的情况浅谈并行编程中的任务分解模式


搜索 收藏 打印 关闭
CSDN社区 > Linux/Unix社区 > 内核及驱动程序研究区
linux中到底有多少个系统空间堆栈??
boyb()2004-10-12 16:05:30 在 Linux/Unix社区 / 内核及驱动程序研究区 提问
每个进程的系统空间是相同,可有的书上说每个进程
都有一个系统空间堆栈,而且大小固定,只有大概7k
那么大,这是什么原因??
既然系统空间都是一样的,为什么每个进程都要有一个
系统空间堆栈呢,只要一个不就可以了吗? 问题点数:20、回复次数:40Top
spiderww(spider)回复于 2004-10-12 16:13:59 得分 0
我想你说的系统空间是指进程的虚拟地址空间吧。空间一样应该是说布局是一样的,但是里面的代码和数据是不一样的。也就是说每个进程空间中的代码段、堆、用户栈、共享库空间等拥有相同的空间相对地址,但是在堆、栈、以及代码段内部对于每个进程来说都是不同的,每个进程都有各自的执行指令和临时、全局的变量。Top
boyb()回复于 2004-10-12 16:57:17 得分 0
to     spiderww:
我说的是指进程的系统空间堆栈,而不是用户空间堆栈Top
winux0(随缘不变)回复于 2004-10-12 17:50:52 得分 0
你说的是进程的系统空间堆栈
进程生成的时候会分配连续两个page也就是8K的数据用来保存进程结构,这个进程结构大概有1K左右,剩下的7K用作该进程的系统堆栈
这个堆栈是在系统空间中的Top
boyb()回复于 2004-10-12 18:11:46 得分 0
to   winux0:
我就是问为什么每个进程都要分配系统堆栈的,请你看看我提的问题Top
winux0(随缘不变)回复于 2004-10-12 19:20:55 得分 0
那难道所有进程用一个系统堆栈,又不是单进程系统,进程调度之后堆栈不乱了吗Top
boyb()回复于 2004-10-12 21:06:16 得分 0
to   winux0:
因为每个用户进程都有自己的用户堆栈,并且对这些进程进行调度的
是系统,所以只要用一个系统空间堆栈就可以了Top
yrj(机枪)回复于 2004-10-13 00:28:02 得分 0
在多进程系统中,需要切换进程,就需要把当前的进程的信息保存,这个堆就是用于保存这些的,以便在下次进程切换回来的时候恢复现场。Top
nuaacims(沉底鱼)回复于 2004-10-13 01:15:07 得分 0
非常的不理解
系统堆栈     和   用户堆栈的概念
对于每个process不是都对应一个stack,难道是两个?
是不是对应每个process的用户态/kernel分别分配了   用户stack/kernel   stack?Top
boyb()回复于 2004-10-13 09:27:02 得分 0
to     nuaacims:
书上就是这么说的,我还没有理解
to     yrj(机枪):
每个进程已经有一个   进程控制块   和   自己的用户空间栈,用它就可以保存进程的信息了;
另外,用于统一管理这些进程的那个线程是不是也有它自己栈,它的大小也有7k的限制吗?Top
spiderww(spider)回复于 2004-10-13 09:28:35 得分 0
yrj(机枪)的意思是不是说所谓系统堆栈就是保存进程调度信息的空间?Top
spiderww(spider)回复于 2004-10-13 09:34:19 得分 0
to   boyb()   :
你看的是哪本书啊?Top
yrj(机枪)回复于 2004-10-13 10:14:49 得分 0
进程的调度信息是不能放在用户堆栈中的,因为用户区的页面是可以被交换的,而调度信息怎么可以被交换掉了,交换掉,还怎么调度?Top
freasy(崔沙)回复于 2004-10-13 10:15:16 得分 0
进程有两种状态
一种状态,进程运行程序本身的代码,使用用户堆栈
一种状态,进程通过调用系统调用,进入内核态.为该进程服务的系统调用使用进程的系统堆栈Top
boyb()回复于 2004-10-13 10:56:25 得分 0
to   spiderww:
我看的是   linux内核源码情景分析
to   yrj(机枪):
我并不是说用用户堆栈来保存调度信息,用户堆栈只能保存自己的一些东西。而只要用一个
系统栈来保存调度信息,来为进程调度服务,而不需要为每个进程都分配一个系统栈,因为在
一个时刻只能进行一次系统调度(这里先不考虑多个cpu的情况)Top
akyca(Hello,World)回复于 2004-10-13 11:09:52 得分 3
winux0(阿鱼木木)和yrj说的很对,内核为每个进程分配8k的空间用于保存进程的tss结构,这个空间称为用户进程的内核栈。但用户空间同样拥有用户栈,为什么会有两个堆栈呢???首先要明白这两个栈的作用。
实际上,内核栈对用户程序是不透明的,用户只知道用户栈的存在。调用子函数时,将参数和返回地址压栈,从子函数返回时出栈,这些都是对用户栈进行操作。但用户程序也有访问内核栈的时候,这是通过系统调用达到的,但用户程序根本无需理会内核栈的行为,因为这是操作系统对进程的统一管理和调度。
内核栈的设立有两个目的:1是为了系统对进程进行调度,2是为了在用户进程执行系统调用进入内核空间时有堆栈可用。
Top
winux0(随缘不变)回复于 2004-10-13 11:19:39 得分 2
系统堆栈里存了很多重要的东西,比方说一个进程通过系统调用进入内核,它的寄存器等等一些东西需要保存在堆栈中待进程退出内核后恢复
这个可以在楼主看的《linux内核源码情景分析》上册,第301-302页找到描述
此外就像楼上所说,进程进入内核后与用户空间是分开的,这个堆栈就可以用了Top
boyb()回复于 2004-10-13 12:04:59 得分 0
to   楼上的两位:
你们没有清楚我问的是什么。
我也知道有必要为进程同时设置用户栈   和   系统栈,并且每个进程都应该有一个用户栈,
但问题是可以统一设置一个系统栈归每个进程公用,而不需要为每个进程都设置一个系统栈
Top
redex(cc)回复于 2004-10-13 12:07:26 得分 0
"每个进程都有一个task_struct数据结构和一片用作系统空间
堆栈的存储空间.   这二者缺一不可,   又有紧密的联系,   所以在
物理存储空间中也连在一起.   内核在为每个进程分配一个task_struct
结构时,   实际上分配两个连续的物理页面(共8192字节).   这两个页面的
底部用作进程的tast_struct结构,而在结构的上面就用作进程的系统空
间堆栈"     --<>p267Top
redex(cc)回复于 2004-10-13 12:16:03 得分 0
系统调用是可中断的,   如果所有进程共用同一个系统堆栈.
则假设当第一个进程的系统调用被中断了,   那这个系统堆栈
就被毁坏了,   第一个进程就不能返回了.Top
boyb()回复于 2004-10-13 13:27:55 得分 0
to   redex:
中断的时候,把系统调用被打断处的地址入栈,中断返回时出栈就可以了,
怎么会破坏呢?Top
winux0(随缘不变)回复于 2004-10-13 14:28:22 得分 0
你完全是按照单进程的模式去考虑这些问题了,中断返回时是进程调度点,也不一定会到原来那个进程
Top
redex(cc)回复于 2004-10-13 16:36:38 得分 0
顶,   把这个问题研究透!!!Top
redex(cc)回复于 2004-10-13 17:00:42 得分 2
再查<<情景分析>>,   发现如果果真如楼主所言,   则系统中定义
的取得当前进程的宏:   current就乱了:
因为current是根据(esp   &   8191UL)的值得出的,   那你怎么
区分current是哪一个进程?   (还根据上面我提供的那个情景,即
一个进程的系统调用被令一个进程中断).   见书p268.Top
spiderww(spider)回复于 2004-10-13 18:01:13 得分 0
up,继续关注Top
redex(cc)回复于 2004-10-14 08:29:59 得分 0
按照楼主的思路又想了一下昨天下午17点钟的发言,
发现我的解释还是行不通。   因此,继续关注。请大家
仔细查阅资料或向别人请教,   把这个问题彻底弄懂。Top
lysliberty(liberty)回复于 2004-10-14 08:59:45 得分 0
假设有5个进程需要调度(所谓的调度就是中止一个进程,转而运行另外一个进程,在
中止进程的时候,必须保存进程中止时的寄存器状态).   比如说,在某一时刻,选择3号进程运行
那么,系统必需持有1,2,4,5号进程的状态(以便将来调度之用).
如果按照楼主所说,多进程共享一个系统堆栈,那这些寄存器信息还怎么区分?Top
boyb()回复于 2004-10-14 09:26:52 得分 0
to   lysliberty:
用任务控制块Top
yrj(机枪)回复于 2004-10-14 09:57:52 得分 0
对进程的调度和管理理解了还不是很深入,还是看大家的回答吧Top
winux0(随缘不变)回复于 2004-10-14 10:23:42 得分 0
回复人:   boyb()   (   )   信誉:100
to   lysliberty:
用任务控制块
用任务控制块?
那不就是进程创建时被分配的那块内存
那块8K的内存除了task_struct,剩下的作为堆栈完成如此这些功能Top
boyb()回复于 2004-10-14 10:53:13 得分 0
to   winux0:
我的意思是用任务控制块来保存那些寄存器的值,而用一个公用的系统栈
来为每个进程公用(当然用在进程处于系统态时)。
还有,我想问一下,除了为每个用户进程都有一个系统栈外,是不是还有
别的系统栈,因为我感觉每个进程私有的那块系统栈太小了(只有7k左右),
如果发生一些递归调用,7k很可能马上就耗尽了(它不象用户栈那样可以根据需要
动态扩展)。大家知道,每个用户进程的用户栈位于用户空间的顶端,即靠近
3G的地方。那系统空间的顶端是不是也应该有一个系统栈,而这个栈可以动态
扩展?我只是猜想,希望大家讨论一下。。。
Top
redex(cc)回复于 2004-10-14 11:07:59 得分 0
继续讨论Top
winux0(随缘不变)回复于 2004-10-14 13:52:39 得分 4
没有公共的系统堆栈,这种实现方式也不太合理,比方说:
系统中有两个进程A,B
某时刻进程B在运行,由于你说的一些原因需要将一些数据存放在所谓的“公共系统堆栈”中
如果这个时候进程开始调度,A进程开始运行,那它该怎么处理这个“公共系统堆栈”内的东西呢?
每个进程的系统堆栈的确是很少,所以那些运行在内核中的进程程序设计需要注意堆栈限制问题
系统空间并不存在这样一个公共堆栈,其实Linux将1G的内核空间分成"物理内存区",   "虚拟内存分配区",   "高端页面映射区","专用页面映射区",   "系统保留映射区"这几个部分,其中物理内存区是最大的,它用来映射系统的物理内存。各部分的划分和大小你可以找相关资料看看Top
winux0(随缘不变)回复于 2004-10-14 14:11:09 得分 0
唉,刚才那个例子有问题,2.4内核是非抢占的,一般不会有那种情况。Top
boyb()回复于 2004-10-14 14:36:27 得分 0
to   winux0:
还有个疑问,就是系统刚启动,还没有用户进程,只有内核线程时,
这时,系统用的是什么栈?难道也只有7k限制吗
Top
arnold8792(马剑侠)回复于 2004-10-14 14:49:56 得分 4
首先要搞清楚linux的调度机制,在内核态时是不会发生调度的,而且进入内核态与返回用户态对堆栈的使用是平衡的,那么这样说是不是所有的用户进程都使用一个堆栈呢?
事实并不是这样,linux使用的是独立的,linux中的进程四个基本特性(情景源代码分析)中就包括了进程的内核堆栈
我个人认为这样的设计是为了更好的管理,更强健,虽然理论上只要堆栈的使用平衡,即所有的原子操作后堆栈都是一样的,就可以共享使用,这就相当于只是一种数据结构,但就像上面的兄弟说的一样,linux把堆栈与task_struct放在一起,并用简单操作得到current指针,这在共享堆栈情况下是不允许的
我想还有就是要使进程的独立性,操作系统是很复杂庞大的东西,如果不搞的清晰,独立一些,最后出了问题是很难找的,如果一个进程(中断,调用)的时候由于某种原因(中断处理程序写的不对)使堆栈不平衡了,那就会影响整个系统,而如果堆栈是独立的,那只会影响此进程,大不了把它kill了,内核和别的进程依旧不变,这可能也是linux系统稳定的原因吧(相对windows)
所以像linux的设计:用户与内核分的非常清楚,好理解也更强壮,你死你的,不关别人的事
楼主也可以自己去改成共享堆栈的(不过那可不是小事:)),我想这个问题只是design方式的不同,
当然也有可能别的情况,希望高手指点Top
arnold8792(马剑侠)回复于 2004-10-14 14:57:37 得分 3
to   winux0:
我的意思是用任务控制块来保存那些寄存器的值,而用一个公用的系统栈
来为每个进程公用(当然用在进程处于系统态时)。
还有,我想问一下,除了为每个用户进程都有一个系统栈外,是不是还有
别的系统栈,因为我感觉每个进程私有的那块系统栈太小了(只有7k左右),
如果发生一些递归调用,7k很可能马上就耗尽了(它不象用户栈那样可以根据需要
动态扩展)。大家知道,每个用户进程的用户栈位于用户空间的顶端,即靠近
3G的地方。那系统空间的顶端是不是也应该有一个系统栈,而这个栈可以动态
扩展?我只是猜想,希望大家讨论一下。。。
楼主看看里面提到了堆栈就是这么小,这也是设计的,还说写中断程序的时候不要用什么递归,大的局部变量:
char   buf[1024];
不过对于开发驱动程序的程序员来说应该不会有这样的问题Top
arnold8792(马剑侠)回复于 2004-10-14 14:59:34 得分 0
to   winux0:
还有个疑问,就是系统刚启动,还没有用户进程,只有内核线程时,
这时,系统用的是什么栈?难道也只有7k限制吗
兄弟,我发觉你还没看完代码就在提问了
boot....main.c..........0   process.........
Top
boyb()回复于 2004-10-14 15:18:39 得分 0
to   arnold8792:
谢谢你的热心回答。
我确实还没有把代码看完,但那么多代码要全部看完的话也
不太可能吧。在读书和看代码时,如果遇到不能理解的问题,经过
长时间思考还是不能解决的话,我就会到这里来请教,因为对别人
来说可能会很简单,我自己想的话会花很多时间。我也相信还有
很多朋友会遇到同样的问题,所以。。。
Top
winux0(随缘不变)回复于 2004-10-14 17:20:37 得分 2
就像arnold8792说的那样,Linux代码复杂而庞大,其中一些地方的设计是考虑到了整体的合理性
所以如果没有对整个操作系统各部分结构有比较系统化的理解
而就单单从一个部分去考虑问题的话,往往是不行的Top
arnold8792(马剑侠)回复于 2004-10-15 09:31:05 得分 0
to   winux0:
还有个疑问,就是系统刚启动,还没有用户进程,只有内核线程时,
这时,系统用的是什么栈?难道也只有7k限制吗
这个问题等你看完系统初始化就知道了,一步一步到位的Top
相关问题
堆 、?栈 、?堆栈************************************堆,栈,堆栈********************************程序的堆栈在进程空间的什么地方?????堆,栈?堆栈溢出堆栈溢出?堆栈溢出堆栈问题堆栈问题线程里New操作分配的存储空间,用的是线程的堆栈吗?
关键词
系统用户代码中断线程内存映射结构物理页面
得分解答快速导航
帖主:boybakycawinux0redexwinux0arnold8792arnold8792winux0
相关链接
CSDN Blog技术文档代码下载第二书店读书频道
广告也精彩
反馈
请通过下述方式给我们反馈



网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号世纪乐知(北京)网络技术有限公司 提供技术支持CSDN网站24小时值班电话:13552009689Copyright ? 2000-2009, CSDN.NET, All Rights Reserved