【问题标题】:Some clarification on TCB of an operting system关于操作系统TCS的一些说明
【发布时间】:2013-04-17 13:00:27
【问题描述】:

我是计算机专业的本科生,正在学习操作系统课程。对于我的任务,我需要实现一个简单的线程管理系统。

我正在为 TCB 创建一个结构。根据我的讲义,我的 TCB 中可以有:

注册, 程序计数器, 堆栈指针, 线程 ID 和 进程号

现在根据我的讲义,每个线程都应该有自己的堆栈。我的问题是这样的:

仅仅通过存储堆栈指针,我可以为每个线程保留一个唯一的堆栈吗?如果我这样做了,一个线程堆栈不会覆盖其他堆栈吗?

如何防止这种情况发生?限制每个线程的堆栈???请告诉我这通常在普通操作系统中是如何完成的。

请帮忙。提前致谢。

【问题讨论】:

    标签: memory-management operating-system


    【解决方案1】:

    操作系统可以通过监视位于地址空间堆栈部分周围的不可访问页面的页面错误来控制堆栈增长。这有助于检测少量堆栈溢出。

    但是如果你将堆栈指针移到地址空间的堆栈区域之外并使用它来访问内存,你可能会进入全局变量或堆或代码或另一个线程的堆栈并破坏那里的任何东西。

    线程在相同的地址空间中运行是有原因的,以便以最小的开销在彼此之间共享代码和数据,并且它们的堆栈通常不会被共享或被访问。

    操作系统通常无法采取任何措施来防止程序发生堆栈溢出和损坏并帮助它们从中恢复。操作系统根本不知道也不知道任意程序是如何工作的以及它应该做什么,因此它不知道什么时候开始出错以及如何处理它们。操作系统唯一能做的就是终止一个做错事的程序,比如试图访问不可访问的资源(内存、系统寄存器等)或执行无效或不可访问的指令。

    【讨论】:

    • 明白你的意思,谢谢。我真正要问的是,由于操作系统无法帮助我,我能做些什么来阻止线程将它们的堆栈增长到彼此?据我了解,编译器(在我的例子中是 C)只使用一个堆栈。所以保持不同的堆栈指针不会阻止它们相互增长。
    • 当一个线程被创建时,无论它是主线程还是任何辅助线程,它都有自己的、独立的堆栈,不会与其他任何东西重叠。无论如何,在防止坏事发生方面,您只能做这么多。
    • 猜想除了在线程堆栈之间留出大量空间之外,我别无选择。
    • 也许我会使用堆而不是堆栈作为线程堆栈。
    • 您可以通过选择堆栈位置来减少或增加早期堆栈溢出检测的机会,但您无法消除堆栈溢出。
    猜你喜欢
    • 2016-05-16
    • 2019-02-07
    • 2011-07-14
    • 2012-05-28
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    相关资源
    最近更新 更多