1.操作系统管理硬件
真正操纵硬件的是操作系统,操作系统可以看成是应用程序和硬件之间的中间层。所有的应用程序对硬件的操作必须通过操作系统来完成,这样做的目的是:首先,防止硬件被失控的应用程序所滥用;其次,操作系统提供统一的机制来控制这些复杂的底层硬件。
操作系统管理硬件
为了实现操作系统对硬件的操纵,操作系统引入了几个抽象的概念。文件是对IO设备的抽象、虚拟内存是对内存和磁盘IO的抽象、进程是对处理器、内存及IO设备的抽象。
操作系统的抽象机制
2.进程的解释
(1).以shell命令行中执行./hello命令为例进行说明,最开始的时候只有shell进程在运行,即shell在等待命令行的输入。
命令输入
(2).当通过shell进程加载hello进程时,shell进程通过系统调用来执行我们的请求。系统调用会将控制权从shell进程传递给操作系统,操作系统保存shell进程的上下文。然后,创建一个新的hello进程及其上下文。接着,将控制权转交给新的hello进程。hello进程执行完成后,操作系统会恢复shell进程的上下文,并且将控制权交给shell进程,之后shell进程继续等待下一个命令的输入。
进程上下文切换
上下文:操作系统会跟踪进程运行中所需要的所有状态信息,这种状态(例如:当前PC和寄存器的值、内存中的内容等)称为上下文。
3.线程的解释
现代操作系统中一个进程由多个线程组成,每个线程都运行在进程的上下文中,共享代码和数据。
线程
4.虚拟内存
操作系统为每个进程提供了一个假象,即每个进程都在独自占用整个内存空间。每个进程看到的内存都是一样的,称之为虚拟地址空间。
进程的虚拟地址空间
进程的虚拟地址空间:从下往上,地址是增大的。
- 第一个区域:用来存放程序的代码和数据的,这个区域的内容是从可执行目标文件中加载而来的。对所有进程来说,代码都是从固定的地址开始的;
- 第二个区域:堆heap,函数malloc所申请的地址空间就在这个堆中的,堆可以在运行时动态的扩展和收缩;
- 第三个区域:共享库的存放区域,这个区域存放C语言的标准库和数学库这类共享库的代码和数据;
- 第四个区域:用户栈,函数调用的本质就是压栈;
- 第五个区域:为内核保留的区域,应用程序的代码不能读写这个区域的数据,也不能直接调用内核中定义的函数,这个区域对应用程序不可见;
5.文件
Linux中一切皆文件,键盘、鼠标、磁盘、显示器,甚至网络这些都可以看成是文件,系统中所有的输入和输出都可以通过读写文件来完成。
"一切皆文件"
6.参考资料
[1].本文图片来源,侵权必删:https://www.bilibili.com/video/BV1cD4y1D7uR?p=3&spm_id_from=pageDriver