String 操作系统如何检测数字和字符串?

String 操作系统如何检测数字和字符串?,string,memory-management,operating-system,numbers,String,Memory Management,Operating System,Numbers,如果我们有一个字符串“a”和一个数字65,因为它们在内存中看起来是相同的,那么操作系统如何知道哪个是字符串,哪个是数字 另一个问题——假设一个程序分配了一些内存(比如,一个字节)。操作系统如何记住在哪里分配了内存 “OS”应用了一种算法,它看起来像:“如果字符串中的每个字符都是一个数字,那么字符串就是一个数字”,并且对于小数、+/-等变得更加复杂 ! 对于计算机来说,字符串是一个数字。最简单的例子是ASCII表,其中每个字母都附有一个数字。因此,如果您熟悉C,您可以编写printf(“%C”,0

如果我们有一个字符串
“a”
和一个数字65,因为它们在内存中看起来是相同的,那么操作系统如何知道哪个是字符串,哪个是数字

另一个问题——假设一个程序分配了一些内存(比如,一个字节)。操作系统如何记住在哪里分配了内存

  • “OS”应用了一种算法,它看起来像:“如果字符串中的每个字符都是一个数字,那么字符串就是一个数字”,并且对于小数、+/-等变得更加复杂
  • !
  • 对于计算机来说,字符串是一个数字。最简单的例子是ASCII表,其中每个字母都附有一个数字。因此,如果您熟悉C,您可以编写
    printf(“%C”,0x65)
    并实际获得一个
    a
    而不是数字。希望这是有道理的

  • 操作系统不记得程序分配的内存的位置。这就是我们的目的


  • 第2条-系统保留(某个进程的)所有分配的记录,因此可以在进程终止时删除这些分配。我建议你读一本关于操作系统原理的书(例如Tanenbaum的“现代操作系统”)。

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

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

    对于第二个问题,这实际上取决于内存管理器。一个程序有很多方法来分配内存并知道它存储在哪里。我不确定我是否完全理解你的问题,但我相信这个答案应该足够了:

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

  • 在程序级,大多数程序都包含一个内存管理器,这是一段代码,负责将大块内存分配并分成更小的块,然后供程序使用。这通常以“块”列表的形式跟踪分配的内存,其中每个内存块都被视为一个双链接的元素列表。每个块通常都带有注释信息,指示它正在使用中以及块的大小,这允许内存管理器在释放内存后回收内存

  • 在用户代码级别,当您请求内存时,通常将其存储在指针中以跟踪内存所在的位置。这只是存储地址的内存中的一系列字节,除非得到指示,否则操作系统和内存管理器永远不会查看这些字节

  • 希望这有帮助

  • 字符“A”和整数65以相同的方式(至少在32位系统上)存储在内存中。但是,字符串“A”的存储方式不同,这取决于系统或编程语言。以C为例,它将字符串存储为后跟空字符的字符数组

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


  • 你的#1没有多大意义。@pyroscope-我认为这实际上是一个非常合理的问题。当一天结束时,所有变量看起来都一样时,计算机如何知道将不同的变量视为具有不同的类型并不明显。这不是更像是操作系统分配了一块内存(例如虚拟内存)吗对于一个进程,如何处理它而不是操作系统记录分配取决于该进程?这里有几个管理层,虚拟内存映射是OS中的某种东西(sbrk in*nix),而给定给进程的页面则由应用程序使用的任何东西(例如,某种形式的malloc或Java GC)来处理.谢谢,有什么好的资源可以解释吗!我真的很感激你的回答!