软件程序是怎么运作的?
我们在使用日常软件时的操作并不难,但是你知道软件程序每一个API运行的背后都存在什么不可告人的秘密吗?
1.操作系统(OS)
在没有操作系统之前,我们对硬件的操作都十分繁琐,例如当你需要将运作的数据写入内存中,你就得要自行分配一个内存区块出来让自己的数据能够填上去,所以你还得要了解到内存的地址是如何定位的…哇,这也太难了吧!为了解决这种”重复造车轮“的问题,引入了操作系统这个概念,它其实就是一组程序(一大堆代码的集合),这段程序的重点在于管理计算机的所有活动以及驱动系统中的所有硬件。操作系统的大致内容包括:
1.1 操作系统内核(Kernel)
操作系统核心也是操作系统中的一段代码,它是直接控制硬件的一段代码,例如让CPU可以开始判断逻辑与运算数值、让主存储器可以开始加载/读出数据与程序代码、让硬盘可以开始被存取、让网络卡可以开始传输数据、让所有周边可以开始运转等等。我们的计算机能不能做到某些事情,都跟核心有关,只有核心提供有相应的功能,我们的计算机才能完成相应的功能。例如你的核心并不支持TCP/IP的网络协议,那么无论你购买了什么样的网卡,这个核心都无法提供网络能力的!核心程序放置到的内存区块是受保护的,开机后就一直常驻在内存当中,时刻处于准备好的状态。
1.2 系统调用(system call)
为了更方便的对硬件进行操作,操作系统通常会提供一整组的开发接口给工程师来开发软件!工程师只要遵守该开发接口那就很容易开发软件了!就像C语言中的库函数,我们只需要按照相应的格式去应用它就能实现相应的功能,并不需要去考虑他是怎么实现的。
所以计算机的最终是硬件,计算机的运行和管理都是在管理硬件;核心程序主要是在管理硬件,提供合理的计算机资源分配(cpu资源,内存使用资源等);所以只要硬件不同,相应的核心就要进行修改,例如不同架构的CPU(x86架构与arm架构的cpu)的核心就不一样;系统调用层是为了保护内核让程序设计师更容易开发软件而提供的一些开发接口
2. 根据上文的分析,我整理出一些知识:
操作系统的核心层直接参考硬件规格写成,所以同一个操作系统程序不能够在不一样的硬件架构下运作。例如在x86架构cpu上运行的windows系列系统就不能在ARM架构的嵌入式设备上运行。
操作系统只是在管理整个硬件资源,包括CPU、内存、输入输出装置及文件系统文件。可以说操作系统只是让计算机的硬件处于一个就绪的状态而已,需要运作的其他功能的话还是要依赖我们的应用程序和一些API。
应用程序的开发都是参考操作系统提供的开发接口,所以该应用程序只能在该操作系统上面运作而已,不可以在其他操作系统上面运作的。例如windows的qq就不能安装在linux上面。
3.内核功能
看了上文我们知道内核是负责整个计算机系统相关的资源分配和管理,在整个计算机系统中,其实最重要是CPU和主存储器,所以内核至少要有一下功能:
3.1 系统调用接口(System call interface):
刚刚聊过了,为了方便程序开发者可以轻易与核心的沟通,将硬件的资源进一步的利用,于是
需要有这个简易的接口来方便程序开发者。
3.2 程序管理(Process control):
我们经常听到的”高并发“就内核进行程序管理的杰作,良好的CPU排程机制和分配机制能有效的加快整体系统效能。
3.3 内存管理(Memory management):
系统所有的程序代码与数据都必须要先存放,所以内存控制是非常重要的.
3.4 文件系统管理(Filesystem management):
例如数据的输入输出(I/O)等等的工。还有不同文件格式的支持等等,如果你的核
心不认识某个文件系统,那么您将无法使用该文件格式的文件。
3.5 装置的驱动(Device drivers):
4. 操作系统与驱动程序的故事:
我们都知道,计算机里的任何一个硬件都是需要驱动程序才能使用起来的,相应的操作系统版本匹配相应的驱动程序版本,但是如果比较晚的推出新的硬件,我们的操作系统岂不是就不认识了,这要怎么办呢?为了解决这个问题,操作系统的相应厂商通常会提供一个开发接口给硬件开发商,他们需要根据这个开发接口设计相应的硬件的驱动程序,这样就能解决问题啦。
5. 应用程序
我们平时接触的一些APP就属于应用程序啦,它是由程序开发者参考操作系统提供的开发接口所开发出来的软件,给我们用户使用。