当前位置: 首页 > Linux

程序?过程?傻傻的一头雾水

时间:2023-04-06 21:53:51 Linux

到现在为止,“程序”和“进程”这两个词你一定见过很多次了。程序和进程有什么区别?程序是一个静态的概念。过程是一个动态的概念。让我们用一个例子来说明这种差异。事实上,该程序在本质上与我们的食谱非常相似。菜谱规定了一道菜完成的全过程,每一步在每个节点上进行了什么样的操作,但是一道美味的菜不是看一遍菜谱就做出来的。真正要做一道菜,应该按照菜谱的要求,准备好食材,按照菜谱的指示,开煤气,锅热后倒入油,把准备好的食材放入和调味料在油温合适的时候下。然后不停地搅拌,直到它熟了,这样一道美味的菜才出锅。在这个例子中,如果把菜谱比作我们写的程序,那么实际按照菜谱做饭的过程就是过程。如果你自己真的炒过菜,相信你会对这一点有更深的体会。如果你没有做过菜,那么笔者强烈建议读者真正为自己做一道菜。进程是计算机科学中一个极其重要的概念。深入理解进程是理解操作系统工作原理的关键,也是编程高手的标志之一。编程高手与普通程序员的分水岭进程是计算机操作系统中一个至关重要的概念。可以说,深入理解进程的概念,是编程高手具备“自我探索”能力,能够深入了解操作系统的分水岭。如何实现流程是一个编程高手的关键标志。理解了这个概念之后,你几乎不会遇到程序的问题,只是你根本不知道问题出在哪里。因为这个概念的重要性,所以我们后续的文章很大一部分都会围绕这个过程进行讲解,目的就是为了保证大家能够真正掌握这个概念,从而在成为高手的道路上迈出坚实的一步。接下来,我们先来看看程序是如何生成的。程序是如何生成的程序这个词其实很笼统。在我们学习和工作的过程中,指的是我们人类可以识别的字符串程序,也可以指机器可以运行的二进制机器指令程序。这个程序是一个可执行程序。.所以这里需要大家认识到,程序这个词有两个意思:人类可以识别的程序,这些程序是用C/C++、Java、Python等语言编写的文本文件。比如helloworld.c、hellworld.java、helloworld.py都是机器可以识别的程序,这些程序都是可执行程序。Windows下是exe程序,Linux下是elf程序。由于计算机无法理解人类可以识别的文本文件程序,因此需要将文本文件程序转换为机器可以识别的可执行程序。这个翻译过程是由编译器完成的。编译器将文本文件程序翻译成二进制机器指令程序。在前面的章节中,有两种语言,一种是C/C++等编译型语言,另一种是Python、Java等解释型语言。CPU可以直接运行编译好的C/C++程序。机器指令,但是解释型语言不能直接由CPU执行,解释型语言直接由解释器执行,而解释器可以直接由CPU执行,因为这些解释器通常都是用C/C++语言编写的,就像下面这样写:$pythonhelloworld.py其中python是一个C语言程序,但是这个C语言程序可以执行python程序。有了这样的背景,我们就来关注C/C++这样的解释型语言是如何从文本文件变成可执行文件的。接下来的一句话,大家一定要明白了,那就是:程序其实包含两部分,一个是指令(代码),一个是数据。有的同学可能会问,程序里不是写满了“指令(代码)”吗,不,大家一定要意识到这一点,很重要。程序不都是指令(代码),也是数据。例如,inta=100;这段代码在生成的可执行程序中没有对应的机器指令,为什么,因为这是数据。那么什么样的代码有对应的可执行程序呢?比如if...while...+-*/、return等语句都会有对应的机器指令。现在你应该清楚了,一般来说,我们可以把数据的操作部分看成是指令,其他的定义都是数据。有了这些知识,你就可以理解编译器了。编译器的工作是将C程序中数据的运算部分翻译成二进制机器指令。这些指令统一放在二进制文件的一部分中。这部分称为代码段,然后编译器收集C程序中定义的数据,并将这些数据放在二进制文件的另一部分中。这部分称为数据段,像披萨一样分为两层。可执行文件看起来像这样:这就是为什么最终的可执行文件中有两部分的原因,这就是可执行文件在磁盘上的样子。(关于编译和链接话题的严肃讨论,请参考系列文章《ANetOS:编程》。)这里需要大家认识到的一点是,可执行程序也是存储在磁盘上的一个普通文件,我们经常使用的文本文件没有本质区别。总结一下,编译器把源代码分为两类,一类是对数据的操作,由编译器翻译成机器指令;另一个是数据,由编译器收集并放入一个执行文件的数据段。可执行程序也是文件,与普通的文本文件没有本质区别,只是文本文件存储的是人类可以识别的字符,而可执行程序存储的是机器指令和机器指令操作的数据。这些二进制指令或数据人类很难直观地理解,但是CPU就不一样了,CPU可以直接执行这些二进制机器指令。现在你应该知道程序是如何生成的了。该程序由编译器翻译。可执行程序与普通文件一样,生成后悄悄保存在磁盘上。从这里我们也可以看出程序其实和菜谱一样是一个静态的概念。程序保存在磁盘上,只要磁盘没有损坏,程序就可以永久保存。接下来我们看看这个过程是怎么来的。进程是如何创建的到目前为止,存储在磁盘上的可执行程序与操作系统无关。一个程序如果只是放在磁盘上,除了占用磁盘控制权外,没有任何用处。程序只有在运行的时候才能真正发挥作用。那么程序是如何运行的呢?这一点大家应该都很熟悉了。Windows下我们双击程序图标,Linux下直接输入程序名。但是这个答案可能并不能让所有人满意,因为从计算机的角度来看,我们仍然不知道程序是如何运行的。要回答这个问题,就需要我们的主角出场,而这里的主角就是操作系统。我们的程序实际上是由操作系统来运行的,一般会经历以下几个阶段。1、当我们双击程序图标或输入程序名时,操作系统会根据程序名在磁盘上寻找可执行程序。2、操作系统在内存中划出一块区域供程序运行。3、操作系统将找到的可执行程序从磁盘复制到新分配的内存区。4、操作系统找到可执行程序代码段在内存中的起始位置,假设这个地址为A。5、操作系统告诉CPU从位置A开始执行,经过这些步骤,CPU开始运行我们的节目。值得注意的是,以上只是简化后的几个重要步骤。实际情况要复杂一些,但是这个简化的步骤足以让我们理解操作系统是如何运行程序的。我们将在以后的文章中详细描述这个过程。所以你会看到当你打开一个比较大的程序,比如游戏,总是很慢,而且会给出“正在加载”的提示。实际上,操作系统正忙于上述步骤。在这里,我们可以给出流程的定义。程序运行后称为进程。而流程也是我们后续文章的重中之重。进程是操作系统精心构造的概念。了解进程对于了解操作系统至关重要。同时,对过程的深刻理解也是编程高手与普通程序员的分水岭。总结在本节中,我们重点介绍了程序和过程的概念。程序是静态的,放在磁盘上,保存程序的指令和数据的普通文件。进程是动态的,存储在内存中,看起来像CPU执行程序时的样子。只要磁盘不被破坏,程序就可以永久保存。一旦进程在内存中被CPU执行完毕,操作系统就会回收该进程占用的所有内存空间,进程的生命周期取决于程序的运行时间。程序需要存放在磁盘上,占用磁盘空间。进程需要在内存中运行,占用内存空间。通过这一节,希望大家能够清楚的理解程序和进程这两个概念。如果您喜欢本文,请关注微信公众号:码农的荒岛求生获取更多内容。计算机基础决定程序员的职业高度