【问题标题】:How does the OS detect numbers and strings?操作系统如何检测数字和字符串?
【发布时间】:2011-08-01 20:06:28
【问题描述】:

如果我们有一个字符串 "A" 和一个数字 65,因为它们在内存中看起来相同,操作系统如何知道哪个是字符串,哪个是数字?

另一个问题 - 假设程序分配了一些内存(例如,一个字节)。操作系统如何记住分配内存的位置?

【问题讨论】:

  • 你的 #1 没有多大意义。
  • @pyroscope- 我认为这实际上是一个非常合理的问题。当它们在一天结束时看起来都一样时,计算机如何知道将不同的变量视为具有不同的类型,这一点并不明显。

标签: string memory-management operating-system numbers


【解决方案1】:

这些细节都不由操作系统处理。它们由用户程序处理。

对于您的第一个问题,在内存内部,字符“A”和数值 65 之间绝对没有区别(当然,假设您只查看一个字节的数据)。当您看到程序如何解释这些位时,就会出现差异。例如,如果用户程序试图将字符串打印到屏幕上,它可能会对操作系统进行一些系统调用以要求操作系统打印字符。在这种情况下,操作系统中的代码由一系列汇编指令组成,用于在显示设备的某处复制这些位。然后显示器的任务是渲染一组适当的像素以绘制字符“A”。换句话说,程序从来没有“知道”这个值是“A”。相反,硬件只是简单地推动控制另一段代码的位,该代码最终负责将这些位转换为像素。

对于第二个问题,这实际上取决于内存管理器。程序有很多方法可以分配内存并知道它的存储位置。我不确定我是否理解您的要求,但我相信这个答案应该足够了:

  1. 在操作系统级别,操作系统内核甚至不知道字节已分配。相反,操作系统只是分配巨大的内存块供用户程序在运行时使用。当程序终止时,所有内存都会被回收。

  2. 1234563程序。这通常将分配的内存作为“块”列表来跟踪,其中每个内存块都被视为元素的双向链接列表。每个块通常都带有指示它正在使用以及块有多大的信息,这允许内存管理器在释放内存后回收内存。
  3. 在用户代码级别,当您请求内存时,通常将其存储在一个指针中以跟踪内存的位置。这只是内存中存储地址的一系列字节,除非得到指示,否则操作系统和内存管理器永远不会查看这些字节。

希望这会有所帮助!

【讨论】:

  • 谢谢,有什么好的资源可以解释它!非常感谢您的回答!
【解决方案2】:

没有。 2 - 系统记录所有分配(某个进程的),因此可以删除它们,例如当进程终止时。我建议您阅读一本有关操作系统原理的书(例如 Tanenbaum 的“现代操作系统”)。

【讨论】:

  • 这不是更像操作系统为一个进程分配一块内存(例如虚拟内存),然后由该进程来处理它,而不是操作系统记录分配吗?跨度>
  • 这里有几层管理,虚拟内存映射是操作系统中的东西(*nix 中的 sbrk),而分配给进程的页面则由应用程序使用的任何内容(例如一些malloc 或 Java GC 的形式)。
【解决方案3】:
  1. 字符“A”和整数 65 以相同的方式(至少在 32 位系统上)存储在内存中。然而,字符串“A”的存储方式不同,这可能取决于系统或编程语言。以 C 为例,它将字符串存储为本质上是一个字符数组,后跟空字符。

  2. 操作系统使用内存管理器来跟踪哪个进程正在使用哪些内存部分。

【讨论】:

    【解决方案4】:
    1. 对于计算机,字符串就是数字。一个最简单的例子是一个 ASCII 表,其中每个字母都附有一个数字。因此,如果您熟悉 C,您可以编写 printf("%c", 0x65) 并实际上得到 A 而不是数字。希望这是有道理的。

    2. 操作系统不记得程序分配的内存位置。这就是pointers 的用途!

    【讨论】:

      【解决方案5】:
      1. 'OS' 应用了一种算法,看起来像:“如果字符串中的每个字符都是数字,那么字符串就是数字”,并且对于小数、+/- 等变得更加复杂!
      2. http://en.wikipedia.org/wiki/Dynamic_memory_allocation!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-01
        • 1970-01-01
        • 2014-06-25
        相关资源
        最近更新 更多