高并发
文章平均质量分 74
介绍实现高并发的相关技术,如异步I/O,无锁数据结构,Reactor模式等
self-motivation
专注LINUX系统与性能分析优化
展开
-
libco开发教程(一) ---- 第一个测试用例
libco开发教程(一) ---- 第一个例子libco背景关于libco的背景,可以看我之前的文章,在c中实现协程前一段时间一直在忙换工作的事情,因此c语言协程库的开发有一些搁浅.最近换工作的事情告一段落了,代码实现也就提上了日程.感兴趣的小伙伴可以跟着我的教程一步一步实践,最终实现一个功能完善能够在生产中使用的c协程库.TDD项目以TDD测试驱动开发的方式进行编码,我们先来编写一个最简单的测试用例test case#include "gtest/gtest.h"#include "原创 2021-09-22 15:51:36 · 419 阅读 · 0 评论 -
gRPC详解-----负载均衡策略
1. 背景1.1 基于调用的LB需要注意的是,gRPC的负载均衡是基于每次调用而不是每条连接的.换句话说,即使所有的请求来自同一个客户端,我们也希望这些请求能够在不同的服务上进行LB.1.2 LB的实现方法在介绍任何gRPC的特定实现之前,我们先来浏览一下常见的LB实现方式.balancing.1.2.1 代理模式使用代理能够提供可靠可信任的客户端,还可以向LB系统报告负载情况.代理通常需要更多的资源和操作,因为代理需要拷贝RPC请求和响应的副本.这种模式也会增加RPC的延迟.当请求量很原创 2021-08-07 20:52:31 · 1679 阅读 · 0 评论 -
golang抢占实现(一)----------抢占的时机
golang抢占时机golang 1.14版本以后开始支持抢占协程.这里有个有趣的问题是:用户态调度的goroutine在什么时机触发抢占判断?熟悉linux的朋友可能知道,linux可能的抢占时机有:时钟中断处理里系统调用返回golang目前的实现golang编译器在每个函数调用之前都会插入以下代码: mov %fs:0xfffffffffffffff8,%rcx //获取tls cmp 0x10(%rcx),%rsp // 判断当前协程的stack是否足够原创 2021-07-14 23:48:34 · 575 阅读 · 0 评论 -
golang程序启动流程详解
golang程序启动流程详解环境go1.16.5 linux/amd64用例package mainimport "fmt"func main() { fmt.Println(42)}编译-gcflags “-N -l”: 关闭优化和内联,方便调试跟踪$ go build -gcflags "-N -l" -o hello hello.go gdb跟踪执行流程$ gdb hello$ source /usr/lib/go/src/runtime/runti原创 2021-07-10 20:35:22 · 1834 阅读 · 0 评论 -
在C语言中实现协程库(一)----------协程切换原理详解
从这篇文章开始,我将一点一点详细介绍如何在c语言中实现协程库.并对其中涉及到的技术进行详细的解释.感兴趣的小伙伴欢迎一起参与代码地址协程切换原理使用glibc中<ucontext.h>提供的相关函数用户态切换简单来说就是保存当前上下文,切换到新的上下文.用户态程序的上下文一般包含如下信息:栈各种寄存器信号掩码: linux信号掩码是基于线程的,协程也需要支持单独设置信号掩码信息我们来看一下glibc定义的用户态上下文结构ucontext_t:typedef struct原创 2021-07-04 21:46:17 · 1394 阅读 · 15 评论 -
自己如何实现自旋锁,互斥锁和读写锁
锁C语言协程库实现锁是很常见的同步原语,那么锁的实现原理是怎样的呢?下面我们就自己模拟实现一下各种锁来更好地理解锁的实现和代价.自旋锁自旋锁是一种成本较低的锁,因为它只会在当前cpu循环忙等直到获取到锁而不会让出控制权.自旋锁的特点也使其只能用于保护操作较短的临界区,且不能睡眠.代码实现主要是通过cas等原子操作来模拟.typedef volatile spin_lock_t;spin_lock(spin_lock_t *lock){ do { if (cas(原创 2021-06-27 19:46:03 · 509 阅读 · 0 评论 -
如何在C语言中实现Golang
如何在C语言中实现GolangGolang介绍Golang语言2007年诞生于Google,Google发明这门语言的目的是什么呢?从语言层面直面问题传统的语言c++, java, python等,都和其使用的计算环境无关.随着多核处理器、网络化系统、大规模计算集群的发展以及Web编程模型的发展,这些传统语言虽然也能应付,但都没有直面面对这些问题.此外,程序规模也发生了变化:今天的服务器程序由数千万行代码组成,由成百上千的程序员编写,每天都在更新.更糟糕的是,构建时间,即使是在大型编译集群上,原创 2021-06-13 10:07:09 · 1438 阅读 · 2 评论 -
深入学习Python中的并发(二)------高级篇
考虑下面的需求:我们有一个日志目录,里面全是gzip压缩的日志文件。每个日志文件的格式是固定的,我们要从中提取出所有访问过robots.txt文件的主机1.1.1.1 ------------ [10/june/2012:00:18:50 - 0500] "GET /robots.txt ..." 200 712.1.1.3 ------------ [12/june/2013:0...原创 2020-02-25 21:49:29 · 233 阅读 · 0 评论 -
深入学习python中的并发(一)---线程
python也提供了线程相关的并发原语,如锁threading.Lock,事件threading.Event,条件变量threading.Condition。本质上都是对pthread_mutex_t, pthread_condition_t的封装。本篇文章通过2个例子来分析理解python中如何控制并发。1.实现2个线程交替打印2.实现一个支持并发的环形队列代码1:2个...原创 2020-02-23 10:38:11 · 338 阅读 · 0 评论 -
gRPC源码分析 同步RPC请求与completion queue分析
gRPC completion queue架构grpc使用completion_queue来缓存事件,典型的如rpc请求。 使用grpc_cq_end_op来向cq中加入事件,使用grpc_completion_queue_next或pluck从队列中取出事件。 其中next/pluck的区别是:next从队列中按顺序依次取出事件,pluck可以通过指定tag条件来获取特定的事件...原创 2020-01-18 21:34:41 · 4938 阅读 · 0 评论 -
linux epoll实现分析
epoll的作用是进行I/O的多路复用,可以同时监听多个fd产生的事件。常结合异步处理实现单线程的高并发。在多核环境中,可以结合多线程实现负载分担。本文主要分析一下linux epoll的实现。APIepoll_create(int size);.epoll_create1(int flags);创建一个epoll实例,并返回与之关联的一个fd.这是后面我们继续使用epoll其...原创 2019-07-27 23:18:07 · 548 阅读 · 0 评论 -
理解Reactor模式: 基于线程和事件驱动
在web服务器开发中,有2种常见的架构:基于线程的架构和事件驱动的架构。基于线程的架构最初多线程server的实现一般都是采用每个连接一个线程的方法。这对于那些需要兼容非线程安全库的站点比较合适。也有使用多进程模型来隔离每个请求,这样单个请求出问题不会影响到其它请求。进程太重,上下文切换很慢而且内存消耗很大。因此,为了更好的扩展性,每个请求一个线程的方式更为常用。尽管多线程程...原创 2019-07-23 20:39:31 · 1276 阅读 · 0 评论 -
C10K问题
http://www.anger6.com/?p=1350问题C10K是探讨如何优化sockets处理以便能够同时处理大量客户请求的问题。C10K就是指的并发处理10K个连接。注意,这里的并发连接和qps的概念是不同的,尽管它们有些相似。qps需要很高的吞吐量(能够很快地处理请求),而大量的并发连接需要高效的连接调度和管理。换句话说,高qps要求的是处理请求的速度,而同时处理...原创 2019-07-21 20:57:52 · 429 阅读 · 0 评论