精华内容
下载资源
问答
  • 2020年十大前沿科技,了解一下

    万次阅读 多人点赞 2020-02-17 17:12:58
    技术趋势日新月异,新的“有趣事物”发展迅猛,这使我不得不阅读文章并观看CES 2020的现场直播,来了解未来会发生什么?   众所周知,世界瞬息万变。我并不认为这些高科技会让您感到惊讶,但是这些科技值得您...

    全文共3085字,预计学习时长9分钟

    来源:Pexels

     

    根据麦肯锡的研究,到2030年,将有近三分之一的美国人需要另谋出路,以应对科学技术的飞速发展。科技的进步意味着工人需要不断学习新技能。

     

    当这种情况真的来临的时候,我对很多事情都十分感兴趣:精酿啤酒(开个玩笑……但认真的说,您可以给我邮寄您当地的IPA),领导力和管理、经济和消费者行为,创业精神和初创企业 ,最后是技术和工具。

     

    当我在俄罗斯ABBYYSoftware全球流程智能部门做全职管理产品营销时,科技便已发挥了巨大作用。鉴于笔者对科技的热爱!我的手腕上佩戴了些智能玩具,而我的家里配备了语音控制恒温器和其他精美的智能设备。技术趋势日新月异,新的“有趣事物”发展迅猛,这使我不得不阅读文章并观看CES 2020的现场直播,来了解未来会发生什么?

     

    众所周知,世界瞬息万变。我并不认为这些高科技会让您感到惊讶,但是这些科技值得您在下次管理层或领导层会议中提及。

    对技术的需求,以及对具有先进技术技能的工人的需求,都在飞速增长。随着企业范围内大规模的重组变化,组织需要以全新的创新方式做出响应。这意味着需要重新考虑如何改善员工技能和人才管理。许多公司都在投入更多资源来招聘,雇用和培养合适的人才以保持竞争力。毫无疑问,这意味着愿意花时间培养高级技术技能的员工在未来12个月内可能更有就会在企业中获得一些最热门的职位。

     

    根据招聘软件公司iCIMS2019年的报告,2016年,各企业平均用了55天时间来填补一个技术职位。在2019年,这一数字跃升至66天。根据这份报告,这些空缺的职位每天每个可能损失约680美元的收入。具备相应职位技能的人很少,但是岗位需求量却很大,具有很高的门槛!你是否具备获得这些职位的技能?

     

    来源:Pexels

     

    2016-2019年最受欢迎的十大技术技能

     

    当查看Udemy上最热门的技能趋势时,数据显示,过去3年中,人们正在向AI和数据科学技能学习转移。这是有道理的,因为2020年的许多潮流技术趋势都包括诸如超自动化,自主性和AI保密性之类的事物。

     

    根据Udemy,以下是2016年至2019年过去三年中最受欢迎的十大技术技能。

     

    1. TensorFlow

    2. Chatbot

    3. Microsoft Azure — architecture

    4. OpenCV (computer vision/AI)

    5. Neural networks

    6. LPIC- Linux

    7. Ethereum (blockchain)

    8. Splunk (data)

    9. QGIS (open-source GIS software)

    10.Kotlin

     

    *排名是根据2019年Udemy.com上的最高消费量得出的。数据来源:Udemy Data 2020。

     

    TensorFlow,OpenCV和神经网络是当今数据科学家正在使用的基础技能,对于理解和开发AI应用程序和平台至关重要。

     

    开源机器学习和神经网络解决了当今越发流行的人工智能创新背后的沉重负担。这些数字技术席卷全球,在各个行业中都得到了应用。

     

    2020年十大最受欢迎的技术技能

     

    当Udemy统计2020年学习平台网站上最受欢迎的技能时,也有类似的趋势。

    由于技能缺口困扰着全球各地的组织,这10项技能是必不可少的。企业高管正在努力填补这些职位。

    如果您打算在今年进行IT科技投资或开始新的职业道路,请考虑以下方面。在分析了4000多万用户的数据之后,Udemy发现人们正在学习的流行技能是Python编程语言。

    总体而言,该报告指出,人们对学习人工智能和数据科学有着浓厚的兴趣,但对Web开发框架(React,Angular),云计算和其他IT认证(AWS,CompTIA)以及Docker的需求也在不断增长 。

     

    1. Python —一种用于软件开发、基础设施管理和数据分析的编程语言。Python的设计理念是通过大量留白来强调代码的可读性。

    2. React (web) — 一个用于构建用户界面的JavaScript库,由Facebook和一个由个人开发者和公司组成的社区维护 。React可以用作单页或移动应用程序开发的基础。

    3. Angular — 一个基于JavaScript的开源前端Web框架。它由Google的Angular团队以及个人和公司组成的社区维护。Angular是由AngularJS开发团队创造的完全复刻。

    4. 机器学习— 对算法和统计模型的科学研究,属于人工智能的范畴。

    5. Docker — 一个开放源代码平台,用于创建容器的软件包。容器彼此隔离,并将其软件,库和配置文件捆绑在一起。

    6. Django — 一个基于Python的免费开源Web框架。Django的主要目标是简化复杂的,数据库驱动的网站创建。

    7. CompTIA —一个专业的技术组织,具有四个IT认证系列,从入门级到专家级,被认为是IT行业的顶级行业协会之一。

    8. Amazon AWS —AWS以按需付费的方式为个人,公司和政府提供云计算平台和API。AWS认证可验证云专业知识。

    9. 深度学习 — 一类基于人工神经网络的机器学习,可以分为有监督,半监督或无监督。

    10.React Native (mobile) — 由Facebook创建的一种开源移动应用程序框架,用于开发适用于Android,iOS,Web和通用Windows平台的应用程序。

     

    *排名是根据2019年Udemy.com上的最高学习量得出的。数据来源:Udemy Data 2020。

     

    2020年十大新兴技术技能

     

    尽管有许多技能对2020年的技术成功至关重要,但这些技能是在2020年及以后即将兴起的。

     

    1. Gatsby.js (网络框架)

    2. AWS Big Data

    3. React Hooks

    4. Microsoft Azure Architecture

    5. Next.js (网络框架)

    6. Apache Airflow (数据处理)

    7. SwiftUI (苹果软件)

    8. Pegasystems (数据处理自动化)

    9. ESP32 (物联网)

    10.量子计算

     

    *以上数据来源于在2018年没有被关注但在2019年学习量激增的技能。资料来源:Udemy Data 2020。

    Udemy对4000万人在这个平台上学习的新兴技能进行了分析,并发现Gatsby.js(一种新的Web开发框架工具)正在迅速发展。其他越来越流行的Web开发工具包括React Hooks,Next.js和SwiftUI(Apple应用程序的用户界面工具)。全新的技能出现在新兴技术技能列表中,包括量子计算和用于物联网发展的ESP32。

     

    来源:Pexels

     

    数字化转型即将到来-数字技能,至关重要。

     

    这些清单表明了公司利益的转变,同时也反映了我们日益数字化的世界。你准备好迎接数字企业了吗?

    ps:这些2020年的十大技术技能和其他深度见解和分析全都来自Udemy for Business的《2020年职场学习趋势报告:未来的技能》。该报告重点介绍了组织在2020年所需的未来技能,以及如何为新的十年做好准备。

    留言 点赞 关注

    我们一起分享AI学习与发展的干货
    欢迎关注全平台AI垂类自媒体 “读芯术”

    (添加小编微信:dxsxbb,加入读者圈,一起讨论最新鲜的人工智能科技哦~)

    展开全文
  • 嵌套允许逻辑上属于同一代码实体,但被编译为不同类文件的类,无需编译器插入可访问性扩展桥接方法,即可访问彼此的私有成员。 动态类文件常量 扩展 Java 类文件格式以支持新的常量池形式,CONSTANT_Dynamic...

    Java11,目前处于发布候选阶段的下一版 Java 编程语言,预计将于 2018 年 9 月 25 日全面上市。距离现在还有 2 周时间。由于Oracle 计划于 2019 年 1 月推出针对 JDK 8 的 “Commercial User End of Public Updates”,估计会有许多用户打算在此之前迁移到 JDK 11。

    你准备好了吗?

    Java Development Kit(JDK)11 不仅仅是一个升级版。 它是 Java 语言的一个大有改善的版本,其中有几个功能专注于性能。 以下是 JDK 11 中可用的新特性列表。

    基于嵌套的访问控制

    嵌套是一种访问控制上下文,与 Java 编程语言中现有的嵌套类型概念一致。 嵌套允许逻辑上属于同一代码实体,但被编译为不同类文件的类,无需编译器插入可访问性扩展桥接方法,即可访问彼此的私有成员。

    动态类文件常量

    扩展 Java 类文件格式以支持新的常量池形式,CONSTANT_Dynamic。 加载CONSTANT_Dynamic 会将创建委托给 bootstrap 方法,就像链接 invokedynamic 调用站点将链接委托给 bootstrap 方法一样。

    改进 Aarch64 内联函数

    改进现有的字符串和数组内联函数,并在 AArch64 处理器上为 java.lang.Math sin,cos 和 log 函数实现新的内联函数。

    Epsilon:No-Op 垃圾收集器

    开发一个处理内存分配但不实现任何实际内存回收机制的 GC。 一旦可用的 Java 堆耗尽,JVM 将关闭。

    删除 Java EE 和 CORBA 模块

    从 Java SE Platform 和 JDK 中删除 Java EE 和 CORBA 模块。这些模块在 Java SE 9 中已弃用,声明的目的是为了在将来的版本中删除它们。

    HTTP 客户端(标准)

    通过 JEP 110 标准化 JDK 9 中引入的孵化 HTTP 客户端 API,并在 JDK 10 中进行更新。

    Lambda 参数的本地变量语法

    在声明隐式类型的 lambda 表达式的形式参数时允许使用 var。

    Curve25519 和 Curve448 密钥协议

    使用 RFC 7748 中描述的 Curve25519 和 Curve448 实现密钥协议。

    Unicode 10

    升级现有平台 API 以支持 Unicode 标准 v10.0。

    运行记录仪

    提供低开销的数据收集框架,用于对 Java 应用程序和 HotSpot JVM 进行故障排除。

    ChaCha20 和 Poly1305 密码算法

    实现 RFC 7539 中指定的 ChaCha20 和 ChaCha20-Poly1305 密码。ChaCha20 是一种相对较新的流密码,可以替代旧的、不安全的 RC4 流密码。

    启动单文件源代码程序

    增强 java 启动程序以运行作为 Java 源代码的单个文件提供的程序,包括通过“shebang”文件和相关技术从脚本中使用。

    低开销堆分析

    提供一种低开销的 Java 堆分配采样方法,可通过 JVMTI 访问。

    传输层安全性(TLS)1.3

    实现传输层安全性(TLS)协议 RFC 8446 的 1.3 版。

    ZGC:可扩展的低延迟垃圾收集器

    Z 垃圾收集器,也称为 ZGC,是一个可扩展的低延迟垃圾收集器。

    弃用 Nashorn JavaScript 引擎

    弃用 Nashorn JavaScript 脚本引擎和 API 以及 jjs 工具,意图在将来的版本中删除它们。

    弃用 Pack200 工具和 API

    在 java.util.jar 中弃用 pack200 和 unpack200 工具以及 Pack200 API。

    OneAPM 为您提供端到端的  Java 应用性能 解决方案,我们支持所有常见的 Java 框架及应用服务器,助您快速发现系统瓶颈,定位异常根本原因。分钟级部署,即刻体验,Java 监控从来没有如此简单。想阅读更多技术文章,请访问  OneAPM 官方技术博客 。

    转:http://blog.oneapm.com/apm-tech/826.html

    展开全文
  • 每搭建一个项目就生成单独的一个文件夹,多个项目之间彼此不干涉,也不干涉tomcat本身的文件夹。做得挺不错的。于是乎今天终于明白,它是怎么启动的了,在tomcat文件里面找不到项目的原因就在这。这么一来就搞清楚啦...

    前言

      在最初认识tomcat的时候,我知道部署web项目,就是把自己的项目打包成war然后往webapp里面一扔,tomcat就会自动将项目部署起来了,但是用IDEA的时候我总是很奇怪,它不是直接放到webapp面的,而是生成一个target目录,外加一个war文件。今天偶然间总算明白过来了,且听我慢慢道来。

    tomcat部署项目的几种方式

    1、war文件直接扔进webapp里面。这个方法是比较常见的了,就不多述了。server.xml中Host标签是有关于webapp的配置。
    2、server.xml中配置context标签,通过context的配置,可以指定某一个web应用:比如这样:

    <Context path="/A" docBase="B" />

      这里代表的是虚拟路径为A,就是映射到ip:port/A, 项目的路径是B。
    配置参数:

    • path:虚拟路径。
    • docBase:应用程序的物理路径。
    • workDir:这个应用的工作目录,存放运行时生成的与这个应用相关的文件。
    • debug:设定debug level, 0表示提供最少的信息,9表示提供最多的信息。
    • privileged:设置为true的时候,才允许Tomcat的Web应用使用容器内的Servlet。
    • reloadable:如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib 和/WEB-INF/classes目录的变化,自动装载新的应用程序,可以在不重起tomcat的情况下改变应用程序,实现热部署。
    • ntiResourceLocking 和antiJARLocking:热部署是需要配置的参数,默认false避免更新了某个webapp,有时候Tomcat并不能把旧的webapp完全删除,通常会留下WEB-INF/lib下的某个jar包,必须关闭Tomcat才能删除,这就导致自动部署失败。设置为true,Tomcat在运行对应的webapp时,会把相应的源文件和jar文件复制到一个临时目录里。

    3、进入tomcat目录里面的conf/Catalina/localhost,新建一个xml文件,记住名字和path后面的要一致,是根据这个来确定项目名称的,Context标签的配置一样。
    这里写图片描述

    小结一下:
      如果项目在webapp里面,那么你只要移除webapp包就可以了,这种做法不会在server.xml中和Catalina里面留下什么,如果是用别的方法就要注意了,移走项目的同时,需要移除相关的配置。

    IDEA部署tomcat的原理

      你知道IDEA是如何部署tomcat项目的嘛?在我最初的时候,我跟着网上的配置啪啪啪一顿操作,让服务器运行起来了,但是我却不知道它是如何运作的。为什么就能访问了呢?先看这里

    /home/dream/apache-tomcat-9.0.11/bin/catalina.sh run
    Using CATALINA_BASE:   /home/dream/.IntelliJIdea2018.1/system/tomcat/Unnamed_day19_privilege_3
    Using CATALINA_HOME:   /home/dream/apache-tomcat-9.0.11
    Using CATALINA_TMPDIR: /home/dream/apache-tomcat-9.0.11/temp
    Using JRE_HOME:        /usr/lib/jvm/jdk-9.0.4
    NOTE: Picked up JDK_JAVA_OPTIONS:  --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
    Using CLASSPATH:       /home/dream/apache-tomcat-9.0.11/bin/bootstrap.jar:/home/dream/apache-tomcat-9.0.11/bin/tomcat-juli.jar

      这是截取的一段IDEA启动过程,一开始我也没有发现什么问题,但是如果我们终端启动tomcat的话对比看看.
    这里写图片描述
      不难发现,这个里面的区别就在于它的CATALINA_BASE,这个目录放的是工作目录,HOME是安装的位置,每一个tomcat实例都有自己的工作目录,包括conf、log、work等。分别放配置文件,日志,jsp->servlet的地方。打开tomcat文件我们也可以看见这些。
    这里写图片描述

    IDEA的tomcat项目发布方式

      我觉得IDEA是做的比较好的,在我之前的eclipse时候它是直接发布到tomcat webapp里面的,并且在server.xml文件里面还配置了context标签,IDEA的做法我们可以看看。
    tomcat配置文件路径图:
    这里写图片描述
    目录树结构:
    这里写图片描述
    这个上面的.0后缀文件我看了一下,它是原来tomcat的文件,复制了一份过来,用意不太知道,可能是IDEA它自己做了些修改吧。
    xml文件:
    这里写图片描述
      不难看出IDEA采用的就是上面描述的第三种方式,在localhost里面配置上了xml文件映射项目的context。每搭建一个项目就生成单独的一个文件夹,多个项目之间彼此不干涉,也不干涉tomcat本身的文件夹。做得挺不错的。于是乎今天终于明白,它是怎么启动的了,在tomcat文件里面找不到项目的原因就在这。这么一来就搞清楚啦~挺好的。

    展开全文
  • 程序员需要了解的硬核知识之磁盘

    千次阅读 2019-11-01 12:35:13
    我们大家知道,计算机的五大基础部件是 存储器、控制器、运算器、输入和输出设备,其中从存储功能的角度来看,可以把存储器分为内存和 磁盘,内存我们上面的文章已经介绍过了,那么此篇文章我们来介绍一下磁盘以及...

    此篇文章是 《程序员需要了解的硬核知识》系列第四篇,历史文章请戳

    程序员需要了解的硬核知识之内存

    程序员需要了解的硬核知识之CPU

    程序员需要了解的硬核知识之二进制

    我们大家知道,计算机的五大基础部件是 存储器控制器运算器输入和输出设备,其中从存储功能的角度来看,可以把存储器分为内存磁盘,内存我们上面的文章已经介绍过了,那么此篇文章我们来介绍一下磁盘以及内存和磁盘的关系。

    认识磁盘

    首先,磁盘和内存都具有存储功能,它们都是存储设备。区别在于,内存是通过电流 来实现存储;磁盘则是通过磁记录技术来实现存储。内存是一种高速,造假昂贵的存储设备;而磁盘则是速度较慢、造假低廉的存储设备;电脑断电后,内存中的数据会丢失,而磁盘中的数据可以长久保留。内存是属于内部存储设备,硬盘是属于 外部存储设备。一般在我们的计算机中,磁盘和内存是相互配合共同作业的。

    一般内存指的就是主存(负责存储CPU中运行的程序和数据);早起的磁盘指的是软磁盘(soft disk,简称软盘),就是下面这个

    (2000年的时候我曾经我姑姑家最早的计算机中见到过这个,当时还不知道这是啥,现在知道了。)

    如今常用的磁盘是硬磁盘(hard disk,简称硬盘),就是下面这个

    程序不读入内存就无法运行

    在了解磁盘前,还需要了解一下内存的运行机制是怎样的,我们的程序被保存在存储设备中,通过使用 CPU 读入来实现程序指令的执行。这种机制称为存储程序方式,现在看来这种方式是理所当然的,但在以前程序的运行都是通过改变计算机的布线来读写指令的。

    计算机最主要的存储部件是内存和磁盘。磁盘中存储的程序必须加载到内存中才能运行,在磁盘中保存的程序是无法直接运行的,这是因为负责解析和运行程序内容的 CPU 是需要通过程序计数器来指定内存地址从而读出程序指令的。

    磁盘构件

    磁盘缓存

    我们上面提到,磁盘往往和内存是互利共生的关系,相互协作,彼此持有良好的合作关系。每次内存都需要从磁盘中读取数据,必然会读到相同的内容,所以一定会有一个角色负责存储我们经常需要读到的内容。 我们大家做软件的时候经常会用到缓存技术,那么硬件层面也不例外,磁盘也有缓存,磁盘的缓存叫做磁盘缓存

    磁盘缓存指的是把从磁盘中读出的数据存储到内存的方式,这样一来,当接下来需要读取相同的内容时,就不会再通过实际的磁盘,而是通过磁盘缓存来读取。某一种技术或者框架的出现势必要解决某种问题的,那么磁盘缓存就大大改善了磁盘访问的速度

    Windows 操作系统提供了磁盘缓存技术,不过,对于大部分用户来说是感受不到磁盘缓存的,并且随着计算机的演进,对硬盘的访问速度也在不断演进,实际上磁盘缓存到 Windows 95/98 就已经不怎么使用了。

    把低速设备的数据保存在高速设备中,需要时可以直接将其从高速设备中读出,这种缓存方式在web中应用比较广泛,web 浏览器是通过网络来获取远程 web 服务器的数据并将其显示出来。因此,在读取较大的图片的时候,会耗费不少时间,这时 web 浏览器可以把获取的数据保存在磁盘中,然后根据需要显示数据,再次读取的时候就不用重新加载了。

    虚拟内存

    虚拟内存是内存和磁盘交互的第二个媒介。虚拟内存是指把磁盘的一部分作为假想内存来使用。这与磁盘缓存是假想的磁盘(实际上是内存)相对,虚拟内存是假想的内存(实际上是磁盘)。

    虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续可用的内存(一个完整的地址空间),但是实际上,它通常被分割成多个物理碎片,还有部分存储在外部磁盘管理器上,必要时进行数据交换。

    计算机中的程序都要通过内存来运行,如果程序占用内存很大,就会将内存空间消耗殆尽。为了解决这个问题,WINDOWS 操作系统运用了虚拟内存技术,通过拿出一部分硬盘来当作内存使用,来保证程序耗尽内存仍然有可以存储的空间。虚拟内存在硬盘上的存在形式就是PAGEFILE.SYS 这个页面文件。

    通过借助虚拟内存,在内存不足时仍然可以运行程序。例如,在只剩 5MB 内存空间的情况下仍然可以运行 10MB 的程序。由于 CPU 只能执行加载到内存中的程序,因此,虚拟内存的空间就需要和内存中的空间进行置换(swap),然后运行程序。

    虚拟内存与内存的交换方式

    刚才我们提到虚拟内存需要和内存中的部分内容做置换才可让 CPU 继续执行程序,那么做置换的方式是怎样的呢?又分为哪几种方式呢?

    虚拟内存的方法有分页式分段式 两种。Windows 采用的是分页式。该方式是指在不考虑程序构造的情况下,把运行的程序按照一定大小的页进行分割,并以为单位进行置换。在分页式中,我们把磁盘的内容读到内存中称为 Page In,把内存的内容写入磁盘称为 Page Out。Windows 计算机的页大小为 4KB ,也就是说,需要把应用程序按照 4KB 的页来进行切分,以页(page)为单位放到磁盘中,然后进行置换。

    为了实现内存功能,Windows 在磁盘上提供了虚拟内存使用的文件(page file,页文件)。该文件由 Windows 生成和管理,文件的大小和虚拟内存大小相同,通常大小是内存的 1 - 2 倍。

    节约内存

    Windows 是以图形界面为基础的操作系统。它的前身是 MS-DOC,最初的版本可以在 128kb 的内存上运行程序,但是现在想要 Windows 运行流畅的花至少要需要 512MB 的内存,但通常往往是不够的。

    也许许多人认为可以使用虚拟内存来解决内存不足的情况,而虚拟内存确实能够在内存不足的时候提供补充,但是使用虚拟内存的 Page In 和 Page Out 通常伴随着低速的磁盘访问,这是一种得不偿失的表现。所以虚拟内存无法从根本上解决内存不足的情况。

    为了从根本上解决内存不足的情况,要么是增加内存的容量,加内存条;要么是优化应用程序,使其尽可能变小。第一种建议往往需要衡量口袋的银子,所以我们只关注第二种情况。

    注意:以下的篇幅会涉及到 C 语言的介绍,是每个程序员(不限语言)都需要知道和了解的知识。

    通过 DLL 文件实现函数共有

    DLL(Dynamic Link Library)文件,是一种动态链接库 文件,顾名思义,是在程序运行时可以动态加载 Library(函数和数据的集合)的文件。此外,多个应用可以共有同一个 DLL 文件。而通过共有一个 DLL 文件则可以达到节约内存的效果。

    例如,假设我们编写了一个具有某些处理功能的函数 MyFunc()。应用 A 和 应用 B 都需要用到这个函数,然后在各自的应用程序中内置 MyFunc()(这个称为Static Link,静态链接)后同时运行两个应用,内存中就存在了同一个函数的两个程序,这会造成资源浪费。

    为了改变这一点,使用 DLL 文件而不是应用程序的执行文件(EXE文件)。因为同一个 DLL 文件内容在运行时可以被多个应用共有,因此内存中存在函数 MyFunc()的程序就只有一个

    Windows 操作系统其实就是无数个 DLL 文件的集合体。有些应用在安装时,DLL文件也会被追加。应用程序通过这些 DLL 文件来运行,既可以节约内存,也可以在不升级 EXE 文件的情况下,通过升级 DLL 文件就可以完成更新。

    通过调用 _stdcall 来减少程序文件的大小

    通过调用 _stdcall 来减小程序文件的方法,是用 C 语言编写应用时可以利用的高级技巧。我们来认识一下什么是 _stdcall。

    _stdcall 是 standard call(标准调用)的缩写。Windows 提供的 DLL 文件内的函数,基本上都是通过 _stdcall 调用方式来完成的,这主要是为了节约内存。另一方面,用 C 语言编写的程序默认都不是 _stdcall 。C 语言特有的调用方式称为 C 调用。C 语言默认不使用 _stdcall 的原因是因为 C 语言所对应的函数传入参数是可变的,只有函数调用方才能知道到底有多少个参数,在这种情况下,栈的清理作业便无法进行。不过,在 C 语言中,如果函数的参数和数量固定的话,指定 _stdcall 是没有任何问题的。

    C 语言和 Java 最主要的区别之一在于 C 语言需要人为控制释放内存空间

    C 语言中,在调用函数后,需要人为执行栈清理指令。把不需要的数据从接收和传递函数的参数时使用的内存上的栈区域中清理出去的操作叫做 栈清理处理

    例如如下代码

    // 函数调用方
    void main(){
      int a;
      a = MyFunc(123,456);
    }
    
    // 被调用方
    int MyFunc(int a,int b){
      ...
    }
    

    代码中,从 main 主函数调用到 MyFunc() 方法,按照默认的设定,栈的清理处理会附加在 main 主函数这一方。在同一个程序中,有可能会多次调用,导致 MyFunc() 会进行多次清理,这就会造成内存的浪费。

    汇编之后的代码如下

    push 1C8h								// 将参数 456( = 1C8h) 存入栈中
    push 7Bh								// 将参数 123( = 7Bh) 存入栈中
    call @LTD+15 (MyFunc)(00401014)			// 调用 MyFunc 函数
    add esp,8								// 运行栈清理
    

    C 语言通过栈来传递函数的参数,使用 push 是往栈中存入数据的指令,pop 是从栈中取出数据的指令。32 位 CPU 中,1次 push 指令可以存储 4 个字节(32 位)的数据。上述代码由于进行了两次 push 操作,所以存储了 8 字节的数据。通过 call 指令来调用函数,调用完成后,栈中存储的数据就不再需要了。于是就通过 add esp,8 这个指令,使存储着栈数据的 esp 寄存器前进 8 位(设定为指向高 8 位字节的地址),来进行数据清理。由于栈是在各种情况下都可以利用的内存领域,因此使用完毕后有必要将其恢复到原始状态。上述操作就是执行栈的清理工作。另外,在 C 语言中,函数的返回值,是通过寄存器而非栈来返回的。

    栈执行清理工作,在调用方法处执行清理工作和在反复调用方法处执行清理工作不同,使用 _stdcall 标准调用的方式称为反复调用方法,在这种情况下执行栈清理开销比较小。

    磁盘的物理结构

    之前我们介绍了CPU、内存的物理结构,现在我们来介绍一下磁盘的物理结构。磁盘的物理结构指的是磁盘存储数据的形式

    磁盘是通过其物理表面划分成多个空间来使用的。划分的方式有两种:可变长方式扇区方式。前者是将物理结构划分成长度可变的空间,后者是将磁盘结构划分为固定长度的空间。一般 Windows 所使用的硬盘和软盘都是使用扇区这种方式。扇区中,把磁盘表面分成若干个同心圆的空间就是 磁道,把磁道按照固定大小的存储空间划分而成的就是 扇区

    扇区是对磁盘进行物理读写的最小单位。Windows 中使用的磁盘,一般是一个扇区 512 个字节。不过,Windows 在逻辑方面对磁盘进行读写的单位是扇区整数倍簇。根据磁盘容量不同功能,1簇可以是 512 字节(1 簇 = 1扇区)、1KB(1簇 = 2扇区)、2KB、4KB、8KB、16KB、32KB( 1 簇 = 64 扇区)。簇和扇区的大小是相等的。

    不管是硬盘还是软盘,不同的文件是不能存储在同一簇中的,否则就会导致只有一方的文件不能删除。所以,不管多小的文件,都会占用 1 簇的空间。这样一来,所有的文件都会占用 1 簇的整数倍的空间。

    我们使用软盘做实验会比较简单一些,我们先对软盘进行格式化,格式化后的软盘空间如下

    接下来,我们保存一个 txt 文件,并在文件输入一个字符,这时候文件其实只占用了一个字节,但是我们看一下磁盘的属性却占用了 512 字节

    然后我们继续写入一些东西,当文件大小到达 512 个字节时,已用空间也是 512 字节,但是当我们继续写入一个字符时,我们点开属性会发现磁盘空间会变为 1024 个字节(= 2 簇),通过这个实验我们可以证明磁盘是以簇为单位来保存的。

    文章参考:

    磁盘

    磁盘缓存

    虚拟内存

    《程序是怎样跑起来的 第四章》

    http://www.intohard.com/article-436-1.html

    下面为自己做个宣传,欢迎关注公众号 Java建设者,号主是Java技术栈,热爱技术,喜欢阅读,热衷于分享和总结,希望能把每一篇好文章分享给成长道路上的你。关注公众号回复 002 领取为你特意准备的大礼包,你一定会喜欢并收藏的。

    展开全文
  • 了解Sidecar模式

    万次阅读 多人点赞 2019-01-28 23:56:34
    因此,组件和应用程序彼此之间具有密切的相互依赖性。 如果将应用程序分解为服务,则可以使用不同的语言和技术构建每个服务。虽然这提供了更大的灵活性,但这意味着每个组件都有自己的依赖关系,并且需要特定于...
  • Android之了解ThreadLocal

    万次阅读 2018-02-25 09:36:09
    总结,不同线程访问同一个ThreadLocal对象,ThreadLocal对象维护一套数据的副本并且彼此互不干扰。 工作原理 get方法 get() 方法源码如下: public T get() { //以当前线程作为getMap()方法的参数。 ...
  • 五句话了解区块链,扫盲系列

    万次阅读 多人点赞 2018-03-22 09:16:56
    区块链解决的是生产关系的问题,也就是信任的问题,想一下为什么淘宝需要有支付宝,因为如果没拿到货而直接付钱,卖家不发货怎么办?需要担保机制,这就是买卖间彼此不信任的问题。2.区块链的核心技术理论是啥?
  • 快速了解UDP协议

    千次阅读 2019-06-23 08:00:00
    QQ客户端之间的消息传送也采用了UDP模式,因为国内的网络环境非常复杂,而且很多用户采用的方式是通过代理服务器共享一条线路上网的方式,在这些复杂的情况下,客户端之间能彼此建立起来TCP连接的概率较小,严重影响...
  • JDNI了解

    千次阅读 2013-02-05 16:49:36
    在网上看到了这样的一道题目: ...由于我没有了解过什么是JNDI,以前仅仅听说过这个词儿。今天看到了这样的一个题,我开始了解了JNDI。。。 下面看一个一个网友写的关于JNDI的看法,觉得挺有意思的:
  • 程序员不得不了解的硬核知识大全

    万次阅读 多人点赞 2020-01-15 11:51:39
    我们每个程序员或许都有一个梦,那就是成为大牛,我们或许都沉浸在各种框架中,以为框架就是一切,以为应用层才是最重要的,你错了。...现在就带你了解一下 CPU 是什么 CPU 的全称是 Central Processin...
  • MVX框架模式了解

    千次阅读 2018-11-22 00:11:03
    MVX框架模式了解 MVX框架模式:MVC+MVP+MVVM 1.MVC:Model(模型)+View(视图)+controller(控制器),主要是基于分层的目的,让彼此的职责分开。 View通过Controller来和Model联系,Controller是View和Model的协调者,...
  • 简单了解osgi

    千次阅读 2017-04-17 19:06:56
    目前,业内关于OSGI技术的学习资源或者...我将用文字记录学习OSGI的整个过程,通过整理书籍和视频教程,来让我更加了解这门技术,同时也让需要学习这门技术的同志们有一个清晰的学习路线。 我们需要解决一下几问题:
  • 深入了解selenium及webdriver原理

    千次阅读 2017-08-11 21:25:08
     关于WebDriver Wire协议的细节,比如希望了解这套Web Service能够做哪些事情,可以阅读Selenium官方的协议文档, 在Selenium的源码中,我们可以找到一个HttpCommandExecutor这个类,里面维护了一个Map, Command...
  • 程序员需要了解的硬核知识之CPU

    千次阅读 多人点赞 2019-10-21 13:14:54
    我们生而为人最明显的一个特征是我们能通过讲话来实现彼此的交流,但是计算机听不懂你说的话,你要想和他交流必须按照计算机指令来交换,这就涉及到语言的问题,计算机是由二进制构成的,它只能听的懂二进制也就是 ...
  • 一篇文章了解新发布的Java JDK 11

    万次阅读 2018-09-27 17:44:39
    嵌套允许逻辑上属于同一代码实体的类,但编译为不同的类文件以访问彼此的私有成员,而无需编译器插入可访问性扩展桥接方法。 传输层安全性(TLS)1.3 ,其中TLS协议的这种大修将适用于JDK 11,从而提供显着的...
  • 在讲解 802.11协议前,我们需要先了解一下 WLAN拓扑结构。 首先,我们需要理解一下 STA 和 AP的区别,请自行参考博主以前的文章。而针对它们的组合方式又分为三种拓扑结构: 独立的基本服务集网络(IBSS,也...
  • 1、数组与容器的基本概念 数组是Java提供的线性队列实现方式,能存储基础数据类型与对象;...容器是封装的更高级集合实现,底层可能是数组也可能是...如果想了解容器之间的相互转换,出门左走找【java8-stream】
  • 我们在之前的文章中 已经了解了 spark支持的模式,其中一种就是 使用k8s进行管理。 hadoop组件—spark----全面了解spark以及与hadoop的区别 是时候考虑让你的 Spark 跑在K8s 上了 spark on k8s的优势–为什么要把...
  • ROS就是专门为这样的团队设计的,在彼此工作的基础之上协作设计开发机器人软件。 贡献者 Contributors  http://www.ros.org/contributors/ 历史 History  http://www.ros.org/history/ 学习ROS最重要的两个网址...
  • OLAP了解 学习

    万次阅读 2017-11-24 09:33:10
    是使分析人员、管理人员或执行人员能够从多种角度对从原始数据中转化出来的、能够真正为用户所理解的、并真实反映企业维特性的信息进行快速、一致、交互地存取,从而获得对数据的更深入了解的一类软件技术。...
  • 这一块我还真不了解,就不说了,怕误人子弟!!! General Empty Project 就是创建一个空的工程,不给你添加任何.cpp或.h文件,不进行任何特殊的设置。 Custom Wizard 就是用户自定义向导,...
  • 区块链和比特币初步了解

    千次阅读 多人点赞 2019-10-29 19:26:46
    最近这几天区块链被再一次提到了风口,这次不一样,xxx代言,xxx支持的,作为一个IT人,应该了解下。而且不能太粗略。 一、先过一些基本概念 区块链和比特币 首先这是两个概念,区块链是技术范畴,比特币更像...
  • 深入学习esp8266的esp now模式,仿机智云做一个小网关,实现无需网络下轻松彼此连接通讯交互数据。 点我访问 21 nonos2.0 浅谈 esp8266 如何在本地局域网网络情况下实现最大效率地和前端实现数据交互。 ...
  • 深入学习esp8266的esp now模式,仿机智云做一个小网关,实现无需网络下轻松彼此连接通讯交互数据。 点我访问 21 nonos2.0 浅谈 esp8266 如何在本地局域网网络情况下实现最大效率地和前端实现数据交互。 ...
  • 深入了解vray材质的属性

    千次阅读 多人点赞 2015-10-31 11:25:31
    深入了解VRay材质的属性 来源:magicfox作者: 韩涌(译)原英文链接:http://viscorbel.com/vray-materials/[/url]要创建逼真的材质,首先必须理解VRay的材质(当然,前提是使用VRay作为渲染器),VRay的材质类型有...
  • 多线程并发 (六) 了解死锁

    千次阅读 2020-01-17 17:22:37
    多线程并发 (一) 了解 Java 虚拟机 - JVM学习知道了创建一个线程会触发JVM创建一个私有的虚拟机栈、程序计数器,当前的虚拟机栈内存就是当前线程的运行内存,程序计数器就是记录当前线程运行的代码的地址。...
  • 一张图带你了解物联网协议栈

    万次阅读 2019-05-23 10:30:32
    通信技术包括 Wi-Fi:创建于IEEE 802.11标准的无线...NFC:一种新兴的技术,使用了NFC技术的设备(比如手机)可以在彼此靠近的情况下进行数据交换,是由非接触式射频识别(RFID)及互连互通技术整合演变而来,通过在...
  • 深入学习esp8266的esp now模式,仿机智云做一个小网关,实现无需网络下轻松彼此连接通讯交互数据。 21、 Esp8266进阶之路 : 浅谈 esp8266 如何在本地局域网网络情况下实现最大效率地和前端实现数据交互。 22、...
  • 深入了解HDMI接口

    万次阅读 2014-03-21 15:00:40
    DDC全文为Display Data Channel,传送端与接收端可利用DDC通道得知彼此的传送与接收能力,但HDMI仅需单向获知接收端( 显示器 )的能力。使用100kHz时钟频率的I2C信号。传送数据结构为VESA Enhanced EDID (V1.3)。 ...
  • HDFS原理了解 (学习笔记)

    万次阅读 2018-03-06 20:16:28
    HDFS简介 HDFS:Hadoop Distributed File System(hadoop分布式文件系统) 分布式,感觉好厉害的样子啊,有网络文件...想要了解这个东东,先找一张原理图瞅瞅。 看不懂没关系,继续往下瞅就是了。 HDFS 1.0 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 125,009
精华内容 50,003
关键字:

彼此了解一下