前言
Linux 作为当今服务端最流行的操作系统,是每个后端工程师应当熟练使用和理解的。本篇文章会详细讲述 Linux 系统中的一些基础概念:进程、线程,以及后面由各编程语言所实现的协程。
进程是什么?
进程是资源分配的最小单位
计算机专业的同学对这句话肯定不陌生,但是应该怎么去理解这句话?
程序是什么?
计算机程序(英语:Computer Program)是指一组指示电子计算机或其他具有消息处理能力设备每一步动作的指令,通常用某种程序设计语言编写,运行于某种目标体系结构上
上面是维基百科给出的解释,我们能把程序初步理解为一组 CPU指令集合
我们平时使用编程语言写的代码 (C,java,php,go...),也叫程序,本质上就是一堆字符串。只不过人类写的字符串 CPU 理解不了,CPU 能理解的东西不是正常人能写的,因此在我们写的程序和CPU能执行的指令之间,存在一种转换关系
这种转换关系通过 编译器/解释器 来实现
编译器
test.c
#include<stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
复制代码
首先这是一个 C语言程序,一个文本文件,位于磁盘的某个角落,CPU 肯定是看不懂的,所以需要做一层转换
gcc test.c -o test
gcc 就是一种编译器,把 C的文本程序转化为 ELF(Executable and Linkable Format)文件,并不是你所认为的二进制文件(binary)
ELF 文件也是一种可执行文件,其中也包含二进制内容,除此之外还有一些其他的信息
gcc 编译后的为 ELF 文件
go 编译后的二进制文件
解释器
解释器是一种直接执行高级语言代码的计算机程序, 而无需将代码编译成机器码
- 优点: 消除了编译整个程序的负担,程序可以拆分成多个部分来模块化
- 缺点: 解释器像是一位“中间人”,每次运行程序时都要先将代码转成另一种语言的代码,然后再作运行,因此解释器的程序运行速度比较缓慢
解释器执行代码的策略一般有以下三种:
- 直接运行高级编程语言的代码(如 shell 内置的解释器 or php 的解释器)
- 先将代码转换成高效的中间码(如:php opcode),然后马上执行(不输出中间码,如 PHP-FPM 的执行)
- 由解释器中内置的编译器先将高级语言的代码编译成中间码,然后再执行(输出中间码,相当于两个阶段,如 javac 先把源码编译成字节码,然后用 jvm 执行字节码)