首页 文章 精选 留言 我的

精选列表

搜索[bat],共2195篇文章
优秀的个人博客,低调大师

后台高性能服务器设计的常见套路, BAT 高频面试

前言 在互联网公司,经常面临一个“三高”问题: 高并发 高性能 高可用 这篇文章将总结一下后台服务器开发中有哪些常用的解决“三高”问题的方法和思想。 希望这些知识,能够给你一丝启发和帮助,助力你收割 各大公司 Offer~ 先上本文思维导图: 正文 一、缓存 什么是缓存?看看维基百科怎么说: > In computing, a cache is a hardware or software component that stores data so that future requests for that data can be served faster; the data stored in a cache might be the result of an earlier computation or a copy of data stored elsewhere. 在计算机中,缓存是存储数据的硬件或软件组件,以便可以更快地满足将来对该数据的请求。 存储在缓存中的数据可能是之前计算结果,也可能是存储在其他位置的数据副本。 缓存本质来说是使用空间换时间的思想,它在计算机世界中无处不在, 比如 CPU 就自带 L1、L2、L3 Cache,这个一般应用开发可能关注较少。但是在一些实时系统、大规模计算模拟、图像处理等追求极致性能的领域,就特别注重编写缓存友好的代码。 什么是缓存友好?简单来说,就是代码在访问数据的时候,尽量使用缓存命中率高的方式。这个后面可以单独写一篇 CPU 缓存系统以及如何编写缓存友好代码的文章。 1.1 缓存为什么有效? 缓存之所以能够大幅提高系统的性能,关键在于数据的访问具有局部性,也就是二八定律:「百分之八十的数据访问是集中在 20% 的数据上」。这部分数据也被叫做热点数据。 缓存一般使用内存作为存储,内存读写速度快于磁盘,但容量有限,十分宝贵,不可能将所有数据都缓存起来。 如果应用访问数据没有热点,不遵循二八定律,即大部分数据访问并没有集中在小部分数据上,那么缓存就没有意义,因为大部分数据还没有被再次访问就已经被挤出缓存了。每次访问都会回源到数据库查询,那么反而会降低数据访问效率。 1.2 缓存分类 1. 本地缓存: 使用进程内成员变量或者静态变量,适合简单的场景,不需要考虑缓存一致性、过期时间、清空策略等问题。 可以直接使用语言标准库内的容器来做存储。例如: 2. 分布式缓存: 当缓存的数据量增大以后,单机不足以承载缓存服务时,就要考虑对缓存服务做水平扩展,引入缓存集群。 将数据分片后分散存储在不同机器中,如何决定每个数据分片存放在哪台机器呢?一般是采用一致性 Hash 算法,它能够保证在缓存集群动态调整,不断增加或者减少机器后,客户端访问时依然能够根据 key 访问到数据。 一致性 Hash 算法也是值得用一篇文章来讲的,如果暂时还不懂的话可以去搜一下。 常用的组件有 Memcache、 Redis Cluster 等,第二个是在高性能内存存储 Redis 的基础上,提供分布式存储的解决方案。 1.3 缓存使用指南 1. 适合缓存的场景: 读多写少: 比如电商里的商品详情页面,访问频率很高,但是一般写入只在店家上架商品和修改信息的时候发生。如果把热点商品的信息缓存起来,这将拦截掉很多对数据库的访问,提高系统整体的吞吐量。 因为一般数据库的 QPS 由于有「ACID」约束、并且数据是持久化在硬盘的,所以比 Redis 这类基于内存的 NoSQL 存储低不少。常常是一个系统的瓶颈,如果我们把大部分的查询都在 Redis 缓存中命中了,那么系统整体的 QPS 也就上去了。 计算耗时大,且实时性不高: 比如王者荣耀里的全区排行榜,一般一周更新一次,并且计算的数据量也比较大,所以计算后缓存起来,请求排行榜直接从缓存中取出,就不用实时计算了。 2. 不适合缓存的场景: 写多读少,频繁更新。 对数据一致性要求严格: 因为缓存会有更新策略,所以很难做到和数据库实时同步。 数据访问完全随机: 因为这样会导致缓存的命中率极低。 1.4 缓存更新的策略 如何更新缓存其实已经有总结得非常好的「最佳实践」,我们按照套路来,大概率不会犯错。 主要分为两类 Cache-Aside 和 Cache-As-SoR。 SoR 即「System Of Record,记录系统」,表示数据源,一般就是指数据库。 1、Cache-Aside: 这应该是最容易想到的模式了,获取数据时先从缓存读,如果 cache hit 则直接返回,没命中就从数据源获取,然后更新缓存。 写数据的时候则先更新数据源,然后设置缓存失效,下一次获取数据的时候必然 cache miss,然后触发回源。 直接看伪代码: 可以看到这种方式对于缓存的使用者是不透明的,需要使用者手动维护缓存。 2、Cache-As-SoR: 从字面上来看,就是把 Cache 当作 SoR,也就是数据源,所以一切读写操作都是针对 Cache 的,由 Cache 内部自己维护和数据源的一致性。 这样对于使用者来说就和直接操作 SoR 没有区别了,完全感知不到 Cache 的存在。 CPU 内部的 L1、L2、L3 Cache 就是这种方式,作为数据的使用方应用程序,是完全感知不到在内存和我们之间还存在几层的 Cache,但是我们之前又提到编写 “缓存友好”的代码,不是透明的吗?这是不是冲突呢? 其实不然,缓存友好是指我们通过学习了解缓存内部实现、更新策略之后,通过调整数据访问顺序提高缓存的命中率。 Cache-As-SoR 又分为以下三种方式: Read Through:这种方式和 Cache-Aside 非常相似,都是在查询时发生 cache miss 去更新缓存,但是区别在于 Cache-Aside 需要调用方手动更新缓存,而 Cache-As-SoR 则是由缓存内部实现自己负责,对应用层透明。 Write Through: 直写式,就是在将数据写入缓存的同时,缓存也去更新后面的数据源,并且必须等到数据源被更新成功后才可返回。这样保证了缓存和数据库里的数据一致性。 Write Back:回写式,数据写入缓存即可返回,缓存内部会异步的去更新数据源,这样好处是写操作特别快,因为只需要更新缓存。并且缓存内部可以合并对相同数据项的多次更新,但是带来的问题就是数据不一致,可能发生写丢失。 二、预处理和延后处理 预先延后,这其实是一个事物的两面,不管是预先还是延后核心思想都是将本来该在实时链路上处理的事情剥离,要么提前要么延后处理。降低实时链路的路径长度, 这样能有效提高系统性能。 2.1 预处理 举个我们团队实际中遇到的问题: 前两个月支付宝联合杭州市政府发放消费劵,但是要求只有杭州市常驻居民才能领取,那么需要在抢卷请求进入后台的时候就判断一下用户是否是杭州常驻居民。 而判断用户是否是常驻居民这个是另外一个微服务接口,如果直接实时的去调用那个接口,短时的高并发很有可能把这个服务也拖挂,最终导致整个系统不可用,并且 RPC 本身也是比较耗时的,所以就考虑在这里进行优化。 那么该怎么做呢?很简单的一个思路,提前将杭州所有常驻居民的 user_id 存到缓存中, 比如可以直接存到 Redis。大概就是千万量级,这样,当请求到来的时候我们直接通过缓存可以快速判断是否来自杭州常驻居民。如果不是则直接在这里返回前端。 这里通过预先处理减少了实时链路上的 RPC 调用,既减少了系统的外部依赖,也极大的提高了系统的吞吐量。 预处理在 CPU 和操作系统中也广泛使用,比如 CPU 基于历史访存信息,将内存中的指令和数据预取到 Cache 中,这样可以大大提高Cache 命中率。 还比如在 Linux 文件系统中,预读算法会预测即将访问的 page,然后批量加载比当前读请求更多的数据缓存在 page cache 中,这样当下次读请求到来时可以直接从 cache 中返回,大大减少了访问磁盘的时间。 2.2 延后处理 还是支付宝,上栗子: 这是支付宝春节集五福活动开奖当晚,不过,作为非酋的我一般是不屑于参与这种活动的。 大家发现没有,这类活动中奖奖金一般会显示 「稍后到账」,为什么呢?那当然是到账这个操作不简单! 到账即转账,A 账户给 B 账户转钱,A 减钱, B 就必须要同时加上钱,也就是说不能 A 减了钱但 B 没有加上,这就会导致资金损失。资金安全是支付业务的生命线,这可不行。 这两个动作必须一起成功或是一起都不成功,不能只成功一半,这是保证数据一致性。 保证两个操作同时成功或者失败就需要用到事务。 如果去实时的做到账,那么大概率数据库的 TPS(每秒处理的事务数) 会是瓶颈。通过产品提示,将到账操作延后处理,解决了数据库 TPS 瓶颈。 延后处理还有一个非常著名的例子,COW(Copy On Write,写时复制)。 Linux 创建进程的系统调用 fork,fork 产生的子进程只会创建虚拟地址空间,而不会分配真正的物理内存,子进程共享父进程的物理空间,只有当某个进程需要写入的时候,才会真正分配物理页,拷贝该物理页,通过 COW 减少了很多不必要的数据拷贝。 三、池化 后台开发过程中你一定离不开各种 「池子」: 内存池、连接池、线程池、对象池...... 内存、连接、线程这些都是资源,创建线程、分配内存、数据库连接这些操作都有一个特征, 那就是创建和销毁过程都会涉及到很多系统调用或者网络 IO。 每次都在请求中去申请创建这些资源,就会增加请求处理耗时,但是如果我们用一个 容器(池) 把它们保存起来,下次需要的时候,直接拿出来使用,避免重复创建和销毁浪费的时间。 3.1 内存池 在 C/C++ 中,经常使用 malloc、new 等 API 动态申请内存。由于申请的内存块大小不一,如果频繁的申请、释放会导致大量的内存碎片,并且这些 API 底层依赖系统调用,会有额外的开销。 内存池就是在使用内存前,先向系统申请一块空间留做备用,使用者需要内池时向内存池申请,用完后还回来。 内存池的思想非常简单,实现却不简单,难点在于以下几点: 如何快速分配内存 降低内存碎片率 维护内存池所需的额外空间尽量少 如果不考虑效率,我们完全可以将内存分为不同大小的块,然后用链表连接起来,分配的时候找到大小最合适的返回,释放的时候直接添加进链表。如: 当然这只是玩具级别的实现,业界有性能非常好的实现了,我们可以直接拿来学习和使用。 比如 Google 的 「tcmalloc」 和 Facebook 的 「jemalloc」。 限于篇幅我们不在这里详细讲解它们的实现原理,如果感兴趣可以搜来看看,也推荐去看看被誉为神书的 CSAPP(《深入理解计算机系统》)第 10 章,那里也讲到了动态内存分配算法。 3.2 线程池 线程是干嘛的?线程就是我们程序执行的实体。在服务器开发领域,我们经常会为每个请求分配一个线程去处理,但是线程的创建销毁、调度都会带来额外的开销,线程太多也会导致系统整体性能下降。在这种场景下,我们通常会提前创建若干个线程,通过线程池来进行管理。当请求到来时,只需从线程池选一个线程去执行处理任务即可。 线程池常常和队列一起使用来实现任务调度,主线程收到请求后将创建对应的任务,然后放到队列里,线程池中的工作线程等待队列里的任务。 线程池实现上一般有四个核心组成部分: 管理器(Manager): 用于创建并管理线程池。 工作线程(Worker): 执行任务的线程。 任务接口(Task): 每个具体的任务必须实现任务接口,工作线程将调用该接口来完成具体的任务。 任务队列(TaskQueue): 存放还未执行的任务。 线程池在 C、C++ 中没有具体的实现,需要应用开发者手动实现上诉几个部分。 在 Java 中 「ThreadPoolExecutor」 类就是线程池的实现。后续我也会写文章分析 C++ 如何写一个简单的线程池以及 Java 中线程池是如何实现的。 3.3 连接池 顾名思义,连接池是创建和管理连接的。 大家最熟悉的莫过于数据库连接池,这里我们简单分析下如果不用数据库连接池,一次 SQL 查询请求会经过哪些步骤: 和 MySQL server 建立 TCP 连接: 三次握手 MySQL 权限认证: Server 向 Client 发送 密钥 Client 使用密钥加密用户名、密码等信息,将加密后的报文发送给 Server Server 根据 Client 请求包,验证是否是合法用户,然后给 Client 发送认证结果 Client 发送 SQL 语句 Server 返回语句执行结果 MySQL 关闭 TCP 连接断开 四次挥手 可以看出不使用连接池的话,为了执行一条 SQL,会花很多时间在安全认证、网络IO上。 如果使用连接池,执行一条 SQL 就省去了建立连接和断开连接所需的额外开销。 还能想起哪里用到了连接池的思想吗?我认为 HTTP 长链接也算一个变相的链接池,虽然它本质上只有一个连接,但是思想却和连接池不谋而合,都是为了复用同一个连接发送多个 HTTP 请求,避免建立和断开连接的开销。 池化实际上是预处理和延后处理的一种应用场景,通过池子将各类资源的创建提前和销毁延后。 四、同步变异步 对于处理耗时的任务,如果采用同步的方式,那么会增加任务耗时,降低系统并发度。 可以通过将同步任务变为异步进行优化。 举个例子,比如我们去 KFC 点餐,遇到排队的人很多,当点完餐后,大多情况下我们会隔几分钟就去问好了没,反复去问了好几次才拿到,在这期间我们也没法干活了,这时候我们是这样的: 这个就叫同步轮训, 这样效率显然太低了。 服务员被问烦了,就在点完餐后给我们一个号码牌,每次准备好了就会在服务台叫号,这样我们就可以在被叫到的时候再去取餐,中途可以继续干自己的事。 这就叫异步,在很多编程语言中有异步编程的库,比如 C++ std::future、Python asyncio 等,但是异步编程往往需要回调函数(Callback function),如果回调函数的层级太深,这就是回调地狱(Callback hell)。回调地狱如何优化又是一个庞大的话题。。。。 这个例子相当于函数调用的异步化,还有的是情况是处理流程异步化,这个会在接下来消息队列中讲到。 五、消息队列 这是一个非常简化的消息队列模型,上游生产者将消息通过队列发送给下游消费者。在这之间,消息队列可以发挥很多作用,比如: 5.1 服务解耦 有些服务被其它很多服务依赖,比如一个论坛网站,当用户成功发布一条帖子有一系列的流程要做,有积分服务计算积分,推送服务向发布者的粉丝推送一条消息..... 对于这类需求,常见的实现方式是直接调用: 这样如果需要新增一个数据分析的服务,那么又得改动发布服务,这违背了依赖倒置原则,即上层服务不应该依赖下层服务,那么怎么办呢? 引入消息队列作为中间层,当帖子发布完成后,发送一个事件到消息队列里,而关心帖子发布成功这件事的下游服务就可以订阅这个事件,这样即使后续继续增加新的下游服务,只需要订阅该事件即可,完全不用改动发布服务,完成系统解耦。 5.2 异步处理 有些业务涉及到的处理流程非常多,但是很多步骤并不要求实时性。那么我们就可以通过消息队列异步处理。比如淘宝下单,一般包括了风控、锁库存、生成订单、短信/邮件通知等步骤。但是核心的就风控和锁库存, 只要风控和扣减库存成功,那么就可以返回结果通知用户成功下单了。后续的生成订单,短信通知都可以通过消息队列发送给下游服务异步处理。大大提高了系统响应速度。 这就是处理流程异步化。 5.3 流量削峰 一般像秒杀、抽奖、抢卷这种活动都伴随着短时间海量的请求, 一般超过后端的处理能力,那么我们就可以在接入层将请求放到消息队列里,后端根据自己的处理能力不断从队列里取出请求进行业务处理。 就像最近长江汛期,上游短时间大量的洪水汇聚直奔下游,但是通过三峡大坝将这些水缓存起来,然后匀速的向下游释放,起到了很好的削峰作用。 起到了平均流量的作用。 5.4 总结 消息队列的核心思想就是把同步的操作变成异步处理,异步处理会带来相应的好处,比如: 服务解耦 提高系统的并发度,将非核心操作异步处理,不会阻塞住主流程 但是软件开发没有银弹,所有的方案选择都是一种 trade-off。 同样,异步处理也不全是好处,也会导致一些问题: 降低了数据一致性,从强一致性变为最终一致性 有消息丢失的风险,比如宕机,需要有容灾机制 六、批量处理 在涉及到网络连接、IO等情况时,将操作批量进行处理能够有效提高系统的传输速率和吞吐量。 在前后端通信中,通过合并一些频繁请求的小资源可以获得更快的加载速度。 比如我们后台 RPC 框架,经常有更新数据的需求,而有的数据更新的接口往往只接受一项,这个时候我们往往会优化下更新接口, 使其能够接受批量更新的请求,这样可以将批量的数据一次性发送,大大缩短网络 RPC 调用耗时。 七、数据库 我们常把后台开发调侃为「CRUD」,数据库在整个应用开发过程中的重要性不言而喻。 而且很多时候系统的瓶颈也往往处在数据库这里,慢的原因也有很多,比如可能是没用索引、没用对索引、读写锁冲突等等。 那么如何使用数据才能又快又好呢?下面这几点需要重点关注: 7.1 索引 索引可能是我们平时在使用数据库过程中接触得最多的优化方式。索引好比图书馆里的书籍索引号,想象一下,如果我让你去一个没有书籍索引号的图书馆找《人生》这本书,你是什么样的感受?当然是怀疑人生,同理,你应该可以理解当你查询数据,却不用索引的时候数据库该有多崩溃了吧。 数据库表的索引就像图书馆里的书籍索引号一样,可以提高我们检索数据的效率。索引能提高查找效率,可是你有没有想过为什么呢?这是因为索引一般而言是一个排序列表,排序意味着可以基于二分思想进行查找,将查询时间复杂度做到 O(log(N)),快速的支持等值查询和范围查询。 二叉搜索树查询效率无疑是最高的,因为平均来说每次比较都能缩小一半的搜索范围,但是一般在数据库索引的实现上却会选择 B 树或 B+ 树而不用二叉搜索树,为什么呢? 这就涉及到数据库的存储介质了,数据库的数据和索引都是存放在磁盘,并且是 InnoDB 引擎是以页为基本单位管理磁盘的,一页一般为 16 KB。AVL 或红黑树搜索效率虽然非常高,但是同样数据项,它也会比 B、B+ 树更高,高就意味着平均来说会访问更多的节点,即磁盘IO次数! > 根据 Google 工程师 Jeff Dean 的统计,访问内存数据耗时大概在 100 ns,访问磁盘则是 10,000,000 ns。 所以表面上来看我们使用 B、B+ 树没有 二叉查找树效率高,但是实际上由于 B、B+ 树降低了树高,减少了磁盘 IO 次数,反而大大提升了速度。 这也告诉我们,没有绝对的快和慢,系统分析要抓主要矛盾,先分析出决定系统瓶颈的到底是什么,然后才是针对瓶颈的优化。 其实关于索引想写的也还有很多,但还是受限于篇幅,以后再单独写。 先把我认为索引必知必会的知识列出来,大家可以查漏补缺: 主键索引和普通索引,以及它们之间的区别 最左前缀匹配原则 索引下推 覆盖索引、联合索引 7.2 读写分离 一般业务刚上线的时候,直接使用单机数据库就够了,但是随着用户量上来之后,系统就面临着大量的写操作和读操作,单机数据库处理能力有限,容易成为系统瓶颈。 由于存在读写锁冲突,并且很多大型互联网业务往往读多写少,读操作会首先成为数据库瓶颈,我们希望消除读写锁冲突从而提升数据库整体的读写能力。 那么就需要采用读写分离的数据库集群方式,一主多从,主库会同步数据到从库。写操作都到主库,读操作都去从库。 读写分离到之后就避免了读写锁争用,这里解释一下,什么叫读写锁争用: MySQL 中有两种锁: 排它锁( X 锁): 事务 T 对数据 A 加上 X 锁时,只允许事务 T 读取和修改数据 A。 共享锁( S 锁): 事务 T 对数据 A 加上 S 锁时,其他事务只能再对数据 A 加 S 锁,而不能加 X 锁,直到 T 释放 A 上的 S 锁。 读写分离解决问题的同时也会带来新问题,比如主库和从库数据不一致 MySQL 的主从同步依赖于 binlog,binlog(二进制日志)是 MySQL Server 层维护的一种二进制日志,是独立于具体的存储引擎。它主要存储对数据库更新(insert、delete、update)的 SQL 语句,由于记录了完整的 SQL 更新信息,所以 binlog 是可以用来数据恢复和主从同步复制的。 从库从主库拉取 binlog 然后依次执行其中的 SQL 即可达到复制主库的目的,由于从库拉取 binlog 存在网络延迟等,所以主从数据存在延迟问题。 那么这里就要看业务是否允许短时间内的数据不一致,如果不能容忍,那么可以通过如果读从库没获取到数据就去主库读一次来解决。 7.3 分库分表 如果用户越来越多,写请求暴涨,对于上面的单 Master 节点肯定扛不住,那么该怎么办呢?多加几个 Master?不行,这样会带来更多的数据不一致的问题,增加系统的复杂度。那该怎么办?就只能对库表进行拆分了。 常见的拆分类型有垂直拆分和水平拆分。 考虑拼夕夕电商系统,一般有 订单表、用户表、支付表、商品表、商家表等, 最初这些表都在一个数据库里。 后来随着砍一刀带来的海量用户,拼夕夕后台扛不住了! 于是紧急从阿狸粑粑那里挖来了几个 P8、P9 大佬对系统进行重构。 P9 大佬第一步先对数据库进行垂直分库, 根据业务关联性强弱,将它们分到不同的数据库, 比如订单库,商家库、支付库、用户库。 第二步是对一些大表进行垂直分表,将一个表按照字段分成多表,每个表存储其中一部分字段。 比如商品详情表可能最初包含了几十个字段,但是往往最多访问的是商品名称、价格、产地、图片、介绍等信息,所以我们将不常访问的字段单独拆成一个表。 由于垂直分库已经按照业务关联切分到了最小粒度,数据量任然非常大,P9 大佬开始水平分库,比如可以把订单库分为订单1库、订单2库、订单3库...... 那么如何决定某个订单放在哪个订单库呢?可以考虑对主键通过哈希算法计算放在哪个库。 分完库,单表数据量任然很大,查询起来非常慢,P9 大佬决定按日或者按月将订单分表,叫做日表、月表。 分库分表同时会带来一些问题,比如平时单库单表使用的主键自增特性将作废,因为某个分区库表生成的主键无法保证全局唯一,这就需要引入全局 UUID 服务了。 经过一番大刀阔斧的重构,拼夕夕恢复了往日的活力,大家又可以愉快的在上面互相砍一刀了。 (分库分表会引入很多问题,并没有一一介绍,这里只是为了讲解什么是分库分表) 八、具体技法 8.1 零拷贝 高性能的服务器应当避免不必要数据复制,特别是在用户空间和内核空间之间的数据复制。 比如 HTTP 静态服务器发送静态文件的时候,一般我们会这样写: 如果了解 Linux IO 的话就知道这个过程包含了内核空间和用户空间之间的多次拷贝: 内核空间和用户空间之间数据拷贝需要 CPU 亲自完成,但是对于这类数据不需要在用户空间进行处理的程序来说,这样的两次拷贝显然是浪费。什么叫 「不需要在用户空间进行处理」? 比如 FTP 或者 HTTP 静态服务器,它们的作用只是将文件从磁盘发送到网络,不需要在中途对数据进行编解码之类的计算操作。 如果能够直接将数据在内核缓存之间移动,那么除了减少拷贝次数以外,还能避免内核态和用户态之间的上下文切换。 而这正是零拷贝(Zero copy)干的事,主要就是利用各种零拷贝技术,减少不必要的数据拷贝,将 CPU 从数据拷贝这样简单的任务解脱出来,让 CPU 专注于别的任务。 常用的零拷贝技术: mmap <kbd>mmap</kbd> 通过内存映射,将文件映射到内核缓冲区,同时,用户空间可以共享内核空间的数据。这样,在进行网络传输时,就可以减少内核空间到用户空间的拷贝次数。 sendfile <kbd>sendfile</kbd> 是 Linux2.1 版本提供的,数据不经过用户态,直接从页缓存拷贝到 socket 缓存,同时由于和用户态完全无关,就减少了一次上下文切换。 在 Linux 2.4 版本,对 sendfile 进行了优化,直接通过 DMA 将磁盘文件数据读取到 socket 缓存,真正实现了 ”0” 拷贝。前面 mmap 和 2.1 版本的 sendfile 实际上只是消除了用户空间和内核空间之间拷贝,而页缓存和 socket 缓存之间的拷贝依然存在。 8.2 无锁化 在多线程环境下,为了避免 竞态条件(race condition), 我们通常会采用加锁来进行并发控制,锁的代价也是比较高的,锁会导致上线文切换,甚至被挂起直到锁被释放。 基于硬件提供的原子操作 CAS(Compare And Swap) 实现一些高性能无锁的数据结构,比如无锁队列,可以在保证并发安全的情况下,提供更高的性能。 首先需要理解什么是 CAS,CAS 有三个操作数,内存里当前值M,预期值 E,修改的新值 N,CAS 的语义就是: 如果当前值等于预期值,则将内存修改为新值,否则不做任何操作。 用 C 语言来表达就是: 注意,上面 CAS 函数实际上是一条原子指令,那么是如何用的呢? 假设我需要实现这样一个功能: 对一个全局变量 global 在两个不同线程分别对它加 100 次,这里多线程访问一个全局变量存在 race condition,所以我们需要采用线程同步操作,下面我分别用锁和CAS的方法来实现这个功能。 通过使用原子操作大大降低了锁冲突的可能性,提高了程序的性能。 除了 CAS,还有一些硬件原子指令: Fetch-And-Add,对变量原子性 + 1 Test-And-Set,这是各种锁算法的核心,在 AT&T/GNU 汇编语法下,叫 xchg 指令,我会单独写一篇如何使用 xchg 实现各种锁。 8.3 序列化与反序列化 先看看维基百科怎么定义的序列化: > In computing, serialization (US spelling) or serialisation (UK spelling) is the process of translating a data structure or object state into a format that can be stored (for example, in a file or memory data buffer) or transmitted (for example, across a computer network) and reconstructed later (possibly in a different computer environment). When the resulting series of bits is reread according to the serialization format, it can be used to create a semantically identical clone of the original object. For many complex objects, such as those that make extensive use of references, this process is not straightforward. Serialization of object-oriented objects does not include any of their associated methods with which they were previously linked. 我相信你大概率没有看完上面的英文描述,其实我也不爱看英文资料,总觉得很慢,但是计算机领域一手的学习资料都是美帝那边的,所以没办法,必须逼自己去试着读一些英文的资料。 实际上也没有那么难,熟悉常用的几百个专业名词,句子都是非常简单的一些从句。没看的话,再倒回去看看? 这里我就不做翻译了,主要是水平太低,估计做到「信达雅」的信都很难。 扯远了,还是回到序列化来。 所有的编程一定是围绕数据展开的,而数据呈现形式往往是结构化的,比如结构体(Struct)、类(Class)。 但是当我们 通过网络、磁盘等传输、存储数据的时候却要求是二进制流。 比如 TCP 连接,它提供给上层应用的是面向连接的可靠字节流服务。那么如何将这些结构体和类转化为可存储和可传输的字节流呢?这就是序列化要干的事情,反之,从字节流如何恢复为结构化的数据就是反序列化。 序列化解决了对象持久化和跨网络数据交换的问题。 序列化一般按照序列化后的结果是否可读,可分为以下两类: 文本类型: 如 JSON、XML,这些类型可读性非常好,是自解释的。也常常用在前后端数据交互上,因为接口调试,可读性高非常方便。但是缺点就是信息密度低,序列化后占用空间大。 二进制类型 如 Protocol Buffer、Thrift等,这些类型采用二进制编码,数据组织得更加紧凑,信息密度高,占用空间小,但是带来的问题就是基本不可读。 还有 Java 、Go 这类语言内置了序列化方式,比如在 Java 里实现了 Serializable 接口即表示该对象可序列化。 说到这让我想起了大一写的的两个程序,一个是用刚 C 语言写的公交管理系统,当时需要将公交线路、站点信息持久化保存,当时的方案就是每个公交线路写在一行,用 "|"分割信息,比如: 5|6:00-22:00|大学城|南山站|北京站 123|6:30-23:00|南湖大道|茶山刘|世界 第一列就是线路编号、第二项是发车时间、后面就是途径的站点。是不是非常原始?实际上这也是一种序列化方式,只是效率很低,也不通用。而且存在一个问题就是如果信息中包含 “|”怎么办?当然是用转义。 第二个程序是用 Java 写的网络五子棋,当时需要通过网络传输表示棋子位置的对象,查了一圈最后发现只需要实现 Serializable 接口,自己什么都不用干,就能自己完成对象的序列化,然后通过网络传输后反序列化。当时哪懂得这就叫序列化,只觉得牛逼、神奇! 最后完成了一个可以网络五子棋,拉着隔壁室友一起玩。。。真的是成就感满满哈哈哈。 说来在编程方面,已经很久没有这样的成就感了。 总结 这篇文章主要是粗浅的介绍了一些系统设计、系统优化的套路和最佳实践。 不知道你发现没有,从缓存到消息队列、CAS......,很多看起来很牛逼的架构设计其实都来源于操作系统、体系结构。 所以我非常热衷学习一些底层的基础知识,这些看似古老的技术是经过时间洗礼留下来的好东西。现在很多的新技术、框架看似非常厉害,实则不少都是新瓶装旧酒,每几年又会被淘汰一批。 > 文章持续更新,全文首发自个人公号,可以微信搜一搜「 编程指北 」第一时间阅读,更有我搜集的上百本经典的计算机书籍电子版

优秀的个人博客,低调大师

BAT 相继经发改委批复,共建 AI 相关国家工程实验室

雷锋网按:近日,国家发改委开始公布国家工程实验室名单,其中百度、阿里巴巴、腾讯均经发改委批复,参与共建多个国家工程实验室。 国家工程实验室(国家发展和改革委员会主管)属国家科技创新体系的重要组成部分,是依托企业、转制科研机构、科研院所或高校等设立的研究开发实体。 百度 今日雷锋网得知,国家发改委正式批复,由百度牵头筹建深度学习技术及应用国家工程实验室,除此之外,百度还将作为共建单位共同参与“大数据系统软件国家工程实验室”和“类脑智能技术及应用国家工程实验室”的建设工作。 据了解,该实验室着重发力于深度学习技术、计算机视觉感知技术、计算机听觉技术、生物特征识别技术、新型人机交互技术、标准化服务、深度学习知识产权七大方向,从研究突破、产业合作、技术成果转让、人才培养等方面提升我国人工智能领域整体竞争力。 实验室将由百度深度学习实验室主任林元庆、

优秀的个人博客,低调大师

网络安全烽火再起 BAT聚头2017 网络安全生态峰会

7月26日至27日,2017 网络安全生态峰会(简称ISS)将在北京国家会议中心如期举行,届时阿里、腾讯、百度、360、启明星辰、绿盟科技等互联网巨头和安全厂商会悉数到场,以“新安全•共担当”为主题,从如何维护网络安全、建设生态网络环境等多方面进行探讨,推动中国互联网事业的安全发展。 据悉,ISS始于2014年, 始终致力于网络安全生态领域建设,汇集众多互联网行业领军企业和人物同台交流。峰会是由中央网信办网安局、工信部网安局、公安部网安局指导下,由中国互联网协会、中国网络空间协会、阿里巴巴集团、蚂蚁金服集团联合主办。 作为国内创办最早、规模最大、嘉宾阵容最强大、安全行业最权威的国际大型安全盛会之一,今年ISS将共同探讨新型网络犯罪类型、解剖新型犯罪手段,让科技赋能社会治理,联动社会各行业、各领域,共同担当新业态下的网络安全责任,并通过

优秀的个人博客,低调大师

105道BAT最新Java面试题(MySQL+Redis+nginx+ookeeper+MongoDB)

MySQL面试题 主键 超键 候选键 外键2.数据库事务的四个特性及含义 视图的作用,视图可以更改么? drop,delete与truncate的区别 索引的工作原理及其种类 连接的种类 数据库范式 数据库优化的思路 存储过程与触发器的区别 Redis面试题 使用Redis有哪些好处? redis相比memcached有哪些优势? redis常见性能问题和解决方案4.MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据 5.Memcache与Redis的区别都有哪些? Redis 常见的性能问题都有哪些?如何解决? redis 最适合的场景 Redis的同步机制了解么? 是否使用过Redis集群,集群的原理是什么? redis集群如何保证一致性? nginx面试题 1.请解释一下什么是Nginx? 请列举Nginx的一些特性?3.请列举Nginx和Apache 之间的不同点? 请解释Nginx如何处理HTTP请求。 在Nginx中,如何使用未定义的服务器名称来阻止处理请求? 使用“反向代理服务器”的优点是什么? 请列举Nginx服务器的最佳用途。 请解释Nginx服务器上的Master和Worker进程分别是什么? 请解释你如何通过不同于80的端口开启Nginx?10.请解释是否有可能将Nginx的错误替换为502错误、503? 在Nginx中,解释如何在URL中保留双斜线? 请解释ngx_http_upstream_module的作用是什么?13.请解释什么是C10K问题,后来是怎么解决的? 14.请陈述stub_status和sub_filter指令的作用是什么?15.解释Nginx是否支持将请求压缩到上游?16.解释如何在Nginx中获得当前的时间? 用Nginx服务器解释-s的目的是什么?18.解释如何在Nginx服务器上添加模块? nginx中多个work进程是如何监听同一个端口的?如何处理客户连接的惊群问题?20.nginx程序的热更新是如何做的? 欢迎大家关注我的公种浩【程序员追风】,文章都会在里面更新,整理的资料也会放在里面。 zookeeper面试题 zookeeper是什么? zookeeper提供了什么? zookeeper文件系统 zookeeper的四种类型的znode zookeeper通知机制 zookeeper有哪些应用场景? zk的命名服务 zk的配置管理服务 zk的集群管理 zk的分布式锁 zk队列管理 zk数据复制 zk的工作原理 zk是如何保证事物的顺序一致性 zk集群下server工作状态16.zk是如何选举Leader的? 17.zk同步流程 分布式通知和协调 zk的session机制 MongoDB面试题 什么是MongoDB? MongoDB是由哪种语言写的? MongoDB的优势有哪些? 什么是数据库? 什么是集合? 什么是文档?7.MongoDB和关系型数据库术语对比图 什么是“mongod”?9.“mongod”参数有什么? 10.什么是“mongo”?11.MongoDB哪个命令可以切换数据库? 什么是非关系型数据库? 非关系型数据库有哪些类型?14.为什么用MOngoDB? 在哪些场景使用MongoDB? MongoDB中的命名空间是什么意思? 哪些语言支持MongoDB? 在MongoDB中如何创建一个新的数据库? 在MongoDB中如何查看数据库列表? MongoDB中的分片是什么意思? 如何查看使用MongoDB的连接? 什么是复制? 在MongoDB中如何在集合中插入一个文档? 在MongoDB中如何除去一个数据库? 在MongoDB中如何创建一个集合? 在MongoDB中如何查看一个已经创建的集合?27.在MongoDB中如何删除一个集合? 28.为什么要在MongoDB中使用分析器? MongoDB支持主键外键关系吗? MongoDB支持哪些数据类型? 为什么要在MongoDB中用"Code"数据类型? 为什么要在MongoDB中用"Regular Expression"数据类型?33.为什么在MongoDB中使用"Object ID"数据类型? 如何在集合中插入一个文档? “ObjectID”有哪些部分组成? 在MongoDb中什么是索引? 如何添加索引? MongoDB有哪些可替代产品?39.如何查询集合中的文档? 40.用什么方法可以格式化输出结果? 如何使用"AND"或"OR"条件循环查询集合中的文档? 在MongoDB中如何更新数据? 如何删除文档? 在MongoDB中如何排序?45.什么是聚合? 在MongoDB中什么是副本集? Mongodb存储特性与内部原理? 最后欢迎大家一起交流,喜欢文章记得点个赞哟,感谢支持!

优秀的个人博客,低调大师

微软、谷歌和 BAT 等巨头成立机密计算联盟,联手保护数据安全

微软近日在其开源博客中宣布加入机密计算联盟(Confidential Computing Consortium,简称 CCC)。该组织致力于定义和加速推进机密计算的采用,并将托管在 Linux 基金会。联盟创始成员还包括阿里巴巴、Arm、百度、谷歌、IBM、英特尔、红帽、瑞士电信和腾讯等科技公司,它提供了一个让行业聚集起来的机会,以促进使用机密计算来更好地保护数据。 建立机密计算联盟的需求源于这样一个事实:随着计算从内部部署转移到公共云和边缘,对数据的保护变得更加复杂。当前的数据保护通常作用于静态(存储)或(网络)传输状态的数据。但是当数据正在被使用时,仍然存在风险,这也是数据保护中最具挑战性的一个步骤。 因此,机密计算将侧重于保护使用中的数据,并为敏感数据提供完全加密的生命周期。它将在内存中处理加密数据,而不会将其暴露给系统的其余部分,并减少敏感数据的暴露,为用户提供更好的控制和透明度。 “保护使用中的数据意味着数据在计算过程中不会以未加密的形式显示,得到访问授权的数据除外”,微软 Azure 首席技术官 Mark Russinovich 表示,“也就是说甚至连公共云服务提供商或边缘设备供应商都可能无法访问它,数据将完全处于私密状态。” 机密计算功能可以做到协作共享数据——例如训练多方数据集机器学习模型、对多方数据集执行分析,或是在数据库引擎中启用机密查询处理——但同时无需对这些数据进行直接访问。 目前,联盟成员已经为机密计算做出了一些开源贡献,包括: 英特尔®软件保护扩展(英特尔®SGX)软件开发套件,旨在帮助开发人员使用受保护的代码和数据,避免数据在硬件层被泄露或修改。 微软 Open Enclave SDK,这个开源框架创建了一种可插入的通用方法来创建可再发行的可信应用程序,以保护正在使用的数据。 红帽 Enarx,为可信执行环境(TEE)提供平台抽象,支持创建和运行“私有、可替换、无服务器”的应用程序。 Linux 基金会执行董事 Jim Zemlin 表示,现有的联盟只是一个开始,后续将会有更多企业加入。

优秀的个人博客,低调大师

如何学好 Linux、C++,并搞定 BAT 面试 作者/分享人:天千

学好Linux运维需要做到以下几点 1、多做实验 实验环境完全可以通过VMware来模拟,模拟私有网络,模拟多台机器,要搞懂VMware提供的集中网络模式的工作原理(桥接网络、宿主机网络、NAT等),这对整个Linux后续的学习帮助都非常之大,还可以通过虚拟机模拟Grub损坏并进行修复、模拟忘记密码并通过单用户模式修改密码等等。 2、LNMP、DHCP、DNS、MySQL等等这些网络服务需要完全基于源码来编译 这样更加有体感,对于编译的参数要理解,因为通过yum安装的软件包都是上一个稳定版本,并不是最新稳定版本,还有另外一点就是编译安装可以通过编译参数对软件进行一定的优化。 3、Linux基础要扎实 底层原理要理解,典型的文件系统的组成、inode和数据存放的位置、Linux进程是如何调度的、调度算法有哪些、磁盘调度算法有哪些、TCP/IP的三次握手和四次挥手的过程是如何的,网络中的数据是如何流向的(参考《构建高性能web站点》),iptables的三表五链、Nginx的网络IO模型(这个很重要,你要能讲清楚为什么Nginx要比Apache好),马哥Linux对于这个部分的内容讲解是我最喜欢的,我强力推荐大家都去听一听马哥的视频。 4、英文文档的阅读能力 阅读各类开源软件的官方文档是必经之路,这个也是了解一个开源软件最快的捷径,如果你没有一定的英文阅读能力,那么你只能等到有人把这些文章翻译成中文后你才能学习到。 5、写博客 很多时候,看了视频和书后,如果你不能讲这些知识用你的语言表达出来,那么很大可能,你并没有真正的理解这些知识,通过写博客的方式会逼迫你回忆知识,然后总结出来,博客被大量人访问也会在一定程度上激励你,让你有一定的成就感,促使你把博客写的更好。 6、Shell脚本的要熟悉 运维这条路上脚本会帮我们省掉不少体力活,此外必须要学习一门编程语言Python、Golang等 C语言要学好必须理解三个概念 1、什么是指针? 指针和数组的关系。 2、程序分为哪几个段 能说清楚全局变量,局部变量,静态变量等分别属于哪个段,各个段的特点是什么? 3、C语言的编译和链的接过程 真心不推荐在Windows上来学习C语言,因为它屏蔽了太多的细节,而这些细节却又是C程序员不可或缺的一部分。C语言这个阶段过去后,我开始学习LinuxC系统编程这个部分,最开始接触的一本书就是《Unix/Linux编程实践教程》强力推荐给大家,这本书会给你介绍如何通过man手册来帮助编程,如何去实现who、cat、ls、ps等系统命令。通过这本书的学习会让你对Linux上很多的原理有一个深刻的认识。 这本书学完后我就开始看UNP和APUE,其中APUE我并不推荐给大家,我推荐给大家的是《Linux/UNIX系统编程手册》这本书的内容更全面,更新。建议大家在看这些书的时候可以做详细的笔记和代码练习,在我的博客上就有我总结的文章。系统编程ok后,就要重点看UNP了,看这本书的时候要找重点看,里面有的章节已经过时了,还有一些章节对于我们目前来说用途并不大,比如STCP的部分。 对于这本书《Linux/UNIX系统编程手册》,重点有三个部分 1、各个socketAPI的对应到OS,做了哪些事情 比如connect后,做了哪些事情?,accept呢?,什么是RST报文?,什么是SIGPIPE,如何触发的? 2、网络IO模型,同步和异步,阻塞和非阻塞的概念 Linux上各种网络IO模型的优缺点对比,epoll、select、信号驱动IO等 3、服务器的网络编程模型,多线程、多进程、线程池等,各自优缺点 在我的博客上也有一篇文章介绍了相关的内容,学完这个后,剩下的就靠多实践和多读一些开源的项目来积累自己的经验了,这里推荐cjson、webbench、Tinyhttpd等,代码量都不大,很容易读懂,在读懂的基础上可以进行适当的改造和重写。 C语言和Linux系统编程这个部分结束后,就要开始踏入C++的世界了,自从C++11出来后,我觉得C++易学了,但是苦于现存的老的C++代码还是有很多,所以我们不得不去学习C++98相关的知识,这里我推荐《C++primer》一书,注意是C++primer,不是《C++primerplus》 我看书的方法都比较老套,第一遍力求看懂,第二遍开始抄代码,练习,第三遍开始总结写博客。所以这本书我前前后后看了大半年,后面又看了C++编程思想上册,EffectiveC++、深度理解C++对象模型、ExceptionalC++、深入理解C++11等经典书籍,看书的模式基本上都是二到三遍,通过抄书上的代码和写博客来加深记忆。看完这些书说真的,我觉得我的C++还只是一个小白,我真正蜕变要从读《LinuxC++服务端编程》陈硕的这本书开始,通过这本书我觉得我的C++水平有了一个质的飞跃。 C++有以下几个要点(只是部分): 1、RAII 这个很重要,是C++的核心,很多学习了C++的人都不知道RAII 2、值语义和对象语义 这个决定了你如何写好一个C++类 3、对象的生命周期,类的生命周期要清晰 4、智能指针 现代C++编程几乎不太可能出现delete语句,内存泄漏的问题真的很少会出现 5、各种STL和C++的一些坑 比如迭代器遍历过程中如何删除元素、std::list的size接口的复杂度居然是O(N)(C++11已经修正)等等 6、善用std::bind和std::function 7、基于对象编程和面向对象编程的区别 8、移动语义很重要 9、Lambda的捕获表达式 10、搞清楚C++的三五法则 11、std::string的实现方式,是否是线程安全的 12、std::map和std::set的底层数据结构等 《EffectiveModernC++》,这本书我重点推荐给大家,在我的博客上也有全部的总结,这本书讲了很多C++11种的一些实现细节、坑以及建议。最后推荐一些linux内核相关的书籍和学习方法 《深入理解Linux内核架构》《Linux环境编程从应用到内核》 重点找自己感兴趣的模块来看,比如我就对文件系统,通过内核模块来探索,不能只看代码不练习 网络上有很多从头开始编写一个内存文件系统的文章,在我的博客上也有一个系列讲解Linux内核模块编程入门的文章,通过编写Linux内核模块可以做很多有趣的事情,比如系统调用拦截、网络拦截、做安全审计等等,通过编写内核模块可以提高对Linux内核学习的兴趣。 在整个求职过程中,我做了以下几件事 1、刷leetcode的题目 从牛客网和google上搜集面试题,分门别类的进行整理,每天都回顾一下 2、拓宽自己的知识面,学习一些新的知识 比如当时流行的docker,更侧重学习其原理 3、加深自己对一些底层的OS知识的理解 比如epoll的原理、docker的cgroup机制和namespace机制的实现、文件系统VFS的实现、Linux信号、管道等的实现。 整理面试题和学习一些底层的OS知识对我整个面试过程中帮助很大,正常情况下如果你只学习Java或者C++是很难拿到阿里巴巴的Offer,阿里巴巴对应届生的知识面、知识的理解程度要求还是比较高的,在我的整个C++面试过程中,问的最多的就是IO复用、智能指针、内存泄漏的问题如何解决、如何排查Load高的问题、Linux内核相关的知识等,而这些问题对我来说早已得心应手,在搜集面试题的时候很多问题都是反复被提及到的,我只需要好好总结即可。 另外一点就是大家在准备面试题的时候不能只记一个结论,多问问为什么,举个例子,TCP/IP的三次握手和四次挥手的过程是什么样的,我们不光光要知道这个问题的结论,还要知道为什么是三次握手,四次挥手,为什么不是二次?当被问及到epoll、select的区别时,你应该从使用方法、可移植性、性能、优缺点、内核实现等多个方面分析和总结。而不是简简单单的就提及一个优缺点就完事了。你擅长的地方你应该多多引导你的面试官去问。 工作心得 在公司实习了大约1年,今年七月份正式入职,在这整个过程中我也零散的做了很多小需求,对C++的理解更加深刻,尤其是对软件工程有了一个新的理解,在此我想分享给大家。 1、要有造轮子的能力,但是不要轻易的去造轮子 2、单元测试的重要性 通过单元测试也可以提高程序员的信心,为了更好的写单测,会逼迫我们将模块之间的耦合降到最低,这样可以方便单测。 3、写易读的、可维护的代码 4、Google的C++编程规范,每一条都值得细细品味 5、Chromium开源项目有很多值得我们借鉴的地方 6、画UML图是程序员的基本素质,要有好的设计,设计要做评审 7、CodeReview一定要有的 8、类名和变量名的易读性 可能对于很多人来说编码规范、CodeReview、UML、单测好像都是说说而已,我起初也是这么认为,感触并不是很深刻,直到我的同事开始带我的时候,我自己亲身去体验的时候才发现这其中奥妙无穷,我们团队使用Chromium的base库作为自己的基础库,编码规范、全都followChromium,至于为什么不用boost,我的理由则是,boost是一个我无法驾驭的怪兽,而chromium的base库是我可以驾驭的,可以打组合拳,代码的稳定性已经经过上亿人的考验,值得我们信赖。推荐大家看看chromium的base库,源代码很易读。通过阅读它的代码可以学习到很多知识。推荐一本书给大家《C++API设计》,讲解了很多软件工程、设计层面的知识。 总结 上面说了很多,更侧重分享了我的学习经历,和一些感悟,可能我说的比较简单,实际上理解上面这些东西,是存在一个过程的,是一个从量变到质变的过程,在整个过程中我理解到,学习要坚持,不是一蹴而就的,要经历量变到质变的过程。

优秀的个人博客,低调大师

云知声黄伟:未来谁能成为 AI 领域的 BAT

以下是黄伟演讲实录。 大家下午好!今天前面杨总(新智元杨静)说了雾霾天出来做这样的交流其实都是真爱,前面二位老总介绍的一些微软包括海尔做的事情,我非常高兴的一点是,我们选择的方向都是对的,都是这个行业里面共同做的方向。今天我分享的题目是——构建AI生态,技术和商业应该是一个良性循环。 为什么选择这样一个题目?首先我们是一个创业公司,做任何技术最终都要去面对商业市场。我本人做云知声之前有一段商业上没有走完的经历,我做过一个 APP,后来大家问云知声为什么不做 APP?不用谈论这个问题,我一直有一个观点,技术其实本身并不是产品,就像今天说人工智能不是产品,而是底层的技术。在今天我个人认为人工智能泡沫比较大,今天人工智能这么热的情况下,我们怎么用人工智能技术构建商业闭环,这个是所有的创业团队考虑的问题。 人工智能是一个基础的技术资源,我们很难

优秀的个人博客,低调大师

BAT专家详解勒索病毒冲击波:勒索物联网时代的开端

5月13日,一场流行病式的计算机病毒在全球的互联网世界中爆发,“疫情”已波及近百个国家。一旦感染该病毒,不到十秒,电脑里所有文件全被加密无法打开,只有按弹窗提示交赎金才能解密。 这一造成全球性恐慌的计算机病毒被称为“勒索病毒”,又被叫做“敲诈者木马”。这次传播的是一个名为“wannacry”的新家族,该木马通过加密形式,锁定用户电脑里的txt、doc、ppt、xls等后缀名类型的文档,导致用户无法正常使用程序,从而进行勒索,要求用户提交赎金之后才解锁。 在5月15日工作日到来之际,大量局域网办公电脑开机,或将再次出现病毒感染高峰。为此,澎湃新闻记者采访百度、腾讯、阿里公司的互联网安全专家对勒索病毒的原理、传播、防护进行了详细解答。 病毒从何而来? 据外媒报道,病毒发行者利用了去年被盗的美国国家安全局(NSA)自主设计的Windows系统黑客工具Eternal Blue,将2017年2月的一款勒索病毒升级。被感染的Windows用户必须在7天内交纳比特币作为赎金,否则电脑数据将被全部删除且无法修复。勒索病毒要求用户在被感染后的三天内交纳相当于300美元的比特币,三天后“赎金”将翻倍。英国NHS官方宣布,袭击该系统的勒索病毒叫做WannaCry(想哭吗)或Wanna Decryptor(想解锁吗)。 腾讯安全部门向澎湃新闻表示, Wana系列敲诈者木马的传播渠道是利用了445端口传播扩散的SMB漏洞MS17-101,微软在17年3月发布了该漏洞的补丁。2017年4月,黑客组织Shadow Brokers公布的Equation Group(方程式组织),使用的“网络军火库”中包含了该漏洞的利用程序,而该勒索软件的攻击者或者攻击组织,就是在借鉴了“网络军火库”后进行了这次全球大规模的攻击,主要影响校园网,医院等内网用户。 传播为何如此之快? 截至5月13日晚8点,我国共39730家机构被这一新型“蠕虫”式勒索病毒感染。病毒传播速度之快前所未有。 百度首席安全专家韦韬告诉澎湃新闻记者,勒索病毒已经发展很久了,与之前的不同之处是这次的病毒传播模块采取了主动传播方式,因此形成了全球范围内的快速蔓延。 韦韬称:“以前的勒索病毒主要通过邮件诈骗的方式,欺骗受害者人工点击,需要人工介入。而这次的勒索病毒是利用了前段时间公开的微软的一个远程漏洞,可以通过远程网络连接直接入侵机器。这次蠕虫与勒索病毒结合在一起,所以形成了像流行病学式的快速爆炸。” 有何危害? 韦韬认为,主动传播方式使得勒索病毒影响更大,因为病毒爆发集中,使得很多系统无法正常工作,但目前数据价值损失没有表面上的那么大。因为中病毒的机器主要是不重视安全的计算机。微软在今年3月份已经发布了安全补丁,真正重视安全的部门只要及时升级,就不会这次勒索蠕虫的影响。而之前邮件传播的勒索病毒即便做了很好的安全升级工作,使用者一旦不小心误点了执行,也很有可能会中招。 韦韬还指出,从效果来看,目前病毒的传播方比特币钱包才收到了约17个左右的比特币,相当于3万美元左右。这表明目前愿意交赎金的人并不多,也从侧面说明了病毒侵入的资料价值并不高。不过还要等到周一看是否会有一波交赎金的高峰到来。 “横向对比来看,大陆各省在这次传染中的情况还好,对比台湾好不少。” 韦韬表示,目前大陆受影响相对较小的重要原因在于,大陆的运营商在过去蠕虫传播的时代,就已经把这次病毒传播的主要端口封禁了,所以这次运营商的网络没有出现大规模爆发。 为什么校园网用户容易中招? 从中国的情况来看,在此次病毒传播中,大量高校的校园网不幸“感染”。据报道,5月12日20时左右,国内部分高校学生反映电脑被病毒攻击,文档被加密。攻击者称需支付比特币解锁。目前受影响的有贺州学院、桂林电子科技大学、桂林航天工业学院、大连海事大学、山东大学等。 腾讯表示,由于之前爆发过多起利用445端口共享漏洞攻击案例,运营商对个人用户关闭了445端口。因校园网是独立的,故无此设置,加上不及时更新补丁,所以在本次事件中导致大量校园网用户中招。 阿里云安全专家分析,此次勒索事件在校园网传播速度之快,影响面之大,主要原因是当前大部分学校基本是一个大的内网互通的局域网,不同的业务未划分安全区域。例如:学生管理系统、教务系统等都可以通过任何一台连入的设备访问,同时,实验室、多媒体教室、机器IP分配多为公网IP,如果学校未做相关的权限限制,所有机器直接暴露在外面。 物联网设备也中招 “这次有一个非常有意思的现象,一些日常生活中用到的加油卡终端、ATM机等智能设备也中毒了,无法提供服务。这反映出现在不仅是办公计算机,这些智能设备也处于非常严重的安全威胁之下。” 韦韬说道。 韦韬指出:“随着智能设备越来越普及、越来越深入生活的方方面面,这样的威胁会变得非常恐怖。我最近看到了一个漫画,画中家里所有的电器都在向你要钱。我认为这次事件正是这样的勒索物联网时代的一个开端。现实中的情况也是如此,目前国内外很多智能设备在安全防护上的情况很不乐观。” 如何防备? 综合专家意见,防止中招最直接的办法是及时打补丁修复漏洞。 腾讯方面表示,腾讯电脑管家可提供漏洞防御,主动拦截多层安全保护,并会提示用户打补丁,及时修复漏洞。 避免被勒索的方法包括:1,下载并打补丁,及时修复漏洞;2,关闭445等端口的网络访问权限;3,开启腾讯电脑管家主动防御系统。此外,如果用户被锁定和勒索,也建议不要向勒索者缴纳赎金。 从个人防护的角度,韦韬建议,要加强社会整体的互联网安全教育,比如安全补丁要及时升级、不明邮件不要随便点击、不法的网站不要去浏览。 “但从组织、社会、国家的角度去看,我们一方面要加强信息安全普及教育,同时也必须要意识到很多人是不会去做升级这件事情的。因而企业、社会、国家必须做好整体性防护措施,及时切断互联网感染渠道,保护不懂安全的普通民众免遭损失。” 韦韬说道。 本文转自d1net(转载)

优秀的个人博客,低调大师

全球云巨头3A排位赛 云计算改写BAT技术格局

IDC最新的统计数据显示,截至2015年上半年,全球公共云计算市场占有率最高的前五家服务商分别为亚马逊、微软、IBM、RackSpace和阿里云。阿里云已经成为中国云计算市场的领导者,考虑其2015下半年连续两个季度的高增长及未来的增长潜力,全球市场或已形成“3A鼎立”的格局(亚马逊云AWS、阿里云AliCloud、微软云Azure)。 但从阿里巴巴最近几个季度的财报可以看出,云计算已经成为打破技术格局的那个变量。阿里云以出色的业绩,证明了阿里巴巴是一家有足够技术积累的公司。 公开资料显示,从2008年开始阿里就决定做云计算,而且当时的技术决策者并不主张采用市场上流行的开源技术构建自己的云平台,而是逼着技术人员从头开始写每一行代码,如庖丁解牛般深入最底层的技术细节。 与之几乎同步进行且关系密切的另一件中国互联网发展史上的标志性事件就是“去IOE”:阿里内部分步骤、分难易程度逐渐把传统的IT架构用更先进的互联网架构替代,涉及的技术领域依然聚焦在服务器、数据库、存储等底层核心,“去IOE”和云计算成为阿里技术发展史上的一体两面。 就IT技术而言,越是接近系统底层难度越大,越往上层应用相对就简单。好比Windows操作系统之于聊天软件,开发难度天壤之别。而云计算恰恰是集所有底层核心技术之大成。 从2008到2015年,阿里花了7年时间打磨云计算,也为阿里乃至全中国培养了一批最顶尖的底层技术人才。 财报中,阿里巴巴特别提及,阿里云在去年10月打破了一项世界纪录。在由数据库之父Jim Gray创办的排序基准评估竞赛Sort Benchmark中,阿里云把100TB数据的排序时间缩短到了377秒,打破了此前由微软、雅虎等机构研究人员保持的纪录。 不久前,阿里云发布全球首个一站式大数据平台“数加”,对外开放阿里巴巴十年来积累的大数据技术和平台,首批亮相20款产品。这是全球首个囊括了前中后台的大数据一站式开放平台。 在2015年双11,阿里云搭建了全球最大的混合云架构,以公共云与专有云的形式成功运行了淘宝、天猫、支付宝的核心交易,业务上达到了惊人的成绩:最大交易达到每秒钟14万笔,最大支付达到每秒钟8.59万笔。 是时候重新审视阿里巴巴了。那个“会做生意”、“擅长运营”公司已经找到了一个新的发动引擎,云计算足以承担起未来增长,马云“全球买全球卖”的梦想里又多了一件看不见商品叫云计算,技术为阿里铺就了通往103年梦想的新道路。 试问,如果单独拆分出阿里云它股价会是多少?是否又是下一个独角兽? 本文转自d1net(转载)

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册