斗地主你什么时候才会托管?(.NET中的托管于非托管)

文章部分引自《.NET4.0面向对象编程漫谈(基础篇)》第1章.NET面向对象编程基础(作者:金旭亮)

 

  无意间看到一位四五岁左右小朋友在玩斗地主,总开始到结束,她一直都在使用“提示”(托管)出牌,你猜的没错,到最后她赢了。

  那么你什么时候才会使用“托管”呢?“我想继续游戏,但是牌太烂了,索性托管吧或者我想玩,但是我会儿刚好有事需要处理”

 

  实际上,我们在选择了.NET Framework平台后,就该选择使用什么语言了,但是每种语言都有自己的优缺点,例如,在非托管C/C++可对系统(Windows)进行一些很低的控制,可以按照自己的想法管理内存,控制线程,当然这些事情你如果不想关心,完全可以丢给CLR去处理,它可以帮你处理的核心功能,比如内存管理,程序集加载,安全性,异常处理,线程同步,当然这些babyservice的待遇只能给托管的代码使用。

 

  

非托管应用程序的执行过程

首先看一下Windows操作系统执行一个普通程序(即非托管程序)的基本过程。

软件工程师写的程序,经过编译器转为机器指令后,一般以文件的方式保存在外部存储器中,当CPU执行程序时,要先把外部存储器中的程序指令代码读到内存。

内存被分成很多块(称为"内存单元"),每个内存单元都有一个唯一的地址,指令就存放在以某个特定的地址开始的内存区域(即"若干个内存单元的集合")中。保存要执行的第一条机器指令的那个内存单元就是程序的"入口点(Entry Point)"。

当程序执行时,CPU从入口点取出第一条指令,开始执行,然后再取第二条,依次类推……

把一个程序从外部存储器上装入内存执行是一个复杂的过程,这个功能由操作系统实现,开发具体应用程序的软件工程师通常不需要手动去写这部分代码。

由此可知,程序的运行必须依赖于操作系统(如Windows),而且编译器生成的程序文件包含的是仅适用于特定CPU架构的机器指令,由于不同CPU架构的机器指令集不同,所以,这个可执行程序无法不加修改地在拥有不同CPU架构的计算机上运行。

以这种方式生成的机器指令代码称为"非托管代码(Unmanaged Code)"。非托管代码不仅不能在不同CPU架构的计算机上执行,而且通常在不同的操作系统下也不能执行,比如一个Windows应用程序就无法直接在 Linux下运行,反之亦然,这说明非托管代码的可移植性是受到较大限制的。

如果需要在拥有不同CPU架构的计算机和多种多样的操作系统上实现同一功能,必须针对每种操作系统和CPU架构编写特定的代码,这明显是一种重复且低效的劳动。

程序能不能只写一次,到处运行?

完全可以的,这就是 "跨平台"的设计思想(Java就是一个典范)。.NET也采用了这种设计思想,而且走得更远,.NET在架构设计上不仅允许.NET应用程序在各种操作 系统和CPU架构上运行,而且允许在同一个程序中混合使用由不同的编程语言开发出来的软件组件,.NET的这一特性被称为"跨语言"。

要支持跨平台这一特性,软件工程师编写的程序经过编译器生成的结果就不能是依赖于操作系统和特定CPU架构的机器指令了,而必须是一种"中立"的、 在各种操作系统和CPU架构上都能执行的代码,这种代码Java称为"Byte Code(字节码)",.NET称之为"IL(中间语言)"。

但程序最终还是要靠CPU执行的,所以,Java的字节码和.NET的IL代码仍然需要最终被翻译成本地CPU能执行的机器指令,这部分功能由一个运行在特定操作系统之上的软件系统来完成,这个软件系统被称之为"虚拟机(Virtual Machine,VM)"。

 
图1-9  托管代码运行原理

只需为每种操作系统和CPU架构提供一个虚拟机,就可以让同样一个应用程序不加修改地"跑"在运行不同操作系统、拥有不同CPU架构的计算机上。

这种运行在虚拟机之上的代码,被称为"托管代码(Managed Code)",其原理如图1-9所示。

使用C#编译器csc.exe编译生成的可执行程序实际包含的只是IL指令代码,这是一种托管代码,只能运行在.NET虚拟机之上。所以,如果某台 计算机上没有安装.NET Framework,就意味着图 1 9的"虚拟机"一层不存在,.NET应用程序就无法执行。对于非Windows的操作系统,只要上面有.NET虚拟机,就可以运行.NET程序,通常不需 要修改.NET应用程序源代码再重新编译。

一个应用程序可以只采用托管代码来构建,完全依赖CLR以及.NET Framework类库,也可以混合使用托管代码和非托管代码进行构建。托管代码调用非托管代码的技术,在.NET中被称为"平台调用(Platform Invoke)"(见图1-10)。

 
(点击查看大图)图1-10  托管代码与非托管代码

托管代码执行的过程

.NET下可直接运行的.exe文件包含的是IL指令。IL是微软和第三方编译器供应商磋商而创建的"虚"机器语言,之所以说它是"虚"的,是说它 独立于特定架构的CPU,并且引入了许多具有面向对象特征的指令,与传统的直接面向硬件的汇编指令有着很大的不同,可以看成是"面向对象的"汇编指令。

由于IL指令独立于特定架构的CPU,因此它必须经过一个"翻译"过程,转换成本地CPU支持的机器指令,才可以最终执行。这个"翻译者"就是"JIT编译器(Just-In-Time Complier)",请看图1-11。

如图1-11所示,程序源代码经语言编译器生成程序集,其中包含IL指令代码。当程序运行时,"类装载器(Class Loader)"从外部存储器中将IL指令读入内存,再经过JIT编译器动态地编译为本地CPU指令代码执行。在进行即时编译的过程中,CLR同时检查这 些IL指令是否违反了一些安全规则,必要时CLR会停止编译并中断程序的执行。

 
(点击查看大图)图1-11  托管代码的执行过程

上述即时编译和代码验证的过程仅仅只是在第一次调用某个方法时发生。CLR会将编译好的本地代码缓存起来,第二次调用时就直接调用缓存中的本地代码,从而避免了再次编译所带来的性能损失。

当然这样的性能损失可以通过升级硬件设备来减少(避免)。

 

 

转载于:https://www.cnblogs.com/tymonyang/p/4455508.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/398241.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

英特尔固态硬盘540s开卡_英特尔Z490主板绝配?技嘉PCIe 3.0 x8固态硬盘测试:6.5GB/s读速...

PCIe 4.0为高端NVMe固态硬盘提供了更广阔的提升空间,而暂时与PCIe 4.0无缘的英特尔平台就比较尴尬。技嘉推出的AORUS RAID SSD似乎正是为此而生,它以PCIe 3.0 x8接口提供6500MB/s顺序读取和6000MB/s顺序写入速度,足以媲美尚未面世的第二代PCI…

李洪强-C语言2-字符串

C语言字符串 一、字符串基础 注意:字符串一定以\0结尾。 Printf(“yang\n”); 其中yang为字符串常量,“yang”‘y’‘a’‘n’‘g’‘\0’。字符串由很多的字符组成,通常使用字符数组来存储字符串,如char name[10]“yang”;也可以…

【练习5.9】图像掩码、礼帽、cvCopy、图像融合、cvCvtColor

提纲题目要求程序代码结果图片要言妙道题目要求: 读入一副风景图,然后将其转化为灰度图像 a、对图像进行形态学“礼帽”操作,并显示结果 b、将结果图像转化为8位的掩码 c、复制灰度值到礼帽块中,显示结果→我的理解是,…

div超出不换行_文字超出显示点点点之ellipsis 设置

一般情况下一行文字在一定区域显示的话如果不限定高度,那么在内容超过的宽度的话就会换行显示,为了页面的美观,目前的通用做法就是在最后显示…,然后鼠标悬浮显示完整内容,具体设置如下:height: 40px; overflor: hidde…

Kali源库配置和拼音安装

2019独角兽企业重金招聘Python工程师标准>>> 版本:kali-linux-2016.1-i386 0、对kali进行系统更新或者软件安装,直接通过国内网络访问境外主网网络不稳定,不如改成国内资源站点。 1、修改以下文档 vim /etc/apt/sources.list 2、文…

java中审核订单流程图_Java 后端横扫阿里、滴滴、美团总结的面试经验!

这次面试的公司有一点点多,主要是因为毕业后前两份工作找的都很草率,这次换工作就想着,emm,毕业三年了,该找个工作好好沉淀几年了。先说下这次面试的结果吧:到 hr 面的:阿里、美团、滴滴、金山云…

产品铭牌要求_AMPULM:电力变压器铭牌有哪些主要技术参数,你都知道吗?

电力变压器电力变压器是供配电系统中关键的一个环节, 它起到电力系统中电压等级的变换,同时连接不同电压等级的电网,以利于电能的输送、分配和使用。认识变压器铭牌图片为一台电力变压器上的铭牌,从铭牌上可以看到变压器的哪些信息…

python 学习资源收集汇总

2019独角兽企业重金招聘Python工程师标准>>> Python是一种面向对象、直译式计算机程序设计语言。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用縮进来定义语句块。与Scheme、Rub…

一年月份大小月口诀_怎么看自己的日柱 公式 推算口诀 最简便计算方法

日柱指的是我们农历干支出生的那一天,通过日柱我们可以看出自己命运的轨迹和走向,从风水学上来讲日柱是八字算命中举足轻重的一部分,那么如何知道自己的日柱呢?通过本期的四柱预测,给大家介绍一种最简便的推算口诀和日…

delphi excel取批注所在的行列_35个Excel使用技巧

技巧1、单元格内强制换行在单元格中某个字符后按alt回车键,即可强制把光标换到下一行中。技巧2、锁定标题行选取第2行,视图 - 冻结窗格 - 冻结首行(或选取第2行 - 冻结窗格)冻结后再向下翻看时标题行始终显示在最上面。技巧3、打印标题行如果想在打印时每…

如何接收串口数据_UART IDLE 中断使用接收不定长串口数据

前言在串口通信应用中,我们常使用接受和发送中断,相信大家都不陌生。这里有个非常有用的中断可能被大家所忽略,即总线IDLE中断。当一帧数据传输结束之后,总线会维持高电平状态,此时,就可以触发MCU的IDLE中断…

MFC 进度条CProgressCtrl

2019独角兽企业重金招聘Python工程师标准>>> SetStep(1);//设置步长 SetRange32(0, total);//设置范围 SetPos(_cur);//设置当前 进度 StepIt();进步一次 转载于:https://my.oschina.net/kkkkkkkkkkkkk/blog/688392

css限制字体三行_讲道理,仅3行核心css代码的rate评分组件,我被自己秀到头皮发麻...

(给100素材网点亮★号,提升开发技能)像rate评分组件一般都用javascript写,所以这次将是一个全新的尝试,用css实现一个rate评分 ❗ 核心代码也就三行?01效果图02原理主要是借助radio单选框,梳理如下:去找个好看的iconf…

matlab GUI之自定义菜单小结

自定义菜单 1.uimenu对象 huimenu(PropertyName,ProperValue) huimenu(parent,PropertyName,ProperValue) 常见属性: 1.1标签 label uimenu(label,&Open) 1.2快捷键 Accelerator uimenu(Accelerator,E) 快捷键位 ctrlE 注意以下三个是系统保留的Accelerator…

把cpp编译为so_基于VSCode和CMake进行C/C++开发第三讲GCC编译器

3.0 本讲目录本系列视频,B站首发,up主: xiaobing1016前言:GCC 编译器支持编译 Go、Objective-C,Objective-C ,Fortran,Ada,D 和 BRIG(HSAIL)等程序;Linux 开发C/C 一定要熟悉 GCCVS…

CSS快速入门-箭头和图标

一、三步搞懂箭头产生的原理 在前面的盒子模型一文中&#xff0c;我们已经知道了一个元素空间占位。为了弄明白箭头的产生&#xff0c;我们可以三步走&#xff1a; #demo12 {border: 100px solid;border-color:green blue orange red;width:100px;height:100px;}<div id&quo…

自动清理归档日志_从MYSQL 数据库归档 到 归档设计

到数据归档&#xff0c;很多人的第一个概念就是&#xff0c;不就是无用的数据&#xff0c;换个地方放吗&#xff0c;直接拷贝&#xff0c;删除不就得了&#xff0c;有那么麻烦。我见到过的&#xff0c;听到过的数据库归档的方法有以下几种1 数据通过人工的手段来进行清理&…

Android支付宝SDK开发笔记

一、准备工作 〉1、下载开发包 https://b.alipay.com/order/productDetail.htm?productId2014110308141993&tabId4#ps-tabinfo-hash 压缩包下的“支付宝钱包支付接口开发包”中即有Andoid使用支付宝的JAR和Demo 〉2、创建支付宝应用 在支付宝开放平台申请创建应用 https:/…

一天一个类,一点也不累之HashSet

最近忙着一个小项目结题&#xff0c;故没能按时完成【一天一个类&#xff0c;一点也不累】&#xff0c;还好项目优秀&#xff0c;算是对自己一点点的安慰和鼓励。~~~ 今天要说的是HashSet 既然是继承自Set&#xff0c;那么就必须有Set的一些属性&#xff0c;比如不能容许有相同…

[BZOJ1502]月下柠檬树(自适应辛普森积分)

1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1387 Solved: 739[Submit][Status][Discuss]Description 李哲非常非常喜欢柠檬树&#xff0c;特别是在静静的夜晚&#xff0c;当天空中有一弯明月温柔地照亮地面上的景物时&#xff0c;他必会悠闲地…