1 分钟阅读

前言

on the last 20 years, we have lived an incredible growth in computer science. Storage spaces have been increased dramatically,RAM has suffered a substantial growth, and cpu’s aare well simply faster. CPU industry has reached a limit. The CPU manufacturers are now shipping more cores on each computers. This situation crashes against the background of many systems programming languages that weren’t designed for multi-processor CPUs or large distributed systems that act as a unique machine.

our programers were bigger,more complex,more difficult to maintain and with a lot of room for bad practices. While our computers had more cores and were faster,we were not faster when developing our code neither our distributed applications. 代码规模规模越来越大,越来越容易出错。

为什么要学习新的语言

通晓多种编程语言的程序员,真香?如果一种语言没有影响到你对编程的思考方式,你就用不着学它了。

我本来是Java方向的,为什么打算换“东家”呢?

  1. 程序员要多会一点,有人提出一个观点:即使这个语言过时了,学习一下也是很有必要的,因为这让你从另一个角度来观察问题,看到新的方式去解决问题。扩展的了解“什么死的,什么是可以变通的”。
  2. 多核化和集群化渐渐成为主流,而JAVA是上一个时代单机服务器时的产品,虽然它现在也在努力跟上潮流。
  3. JAVA语法还是不够简单。熟悉java多线程的人都知道,wait方法的调用必须在synchronized块中。并且,实现线程要继承Thread或者实现Runnable。总之,在java中开发多线程程序细节很多,能力要求也很高,是面试题的重要来源地。java 的大量机制 隐藏在jvm中,这一点不如 go 直观(go runtime是go 写的)。
  4. 在未来的编程事业中,人们越来越关注实现业务本身,而实现业务所需的技术细节将主要由编程语言来实现。比如在Go语言中,实现一个线程将由一个关键字表示,学习的复杂性大大下降。
  5. 当然,决定语言发展趋势的因素有很多。若只考虑易用性,C语言早该回家抱孩子了。从长远讲,语言要么效率足够高,要么足够简单,处在中间状态的语言会很尴尬!

一文详解 Go 应用性能优化 go pprof 实战

左耳朵耗子:Go 语言不会吞食底层到 C 和 C++ 那个级别的,也不会吞食到上层如 Java 业务层的项目。Go 语言能吞食的一定是 PaaS 上的项目,比如一些消息缓存中间件、服务发现、服务代理、控制系统、Agent、日志收集等等,他们没有复杂的业务场景,也到不了特别底层(如操作系统)的软件项目或工具。而 C 和 C++ 会被打到更底层,Java 会被打到更上层的业务层。这是我的一个判断。

Go语言专家曹大谈十年技术生涯:有理想,但不理想化相比 PHP 之类的语言,Go 的最大好处是可以跨越很多领域,从业务到基础设施,如果你业务干腻了,技术储备又足够,也可以去玩玩基础设施开发 (当然,我不建议你总是换, 实在手痒可以业余时间给一些开源基础设施项目提提 PR)。也就是大家的工作内容选择范围会大很多,这又需要考验你的智慧了。选择也很重要,要能看得出什么是行业的红利,哪里有现金流,哪些是公司内的重点项目,哪些比较容易出成果(你要是不懂这些,只会写代码,那你的发展就会慢)。特别是这几年,这个能力会变得更加重要。

如何阅读Go源码?

基本理念

在 golang 中已经完全屏蔽了线程的概念,将 goroutine 统一为整个语言层面的并发粒度,并遵循着 gmp 的秩序进行运作. 在此基础之上,紧密围绕着 gmp 理念打造设计的一系列工具、模块则像是在骨架之上填充的血肉,是依附于这套框架而存在的. 下面我们来看其中几个经典的案例:

  1. golang 的内存管理模块主要继承自 TCMalloc(Thread-Caching-Malloc)的设计思路,其中由契合 gmp 模型做了因地制宜的适配改造,为每个 p 准备了一份私有的高速缓存——mcache,能够无锁化地完成一部分 p 本地的内存分配操作.
  2. 在 golang 中的并发工具(例如锁 mutex、通道 channel 等)均契合 gmp 作了适配改造,保证在执行阻塞操作时,会将阻塞粒度限制在 g(goroutine)而非 m(thread)的粒度,使得阻塞与唤醒操作都属于用户态行为,无需内核的介入,同时一个 g 的阻塞也完全不会影响 m 下其他 g 的运行.
  3. 在设计 io 模型时,golang 采用了 linux 系统提供的 epoll 多路复用技术,然而为了因为 epoll_wait 操作而引起 m(thread)粒度的阻塞,golang 专门设计一套 netpoll 机制,使用用户态的 gopark 指令实现阻塞操作,使用非阻塞 epoll_wait 结合用户态的 goready 指令实现唤醒操作,从而将 io 行为也控制在 g 粒度,很好地契合了 gmp 调度体系.

标签:

分类:

更新时间:

留下评论