操作系统
操作系统是一套软件,它的任务就是为上层开发的用户,提供一个更方便的开发环境,同时
让硬件连接到系统中,能够非常方便,从而提高开发速度,以及稳定可靠。
操作系统就是这么存在的。
我们理解它,可以用一个非常简单的例子,这里我们看下。
我们做一个游戏,写第一个游戏的时候,用到了一些算法,比如检测碰撞,爆炸特效,然后开发第二个游戏的时候,也要用到这些算法。
常规的做法就是复制第一个游戏的这部分代码,改动下,用在第二个游戏。
第三个游戏发现也用这块,复制是可以解决。但是后面还会出现第四个游戏,所以这时候有人提议,把这部分算法,单独拉出来,做成一个模块,方便后续的游戏引用。
操作系统也是一个模块,解决的是硬件的处理,以及对上层软件调用的适配,方便使用。
我们前面说过,出现内存的原因,一个是因为硬盘的速度问题,还有一个更为关键的是,内存是在运行当中是可以改变的。
这一块,我们在随后的链接器加载器这边来说,现在先有一个概念。记住一点,硬盘上的程序加载进入系统,被操作系统加载成一个进程,记录下来,运行。
我们操作系统主要有哪些部分组成呢?它设计了哪些模块呢?
1 设备驱动程序
这部分就是解决硬件连接进来,我们该如何加载,解析,这块学习可以去看下相关书籍。Linux操作系统和 Windows 操作系统,两边对这个设计有区别。
2 文件管理系统
设计如何读取硬盘,U 盘,对应不同的文件格式,该如何加载,读写操作。
3 进程管理
我们的 CPU 运行很快,而我们的程序加载进来,如果只有一个程序,实际上大多时候 CPU就是空闲的了。那么让它多干一些事,就是一个优化。像我们电脑上,一边看电视,一边浏览网页。
能够同时的原因是,CPU 的运行,完全能够保证让多个进程运行,我们使用的人感知不到被切换。这个如何理解?就如同魔术师把扑克牌变没,消失。
我们肉眼捕捉不到他怎么换的,所以我们就感到很神奇。CPU 的速度比这个更快,它让电视TV,和浏览器两个快速切换运行,我们肉眼感知不到,就认为同时运行了。
那么多个进程就需要管理起来,操作系统来完成这部分工作。
4 进程间通信
进程之间需要相互配合,所以需要通信,像 msg ,socket,pipe 等一系列的方法。这部分也是由操作系统提供。
5 内存管理
进程运行态的时候,是在内存中的。于是对于内存的管理,需要操作系统对实际物理内存进行管理,同时提供一套接口,让进程不需要关注实际物理内存,只需要关注虚拟内存。
这样子每个进程的访问都是虚拟内存,方便运行,真正用的内存是实际物理内存,这个管理过程,也是操作系统提供的。
之前的 DOS 就是实内存模式,同时一个单任务的。
6 中断检测,响应程序
7 创建进程,加载程序的过程
8 网络访问,绘图,播放音乐
下来我们就来说下进程的概念
进程
我们要让一个程序运行,就需要加载进入内存,而把它加载到内存,用什么来管理呢?操作系统给了一个概念,叫做进程。
进程就是程序装载进入准备阶段了,操作系统这时候根据时间片,获取到程序的入口点,开始执行。
我们的程序,在硬盘上存着,它是由什么组成的呢?程序也是一个文件,所以回到我们之前说的,文件由=文件头+内容组成。
所以程序也有程序的头,也就是约定好的一个格式。
这里,windows 上面叫做 PE,Linux 上面叫做 ELF。两个文件格式。关于这块的知识点,请参考**《加密与解密》《程序员的自我修养》**
进程主要有哪些信息呢?我们把这个叫做 PCB,进程控制块。
主要记录,进程号,进程内存申请信息,进程对应的程序位置,当前的运行状态,以及打开文件,驱动信息记录。
这里运行状态非常重要。
因为我们的 CPU 运算的相关寄存器,这里可以是 PC,SP,以及 R0 这种,都是只有一份。那么进程如果不做保存,当操作系统把这个进程切出去,要运行另一个的时候,这时候的这些寄存器就是错误的。
所以,进程切换的时候,有个动作,就是把自己使用的全局寄存器保存起来,为的是再调用回来的时候,可以恢复到正确的位置。
这个过程叫做进程间切换,而保存的过程成为保护现场。