程序中存储的已经是机器指令了,为什么还需要操作系统?

4 篇文章 0 订阅
3 篇文章 0 订阅

这是在知乎上看到的一个问题(https://www.zhihu.com/question/294827188/answer/2556724327)。原问题如下:

程序在编译的时候,会转换成汇编,然后是机器指令,那么运行的时候,操作系统充当什么呢?
我的意思是,既然程序已经是二进制机器指令文件了,应该是可以脱离操作系统环境来运行吧,但事实不是这样的,希望大佬们能解决小白的问题,,感激不尽。。。

这真的是一个好问题!我简单概括了一下操作系统在程序运行时发挥的作用:
1、负责解析可执行文件格式;
2、负责提供系统调用;
3、负责提供通用函数;
4、负责管理多个进程。

1、操作系统负责解析可执行文件格式

题目中说”程序是二进制机器指令文件“,其实不是完全准确的。编译出来的可执行文件内确实存在机器指令(以及这些指令需要的数据),并且这些指令确实是被CPU直接执行的,但可执行文件内不全是机器指令,还有一些数据是用来描述该文件结构的(例如描述机器指令的具体位置、适用的CPU架构等),这些描述数据的格式是目标操作系统规定的。不同的操作系统,所支持的可执行文件格式不一定相同。例如Linux系统,可执行文件格式是ELF格式;Windows系统可执行文件格式是PE格式。这也是为什么在Windows上编译出来的程序不能直接在相同CPU架构的Linux上运行的原因(尽管它们支持的机器指令是相同的)。当然,Linux可以借助wine等软件执行Windows的程序,但这不是直接执行。如果把机器指令比喻成苹果,操作系统A支持的可能是用袋子装的苹果,操作系统B支持的可能是用箱子装的苹果。虽然最核心的东西是苹果,但包装形式不同。

事实上,也可以编译出直接运行在机器上的程序。这样的程序与操作系统的地位是相当的(尽管比操作系统要简单得多)。如果只是想做一些简单的加减乘除等数学运算,并只把结果保存到内存中,是没有什么问题的(确实有对应的机器指令可以实现这些计算)。但如果程序想要读写文件或者进行网络通信等操作,将会是很复杂的工作:并没有直接对应的机器指令。而如果程序是运行在操作系统之上,只需要简单地调用操作系统提供的系统调用就能完成读写文件和进行网络通信等操作了(见下)。

2、操作系统负责提供系统调用【非常重要】

在操作系统上运行的程序,想要读写文件或进行网络通信等操作,必需借助于操作系统提供的系统调用。有人可能会问,我读写文件的时候,只是include了头文件然后调用了open、read、write这样的函数,很简单啊,并没有进行系统调用啊?其实这种情况下,程序运行时真正使用的是libc.so中的open等函数,确实不是系统调用。但libc.so实现open等函数时使用了系统调用,所以可以理解成是程序间接地使用了系统调用。ps:libc对大部分系统调用都进行了封装,所以我们编程的时候就能很方便地使用操作系统提供的各种能力了。

3、操作系统负责提供通用函数【非必需】

程序想要进行加减乘除计算可以直接使用对应的机器指令,但如果想要计算sin(正弦)、cos(余弦)呢?并没有对应的机器指令(部分CPU存在对应的指令),总不能自己再实现sin、cos等函数吧?解决方式就是:操作系统通常会自带封装了这些常见的函数的动态库(例如sin、cos就存在于libm.so中)。程序只要声明对这些函数的使用,运行的时候就可以直接使用。

之所以说非必需,首先是操作系统并不是必需提供这些动态库,只不过是大部分程序都会使用到这些动态库,所以操作系统一般都会自带这些库。另外就是程序也不是必需使用操作系统提供的动态库,可以用自己的源码与对应的依赖库一起编译并发布,是能够做到不使用操作系统提供的动态库的。
当然操作系统自带的通用函数是有限的,如果操作系统没有提供程序需要的函数,还是要去寻找实现了对应功能的代码,这就是第三方库。

4、操作系统用来管理多个进程

操作系统为用户提供了一个多进程同时运行的环境,所以会为用户提供各种管理进程的方式:启动进程、查看进程状态、杀死进程等。例如启动游戏的时候操作系统就会帮我们启动一个或多个进程。当游戏卡死的时候,我们可以通知操作系统强制关闭游戏,而无需重启电脑。

另一方面,既然操作系统提供了一个多进程同时运行的环境,它也为在其上运行的程序提供了进程管理的机制。例如创建进程、执行程序、进程间通信、进程间同步等(一般通过系统调用实现)。

当然,如果编译出了直接在机器上执行的不依赖操作系统的程序,完全可以自行实现各个模块(可能没有进程/线程的概念)之间的通信同步等操作。不依赖操作系统也完全可以实现自身的功能。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值