# 程序执行原理(科普)

# 程序执行原理(科普)

## 目标

* 计算机中的 **三大件**
* 程序执行的原理
* 程序的作用

## 01. 计算机中的三大件

计算机中包含有较多的硬件,但是一个程序要运行,有 **三个** 核心的硬件,分别是:

1. **CPU** 
    * 中央处理器,是一块超大规模的集成电路
    * 负责 **处理数据**/**计算**
2. **内存**
    * **临时** 存储数据(断电之后,数据会消失)
    * 速度快
    * 空间小(单位价格高)
3. **硬盘** 
    * **永久** 存储数据
    * 速度慢
    * 空间大(单位价格低)

| CPU | 内存 | 硬盘 |
| :---: | :---: | :---: |
| ![CPU-w200](media/14951694921910/CPU.jpg) | ![内存条-w200](media/14951694921910/%E5%86%85%E5%AD%98%E6%9D%A1.png)   | ![硬盘-w200](media/14951694921910/%E7%A1%AC%E7%9B%98.jpg) |

### 思考题

1. 计算机中哪一个硬件设备负责执行程序?
    * **CPU**
2. **内存** 的速度快还是 **硬盘** 的速度快?
    * **内存**
3. 我们的程序是安装在内存中的,还是安装在硬盘中的?
    * 硬盘
4. **我买了一个内存条,有 500G 的空间!!!**,这句话对吗?
    * 不对,内存条通常只有 `4G` / `8G` / `16G` / `32G`
5. **计算机关机之后,内存中的数据都会消失**,这句话对吗?
    * 正确 

## 02. 程序执行的原理

![001_程序执行示意图-w](media/14951694921910/001_%E7%A8%8B%E5%BA%8F%E6%89%A7%E8%A1%8C%E7%A4%BA%E6%84%8F%E5%9B%BE.png)

1. 程序 **运行之前**,程序是 **保存在硬盘** 中的
2. 当要运行一个程序时
    * 操作系统会首先让 **CPU** 把程序复制到 **内存** 中
    * **CPU** 执行 **内存** 中的 **程序代码**

> **程序要执行,首先要被加载到内存**

### 2.1 Python 程序执行原理

![003_Python程序执行示意图](media/14951694921910/003_Python%E7%A8%8B%E5%BA%8F%E6%89%A7%E8%A1%8C%E7%A4%BA%E6%84%8F%E5%9B%BE.png)

1. 操作系统会首先让 **CPU** 把 **Python 解释器** 的程序复制到 **内存** 中
2. **Python 解释器** 根据语法规则,**从上向下** 让 **CPU** 翻译 **Python 程序中的代码**
3. **CPU** 负责执行翻译完成的代码

#### Python 的解释器有多大?

* 执行以下终端命令可以查看 Python 解释器的大小

```bash
# 1. 确认解释器所在位置
$ which python

# 2. 查看 python 文件大小(只是一个软链接)
$ ls -lh /usr/bin/python

# 3. 查看具体文件大小
$ ls -lh /usr/bin/python2.7
```

> 提示:建立 **软链接** 的目的,是为了方便使用者不用记住使用的解释器是 **哪一个具体版本**

## 03. 程序的作用

> 程序就是 **用来处理数据** 的!

* **新闻软件** 提供的 **新闻内容、评论……** 是数据
* **电商软件** 提供的 **商品信息、配送信息……** 是数据
* **运动类软件** 提供的 **运动数据……** 是数据
* **地图类软件** 提供的 **地图信息、定位信息、车辆信息……** 是数据
* **即时通讯软件** 提供的 **聊天信息、好友信息……** 是数据
* ……

### 3.1 思考 QQ 程序的启动过程

1. QQ 在**运行之前**,是保存在 **硬盘** 中的
2. **运行之后**,QQ 程序就会被加载到 **内存** 中了

![003_QQ登陆界面-w248](media/14951694921910/003_QQ%E7%99%BB%E9%99%86%E7%95%8C%E9%9D%A2.png)

### 3.2 思考 QQ 程序的 **登录** 过程

1. 读取用户输入的 **QQ 号码**
2. 读取用户输入的 **QQ 密码**
3. 将 **QQ 号码** 和 **QQ 密码** 发送给腾讯的服务器,等待服务器确认用户信息

#### 思考 1

> 在 QQ 这个程序将 **QQ 号码** 和 **QQ 密码** 发送给服务器之前,**是否需要先存储一下 QQ 号码 和 密码?**

**答案**

肯定需要!—— 否则 QQ 这个程序就不知道把什么内容发送给服务器了!

#### 思考 2

> QQ 这个程序把 **QQ 号码** 和 **QQ 密码** 保存在哪里?

**答案**

保存在 **内存** 中,因为 QQ 程序自己就在内存中

#### 思考 3

> QQ 这个程序是怎么保存用户的 **QQ 号码** 和 **QQ 密码** 的?

**答案**

1. 在内存中为 **QQ 号码** 和 **QQ 密码** 各自分配一块空间
    * 在 QQ 程序结束之前,这两块空间是由 QQ 程序负责管理的,其他任何程序都不允许使用
    * 在 QQ 自己使用完成之前,这两块空间始终都只负责保存 **QQ 号码** 和 **QQ 密码**
2. 使用一个 **别名** 标记 **QQ 号码** 和 **QQ 密码** 在内存中的位置

![004_QQ号码和密码内存示意图](media/14951694921910/004_QQ%E5%8F%B7%E7%A0%81%E5%92%8C%E5%AF%86%E7%A0%81%E5%86%85%E5%AD%98%E7%A4%BA%E6%84%8F%E5%9B%BE.png)

> * 在程序内部,为 **QQ 号码** 和 **QQ 密码** 在内存中分配的空间就叫做 **变量**
> * **程序就是用来处理数据的,而变量就是用来存储数据的**


 

猜你喜欢

转载自blog.csdn.net/xxf_is_girl_gad/article/details/85534556