Nginx 官方博客:终于说清了 NIO 、非阻塞和线程池那些事情,其实 Netty 才是最终形态吧
https://www.nginx.com/blog/thread-pools-boost-performance-9x...阅读全文
https://www.nginx.com/blog/thread-pools-boost-performance-9x...阅读全文
hystrix是一个容错库,旨在隔离指向远程系统,服务和第三方库的请求,杜绝级联故障,并在复杂的分布式系统中实现弹性,毕竟在分布式系统中,故障是不可避免的。 此项目脱胎于由Netflix开源的同名java项目。https://github.com/Netflix/Hystrix 像Hystrix命令一样执行代码定义依赖于外部系统的应用逻辑,将函数传给Go。当外部系统处于健康状态,这个函数将是唯一被执行的代码。 1234hystrix.Go("my_command", func() error { // talk to other services return nil}, nil) 定义fallback行为如果希望外部系统挂了的时候执行一些动作,可以给Go传递第二个函数。理想情况下,这里的逻...阅读全文
起源及演进 最近十年来,C/C++在计算领域没有很好得到发展,并没有新的系统编程语言出现。对开发程度和系统效率在很多情况下不能兼得。要么执行效率高,但低效的开发和编译,如C++;要么执行低效,但拥有有效的编译,如.NET、Java;所以需要一种拥有较高效的执行速度、编译速度和开发速度的编程语言,Go就横空出世了。 go是一个Google公司推出的一个开源项目(系统开发语言),它是基于编译、垃圾收集和并发的编程语言。并将其开源并在BSD许可证下发行。 Go最初的设计由Robert Griesemer,Rob Pike 和Ken Thompson在2007年9月开始的,官方的发布是在2009年11月。2010年5月由Rob Pike公开的将其运用于google内部的一个后台系统。目前在googl...阅读全文
package main import ( "github.com/robfig/cron" "time" "fmt" "os" log "github.com/cihub/seelog" ) var ( ttt int ) const ( logFilePath = "hard/log/test/test.log" ) func init() { logLevel := os.Getenv("LOG_LEVEL") if logLevel == "" { logLevel = "error" } logger, err := log.LoggerFromConfigAsString(`
岗位职责:负责通讯平台服务器功能开发,精通Golang编程、Socket网络编程、RESTful接口编程、多线程编程,熟悉ORACLE或MySQL数据库。 公司地址:武汉市洪山区街道口百脑汇19楼 联系电话:027-5066742...阅读全文
鹅厂一面基础技术面二面项目技术面三面综合技术面总结某东南亚互联网公司一面技术面二面研发经理综合面试经过半年的沉淀,加上对MySQL,redis和分布式这块的补齐,终于开始重拾面试信心,再次出征。鹅厂面试职位:go后端开发工程师,接受从Java转语言都知道鹅厂是cpp的主战场,而以cpp为背景的工程师大都对os,network这块要求特别高,不像是Java这种偏重业务层的语言,之前面试Java的公司侧重还是在数据结构、网络、框架、数据库和分布式。所以OS这块吃的亏比较大一面基础技术面电话面试,随便问了些技术问题,最后还问了个LeetCode里面medium级别的算法题,偏简单redis有没有用过,常用的数据结构以及在业务中使用的场景,redis的hash怎么实现的,rehash过程讲一下和Ja...阅读全文
见代码注释: package main import ( "fmt" "sync" ) func main() { sourceArray := [...]string{"a", "b", "c", "d", "e", "f", "g"} fmt.Println(sourceArray) slice_1 := sourceArray[:4] slice_2 := sourceArray[2:] slice_3 := sourceArray[1:] slice_4 := slice_3[1:] slice_5 := slice_4[1:] slice_1[3] = "i" fmt.Println(sourceArray) fmt.Println(slice_1) fmt.Println(sli...阅读全文
载:http://www.tomsun.info/?p=80 对golang的goroutine的内部实现感觉非常神秘,通过这段时间的学习基本了解了golang调度器实现原理。 golang调度器 虽然golang的最小调度单元为协程(goroutine),但是操作系统最小的调度单元依然还是线程,所以golang scheduler(golang调度器)其要做的工作是如何将众多的goroutine放在有限的线程上进行高效而公平的调度。 操作系统的调度不失为高效和公平,比如CFS调度算法,那么go为何要引入goroutine?原因很多,有人会说goroutine 相比于linux的pthread机制使用很方便。但是核心原因为goroutine的轻量级,无论是从进程到线程,还是从线程到协程,其核...阅读全文
与其说并发调度,不如说,这就是一场“配对”游戏。线程模型在细说 Go 的调度模型之前,先来说说一般意义的线程模型。线程模型一般分三种,由用户级线程和 OS 线程的不同对应关系决定的。N:1,即全部用户线程都映射到一个OS线程上,上下文切换成本最低,但无法利用多核资源;1:1 , 一个用户线程对应到一个 OS线程上, 能利用到多核资源,但是上下文切换成本较高,这也是 Java Hotspot VM 的默认实现;M:N,权衡上面两者方案,既能利用多核资源也能尽可能减少上下文切换成本,但是调度算法的实现成本偏高。为什么 Go Scheduler 需要实现 M:N 的方案?线程创建开销大。对于 OS 线程而言,其很多特性均是操作系统给予的,但对于 Go 程序而言,其中很多特性可能非必要的。这样一来,...阅读全文
出这节视频,其实也是迫不得已.我想给大家展现出一条正确的道路,一个细致的学习方法,不放过任何一个学习和理解的机会.golang 和别的语言不一样,她比较新,所以有一些先进的东西在里面.比如说这个是为服务器开发的,那么谷歌就做了一个网页编译环境.你在网页上写代码.然后提交到谷歌的服务器上,编译,执行,把结果返回到网页上.要是用 c 实现这一套,还真是听困难.而因为 golang 的原生支持,实现这一套就简单的多.golang 在国内还是比较热的,在国外倒是不太火.因为国外高手太多,重建一套等效的系统也不是太难.在国内你就别想了,还是站在巨人的肩上吧.golang 是 c 语言大师们,系统大师们创造的 web c 语言,很多 c 语言的影子,比如说编译,当然也有很多 web 语言的影子,比如说 ...阅读全文
Go语言的整个内存管理子系统主要由两部分组成——内存分配器和垃圾收集器(gc)。十一小长假期为了避开我泱泱大国的人流高峰,于是在家宅了3天把Go语言的内存分配器部分的代码给研究了一番,总的来说还是非常酷的,自己也学到了不少的东西,就此记录分享一下。整个内存分配器完全是基于Google自家的tcmalloc的设计重新实现了一遍,因此,想看看Go语言的内存分配器实现的话,强烈建议先读一读tcmalloc的介绍文档,然后看看Go runtime的malloc.h源码文件的注释介绍,这样基本就大概了解Go语言内存分配器的设计了。 Go的内存分配器主要也是解决小对象的分配管理和多线程的内存分配问题。(后面提到的内存分配器都是指代的Go语言实现的内存分配器)。内存分配器以32k作为对象大小的定夺标准,小...阅读全文
算法和数据结构数组、链表、二叉树、队列、栈的各种操作(性能,场景)二分查找和各种变种的二分查找各类排序算法以及复杂度分析(快排、归并、堆)各类算法题(手写)理解并可以分析时间和空间复杂度。动态规划(笔试回回有。。)、贪心。红黑树、AVL树、Hash树、Tire树、B树、B+树。图算法(比较少,也就两个最短路径算法理解吧)计算机网络OSI7层模型(TCP4层)每层的协议url到页面的过程HTTPhttp/https 1.0、1.1、2.0get/post 以及幂等性http 协议头相关网络攻击(CSRF、XSS)TCP/IP三次握手、四次挥手拥塞控制(过程、阈值)流量控制与滑动窗口TCP与UDP比较子网划分(一般只有笔试有)DDos攻击(B)IO/NIO/AIO三者原理,各个语言是怎么实现的N...阅读全文
Glow 是使用 Go 编写的易用分布式计算系统,是 [Hadoop Map Reduce](http://www.oschina.net/p/hadoop),[Spark](http://www.oschina.net/p/spark-project),Flint,[Samza](http://www.oschina.net/p/samza) 等等的替代品。 Glow 的目标是提供一个库,可以在并行线程或者分布式集群机器中进行更简单计算。 安装:
go get github.com/chrislusf/glow go get github.com/chrislusf/...阅读全文
记录一下昨天的面试,感觉是凉了。 字节跳动嘛,早有耳闻面试很难,尤其是算法题部分,所以特地准备了很久算法,没想到最后没有跪在算法,跪在数据库…… 背景 2019届中流985计算机本科,已经保研南京大学,同学帮忙内推暑期实习,时长3个月。目标岗位是后台开发,头条后台用Golang较多,本人没有接触过Golang,对Java比较熟悉。 面试 先自我介绍一下,最近在做什么。打算什么时候开始实习,能实习多久。 对什么语言比较熟悉?Java。 HashMap底层实现,如何扩容。HashMap为什么线程不安全,多个线程同时put时会发生什么?(这里答得不好,没有答到同时put导致链表成环的场景,反而是想到了用迭代器时其他线程对HashMap进行了修改引发的ConcurrentModificationEx...阅读全文
# golang协程同步的几种方法 --- 本文简要介绍下go中协程的几种同步方法。 ## 协程概念简要理解 协程类似线程,是一种更为轻量级的调度单位,但协程还是不同于线程的,线程是系统级实现的,常见的调度方法是时间片轮转法,如每隔10ms切换一个线程执行。 协程则是应用软件级实现,它和线程的原理差不多,当一个协程调度到另一个协程时,将上一个协程的上下文信息压入堆栈,来回切换。一个线程可以跑很多个协程,由这个线程来调度协程的切换,如果是C/C++的话底层就能通过select/poll/epoll来做,例如微信后台的开源libco库。 golang协程底层不是C,纯go实现,golang的协程应该是目前各类有协程概念的语言中实现的最完整和成熟的,调度是基于GPM模型实现的,有兴趣可以去了解下,...阅读全文
1.多值返回 在C/C++里面如果需要返回多值,一般是在函数传入指针或者引用,比如 fun(int *a,int *b,int *c),但在go里面,如果需要返回多值,只需要把函数写成这样 1 func test_func()(int,int,int){ 2 a := 1; 3 b := 2; 4 c := 3; 5 6 return a,b,c; 7 } 最后函数会依次返回a,b,c 这个其实在lua中早就有了,所以实际上在go里面也算不上什么新的东西,go里面还有一个返回值命名的特性 func read_file()(read_count int,err int){ ....//代码需要做的事情 return ; } 这样就可以让函数的代码更加清晰和更让人理解,看函数声明就可以知道返回值...阅读全文
直接上代码: 1. 第一种情况, 如果没有select{}, main 主线程不会等待coroutine运行,导致coroutine得不到机会运行。 You are requesting eventual scheduling (using the two go statements) of two goroutines and then you exit main without giving the scheduler a chance to do anything. 有了select, 程序正常运行。 package main import ( "fmt" "time" ) func main() { go func1() go func2() select{} } func func...阅读全文
1. 线程(Thread)和协程(Coroutine)的定义 Go语言最大的特色就是从语言层面支持并发(Goroutine),Goroutine是Go中最基本的执行单元。事实上每一个Go程序至少有一个Goroutine:主Goroutine。当程序启动时,它会自动创建。 为了更好理解Goroutine,现讲一下线程和协程的概念。 线程(Thread):有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆(heap, 一般由程序员分配释放)栈(stack,由编译器自动分配释放 ,存放函数的参数值,局部变量的值等)组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己...阅读全文
岗位职责: 负责容器云平台的架构设计与开发工作; 负责Docker等关键技术研究和开发工作; 负责Kubernetes等编排服务框架的开发工作; 岗位要求: 大学本科以上,计算机及相关专业,三年以上云计算系统架构设计、应用和开发经验; 熟悉linux下C、C++开发语言,对多进程多线程及网络编程有较深刻的理解; 熟练掌握Go语言及并发编程; 掌握 kubernetes ,mesos等编排服务框架以及能对它们进行二次开发优先; 熟悉Docker环境的网络性能调优以及网络解决方案,如Flannel等开源技术优先; 熟悉Docker的相关开源技术,掌握Docker源码者优先; 工作激情,有良好的团队协作精神,富有责任心,能承受一定强度的工作压力。 岗位在深圳,有意向...阅读全文
> 并发(并行),一直以来都是一个编程语言里的核心主题之一,也是被开发者关注最多的话题;Go语言作为一个出道以来就自带 『高并发』光环的富二代编程语言,它的并发(并行)编程肯定是值得开发者去探究的,而Go语言中的并发(并行)编程是经由goroutine实现的,goroutine是golang最重要的特性之一,具有使用成本低、消耗资源低、能效高等特点,官方宣称原生goroutine并发成千上万不成问题,于是它也成为Gopher们经常使用的特性。 > Goroutine是优秀的,但不是完美的,在极大规模的高并发场景下,也可能会暴露出问题,什么问题呢?又有什么可选的解决方案?本文将通过runtime对goroutine的调度分析,帮助大家理解它的机理和发现一些内存和调度的原理和问题,并且基于此提出...阅读全文
01 拼多多(2面技术+HR面) 一面 聊项目,很细 重解笔试题目 Mqtt,Http,WebSocket协议相关内容 C++ 多态实现 预编译保护 动态链接和静态链接 进程fork过程 C++构造函数和析构函数相关 深拷贝和浅拷贝 虚函数和内联 C++内存分配 O(logn), O(n), O(nlongn), O(n^2), O(n^logn), O(n^3)算法各举一个例子 map 和 hashMap 底层实现 hash 函数、hash冲突相关 稳定排序和不稳定排序,各种排序算法复杂度 Graphql、 Restful 题目1.给一个序列,如{1,4,6,3,8,7},然后打印相应的柱状图 题目2.给定一个函数 g(x) 可以以概率 p 产生1, 概率 1-p 产生0, 让你利用g(x...阅读全文
##Goroutine与Libtask协程切换性能比较 ##Libtask Libtask是一个非常轻量级的C语言协程库,作者是大名鼎鼎的拉斯.考克斯,也是Go语言的作者之一。Libtask的实现原理也很简单,主要是利用系统调用如:getcontext、setcontext(注:不同的操作系统有不同的系统调用)封装成makecontext、swapcontext两个函数,利用这两个函数实现在单个线程中执行多个task,协程上下文切换非常轻量,因为是在同一个线程中,所以只需要保存和设置SP和PC就可实现上下文切换。 ###Goroutine Goroutine的实现应该有参考Libtask,主体思想都差不多,只不过Goroutine扩展到可以支持多核处理器,系统调用、IO等阻塞...阅读全文
在看swoole的时候,看到php 定义协程的方式是 go(function () { echo "hello wangbaojin \n"; }); 此时吓我一大跳,因为之前写过golang,go里定义协程的方式是 go func 难道是php 这里又是抄袭了 go???????抱着好奇的心情展开了调查 ######################################################## 各种语言的协程支持情况 C++可以通过 Boost.Coroutine 库实现协程。 Java 不支持协程 Python 3.5 加入了 async def 对协程的支持,但是Python的 协程是在方法定义时就确定了,被定义协程的方法不能当做普通方法来使用,而Go语言 swo...阅读全文
代码: SafeRun加锁设置url的已访问 通过 for i:=0; i < len(urls); i++{ <-sub_quit }父go线程等待子go线程结束 package main import ( "fmt" ) type Fetcher interface { // Fetch 返回 URL 的 body 内容,并且将在这个页面上找到的 URL 放到一个 slice 中。 Fetch(url string) (body string, urls []string, err error) } var lockx = make(chan int,1) func SafeRun(f func()){ <-lockx f() lockx <-1 } var visited map[st...阅读全文
go语言在云计算时代将会如日中天,还抱着.NET不放的人将会被淘汰。学习go语言和.NET完全不一样,它有非常简单的runtime 和 类库。最好的办法就是将整个源代码读一遍,这是我见过最简洁的系统类库。读了之后,你会真正体会到C#的面向对象的表达方式是有问题的,继承并不是必要的东西。相同的问题,在go中有更加简单的表达。 go runtime 没有提供任何的锁,只是提供了一个PV操作原语。独占锁,条件锁 都是基于这个原语实现的。如果你学习了go,那就就知道如何在windows下高效的方式实现条件锁定(windows没有自带的条件锁)。 我想阅读源代码,不能仅仅只看到实现了什么,还要看到作者的设计思路,还有如果你作为作者,如何实现。这些才是真正有用的东西,知识永远学不完,我们要锻炼我们的思维...阅读全文
FreeCache 是一个 Go 语言的缓存库,无额外的 GC 负荷。数百万对象的垃圾收集延迟仅在数百毫秒。 特性: * 可存储数以百万计条目 * 零垃圾收集负荷 * 高并发而且线程安全的访问 * 纯 Go 语言实现 * 支持对象失效 * 近乎 LRU 的算法 * 严格限制内存使用 * 提供一个测试用的服务器,支持一些基本 Redis 命令 示例代码:
cacheSize := 1024*1024 cache := freecache.NewCache(cacheSize) key := []byte("abc") val := []byt...阅读全文
runtime.Gosched()用于让出CPU时间片。这就像跑接力赛,A跑了一会碰到代码runtime.Gosched()就把接力棒交给B了,A歇着了,B继续跑。 看代码: package main import ( "fmt" "runtime" ) func say(s string) { for i := 0; i < 2; i++ { runtime.Gosched() fmt.Println(s) } } func main() { go say("world") say("hello") } 输出结果: hello world hello 注意结果: 1、先输出了hello,后输出了world. 2、hello输出了2个,world输出了1个(因为第2个hello输出完,主线程...阅读全文
典型的两个现实案例: 我们先看两个用Go做消息推送的案例实际处理能力。 360消息推送的数据: 16台机器,标配:24个硬件线程,64GB内存 Linux Kernel 2.6.32 x86_64 单机80万并发连接,load 0.2~0.4,CPU 总使用率 7%~10%,内存占用20GB (res) 目前接入的产品约1280万在线用户 2分钟一次GC,停顿2秒 (1.0.3 的 GC 不给力,直接升级到 tip,再次吃螃蟹) 15亿个心跳包/天,占大多数。 京东云消息推送系统 (团队人数:4) 单机并发tcp连接数峰值118w 内存占用23G(Res) Load 0.7左右 心跳包 4k/s gc时间2-3.x s C10K问题 为什么可以支撑这么高并发的请求呢?我们先从C10K问题说起...阅读全文
Rob Pike谈Google Go:并发,Type System,内存管理和GC 1. Rob,你创建了Google Go这门语言。什么是Google Go?能简明扼要的介绍一下Google Go吗? 我还是讲讲为什么要创建这门语言吧,和你的问题稍有些不同。我在Google做了一个有关编程语言的系列讲座,在Youtube上有,谈及了我早期所写的一个语言,叫做Newsqueak,那是八十年代的事,非常早。在做讲座期间,我开始思考为什么Newsqueak中的一些想法在我现在以C++为主的工作环境中无法使用。而且在Google我们经常要构建非常大的程序,光构建就要花很多时间,对依赖的管理也有问题,由于链接了本来并不需要的东西,二进制程序包变得很大,链接时间很长,编译时间也很长,而且C++的工作方...阅读全文
典型的两个现实案例: 我们先看两个用Go做消息推送的案例实际处理能力。 360消息推送的数据: 16台机器,标配:24个硬件线程,64GB内存 Linux Kernel 2.6.32 x86_64 单机80万并发连接,load 0.2~0.4,CPU 总使用率 7%~10%,内存占用20GB (res) 目前接入的产品约1280万在线用户 2分钟一次GC,停顿2秒 (1.0.3 的 GC 不给力,直接升级到 tip,再次吃螃蟹) 15亿个心跳包/天,占大多数。 京东云消息推送系统 (团队人数:4) 单机并发tcp连接数峰值118w 内存占用23G(Res) Load 0.7左右 心跳包 4k/s gc时间2-3.x s C10K问题 为什么可以支撑这么高并发的请求呢?我们先从C10K问题说起...阅读全文
这篇博客是我在维尔纽斯的 [Go Meetup](https://www.meetup.com/Vilnius-Golang/events/249897910/) 演讲的总结。如果你在维尔纽斯并且喜欢 Go 语言,欢迎加入我们并考虑作演讲 在这篇博文中我们将要探索 Go 语言的内存管理,首先让我们来思考以下的这个小程序: ```go func main() { http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path)) }) http.ListenAndServe(":8080", nil) }...阅读全文
1 package main 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "os" 7 "path/filepath" 8 "strings" 9 ) 10 11 var matchCount = 0 12 var ch = make(chan int, 512) 13 14 func findFile(path string, text string) { 15 var pathArray [100]string 16 var count = 0 17 filepath.Walk(path, func(path string, info os.FileInfo, err error) error { 18 if err != nil { 19 } 20 //f...阅读全文
 在过去的几年里,Go 语言能获得如此难以置信的流行度的一个主要原因,是 Go 能通过轻量级的 Goroutines 和 channel 更加简便地处理并发问题。 并发并不是什么新鲜事物,它一直以多线程的形式存在于我们几乎每天都要使用的应用程序之中。 不过,在实际理解什么是 Goroutine,什么不是之前,我们需要知道 Goroutine 并不是轻量级线程(尽管 Goroutine 依赖于线程运行),稍后我们将深入研究真正的线...阅读全文
# 前言 在游戏开发中,我们经常要为 Request、对象或其它东西设置全局唯一的 ID。常见的选择有随机数、时间戳、UUID、用 Redis 生成 ID 等,这些选择要么可能重复,要么太慢,于是我开发了 WUID,一个极快的唯一 ID 生成器。 [WUID](https://github.com/edwingeng/wuid) 比 UUID 快 10-135 倍,比用 Redis 生成 ID 快 4600 倍。 # 核心设计 [WUID](https://github.com/edwingeng/wuid) 顺序生成 64 位整数,其高 24 位是从外部存储加载的,每次加载自动加 1。 目前支持的外部存储包括:Redis、MySQL、MongoDB。 # Benchmarks ``` Be...阅读全文
## 介绍 在过去的几个月里,我在几个项目上使用过 Go,尽管我还算不上专家,但是还是有几件事我要感谢 Go:首先,它有一个清晰而简单的语法,我不止一次注意到 Github 开发人员的风格非常接近于旧 C 程序中使用的风格,从理论上讲,Go 似乎吸收了世界上所有语言最好的特性:它有着高级语言的力量,明确的规则使得更简单,即使这些特性有时有一点点的约束力--就是可以给代码强加一个坚实的逻辑。这是命令式的简单,由大小以位为单位的原始类型组成。但是没有像把字符串当成字符数组那样操作的乏味。然而,我认为这两个非常有用和有趣的功能是 goroutine 和 channels。  改成 ks := make([]int, 1000) 就可以跑满CPU了。 我用的是 1.6版, 1.5版的这种问题更严重...阅读全文
挂起函数的组合执行 本节我们介绍挂起函数组合的各种方法。 按默认顺序执行 假设我们有两个在别处定义的挂起函数: suspend fun doJob1(): Int { println("Doing Job1 ...") delay(1000L) // 此处模拟我们的工作代码 println("Job1 Done") return 10 } suspend fun doJob2(): Int { println("Doing Job2 ...") delay(1000L) // 此处模拟我们的工作代码 println("Job2 Done") return 20 } 如果需要依次调用它们, 我们只需要使用正常的顺序调用, 因为协同中的代码 (就像在常规代码中一样) 是默认的顺序执行。下面的示例...阅读全文
进程/线程上下文切换: https://zhuanlan.zhihu.com/p/79772089 Golang协程:https://www.cnblogs.com/liang1101/p/7285955.htm...阅读全文
我想写个多线程的例子: 有个专门添加字符串到channel的函数 addStr和一个专门打印channel中一个一个字符串的 printStr函数 我想开两个线程专门写,开两个线程专门读,要怎么办...阅读全文
欢迎关注IPFS官方周报!星际文件系统 (IPFS) ( https://ipfs.io/ )是一种新的超媒体分布协议,通过内容和标识来寻址。IPFS 支持创建完全分布式的应用程序。它的目标是使网络更快、更安全、更开放。由于范围广大,本周刊旨在跟踪整个生态系统的开发。想参与其中?点击下面的一些链接,查看我们在 GitHub (https://github.com/ipfs )上的内容,或加入我们的 IRC (https://riot.im/app/#/room/#ipfs:matrix.org )。以下是自上次 IPFS 周报以来的一些亮点。最新的参见IPFS营地主题演讲和访谈我们很高兴分享在IPFS Camp的头几天和最后一天汇聚在一起的主题演讲,以及社区访谈,重点介绍了IPFS Camp...阅读全文
一、Golang“调度器”的由来? (1) 单进程时代不需要调度器 我们知道,一切的软件都是跑在操作系统上,真正用来干活(计算)的是CPU。早期的操作系统每个程序就是一个进程,知道一个程序运行完,才能进行下一个进程,就是“单进程时代” 一切的程序只能串行发生。 5-单进程操作系统.png 早期的单进程操作系统,面临2个问题: 1.单一的执行流程,计算机只能一个任务一个任务处理。 2.进程阻塞所带来的CPU时间浪费。 那么能不能有多个进程来宏观一起来执行多个任务呢? 后来操作系统就具有了最早的并发能力:多进程并发,当一个进程阻塞的时候,切换到另外等待执行的进程,这样就能尽量把CPU利用起来,CPU就不浪费了。 (2)多进程/线程时代有了调度器需求 6-多进程操作系统.png 在多进程/多线程的...阅读全文
Nim语言有很多语言上先进的特性和接近Python的语法,Rust定位成C++的直接竞争者。 但是请认真思考:这两个语言从一出生开始,都没有解决,而且以后也很难解决本世纪软件业的一次重大危机:多核编程危机。 它们的出现就不是冲着解决多核编程问题来的,基因决定了,靠这两门语言解决不了多核编程的问题。 怎么解决多核编程的问题? 屏蔽硬件上的复杂特性,例如缓存、一致性、内存屏障、原子操作,给程序员简单的并发特性,在编程时存在尽量少的心智负担。 GO可以在内存中创建成千上万的协程,并且提供了协程间通信的基础设施,单凭这两点,Nim和Rust都没有做到。 Nim语言目前没有实现自身的汇编器和链接器,Nim代码首先被编译为C代码,再把C代码编译为本地机器码。 Golang自带汇编器和链接器。 Rust官...阅读全文
作者:skoo 链接:https://zhuanlan.zhihu.com/p/22474724 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 最近 fix 了一个 Go 程序系统线程数量暴增的问题,线程数量维持在2,3万个,有时候甚至更多,这情况明显不符合 Go 的并发原理。第一次发现线程数巨多是因为这个程序突然 crash 了,由于设置了程序可用的最大线程数,所以线程数一太多就会crash。 这个程序其实就是现在挺火热的 Swarm,Swarm 这个程序的模式就是作为 client 的角色向数万个 docker daemon 服务器建连,维持长连接状态,然后再定时的从这些 docker daemon 读取数据。经排查,发现长连接数和线程数基本一致,看到...阅读全文
去年在读UNP等几本书时都涉及到IO及相关知识,不过由于点很零散,当时没有总结。趁这次看golang net包的机会,结合之前看的比较基础的概念写了这篇博客,记录下现在的理解,方便以后回顾。 IO多路复用Unix网络编程里总结了5种IO模型,其中只有异步IO模型是异步IO,因为只有异步IO的recvfrom是不阻塞进程的。首先每个IO读操作都包括以下两个过程,书里说的异步就是指发起读操作时,数据从内核拷贝到用户空间是否要阻塞进程这个问题。 等待网络数据到达网卡并读取到内核缓冲区,数据准备好。 从内核缓冲区复制数据到进程空间。 另外阻塞IO模型和阻塞IO调用是不同的。比如非阻塞IO模型当中其实包含了多次非阻塞IO调用和一次阻塞IO调用,非阻塞IO调用是指在内核无数据准备好时,recvfrom不...阅读全文
进程、线程、协程 进程:进程是系统进行资源分配的基本单位,有独立的内存空间,单切换代价极高,进程间通信也比较麻烦 线程:线程是CPU调度和分派的基本单位,线程依附于进程,与其他线程共享进程的资源,仅有自己的(程序计数器,一组寄存器的值,和栈),线程切换代价小(但是线程之间的切换可能会设计用户态和内核态的切换),由于共享进程资源,所以线程之间通信比较方便。 协程:协程是一种用户态的轻量级线程,协程的调度完全由用户控制,协程切换只需要保存和恢复任务的上下文,没有内核的开销。协程间通信也比较简单(协程间本身是不可抢占的,由于操作系统的调度机制无法影响到它,因此一般存在用户自定义的调度机制)(也可以这么说内核线程依然叫“线程(thread)”,用户线程叫“协程(co-routine)".) Gola...阅读全文
阿里巴巴-基础架构事业群-CDN平台研发工程师 岗位描述: 阿里云是国内最知名的云计算公司,CDN业务是阿里云的重要业务之一,拥有分布广泛的国内和海外节点,并在国内外都能提供高质量的CDN主流服务和增值服务。我们面临着世界级的流量带来的技术挑战,我们立志为客户提供最便捷、最快速的CDN服务。通过我们的努力为用户最大程度的实现商业价值。 1、负责CDN平台产品业务后端功能研发。 2、负责CDN平台自动化工具相关工作的设计及研发。 3、负责CDN平台产品架构优化,解决CDN产品服务效率问题。 岗位要求: 1、了解CDN加速技术,熟悉DNS、HTTP协议。 2、具有两年年以上开发经验,熟练Go,Python,Java其中一种语言高级特性和...阅读全文
文:Fundamentals of concurrent programming 译者:youngsterxyf 本文是一篇并发编程方面的入门文章,以Go语言编写示例代码,内容涵盖: 运行期并发线程(goroutines) 基本的同步技术(管道和锁) Go语言中基本的并发模式 死锁和数据竞争 并行计算 在开始阅读本文之前,你应该知道如何编写简单的Go程序。如果你熟悉的是C/C++、Java或Python之类的语言,那么 Go语言之旅 能提供所有必要的背景知识。也许你还有兴趣读一读 为C++程序员准备的Go语言教程 或 为Java程序员准备的Go语言教程。 1. 运行期线程 Go允许使用go语句开启一个新的运行期线程,即 goroutine,以一个不同的、新创建的goroutine来执行一个函...阅读全文
杭州数字货币永续合约交易系统开发搭建 杭州数字货币永续合约交易系统开发搭建——结算快 无分摊 风险可控 代理推广随着数字货币期货的快速发展,广大用户看到了期货合约可以套期保值这一优势,并大力投身于合约交易之中。针对于资产量较大的用户来说,传统的周合约、季度合约已经满足不了他们的需求,永续合约不需要交割的特点更人性化,且永续合约结算快,有效提升了市场活跃度,也加大了投资者风险对冲、套期保值的机会。杭州孟德科技推出的永续合约交易系统支持双向交易,多杠杆,多风险控制,风险管控分为警戒线,禁止开仓线,强平线,降低用户风险率;并且平台引入了用户和平台对赌,以及代理商推荐返佣机制,推动了平台用户的发展。一、K线来源交易主要依靠外部交易所大盘行情进行交易火币、币安、抹茶以及公司内部研发专属孟德云K线。二、...阅读全文
在Android开发中,调用Context的startService方法启动Service的生命周期时,如果Android面临内存匮乏,可能会销毁掉你当前运行的Service,然后待内存充足的时候可以重新创建Service,Service被Android系统强制销毁并再次重建的行为依赖于Service中onStartCommand方法的返回值。 而Service onStartCommand方法中,常用的返回值主要有:START_NOT_STICKY、START_STICKY和START_REDELIVER_INTENT三种,这三个值都是Service中的静态常量。下面小编就和大家分享下这三种返回值的具体的含义及使用情况。 START_NOT_STICKY ...阅读全文