了解程序运行逻辑的必要性及应用和硬件的关系

简介: 了解程序运行逻辑的必要性及应用和硬件的关系

一、了解程序运行逻辑的必要性


       通过前几篇博客的汇编代码和C语言源代码进行比较,相比对程序的运行方式有了新的理解,而且,从汇编代码中获取的知识,也有助于了解Java等高级语言的特性,比如Java中就有 native 关键字修饰的变量,那么这个变量的底层就是使用C语言编写,还有一些Java中的语法只能通过汇编代码才能知道其运行逻辑。在某些情况下,对于查找bug的原因也是由帮助的


串行处理的特点:



串行处理最大的特点就是 专心只做一件事,一件事做完之后才能去做另外一件事情

计算机是支持多线程的,多线程的核心就是CPU切换,如下图所示:



可举个例子,看下面代码:


// 定义全局变量
int counter = 100;
// 定义MyFunc()
void MyFunc(){
    counter *= 2;
}
// 定义MyFunc2()
void MyFunc(){
    counter *= 2;
}


上述代码是更新counter的值的C语言程序,MyFunc10和MyFunc20的处理内容都是把 counter的值扩大至原来的二倍,然后再把 counter的值赋值给 counter.这里,我们假设使用 多线程处理,同时调用了一次MyFunc1和MyFunc2 函数,这时,全局变量counter的值,理应编程100*2*2=400.如果你开启了多个线程的话,你会发现counter的数值有时也是200,对于为什么出现这种情况,如果你不了解程序的运行方式,是很难找到原因的


我们将上面的代码转换成汇编语言的代码如下


mov eax,dword ptr [_counter]    ; 将 counter 的值读入 eax 寄存器
add eax,eax                     ; 将 eax 寄存器的值扩大2倍
mov dword ptr [_counter] ,eax   ; 将 eax 寄存器的值存入 counter 中


  在多线程程序中,用汇编语言表示的代码每运行一行,处理都有可能切换到其他线程中。因而,假设MyFun1 函数在读出counter数值100后,还未来得及将它的二倍值200写入counter时,正巧 MyFun2函数读出了 counter的值100,那么结果就将变为200


多线程交互程序处理步骤:



为了避免bug,我们可以采用函数或C语言代码的行为单位来禁止线程切换的 锁定 方法,或者使用某种线程安全的方式来避免该问题的出现


汇编语言的经验很重要的,通过借助汇编语言,我们可以更好的了解计算机运行机制


二、应用和硬件的关系


       C、Java等高级语言编写的程序起到间接控制硬件的作用,所以大家很少直接接触到硬件的指令,硬件的控制由 Windows 操作系统全权负责


       虽然Windows屏蔽了控制硬件的细节,但是Windows却为你开放了系统调用 功能来实现对硬件的控制。在Windows 中,系统调用称为 API,API就是应用调用的函数,这些函数的实体被存放在 DLL文件中


应用通过API间接控制硬件:



下面式一个通过系统调用来间接控制硬件的实例


       假如要在窗口中显示字符串,就可以使用Windows API中的 TextOut 函数。


TextOut 函数的语法(C语言)如下:


BOOL TextOut{
    HDC hdc,           // 设备描述表的句柄
    int nXStart,       // 显示字符串的x坐标
    int nYStart,       // 显示字符串的y坐标
    LPCTSTR lpString, // 指向字符串的指针
    int cbString       //字符串的文字数
}


  那么,在处理TextOut 函数的内容时,从结果来看,Windows直接控制了作为硬件的显示器。但Windows本身也是软件,由此可见,Windows应该向CPU传递了某个指令,从而通过软件控制了硬件


       Windows 提供的TextOut 函数API可以向窗口和打印机输出字符。C语言提供的 printf 函数,是用来在命令提示符中显示字符串的函数。使用printf函数是无法向打印机输出字符的


目录
相关文章
|
Cloud Native Devops 持续交付
云原生与 DevOps
云原生与 DevOps
992 0
|
运维 Cloud Native 持续交付
深入理解云原生架构及其在现代企业中的应用
随着数字化转型的浪潮席卷全球,企业正面临着前所未有的挑战与机遇。云计算技术的迅猛发展,特别是云原生架构的兴起,正在重塑企业的IT基础设施和软件开发模式。本文将深入探讨云原生的核心概念、关键技术以及如何在企业中实施云原生策略,以实现更高效的资源利用和更快的市场响应速度。通过分析云原生架构的优势和面临的挑战,我们将揭示它如何助力企业在激烈的市场竞争中保持领先地位。
402 13
|
10月前
|
人工智能 自然语言处理 API
硅基流动入驻阿里云云市场,核心API服务将全面接入阿里云百炼平台💐
2025年6月18日,AI Infra企业硅基流动与阿里云达成战略合作,加入“繁花计划”并入驻云市场。其大模型推理平台SiliconCloud核心API将接入阿里云百炼平台,依托灵骏智能计算集群为客户提供高效服务。作为国内领先的MaaS平台,SiliconCloud已集成百余款开源大模型,服务600万用户及众多企业。双方将在算力协同、行业解决方案等领域深化合作,推动AI生态发展。
1157 0
|
运维 Cloud Native Devops
云原生架构的崛起与实践云原生架构是一种通过容器化、微服务和DevOps等技术手段,帮助应用系统实现敏捷部署、弹性扩展和高效运维的技术理念。本文将探讨云原生的概念、核心技术以及其在企业中的应用实践,揭示云原生如何成为现代软件开发和运营的主流方式。##
云原生架构是现代IT领域的一场革命,它依托于容器化、微服务和DevOps等核心技术,旨在解决传统架构在应对复杂业务需求时的不足。通过采用云原生方法,企业可以实现敏捷部署、弹性扩展和高效运维,从而大幅提升开发效率和系统可靠性。本文详细阐述了云原生的核心概念、主要技术和实际应用案例,并探讨了企业在实施云原生过程中的挑战与解决方案。无论是正在转型的传统企业,还是寻求创新的互联网企业,云原生都提供了一条实现高效能、高灵活性和高可靠性的技术路径。 ##
958 30
|
开发框架 缓存 NoSQL
基于SqlSugar的数据库访问处理的封装,在.net6框架的Web API上开发应用
基于SqlSugar的数据库访问处理的封装,在.net6框架的Web API上开发应用
|
弹性计算 Kubernetes Perl
k8s 设置pod 的cpu 和内存
在 Kubernetes (k8s) 中,设置 Pod 的 CPU 和内存资源限制和请求是非常重要的,因为这有助于确保集群资源的合理分配和有效利用。你可以通过定义 Pod 的 `resources` 字段来设置这些限制。 以下是一个示例 YAML 文件,展示了如何为一个 Pod 设置 CPU 和内存资源请求(requests)和限制(limits): ```yaml apiVersion: v1 kind: Pod metadata: name: example-pod spec: containers: - name: example-container image:
1840 3
|
存储 前端开发 Java
(二)JVM成神路之剖析Java类加载子系统、双亲委派机制及线程上下文类加载器
上篇《初识Java虚拟机》文章中曾提及到:我们所编写的Java代码经过编译之后,会生成对应的class字节码文件,而在程序启动时会通过类加载子系统将这些字节码文件先装载进内存,然后再交由执行引擎执行。本文中则会对Java虚拟机的类加载机制以及执行引擎进行全面分析。
405 0
|
安全 jenkins 持续交付
jenkins学习笔记之八:jenkins认证集成gitlab
jenkins学习笔记之八:jenkins认证集成gitlab
|
存储 Kubernetes 调度
在K8S中,什么是PV和PVC?
在K8S中,什么是PV和PVC?
|
Kubernetes Cloud Native Devops
【阿里云云原生专栏】DevOps与云原生的融合:阿里云CI/CD流水线最佳实践
【5月更文挑战第23天】阿里云融合DevOps与云原生技术,提供高效CI/CD解决方案,助力企业提升研发效能。通过云效平台,集成代码管理、构建服务、容器服务、持续部署及监控日志组件,实现自动化研发流程。案例中,应用从GitHub构建到Kubernetes部署,全程无缝衔接。借助阿里云,企业能快速构建适应云原生的DevOps体系,以应对复杂需求和提升市场竞争力。
670 1