精华内容
下载资源
问答
  • go runtime 千次阅读
    2022-03-31 21:39:19

    Runtime简介

    golang runtime是go语言运行所需要的基础设置。

    在这里插入图片描述

    java 、python中也有runtime,但是java、python中的runtime是虚拟机,而go的runtime和用户代码一起编译到一个可执行文件中。

    go runtime大致可分成三部分:go调度,go内存管理,go GC。

    1、简介一下go调度

    先介绍一下go routine与go 调度的区别

    我们都知道Go语言是原生支持语言级并发的,这个并发的最小逻辑单元就是goroutine。goroutine就是Go语言提供的一种用户态线程,当然这种用户态线程是跑在内核级线程之上的。当我们创建了很多的goroutine,并且它们都是跑在同一个内核线程之上的时候,就需要一个调度器来维护这些goroutine,确保所有的goroutine都使用cpu,并且是尽可能公平的使用cpu资源。

    Go的调度器使用了三种结构:M,P,S

    • M代表内核线程,类似于标准的POSIX线程,M代表machine。
    • G代表goroutine,它拥有自己的栈,程序计数器(instruction counter)和一些关于goroutine调度的信息(如正在阻塞的channel)。
    • P代表processor,表示调度的上下文。可以把它看作是一个局部的调度器,让Go代码跑在一个单独的线程上。这是让Go从一个N:1调度器映射到一个M:N调度器的关键。

    2、简介一下go内存管理

    Go 的内存管理基本上参考 tcmalloc 来实现的,只是细节上根据自身的需要做了一些小的优化调整。

    Go 的内存是自动管理的,我们可以随意定义变量直接使用,不需要考虑变量背后的内存申请和释放的问题。

    介绍一个很好的文章
    图解tcmalloc整个的结构

    图解tcmalloc

    里面介绍了tcmalloc的几个结构,不同结构之间的联系
    看完tcmalloc就差不多懂了

    插一嘴我发现内核的slab机制跟这个也很像…

    3、go GC

    垃圾回收(Garbage Collection,简称GC)是编程语言中提供的内存管理功能

    在传统的编程语言(主要指C/C++)中,程序员定义了一个变量,就是在内存中开辟了一段相应的空间来存值。由于内存是有限的,所以当程序不再需要使用某个变量的时候,就需要销毁该对象并释放其所占用的内存资源,好重新利用这段空间。在C/C++中,释放无用变量内存空间的事情需要由程序员自己来处理。当软件系统比较复杂,变量多的时候程序员往往就忘记或者在不该释放的时候释放内存了。这对于程序开发人员是一个比较头痛的问题。

    为了解决这个问题,后来开发出来的几乎所有新语言(java,python,php等等)都引入了语言层面的自动内存管理 – 也就是语言的使用者只用关注内存的申请而不必关心内存的释放,内存释放由虚拟机(virtual machine)或运行时(runtime)来自动进行管理。而这种对不再使用的内存资源进行自动回收的功能就被称为垃圾回收。

    go GC主要是用了三色标记法
    在版本更新中具体的版本也在发生一些变化
    整体难度还是比较大的。

    推荐一篇帖子

    深入理解Go的GC回收机制

    当然还有一些其他的功能,如支持pprof、trace、race等等。

    还要重点说一下channel

    channel是Go语言在语言级别提供的goroutine间的通信方式。我们可以使用channel在两个或 多个goroutine之间传递消息。

    channel 会某种情况下出现阻塞,通过控制channel的阻塞来管理协程的并发与流程控制。

    然后还有runtime的几个包

    • Gosched:让当前线程让出 cpu 以让其它线程运行,它不会挂起当前线程,因此当前线程未来会继续执行
    • NumCPU:返回当前系统的 CPU 核数量
    • GOMAXPROCS:设置最大的可同时使用的 CPU 核数
    • Goexit:退出当前 goroutine(但是defer语句会照常执行)
    • NumGoroutine:返回正在执行和排队的任务总数
    • GOOS:目标操作系统
    更多相关内容
  • matlab R2019b 对应 runtime ,版本:9.7.0.1190202 (R2019b) 网址连接
  • onnxruntime-1.5.2.zip

    2020-12-04 13:07:29
    https://github.com/microsoft/onnxruntime/releases 方便下载
  • 完美解决“换另一台电脑上用VS2008继续开发web项目时出现“System.Runtime.InteropServices.COMException”,然后是加载不了项目。”
  • java runtime environment 1.8.0_45 64bit jre1.8.0_45 64bit jre-8u261
  • java runtime environment 1.8.0_45 64bit.rar
  • 开发中使用第三方插件时有时需要这个,是Microsoft Visual C++ 2010 Runtime,并非官网的Microsoft Visual C++ 2010 Redistributable。
  • JRE1.8.0(Java Runtime Environment)——Java运行环境32bit
  • ArcGIS Runtime SDK for .NET 100.3.0 直接授权版 需要的自然明白,请仔细看说明后使用,无需安装,直接使用
  • Sentinel HASP Runtime V7.55

    2018-11-19 17:45:43
    HASP_SRM_Runtime_setup,之前在论坛没找到新版的,共享一下V7.55
  • labview runtime engine 6.1

    2018-03-21 19:58:04
    labview runtime engine 6.1版本,官方下载。有的软件运行需要labview的运行时库,老版本不好找。
  • Microsoft Visual C++ Runtime 64 bits,其他相关工具见安装详细教程博客http://blog.csdn.net/ruthywei/article/details/78433074
  • Arcgis Engine 10.2 运行时中文补丁 安装方法 1,安装ArcGIS Engine Runtime 10 英文版; 2.安装本补丁; 3.安装官方 ArcGISEngine10SP5-SimplifiedChine
  • VCRuntimes C++ 2010 X86_X64 VC Runtime文件, ,
  • dotnet runtime 2.0.7 win x64

    2018-05-17 09:23:52
    dotnet runtime 2.0.7 win x64 支持在 windows 使用 Dotnet core ,可以不安装 VisualStudio 系统要求 win7 以上
  • 安装MySql时所需,Microsoft Visual C++ 2013 Redistributable运行库,仅满足64位系统,亲测可用!
  • Runtime OBJ Importer

    2017-02-08 14:51:09
    unity插件包,可以动态导入obj格式的模型。
  • Vc_runtime(X86+x64)

    2018-05-06 14:13:12
    Visual C++ 2008 SP1 运行库 runtime visual C+ 包含 x86 Runtime Setup和 x64 Runtime Setup
  • 丢失api-ms-win-crt-runtime-l1-1-0.dll解决

    千次下载 热门讨论 2018-01-05 19:56:48
    1. 把api-ms-win-crt-runtime-l1-1-0.dll下载到电脑 2. 直接拷贝该文件到系统目录里:C:\Windows\System32目录下,64位系统为:C:\Windows\SysWOW64 3. 最后在开始菜单中找到“运行(R)” 或者按快捷键“Win+R”,在...
  • 土地规划数据库质检ArcEngine 9.3 Runtime全套许可
  • runtime最新代码

    2018-03-15 23:03:24
    runtime源码runtime源码runtime源码runtime源码runtime源码runtime源码runtime源码
  • 提示api-ms-win-crt-runtime-l1-1-0.dll 丢失,安装这个小玩意就可以解决了
  • ArcGIS Runtime SDK for WPF 10.2.5 破解

    热门讨论 2015-07-09 09:20:00
    ArcGIS Runtime SDK for WPF 10.2.5 版本破解License standard版本 测试可以使用,无弹出信息 测试环境:vs2013 win7_64
  • api-ms-win-crt-runtime-dll-v3.exe万能解决办法!
  • 介绍了ArcGIS Runtime SDK标准版授权的方式
  • loadrunner11安装时提示少了这个Microsoft WSE2.0 SP3 Runtime.msi ,这个可用。
  • 4、Runtime fields 解决文章开头问题 4.1 Runtime fields 实战求解 PUT news_00001/_mapping { "runtime": { "emotion_flag_new": { "type": "keyword", "script": { "source": "if (doc['emotion'].value ...

    1、实战问题

    实战业务中,遇到数据导入后,但发现缺少部分必要字段,一般怎么解决?

    比如:emotion 代表情感值,取值范围为:0-1000。

    其中:300-700 代表中性;0-300 代表负面;700-1000 代表正面。

    但实际业务中,我们需要:中性:0;负面:-1;正面:1。

    如何实现呢?

    这时,可能想到的解决方案:

    • 方案一:重新创建索引时添加字段,清除已有数据再重新导入数据。

    • 方案二:重新创建索引时添加字段,原索引通过 reindex 写入到新索引。

    • 方案三:提前指定数据预处理,结合管道 ingest 重新导入或批量更新 update_by_query 实现。

    • 方案四:保留原索引不动,通过script 脚本实现。

    方案一、二类似,新加字段导入数据即可。

    方案三、方案四 我们模拟实现一把。

    2、方案三、四实现一把

    2.1 方案三 Ingest 预处理实现

    DELETE news_00001
    PUT news_00001
    {
      "mappings": {
        "properties": {
          "emotion": {
            "type": "integer"
          }
        }
      }
    }
    
    POST news_00001/_bulk
    {"index":{"_id":1}}
    {"emotion":558}
    {"index":{"_id":2}}
    {"emotion":125}
    {"index":{"_id":3}}
    {"emotion":900}
    {"index":{"_id":4}}
    {"emotion":600}
    
    PUT _ingest/pipeline/my-pipeline
    {
      "processors": [
        {
          "script": {
            "description": "Set emotion flag param",
            "lang": "painless",
            "source": """
              if (ctx['emotion'] < 300 && ctx['emotion'] > 0)
                ctx['emotion_flag'] = -1;
              if (ctx['emotion'] >= 300 && ctx['emotion'] <= 700)
                ctx['emotion_flag'] = 0;
              if (ctx['emotion'] > 700 && ctx['emotion'] < 1000)
                ctx['emotion_flag'] = 1;
              """
          }
        }
      ]
    }
    POST news_00001/_update_by_query?pipeline=my-pipeline
    {
      "query": {
        "match_all": {}
      }
    }

    方案三的核心:定义了预处理管道:my-pipeline,管道里做了逻辑判定,对于emotion 不同的取值区间,设置 emotion_flag 不同的结果值。

    该方案必须提前创建管道,可以通过写入时指定缺省管道 default_pipeline 或者结合批量更新实现。

    实际是两种细分实现方式:

    • 方式一:udpate_by_query 批量更新。而更新索引尤其全量更新索引是有很大的成本开销的。

    • 方式二:写入阶段指定预处理管道,每写入一条数据预处理一次。

    2.2 方案四 script 脚本实现

    POST news_00001/_search
    {
      "query": {
        "match_all": {}
      },
      "script_fields": {
        "emotion_flag": {
          "script": {
            "lang": "painless",
            "source": "if (doc['emotion'].value < 300 && doc['emotion'].value>0) return -1; if (doc['emotion'].value >= 300 && doc['emotion'].value<=700) return 0; if (doc['emotion'].value > 700 && doc['emotion'].value<=1000) return 1;"
          }
        }
      }
    }

    方案四的核心:通过 script_field 脚本实现。

    该方案仅是通过检索获取了结果值,该值不能用于别的用途,比如:聚合。

    还要注意的是:script_field 脚本处理字段会有性能问题。

    两种方案各有利弊,这时候我们会进一步思考:

    能不能不改 Mapping、不重新导入数据,就能得到我们想要的数据呢?

    早期版本不可以,7.11 版本之后的版本有了新的解决方案——Runtime fields 运行时字段。

    3、Runtime fields 产生背景

    Runtime fields 运行时字段是旧的脚本字段 script field 的 Plus 版本,引入了一个有趣的概念,称为“读取建模”(Schema on read)。

    有 Schema on read 自然会想到 Schema on write(写时建模),传统的非 runtime field 类型 都是写时建模的,而 Schema on read 则是另辟蹊径、读时建模。

    这样,运行时字段不仅可以在索引前定义映射,还可以在查询时动态定义映射,并且几乎具有常规字段的所有优点。

    Runtime fields在索引映射或查询中一旦定义,就可以立即用于搜索请求、聚合、筛选和排序。

    4、Runtime fields 解决文章开头问题

    4.1 Runtime fields 实战求解

    PUT news_00001/_mapping
    {
      "runtime": {
        "emotion_flag_new": {
          "type": "keyword",
          "script": {
            "source": "if (doc['emotion'].value > 0 && doc['emotion'].value < 300) emit('-1'); if (doc['emotion'].value >= 300 && doc['emotion'].value<=700) emit('0'); if (doc['emotion'].value > 700 && doc['emotion'].value<=1000) emit('1');"
          }
        }
      }
    }
    
    GET news_00001/_search
    {
      "fields" : ["*"]
    }

    4.2 Runtime fields 核心语法解读

    第一:PUT news_00001/_mapping 是在已有 Mapping 的基础上 更新 Mapping。

    这是更新 Mapping 的方式。实际上,创建索引的同时,指定 runtime field 原理一致。实现如下:

    PUT news_00002
    {
      "mappings": {
        "runtime": {
          "emotion_flag_new": {
            "type": "keyword",
            "script": {
              "source": "if (doc['emotion'].value > 0 && doc['emotion'].value < 300) emit('-1'); if (doc['emotion'].value >= 300 && doc['emotion'].value<=700) emit('0'); if (doc['emotion'].value > 700 && doc['emotion'].value<=1000) emit('1');"
            }
          }
        },
        "properties": {
          "emotion": {
            "type": "integer"
          }
        }
      }
    }

    第二:更新的什么呢?

    加了字段,确切的说,加了:runtime 类型的字段,字段名称为:emotion_flag_new,字段类型为:keyword,字段数值是用脚本 script 实现的。

    脚本实现的什么呢?

    • 当 emotion 介于 0 到 300 之间时,emotion_flag_new 设置为 -1 。

    • 当 emotion 介于 300 到 700 之间时,emotion_flag_new 设置为 0。

    • 当 emotion 介于 700 到 1000 之间时,emotion_flag_new 设置为 1。

    第三:如何实现检索呢?

    我们尝试一下传统的检索,看一下结果。

    我们先看一下 Mapping:

    {
      "news_00001" : {
        "mappings" : {
          "runtime" : {
            "emotion_flag_new" : {
              "type" : "keyword",
              "script" : {
                "source" : "if (doc['emotion'].value > 0 && doc['emotion'].value < 300) emit('-1'); if (doc['emotion'].value >= 300 && doc['emotion'].value<=700) emit('0'); if (doc['emotion'].value > 700 && doc['emotion'].value<=1000) emit('1');",
                "lang" : "painless"
              }
            }
          },
          "properties" : {
            "emotion" : {
              "type" : "integer"
            }
          }
        }
      }
    }

    多了一个 runtime 类型的字段:emotion_flag_new。

    执行:

    GET news_00001/_search

    返回结果如下:

    ebf3ff1b829d733f2b1591ddf5b90561.png

    执行:

    GET news_00001/_search
    {
      "query": {
        "match": {
          "emotion_flag_new": "-1"
        }
      }
    }

    返回结果如下:

    876934cb88bf4cd05637a6c2fabd4a09.png

    执行:

    GET news_00001/_search
    {
      "fields" : ["*"],
      "query": {
        "match": {
          "emotion_flag_new": "-1"
        }
      }
    }

    返回结果如下:

    9b7126dfac2b111dd04f30ec27ebad31.png

    4.3 Runtime fields 核心语法解读

    为什么加了:field:[*] 才可以返回检索匹配结果呢?

    因为:Runtime fields 不会显示在:_source 中,但是:fields API 会对所有 fields 起作用。

    如果需要指定字段,就写上对应字段名称;否则,写 * 代表全部字段。

    4.4 如果不想另起炉灶定义新字段,在原来字段上能实现吗?

    其实上面的示例已经完美解决问题了,但是再吹毛求疵一下,在原有字段 emotion 上查询时实现更新值可以吗?

    实战一把如下:

    POST news_00001/_search
    {
      "runtime_mappings": {
        "emotion": {
          "type": "keyword",
          "script": {
            "source": """
             if(params._source['emotion'] > 0 && params._source['emotion'] < 300) {emit('-1')}
             if(params._source['emotion'] >= 300 && params._source['emotion'] <= 700) {emit('0')}
             if(params._source['emotion'] > 700 && params._source['emotion'] <= 1000) {emit('1')}
            """
          }
        }
      },
      "fields": [
        "emotion"
      ]
    }

    返回结果:

    c55d2ff779cdc52aab2052e9ac90b771.png

    解释一下:

    第一:原来 Mapping 里面 emotion是 integer 类型的。

    第二:我们定义的是检索时类型,mapping 没有任何变化,但是:检索时字段类型 emotion 在字段名称保持不变的前提下,被修改为:keyword 类型。

    这是一个非常牛逼的功能!!!

    早期 5.X、6.X 没有这个功能的时候,实际业务中我们的处理思路如下:

    • 步骤一:停掉实时写入;

    • 步骤二:创建新索引,指定新 Mapping,新增 emotion_flag 字段。

    • 步骤三:恢复写入,新数据会生效;老数据 reindex 到新索引,reindex 同时结合 ingest 脚本处理。

    有了 Runtime field,这种相当繁琐的处理的“苦逼”日子一去不复回了!

    5、Runtime fields 适用场景

    比如:日志场景。运行时字段在处理日志数据时很有用,尤其是当不确定数据结构时。

    使用了 runtime field,索引大小要小得多,可以更快地处理日志而无需对其进行索引。

    6、Runtime fields 优缺点

    优点 1:灵活性强

    运行时字段非常灵活。主要体现在:

    • 需要时,可以将运行时字段添加到我们的映射中。

    • 不需要时,轻松删除它们。

    删除操作实战如下:

    PUT news_00001/_mapping
    {
     "runtime": {
       "emotion_flag": null
     }
    }

    也就是说将这个字段设置为:null,该字段便不再出现在 Mapping 中。

    优点 2:打破传统先定义后使用方式

    运行时字段可以在索引时或查询时定义。

    由于运行时字段未编入索引,因此添加运行时字段不会增加索引大小,也就是说 Runtime fields 可以降低存储成本。

    优点3:能阻止 Mapping 爆炸

    Runtime field 不被索引(indexed)和存储(stored),能有效阻止 mapping “爆炸”。

    原因在于 Runtime field 不计算在  index.mapping.total_fields 限制里面。

    缺点1:对运行时字段查询会降低搜索速度

    对运行时字段的查询有时会很耗费性能,也就是说,运行时字段会降低搜索速度。

    7、Runtime fields 使用建议

    • 权衡利弊:可以通过使用运行时字段来减少索引时间以节省 CPU 使用率,但是这会导致查询时间变慢,因为数据的检索需要额外的处理。

    • 结合使用:建议将运行时字段与索引字段结合使用,以便在写入速度、灵活性和搜索性能之间找到适当的平衡。

    8、小结

    本文通过实战中添加字段的问题引出解决问题的几个方案;传统的解决方案大多都需要更改 Mapping、重建索引、reindex 数据等,相对复杂。

    因而,引申出更为简单、快捷的 7.11 版本后才有的方案——Runtime fields。

    Runtime fields 的核心知识点如下:

    • Mapping 环节定义;

    • 在已有 Mapping 基础上更新;

    • 检索时使用 runtime fields 达到动态添加字段的目的;

    • 覆盖已有 Mapping 字段类型,保证字段名称一致的情况下,实现特定用途

    • 优缺点、适用场景、使用建议。

    你在实战环节使用 Runtime fields 了吗?效果如何呢?

    欢迎留言反馈交流。

    参考

    https://opster.com/elasticsearch-glossary/runtime-fields/

    https://www.elastic.co/cn/blog/introducing-elasticsearch-runtime-fields

    https://dev.to/lisahjung/beginner-s-guide-understanding-mapping-with-elasticsearch-and-kibana-3646

    https://www.elastic.co/cn/blog/getting-started-with-elasticsearch-runtime-fields

    推荐

    1、重磅 | 死磕 Elasticsearch 方法论认知清单(2021年国庆更新版)

    2Elasticsearch 7.X 进阶实战私训课

    e10ad8752bc85c2e544707b043594fef.png

    更短时间更快习得更多干货!

    已带领70位球友通过 Elastic 官方认证!

    中国仅通过百余人

    471f1adb35c8546c0be9b00cdda5b65b.gif

    比同事抢先一步学习进阶干货!

    展开全文
  • Visual C++ Runtime 2008 x64

    2015-08-02 05:47:34
    Microsoft Visual C++ 2008 Redistributable Package (VC2008运行库x64) SP1会为 Visual C++ 库安装必要的运行时组件,使用户能够在未安装 Visual C++ 2008 SP1 的计算机上运行使用 Visual C++ 开发的 64 位应用程序...
  • Visual C++ Runtime 2013 x64

    2015-08-02 05:56:02
    Microsoft Visual C++ 2013运行库(VC2013运行库)x64位版本微软官方中文版下载。Visual C++ 2013可再发行组件包安装 Visual C++ 库的运行时组件,在未装有 Visual Studio 2013 的计算机上运行使用 Visual Studio 2013...
  • 解决api-ms-win-crt-runtime-l1-1-0.dll 丢失问题 工具下载

    千次下载 热门讨论 2016-02-02 15:39:11
    ------------- httpd.exe - 系统错误 -------------法启动此程序,因为计算机中丢失 api-ms-win-crt-runtime-l1-1-0.dll。尝试重新安装该程序以解决此问题。 ------------- 确定 -------------

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 977,414
精华内容 390,965
关键字:

Runtime