从CPU的运行到函数调用做个了解

CPU的内部结构

我们都知道CPU是一台电脑的核心部件,所有的程序都是通过它运行的,那么CPU是如何让一个程序跑起来的呢?我们今天就来一起简单的做个了解,首先看下CPU的基本结构

程序流程

假如现在我们有个两个数相加的程序,当你点击运行这个程序时,系统会将这个程序复制到内存中。程序中的这些数据和指令会被存储在一个一个小的“内存空间”,并给每个空间一个“门牌号”,也就是内存中的地址。

系统将程序复制到内存中后,会将程序计数器设定到程序运行的开始位置(假设这个程序的开始位置是0100),然后开始运行;当CPU每执行一条指令,程序的累加器的值就自动加1,然后CPU的控制器就会参照程序计数器的数值从内存中读取命令并执行,那么我们用图表示这个流程的话大概是下图中的样子

在CPU进行运算时,标志寄存器的数值会根据运算结果自动设定。如果程序执行到跳转指令的时候,会根据地址中的内容跳转到对应的地址;条件分支在跳转指令之前会进行比较运算,然后CPU根据标志寄存器的数值进行判断是否要跳转

函数调用

对CPU的执行流程有了个大概的了解后,我们现在可以来看看咱们平时写的程序函数是怎么运行的了。在介绍之前我们先了解两个机器语言指令

call指令,把函数要执行的指令地址存储在名为栈的主内存

return指令,把保存在栈中的地址设定到程序计数器中

在上图中,函数执行到0132的时候,并不是通过跳转指令跳转到Add函数的入口,而是通过call指令;这个地方和我没前面讲到的条件分支跳转指令是不一样的,因为调用完函数,我们还要返回函数调用的地方继续下一条指令。

到此,我们可以对程序的运行过程有个大概的了解。

时间: 2024-10-12 19:13:28

从CPU的运行到函数调用做个了解的相关文章

[linuxeden] 程序员的野心:让GPU像CPU一样运行

GPU代表的是图形处理单元,但是,这些小小芯片除了处理图形功能,还有其它用处.比如,Google使用GPU来为人脑建模,Salesforce则依赖GPU分析Twitter微博数据流.GPU很适合并行处理运算,也就是同时执行成千上万个任务.怎么做呢?你得开发一个新软件,让它挖掘GPU芯片的潜力.最近美国印第安纳大学计算机博士埃里克-浩克(Eric Holk)就作出尝试,他开发了一个应用程序来运行GPU.浩克说:“GPU编程仍然需要程序员管理许多低层细节,这些细节是与GPU执行的主要任务分离 的.我

linux top cset schedtool 对于多核CPU,如何限制进程在一个CPU上运行

对于多核CPU,如何限制进程在一个CPU上运行呢? 如何察看某个进程在哪个CPU上运行: 在控制台中输入: #top -d 1 之后按下f.进入top Current Fields设置页面: 选中:j: P          = Last used cpu (SMP) 则多了一项:P 显示此进程使用哪个CPU. 经过试验发现:同一个进程,在不同时刻,会使用不同CPU Core.这应该是Linux Kernel SMP处理的. 本程序通过这个方法查看,将会在多个CPU上运行. 想要让它在一个CPU

关于CPU的运行队列与系统负载

在linux操作系统中,我们一般查看系统的cpu负载情况常用的命令可以是uptime,top,还有vmstat等这些个都是可以有的.每个工具所提供的信息各不相同, 我这里要讨论的仅说cpu部分.使用uptime命令,可以得到操作系统在过去1分钟,5分钟和15分钟的cpu平均负载值,也就是传说中的 load average,这个和top命令右上角那个地方显示出来的东东是想通的,那么这个load average到底是个什么样的东西呢,其实它表示的就是在cpu里面运行的进程数量,不过这里的进程和使用命

vcpupin和taskset命令设置某虚拟机在某个固定cpu上运行

Taskset命令设置某虚拟机在某个固定cpu上运行 1)设置某个进程pid在某个cpu上运行: [[email protected]~]# taskset -p000000000000000000000000000000000000100 95090 pid 95090's current affinity mask: 1 pid 95090's new affinity mask: 100 解释:设置95090这个进程,在cpu8上运行 95090是我提前用ps –aux|grep "虚拟机

[转帖]判断Linux进程在哪个CPU核运行的方法

判断Linux进程在哪个CPU核运行的方法 原文网址:http://www.embeddedlinux.org.cn/html/xinshourumen/201601/30-5013.html 问题:有一个Linux进程运行在多核处理器系统上,如何查看该进程运行在哪个CPU上? 方法一: 如果一个进程使用taskset命令明确的被固定(Pinned)到CPU的特定内核上,你可以使用taskset命令找出被固定的CPU内核: taskset -c -p <pid> 例如,如果你对PID为5357

[转帖]centos7设置CPU的运行频率为performance

centos7设置CPU的运行频率为performance http://www.512873.com/archives/612.html Publish: March 6, 2019 Category: 文档 No Comments 查看当前cpu运行频率: cat /proc/cpuinfo | grep -i "cpu mhz" 开始设置: cpupower -c all frequency-set -g performance 或者: cpupower  frequency-s

Java 中的 int 与 Integer 用于 List&lt;Integer&gt; 时,以及通过打印变量检测程序运行和函数调用次数计数

总结一下最近做的东西中遇到的问题 1. Java 中的 int 与 Integer 用于 List<Integer>  时 两者之间的关系都是很清楚的,int 是基本数据类型,存储的是值,而 Integer 是引用数据类型,存储的是指向数值的地址. Integer 是在类层面上对 int 的封装.然后 Java 提供了自动装包拆包机制,使得两者之间可以转换.这里主要是测试了下它们用于 List 时候的疑惑. /* * To change this template, choose Tools

简单C程序在IA-32 CPU上运行过程的分析

本文将通过编译器生成的汇编代码分析C程序在IA-32体系PC上的运行流程 实验环境: gcc 4.8.2 C语言程序的内存结构 C代码如下 int g(int x) { return x + 1; } int f(int x) { return g(x); } int main(void) { return f(2) + 3; } 使用编译命令gcc -S -O0 -o main.s main.c -m32编译出汇编文件,如下 g: pushl %ebp movl %esp, %ebp movl

MySQL 动态sql语句运行 用时间做表名

1. 描写叙述 在使用数据的时候,我时候我们须要非常多数据库,并且想用时间来做表名以区分.可是MySQL在存储过程中不支持使用变量名来做表名或者列名. 比方,有一个表我们想以"2015-07-16 12:00:00"命名. 2. 解决方式 假设仅仅是更换一个普通的表名的话,非常easy.直接使用以下sql语句就可以: alter table old_table_name rename new_table_name 可是要以时间为表名,动态命名的话就不能够了.首先我们能够用NOW()函数