玩命加载中 . . .

1.2-操作系统


1.2 操作系统

无论是shell程序还是hello程序,都没有直接访问键盘、显示器、磁盘等硬件设备,真正操控硬件的是操作系统,可以把操作系统看成是应用程序和硬件之间的中间层,所有应用程序对硬件的操作必须通过操作系统来完成

为了实现上述功能,操作系统引入了一些抽象的概念,例如:文件是对IO设备的抽象,虚拟内存是对内存和磁盘的抽象,进程是对处理器、内存以及IO的抽象

1.2.1 进程

程序在现代系统上运行时,操作系统会提供一种假象,就好像系统上只有这个程序在运行,程序看上去是独占地使用处理器、内存和IO设备,处理器看上去就像在不间断地执行程序中的指令,即该程序的代码和数据是系统内存中唯一的对象。这种假象是通过进程的概念来实现的

假设示例场景中只有两个并发的进程,shell进程和hello进程,最开始只有shell进程在运行,即shell在等待命令行的输入,当我们通过shell进程加载hello进程时,shell进程通过系统调用来执行我们的请求,系统调用会将控制权由shell进程传递给操作系统,操作系统保存shell进程的上下文context,然后创建一个新的hello进程以及上下文,然后将控制权转交给hello进程,hello进程执行完之后,操作系统就会恢复shell进程的上下文,并将控制权交给shell进程,之后shell进程继续等待下一个命令的输入

上下文:操作系统会跟踪进程运行中所需要的所有状态信息,这种状态就是上下文,例如当前PC和寄存器的值,以及内存中的内容等

1.2.2 虚拟内存

虚拟内存为每个进程提供了一个假象,就是每个进程都在独自占用整个内存空间,称之为虚拟内存空间

  1. 从下往上,第一个区域是用来存放程序运行的代码和数据,这个区域的内容是从可执行目标文件中加载而来的,对于所有的进程,代码都是从固定的地址开始,全局变量就是放在这个区域

  2. 再往上是,程序中由malloc申请的空间就在这个区域,堆可以在运行时动态地扩展和收缩

  3. 接下来是共享库的存放区域,主要存放像C语言标准库和数学库这种共享库的代码和数据

  4. 继续往上是用户栈,栈的增长方向是从高地址到低地址

  5. 最顶部是为内核保留的区域,应用程序不能读写这个区域的数据,对应用程序是不可见的


文章作者: kunpeng
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 kunpeng !
  目录