先来认识 CPU 的架构,只有理解了 CPU 的 架构,才能更好地理解 CPU 是如何读写数据的,对于现代 CPU 的架构图如下:
周末的时候,有个读者跟我说,面试字节的时候被问到:「什么是伪共享?又该怎么避免伪共享的问题?」
Disruptor的RingBuffer, 之所以可以做到完全无锁,也是因为"单线程写",这是所有"前提的前提",离了这个前提条件,没有任何技术可以做到完全无锁。Redis、Netty等等高性能技术框架的设计都是这个核心思想。
同步:程序从上往下执行 异步:程序从上往下执行会有多个分支共同执行(即开多个线程)。
本文基于 Joe Mario 的一篇博客 改编而成。 Joe Mario 是 Redhat 公司的 Senior Principal Software Engineer,在系统的性能优化领域颇有建树,他也是本文描述的 perf c2c 工具的贡献者之一。 这篇博客行文比较口语化,且假设读者对 CPU 多核架构,Cache Memory 层次结构,以及 Cache 的一致性协议有所了解。 故此,笔者决定放弃照翻原文,并且基于原博客文章做了一些扩展,增加了相关背景知识简介。 本文中若有任何疏漏错误,责任在于编译者。有任何建议和意见,请回复内核月谈微信公众号,或通过 oliver.yang at linux.alibaba.com 反馈。
以前一直听说有Disruptor这个东西,都是性能很强大,所以这几天自己也看了一下。 下面是自己的学习笔记,另外推荐几篇自己看到写的比较好的博客: Disruptor——一种可替代有界队列完成并发线程间数据交换的高性能解决方案 Disruptor3.0的实现细节
Java 中的 BIO、NIO和 AIO 理解为是 Java 语言对操作系统的各种 IO 模型的封装。程序员在使用这些 API 的时候,不需要关心操作系统层面的知识,也不需要根据不同操作系统编写不同的代码。只需要使用Java的API就可以了。
本文属于并发编程系列,通过之前的文章我们了解到了CPU中缓存行的概念。简单复习一下就是缓存行是CPU读写缓存的最小单位,一般是64字节。另外当前CPU共有三个级别的缓存,从距离CPU内核的由近及远分为是L1 Cache、L2 Cache、L3 Cache。基于这个背景知识,我今天继续来谈一下和缓存相关的另一大话题:Fasle Sharing!
参考: Netty权威指南第一版 Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码)
从我的前一篇博文中, 我们知道了CPU缓存及缓存行的概念, 同时用一个例子说明了编写单线程Java代码时应该注意的问题. 下面我们讨论更为复杂, 而且更符合现实情况的多核编程时将会碰到的问题. 这些问
Java里有伪随机型和安全型两种随机数生成器。伪随机生成器根据特定公式将seed转换成新的伪随机数据的一部分。安全随机生成器在底层依赖到操作系统提供的随机事件来生成数据。
传统的C++(C++98)中并没有引入线程这个概念。linux和unix操作系统的设计采用的是多进程,进程间的通信十分方便,同时进程之间互相有着独立的空间,不会污染其他进程的数据,天然的隔离性给程序的稳定性带来了很大的保障。而线程一直都不是linux和unix推崇的技术,甚至有传言说linus本人就非常不喜欢线程的概念。随着C++市场份额被Java、Python等语言所蚕食,为了使得C++更符合现代语言的特性,在C++11中引入了多线程与并发技术。
上一篇文章中《图解Linux网络包接收过程》,我们梳理了在Linux系统下一个数据包被接收的整个过程。Linux内核对网络包的接收过程大致可以分为接收到RingBuffer、硬中断处理、ksoftirqd软中断处理几个过程。其中在ksoftirqd软中断处理中,把数据包从RingBuffer中摘下来,送到协议栈的处理,再之后送到用户进程socket的接收队列中。
Linux内核对网络包的接收过程大致可以分为接收到RingBuffer、硬中断处理、ksoftirqd软中断处理几个过程。其中在ksoftirqd软中断处理中,把数据包从RingBuffer中摘下来,送到协议栈的处理,再之后送到用户进程socket的接收队列中。
产生的随机数是 0 - 1 之间的一个 double,即 0 <= random <= 1。
作者:专职跑龙套 链接:https://www.jianshu.com/p/2f6acd169202
来源 | https://www.jianshu.com/p/2f6acd169202
本人上周亲手写下了一个牛逼的bug,直接导致的结果是,晚上12点升级后台接口以后,第二天早上7点多开始,所有的app页面出现卡顿,白屏。
熟练掌握 BIO,NIO,AIO 的基本概念以及一些常见问题是你准备面试的过程中不可或缺的一部分,另外这些知识点也是你学习 Netty 的基础。
在我们写业务逻辑中,总会碰到某些"自动更新"和"定时任务"的需求,那么,该如果实现这些需求呢? 一:分析需求 其实,大概的需求实现分为2种:"伪自动"和"真自动" 1:什么是伪自动呢? 场景(1):
您好,我是码农飞哥,感谢您阅读本文!本文主要将对gunicorn进行一个简单的总结。
说到原子,类似于以下的代码可能人人都可以看出猫腻。 /* http://www.cnblogs.com/Colin-Cai */ #include <stdio.h> #include <pthread.h> int cnt = 0; void* mythread(void* arg) { int i; for(i=0;i<500000000;i++) cnt++; return NULL; } int main() {
阻塞同步有许多实现方式了:mutex, semaphore. 阻塞同步使用不当就可能造成死锁,活锁,优先级反转。
BIO (Blocking I/O) 是同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。
最近在项目中遇到一个问题,就是需要采用正则匹配一些疑似暗链和挂马的HTML代码,而公司的老大给的正则表达式有的地方写的不够严谨,导致在匹配的时候发生卡死的现象,而后面的逻辑自然无法执行了。虽然用正则表达式来判断暗链和挂马可能不那么准确或者行业内很少有人那么做,但是本文不讨论如何使用正确的姿势判断暗链挂马,只关注与正则超时的处理。 在使用正则表达式的时候,如果正则写的太糟糕,所消耗的时间是惊人的,并且有可能会一直回溯,而产生卡死的现象,所以一般的大型公司都会有专门的人来对正则进行优化,从而提高程序效率。一般来说如果可能的话不要让用户来输入正则进行匹配。但是现在既没有专门的人进行正则的优化,本人也对正则了解的不够,所以只能从另外的角度来考虑处理超时的问题。 首先我想到的方法是另外开启一个线程来进行匹配,而在主线程中进行等待,如果发现子线程在规定的时间内没有返回就kill掉子线程。这也是一个方案,但是我现在要介绍另外一种方案,该方案来自我在网上看到的一篇博客.
前面两篇文章我们总结了 Docker 背后使用的资源隔离技术 Linux namespace。 Docker 基础技术之 Linux namespace 详解 Docker 基础技术之 Linux namespace 源码分析 本篇将讨论另外一个技术——资源限额,这是由 Linux cgroups 来实现的。 cgroups 是 Linux 内核提供的一种机制,这种机制可以根据需求把一系列任务及子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。(来自 《Docker
特殊的是StoreLoad,会使该屏障之前的所有内存访问指令(装载和存储指令)完成之后,才执行该屏障之后的内存访问指令;是一个”全能型”的屏障,它同时具有其他三个屏障的效果
在多线程环境中使用 Random 类来生成伪随机数时,很容易出现线程安全问题。例如,当多个线程同时调用 Next 方法时,可能会出现种子被意外修改的情况,导致生成的伪随机数不符合预期。
fd:file descriptor,文件描述符。linux内核将所有外部设备都看作一个文件来操作,对文件的读写会调用内核提供的命令,返回一个文件描述符。对一个socket的读写也会有相应的socket fd。描述符就是一个指向内核中结构体的数字。
本文将介绍我曾经做过的一个项目的服务器架构和服务器编程的一些重要细节。 一、程序运行环境 操作系统:centos 7.0 编译器:gcc/g++ 4.8.3 cmake 2.8.11 mysql数据库:5.5.47 项目代码管理工具:VS2013 一、程序结构 该程序总共有17个线程,其中分为9个数据库工作线程D和一个日志线程L,6个普通工作线程W,一个主线程M。(以下会用这些字母来代指这些线程) (一)、数据库工作线程的用途 9个数据库工作线程在线程启动之初,与mysql建立连接,也就是说每个线程都与my
虽然目前国内伪基站相比于前几年来说已经少了很多,但还是有少量流动的,或者一些边境区域会受到影响。以往的打击伪基站手段都是采用大数据分析,发现后出警抓捕。但对于流动的,或者跨境的,就比较难办了。 基于这种现状,2017年开始跟某地运营商开始研发有防御伪基站功能的设备。
上篇文章中 Java BIO 认识 介绍了 BIO 的弊端,就是服务端会对每个客户端的请求单独创建一个线程来处理,这样子很浪费资源,特别是高并发的时候,资源容易被耗尽导致宕机。
接下来我们简单说下这几个类的使用场景,来了解其中的细微差别,和api设计者的良苦用心。
在计算机科学中,缓存是一个至关重要的概念,它能够显著提高数据访问速度。然而,缓存的使用并非没有问题,其中最著名的问题之一就是伪共享。本文将深入浅出地介绍缓存行与伪共享问题,包括常见问题、易错点以及如何避免这些问题。
RansomExx 是一种勒索软件变种,它在 2020 年引发了几次备受瞩目的攻击,已显示出进一步发展和不受阻碍的活动迹象。最近报道的发展涉及使用适用于 Linux 服务器的更新变体,有效地将其范围扩展到 Windows 服务器。
众所周知,STL容器不是线程安全的。对于vector,即使写方(生产者)是单线程写入,但是并发读的时候,由于潜在的内存重新申请和对象复制问题,会导致读方(消费者)的迭代器失效。实际表现也就是招致了core dump。另外一种情况,如果是多个写方,并发的push_back(),也会导致core dump。
本文将介绍我曾经做过的一个项目的服务器架构和服务器编程的一些重要细节。 一、程序运行环境 操作系统:centos 7.0 编译器:gcc/g++ 4.8.3 cmake 2.8.11 mysql数据库:5.5.47 项目代码管理工具:VS2013 二、程序结构 该程序总共有17个线程,其中分为9个数据库工作线程D和一个日志线程L,6个普通工作线程W,一个主线程M。(以下会用这些字母来代指这些线程) (一)、数据库工作线程的用途 9个数据库工作线程在线程启动之初,与mysql建立连接,也就是说每个线程都与my
在服务器和客户端通信的过程中,服务器线程会一直等待请求结果返回,无法处理其他请求。
Redis 是一种内存数据库,将数据保存在内存中,读写效率要比传统的将数据保存在磁盘上的数据库要快很多。但是一旦进程退出,Redis 的数据就会丢失。
但是,netperf 测试虚拟机的极限性能时, 内核协议栈对网络性能损耗较大,此时 ,可以用 DPDK 的testpmd屏蔽虚拟机内核协议栈的差异,获取实例的真实网络性能
Kallisto是由Nicolas Bray主导开发的一款专门用于从 RNA-Seq 数据中量化转录本的表达丰度的工具。发表于 2016 年的《Nature Biotechnology》期刊,其具有以下特性:
领取专属 10元无门槛券
手把手带您无忧上云