你知道哈希算法,但你知道一致性哈希吗?

前言

假如让你为淘宝这种数据量非常大的公司的设计一个可扩展的数据存储系统,你该如何存储和管理数据呢?总不能放在单个服务器上吧,肯定放不下,必然需要水平扩展。那么这样就带来一个问题,这个数据要存储在哪个服务器上呢?这就引入了本文的主题一致性哈希算法,可能你没听过,那么本文就通过一个简单的例子带你一步一步认识它。

欢迎关注个人公众号【JAVA旭阳】

数据线性分布

假如我们现在有一组服务器,我们想提出一个在这组服务器之间进行数据存储和查找的策略。让我们从一个最最简单的方案开始。假设我们一个接一个地填满服务器,即仅当当前服务器已满时,我们才开始将数据写入下一个服务器。

在下图中,我们有一个简单的服务器,一次只能存储 4 条记录。当服务器变满时,我们添加一个新服务器并向其添加新数据。

好吧,这种方法在任何服务器上写入数据时都非常有效。当您被要求读取特定数据时会发生什么?您需要识别存储给定数据的服务器,然后获取它。你如何识别服务器?您会遍历所有服务器并线性扫描每个服务器吗?这会影响读取性能。

例如:在上面的例子中,如果你被要求查找“New York”,因为键和服务器之间没有直接映射,你将不得不线性扫描所有服务器并搜索这个键。

这样的效率是不是很糟糕,那么有没有更好的解决方案呢。

数据哈希分布

哈希算法想必大家都知道,Java中的HashMap就是采用的哈希算法。那么根据这个思路,我们提出了一个新的解决方案,数据根据哈希进行存储管理。

我们看到如果我们有 N 个服务器,则获取记录的时间复杂度将为 O(N)。我们希望在 O(1) 中高效地读写数据。我们首先想到的是提供 O(1) 查找和写入的 HashMap 数据结构。

让我们看看 Hashing 是否可以解决我们的问题。假设我们有 N 个存储数据的服务器和一个具有分发数据策略的应用程序。该方法类似于 HashMap 使用的方法。首先,对键进行哈希处理,然后确定数据将存放的存储桶。应用程序将首先对密钥进行哈希处理,然后通过计算hash(data) % N来确定哪个服务器。

上述算法将给出写入数据的服务器编号。此外,在检索数据时,它将使用相同的逻辑,获取服务器编号并获取数据。读取和写入都在 O(1) 中完成。

让我们来看一个例子。假设我们有三个名为 S0、S1 和 S2 的服务器。我们的钥匙是世界城市名称。使用哈希,我们计算需要将密钥分配到的存储桶或服务器。

密钥的哈希和计算桶

密钥分配

但这在分布式系统中总是有效的吗?我们会遇到以下问题:

  • 如果我们添加更多服务器,则hash(data) % N会有所不同。这意味着我们将不得不在添加新服务器时重新分配所有数据。
  • 如果删除其中一台服务器,我们将遇到同样的问题。由于此处服务器的数量 N 是可变的,因此所有密钥都会受到影响。

以下是添加新服务器时发生的情况的说明。随着服务器数量从 3 台增长到 4 台,桶的计算逻辑将变为Hash % 4

新旧密钥分配

在添加新服务器时,我们观察到三个键中的两个受到了影响。如果我们添加一个新服务器,键Madrid的桶将是 0 (S0) 而不是 1(S1)。我们必须将此密钥移动到服务器 S1 以确保我们的应用程序找到它。因此,我们必须重新散列所有现有密钥并将它们分配给不同的服务器。在最坏的情况下,这可能会影响系统中的所有密钥。

看来通过哈希算法将数据分发到不同服务器中还是不大行,那还有什么更好的办法呢?这边就要隆重介绍一致性哈希

什么是一致性哈希?

当我们想要动态添加或删除服务器时,一致性哈希解决了我们的问题。在简单散列的情况下,添加或删除服务器将影响存储在系统中的所有 M 密钥。然而,一致性哈希确保只有 M/N 键受到影响,其中 N 是服务器的数量。

一致性哈希使密钥的分布与系统使用的服务器数量无关。因此,我们可以在不影响整个系统的情况下扩大或缩小规模。

从根本上说,一致性哈希使用哈希环。该算法将每个服务器映射到圆上的一个点。它首先使用服务器的 IP 地址,计算其散列值并为其分配圆上的一个点(角度)。以下是如何为 3 个服务器 S1、S2、S3 计算角度的简单说明:

将服务器分配给哈希环上的点

此外,每个密钥都使用相同的哈希算法进行哈希处理并在服务器上分配一个点。对于每个散列键,我们按顺时针方向移动并找到最近的服务器并分配给它。

将密钥分配给哈希环上的点

我们得到以上密钥集的以下分配:

将密钥分配给服务器

以下是上述密钥分配到哈希环上不同服务器的图形表示:

在哈希环上将密钥分配给服务器

从上图可以看出,我们从每个键顺时针方向移动,找到它的服务器。

扩展和添加新服务器

如前一节所述,我们首先计算服务器IP地址的哈希值并找到它在圆上的位置。例如:如果我们添加一个服务器S4,发现它位于圆上的S2和S0之间。此外,我们重新分配 S0 的键,其角度小于 S3,或者换句话说,在圆上出现在 S3 之前。

下图说明了此过程,其中添加了一个新服务器 S3,它位于 S2 和 S0 之间。最初,键Mumbai被分配给服务器 S0。在添加 S3 时,我们看到从键Mumbai顺时针方向遇到的第一个服务器是 S3,因此我们将此键分配给 S3。

添加新服务器 S3

从上面可以看出,添加新服务器不会影响所有密钥。只有散列环上两个服务器之间出现的密钥需要重新分配。

删除现有服务器

当删除现有服务器时,只需要重新分配属于该服务器的密钥。对于属于被移除服务器的key,按顺时针方向找到哈希环上的下一个服务器。此外,然后将密钥分配给新服务器。

下图说明了删除现有服务器的过程:

删除服务器 S1

在上图中,删除了服务器 S1。键New York被分配给服务器 S1。删除 S1 后,我们从键New York中找到第一个服务器并找到服务器 S2。因此,键New York被重新分配给服务器 S2。

与普通散列不同,删除服务器不需要重新散列所有密钥。只需重新分配已移除服务器的密钥。

虚拟节点

我们看到,当一个节点被移除时,分配给这个节点的所有键都会被移动到哈希环中的下一个节点。通常,在删除一个节点时,数据分布会变得不均匀,并且其中一个节点的负载会增加。

在上述情况下,如果我们从系统中删除 S0,则键London将映射到服务器 S2。最终,我们会发现 S2 处理三个密钥,而 S1 只管理一个密钥。因此,数据分布不均匀。

删除 S0 会给 S2 带来更多负载

在理想情况下,当有M个密钥和N个服务器时,每个服务器必须有接近 M/N 个密钥。因此,添加或删除节点会影响系统中的最大 M/N 键。为了确保接近理想的分布,我们在系统中引入了虚拟节点。每个物理节点在哈希环上都有多个虚拟节点。

我们使用多个哈希函数来查找虚拟节点在哈希环上的位置。每个服务器都用 Sij 表示,其中 i 表示实际服务器编号,j 代表其虚拟副本。例如:对于第一台服务器,虚拟副本将是 S00、S01、S02、S03 等。我们使用不同的哈希函数来计算每个虚拟副本的哈希值。

在上面的示例中,我们得到以下虚拟服务器分配:

哈希环上的虚拟服务器

从上图可以看出,服务器S1的虚拟副本是S10、S12和S13。这同样适用于服务器 S0。这导致节点之间的数据分布接近均匀。

对于给定的密钥,如果哈希环中的下一个服务器是 S12,则它将分配给第一个物理服务器。一般而言,分配给虚拟服务器 Sij 的密钥将存储在物理服务器 Si 上。

总结

本文带大家认识了一致性哈希算法,一致性哈希于 1997 年推出,它已经在许多分布式系统中的得到了应用。 AmazonDynamo DB 中使用它作分区组件。此外,Apache Cassandra Voldermort 等开源应用程序使用它进行数据分区。

欢迎关注个人公众号【JAVA旭阳】

本文来自博客园,作者:JAVA旭阳,转载请注明原文链接:http://www.cnblogs.com/alvinscript/p/17064355.html

本文转载于网络 如有侵权请联系删除

相关文章

  • Promise基本使用参数

    下列用到的所有定时器模拟我们的ajax请求。Promise实例化的时候,传入的参数是一个函数,函数中接收两个参数:constp=newPromise((resolve,reject)=>{ setTimeout(()=>{ resolve('123') },1000) }).then(res=>{ console.log(res)//1秒后打印123 })复制传入的resolve和reject本身都是函数。其作用分别为:resolve-把Promise的状态从进行中变为成功状态。reject-把Promise的状态从进行中变为拒绝状态。Promise的三种状态:pending:进行中,表示Promise还在执行阶段,没有执行完成。fulfilled:成功状态,表示Promise成功执行完成。rejected:拒绝状态,表示Promise执行被拒绝,也就是失败。Promise的状态,只可能是其中一种状态,从进行中变为成功或失败状态之后,状态就固定了,不会再发生改变。Promise.then执行resolve时,Promise状态变为fulfilled

  • 钓鱼文档碎碎念(一)

    本文将简单介绍使用宏代码进行钓鱼的方法,并使其可以回连到CobaltStrike.CobaltStrike.自带有宏钓鱼功能。可以使用如下步骤进行创建:Attacks-->Packages-->MSofficesMacro复制内容大体如下PrivateTypePROCESS_INFORMATION hProcessAsLong hThreadAsLong dwProcessIdAsLong dwThreadIdAsLong EndType PrivateTypeSTARTUPINFO cbAsLong lpReservedAsString lpDesktopAsString lpTitleAsString dwXAsLong dwYAsLong dwXSizeAsLong dwYSizeAsLong dwXCountCharsAsLong dwYCountCharsAsLong dwFillAttributeAsLong dwFlagsAsLong wShowWindowAsInteger cbReserved2AsInteger lpReserved2AsLong hS

  • JVM笔记 -- Java跨平台和JVM跨语言

    学习JVM的重要性从上层应用程序到底层操作系统,到底有哪些东西?平时开发的应用程序主要基于各种框架,譬如Spring,SpringMVC,Mybatis,而各种框架又是基于JavaAPI来实现的,JavaAPI调用执行是在JVM上的,而JVM则是运行在操作系统上的,操作系统是在物理机器打交道的。在框架上进行业务开发,或者学习框架如何使用,是大部分开发者的工作。但是实际上我们不该执着于框架该如何使用,而是应该往下走,一般最后遇到的问题都会到JVM和操作系统的问题。即使现在的JVM已经很完善,帮开发者做了很多事,但是我们不该以此为理由不去了解JVM的原理。架构师把开发者变成温室里的花朵和温水里的青蛙,如果有一天出现以下问题,该怎么解决:运行系统卡死,系统无法访问,直接OOM。线上GC(垃圾回收)有问题,需要dump内存,进行分析。新项目上线,需要对系统进行评估,设置JVM的参数。面试时被问及实际项目中JVM参数调优。几乎所有的高级语言在交给机器CPU执行之前,都会经历高级语言-->汇编语言-->机器指令的过程,因为计算机是不会直接识别高级语言的。了解高级语言如何转换成能被机器识

  • 权威认证!腾讯WeTest通过可信云企业级SaaS服务评估

      近日,腾讯WeTest正式通过可信云企业级SaaS认证评估。这是腾讯WeTest在深耕品质领域之路上一次重大的行业认证突破。  可信云评估始于2013年,由中国信息通信研究院组织,是国内最早针对云计算开展的评估工作的组织,也是国际产业标准之一,在业内具有极高权威性。发展至今,已建立了云计算基础服务和产品评估、云计算软件类评估、专项能力评估、可用性监测以及云保险等在内的综合评估体系,成为衡量云服务技术能力和服务水平的重要标准。  腾讯WeTest此次参评的可信云企业级SaaS服务评估,其服务评估过程包括服务基本信息审查、企业基本信息审查、技术测试、运维管理审查以及专家评审等环节,并从数据安全、服务能力、用户体验性能等多维度进行全面评估,对于企业的技术标准具有严格要求。  针对此次可信云企业级SaaS服务评估,腾讯WeTest承诺数据持久性不低于99.99%,支持用户数据的主动删除与测试设备的报废销毁,并且用户能够主动发起测试数据的下载与迁移操作。在用户隐私数据保障方面,腾讯WeTest依照标准进行加密存储并对数据访问进行权限隔离,确保用户数据的私密性与安全性。通过多维度的数据保护措施

  • HBase的JavaAPI常用练习

    本篇博客,小菌为大家带来关于使用HBase的JavaAPI的一些常用练习。使用hbaseapi对hbase_rate表,按照startRowKey=1和endRowKey=100进行扫描查询结果。@Test publicvoidscanData()throwsIOException{ //获取连接 Configurationconfiguration=HBaseConfiguration.create(); configuration.set("hbase.zookeeper.quorum","node01:2181,node02:2181,node03:2181"); Connectionconnection=ConnectionFactory.createConnection(configuration); //获取表 Tablerate_table=connection.getTable(TableName.valueOf("hbase_rate")); //创建扫描对象 Scanscan=newScan();

  • 使用Multicall 加速 DeFi查询调用

    背景介绍有时,从区块链获取数据的成本可能会非常高,不管是从请求花费的时间还是从发送的请求数量上来说,都是这样。如果我们想同时获取大量数据,用来在仪表板上显示或进行分析,我们必须调用合约的不同函数或者用不同参数调用相同函数,这些都可能会导致查询时间很长。另外,当我们使用像Infura[4]这样的节点提供商,也很容易达到发送请求数量的限额。什么是Multicall?Multicall[5]是一个npm软件包,可将多个HTTP调用分为一个组。用这个方式,之前想从n个不同的请求中获取的数据,现在可以在发送HTTP请求之前对它们进行分组,然后进发送一个请求,从而缩短了请求响应时间,并降低了eth_call调用的次数。用测试了解运作方式为了了解这种机制的工作原理以及相对于传统方法是否确实有所改进,我们将通过一个对比测试来验证。分别在不使用Multicall和使用Multicall的情况下,对每个函数调用n次,然后分析结果。为此,我们通过调用函数getAccountLiquidity来查询Compound协议。我们将使用1,000个不同的地址来获取所有地址的信息。创建项目安装依赖为了进行测试,先创建

  • 【Numpy学习】Numpy中reshape与resize区别用法详解

    参考链接:Python中的numpy.reshape用法 numpy中reshape跟resize都是用于改变多维数组的形状,在机器学习方法中使用的含义就是改变矩阵的形状单纯从代码看两个函数的应用没有任何区别如下面代码所示: >>>importnumpyasnp>>>x=np.random.rand(2,3)>>>xarray([[0.11566322,0.69637779,0.56906707],    [0.73949046,0.8744751,0.51143749]])>>>x.reshape(3,2)array([[0.11566322,0.69637779],    [0.56906707,0.73949046],    [0.8744751,0.51143749]])>>>xarray([[0.11566322,0.69637779,0.56906707],    [0.73949046,0.8744751,0.51143749]])>>>x.resize(3,2)&

  • SNTP服务器授时的主要功能

    本文主要讲了SNTP服务器的主要功能,分别阐述了SNTP在协议上区别于NTP协议的不同点和SNTP服务器应用于时间同步授时体系中区别于NTP服务器需要注意的事项,方便用户在不同系统中正确选择网络授时服务器。SNTP服务器是以SNTP协议为功能实现基准的时间服务器设备,是在NTP协议的基础上进行了缩减,隶属于NTP网络时间协议的子集。NTP协议可以跨越各种平台和操作系统,为了保证高度的精确性,需要很复杂的算法,但是在很多实际应用中,秒级的准确度就可以满足实际系统的应用。为满足对更多情况下时间同步有要求,SNTP协议在NTP协议的基础上简化了原来的访问协议,在保证时间精度的前提下,使得网络时间的开发和应用变得更加容易。SNTP服务器涉及到的SNTP协议主要对NTP协议设计的有关访问安全,服务器自动迁移部分进行了缩减,而达到更加简易授时的目的。SNTP服务器最早应用于时间同步功能,主要是针对PC机的时间同步统一要求。计算机在最初的时间协议设计商,满足SNTP协议要求,在一套完整的网络内所有的PC机都有自己的本地时钟,每个时钟本身靠自身内部携带的晶体振荡器保持时间的正常运行,但是由于内部晶体等

  • 谷歌的20岁有点焦头烂额,40图看透20年

    来源:TheVerge,BusinessInsider编辑:肖琴、元子【新智元导读】TheVerge为一些公司做了一个年终盘点,并通过卡片的形式给出了最终评价。本文盘点了谷歌公司今年的表现并给出了评分,同时BI也通过40张精选照片,回顾了谷歌从一个小宿舍成长为市值6850亿美元大公司的历程。介于今年谷歌的表现,TheVerge给谷歌评了一个”C“,勉强算是及格吧。其中的亮点虽然不怎么亮;但是污点却实在的很污。下图?接下来,我们就展开讲讲谷歌今年的表现,并用40张照片回顾谷歌的风雨20年。 谷歌在下沉2018年对于谷歌来说,意义非凡。首先,它标志着公司成立20周年,拥有Android10周年,创立Chrome10周年。其次,它也让谷歌陷入一连串的打击中。用TheVerge的话来说,Google这个金字招牌,已经残破不堪。员工在分裂谷歌自己的员工,对自己公司的信任正在流失。甚至有些人,公然的、直接的、用实际行动来表达自己对公司的不满。Android之父AndyRubin性侵一案,20000名员工罢工抗议。约占谷歌雇员数量的24%。下图?来源:IndiaTodayDragonfly,

  • 快讯 | 教育部:将尽快提出增加AI领域研究生招生指标的方案

    6月8日,教育部教育奋进之笔“1+1”系列发布会第四场在浙江召开,现场解读了《高等学校人工智能创新行动计划》,并介绍有关工作开展情况。“新工科”中布局57个人工智能类项目在发布会上,教育部科学技术司司长雷朝滋表示,党中央、国务院高度重视人工智能发展。2017年7月,国务院印发《新一代人工智能发展规划》,对我国人工智能发展做出总体部署;2018年政府工作报告也明确提出“加强新一代人工智能研发应用”。而今年4月,教育部组织高校、专家研讨后,研究起草并由部内12个司局共同会签后,印发了《行动计划》。 “可以说,《行动计划》是一份汇集各类政策措施,引导、支持高校提升人工智能领域科技创新、人才培养和服务国家需求等能力的指导性文件。”雷朝滋总结道。 他指出,《行动计划》印发后,2018年认定的首批612个“新工科”研究与实践项目中,布局建设了57个人工智能类项目;截至2017年12月,全国共有71所高校围绕人工智能领域设置了86个二级学科或交叉学科。 接下来,围绕《行动计划》,教育部将尽快落实相关支持政策:教育部成立人工智能科技创新咨询专家组,为高校人工智能发展提供咨询和建议;系统布局一批创

  • 【算法】GBDT算法

    小编邀请您,先思考:1GBDT算法的原理是什么?2GBDT算法如何做正则化处理?本文对Boosting家族中另一个重要的算法梯度提升树(GradientBoostingDecisonTree,以下简称GBDT)做一个总结。GBDT有很多简称,有GBT(GradientBoostingTree),GTB(GradientTreeBoosting),GBRT(GradientBoostingRegressionTree),MART(MultipleAdditiveRegressionTree),其实都是指的同一种算法,本文统一简称GBDT。GBDT在BAT大厂中也有广泛的应用,假如要选择3个最重要的机器学习算法的话,个人认为GBDT应该占一席之地。GBDT概述GBDT也是集成学习Boosting家族的成员,但是却和传统的Adaboost有很大的不同。回顾下Adaboost,是利用前一轮迭代弱学习器的误差率来更新训练集的权重,这样一轮轮的迭代下去。GBDT也是迭代,使用了前向分布算法,但是弱学习器限定了只能使用CART回归树模型,同时迭代思路和Adaboost也有所不同。在GBDT的迭代中,

  • 管理信息系统总复习、第一章(信息系统的概述)

    第一章信息系统的概述 1.2信息技术对企业不再重要? 企业如何利用IT是关键 竞争优势不是来源于IT,而是取决于企业如何利用IT。 其中业务流程的变革,很难将管理和组织从一个公司复制到另一个公司。 其中基于IT商业模式、产品和服务创新需要与企业的实际结合。 1.3为什么企业需要IT和信息系统 互联网的增长和各种汇聚 扁平化的世界 经济的全球化 知识经济的崛起 数字化企业的普及 1.4企业投资IT和信息系统的目的 进行商业活动的基础 当今大多数企业离开了信息系统和IT是不能运营的。 信息系统和IT可以增加市场份额。 信息系统和IT可以帮助企业成为高质量的生产者。 信息系统和IT是新产品开发的重要工具。 提高企业的运营效率和生产率 IT和信息系统是改进运营效率以获取高额利润的重要的工具之一,可以实现提高运营效率和生产率。 1995-2005,IT对降低通货膨胀率的贡献为0.5%-1%,对于企业来说这意味着IT是降低成本的重要因素。 创新产品、服务与商业模式 商业模式:描述企业如何通过生产、物流和销售产品或服务来盈利。 IT和信息系统是创新产品、服务与商业

  • 非参数估计——核密度估计(Parzen窗)

      核密度估计,或称Parzen窗,目标是利用离散的数据本身拟合出一个连续的分布,属于非参数估计。所谓非参数估计,即该估计并没有预设某种分布函数来对其参数进行求解或拟合,比如机器学习中K近邻法也是非参估计的一种。 直方图   首先从直方图切入。对于随机变量$X$的一组抽样,即使$X$的值是连续的,我们也可以划分出若干宽度相同的区间,统计这组样本在各个区间的频率,并画出直方图。下图是均值为0,方差为2.5的正态分布。从分布中分别抽样了100000和10000个样本:   这里的直方图离散地取了21个相互无交集的区间:$[x-0.5,x+0.5),x=-10,-9,...,10$,单边间隔$h=0.5$。$h>0$在核函数估计中通常称作带宽,或窗口。每个长条的面积就是样本在这个区间内的频率。如果用频率当做概率,则面积除以区间宽度后的高,就是拟合出的在这个区间内的平均概率密度。因为这里取的区间宽度是1,所以高与面积在数值上相同,使得长条的顶端正好与密度函数曲线相契合。如果将区间中的$x$取成任意值,就可以拟合出实数域内的概率密度(其中$N_x$为样本$x_i\in[x-h,x+h),

  • 系统运维的那些事--文件权限

      之前笔者做一个文件管理系统(其中包含有文件的上传、下载、文件属性管理),用的是windows服务器实现技术是ASP.NET 系统完成后,一直都使用正常。突然,某天因为某个需求要把整个网站站点从硬盘D盘转移到E盘 但是,移植后就报错。检查代码花了很长时间没看出是哪里的问题。后来,经过分析觉得不是代码的问题,可能是文件转移的时候文件的权限发生改变导致文件上传下载操作失败。   解决的方式如下:   若用户A登录服务器下载文件,普通用户对文件权限默认是 所有权。                   那么B再登录访问的时候,普通用户对文件的管理权限是只读和运行。         导致,B登录网站访问文件时,如删除文件。则报错。(权限不够)     那么修改存放下载文件的文件夹的权限。可以解决此问题。     往往这些细节问题,很容易被忽略

  • python相关总结

    1字符串str有split Pythonsplit()方法  Python字符串 描述 Python split() 通过指定分隔符对字符串进行切片,如果参数num有指定值,则分隔num+1个子字符串 语法 split()方法语法: str.split(str="",num=string.count(str)).复制 参数 str--分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。 num--分割次数。默认为-1,即分隔所有。 返回值 返回分割后的字符串列表。   2对象len Pythonlen()方法  Python内置函数 描述 Pythonlen()方法返回对象(字符、列表、元组等)长度或项目个数。 语法 len()方法语法: len(s)复制 参数 s--对象。 返回值 返回对象长度。 3range Pythonrange()函数用法  Python内置函数 pythonrange()函数可创建一个整数列表,一般用在for循环中。 函数语法 range(start,stop[,ste

  • 前端小白的算法之路

    时隔多日终于解决了埋在心头的一道难题,霎时云开雾散,今天把一路而来碰到的疑惑和心得都记录下来,也算是开启了自己探索算法的大门。 问题背景 曾经有一个年少轻狂的职场小白,在前端圈子里摸爬滚打将近两年,本计划在js的道路上越走越远,以至于每天沉浸在js红皮书里不能自拔,突然有一天脑抽想找leader比划两下,于是出现了下面的对话,小白:leader,您最近在干嘛?手里有需要亟待解决的难题吗?leader:咦,确实有哎,咱的项目随着业务的不断发展,日均PV也越来越多,公司的两台机器已经快满足不了需求,现在需要解决一下机器的问题。小白:那还不简单,就是多搞几台机器,四核换八核,可以并行处理就OK了。leader:小伙子想法很美好啊,钱从哪来?那我先问你个简单的问题[1],你写个算法出来。于是这个问题应用而生,小白也开始了苦苦的算法中。。。 问题阐述 假设一台双核处理器可以并行处理任务,它们的处理速度都为1k/s,每个任务均以k为单位,如[300,600,300,500,1000,700,300],且每个任务不能拆分必须由单独的核来执行,求一堆任务的最短时间算法? (如果你对这个问题感兴趣或

  • 【转载】Linux 内核对设备树的处理

    [Linux基础]--第三课:Linux内核对设备树的处理 原文地址:https://blog.csdn.net/u014674293/article/details/114833254   前言: 本文转自韦东山老师关于设备树的讲解,原文地址:第三课:linux内核对设备树的处理。 一、从源头分析--内核head.S对dtb的简单处理 现在我们开始第一节,我们要从源头分析,uboot将一些参数,设备树文件传递给内核,那么内核如何处理这些设备树文件呢?我们需要从内核的一个执行文件head.S开始分析。 1.1、r0,r1,r2三个寄存器的设置 BootLoader启动内核时,会设置r0,r1,r2三个寄存器: r0一般设置为0; r1一般设置为machineid(在使用设备树时该参数没有被使用); r2一般设置为ATAGS或DTB的开始地址; 这里的machineid,是让内核知道是哪个CPU,从而调用对应的初始化函数。以前没有使用设备树时,需要BootLoader传一个machineid给内核,现在使用设备树的话,这个参数就不需要设置了。 r2要么是以前的ATAGS开始

  • 初级面试问题

    关于Java基础入口函数的零碎: publicstaticvoidmain(Stringargs[]){.....} 1.为了当JVM自由调用main方法,使用public修饰符把这个方法暴露出来 2.static的原因是JVM需要直接调用而不是先创建一个对象再由对象调用,因此用static修饰使其变为共有 3.main方法被JVM调用,无需任何返回值,故为void 4.方法调用规则,谁调用方法,谁为方法的形参赋值;String[]args是main函数的形式参数,可以用来获取命令行用户输入进去的参数 5.Java中args的作用是从命令行取得输入参数,这样在程序中可以调用。例如有这样一个程序:     1publicclassJustWannaHugU 2{ 3publicstaticvoidmain(Stringargs[]) 4{ 5for(Stringarg:args) 6{ 7System.out.println(args); 8} 9} 10}复制     那么,编译成class文件以后,从命令行

  • MySQL

    mysql基本使用 存储引擎+数据类型 MySQL表的进阶 表的查询进阶 MySQL基础终章---事务等 多表查询

  • 利用DP-SSL对少量的标记样本进行有效的半监督学习

    ©作者| Doreen 01介绍 深度学习之所以能在图像分类、自然语言处理等方面取得巨大成功的原因在于大量的训练数据得到了高质量的标注。 然而在一些极其复杂的场景(例如:无人驾驶)中会产生海量的数据,对这些数据进行标注将会产生大量的时间成本和人工成本。 近些年,研究人员提出了activelearning,crowdlabeling,distantsupervision,semi/weak/self-supervision等方法试图缓解人工标记的工作量。其中,半监督学习(SSL)是运用最为广泛的一种。 SSL主要运用了两种策略即伪标签(利用模型的预测作为标签来训练模型)和一致性正则化(令模型在经过不同变换后仍能得到相同的预测结果)。 该方法虽然在一定程度上解决了手工标注数据的麻烦,但在标记数据的数量极其有限的情况下,SSL在准确性和鲁棒性上都表现不佳。 为了解决这个问题,研究人员提出了一种基于多选择性(MCL,multiplechoicelearning)的半监督学习方法DP-SSL(DataProgrammingSemi-supervisedLearning)对未标记的数据自

  • vivo s11t线刷救砖过程

      本来想刷个recovery从而来刷其他的固件包,却没想到失败了,后来导致开机都开不了,并且recovery的那个界面的选项都没有任何作用。所以我只能线刷了。百度了一下。找到了一个有用的网址:http://bbs.hqapk.com/thread-6305-1-1.html 下面这个是方法: http://bbs.hqapk.com/thread-6208-1-1.html  (注:大家要注意对号入座,一定要认真看清楚,强烈建议先看一遍,再跟着教程一步一步操作刷入) 这个教程WIN7系统下线刷MTKCPU的手机通用教程,官方线刷包和刷机工具还有驱动,需要到云卓论坛的固件区,下载你手机的官方线刷包和驱动还有工具,让后按着下面的教程操作即可。 刷机注意事项: 1、电池电量必须保持在50%以上。 2、数据线尽量插在电脑后面的USB查看。 3、黄色进度条跑动后,不能断开手机和电源。 第一步:将你要刷入机型的官方包和刷机工具、驱动下载好放到桌面(注:我的机联想A898T,虽然和你们的机型不一样,但是教程步骤是通用的,大家不要纠结我的是什么机型,教程和步骤是一样的)如下图所示

相关推荐

推荐阅读