轻量级

go语言学习入门篇 2--轻量级线程的实现

风格不统一 提交于 2019-11-26 12:49:28
很多有过 JVM 相关语言工作经验的程序员或许都遇到过如下问题: 超出 thread 限制导致内存溢出。在作者的笔记本的 linux 上运行,这种情况一般发生在创建了 11500 个左右的 thread 时候。 但如果你用 Go 语言来做类似的尝试,每创建一个 Goroutine ,并让它永久的 Sleep ,你会得到一个完全不同的结果。在作者的笔记本上,在作者等待的不耐烦之前,GO语言创建了大约7千万个 Goroutine 。为什么我们可以创建的 Goroutines 比 thread 多这么多呢?回答这个问题需要回到操作系统层面来进行一次愉快的探索。 1.到底什么是线程(Thread)? “Thread" 本身其实可以代表很多不同的意义。在这篇文章中,CPU执行任务的最小单元。Thread 由如下内容组成: 一系列按照线性顺序可以执行的指令(operations); 一个逻辑上可以执行的路径。CPUs 中的每一个 Core 在同一时刻只能真正并发执行一个线程。 这就产生了一个结论:如果你的 threads 个数大于 CPU 的 Core 个数的话,有一部分的 Threads 就必须要暂停来让其他 Threads 工作,直到这些 Threads 到达一定的时机时才会被恢复继续执行。 而暂停和恢复一个线程,至少需要记录两件事情(线程切换开销): 记录当前执行的指令位置。亦称为

一文让你读懂Synchronized底层实现,秒杀面试官

有些话、适合烂在心里 提交于 2019-11-26 04:25:11
本文为死磕Synchronized底层实现第三篇文章,内容为轻量级锁实现。 轻量级锁并不复杂,其中很多内容在偏向锁一文中已提及过,与本文内容会有部分重叠。 另外轻量级锁的背景和基本流程在概论中已有讲解。强烈建议在看过两篇文章的基础下阅读本文。 本系列文章将对HotSpot的 synchronized 锁实现进行全面分析,内容包括偏向锁、轻量级锁、重量级锁的加锁、解锁、锁升级流程的原理及源码分析,希望给在研究 synchronized 路上的同学一些帮助。 本文分为两个部分: 1.轻量级锁获取流程 2.轻量级锁释放流程 本人看的JVM版本是jdk8u。 轻量级锁获取流程 下面开始轻量级锁获取流程分析,代码在 bytecodeInterpreter.cpp#1816 。 CASE(_monitorenter): { oop lockee = STACK_OBJECT(-1); ... if (entry != NULL) { ... // 上面省略的代码中如果CAS操作失败也会调用到InterpreterRuntime::monitorenter // traditional lightweight locking if (!success) { // 构建一个无锁状态的Displaced Mark Word markOop displaced = lockee->mark()-

docker:轻量级图形页面管理工具Portainer

点点圈 提交于 2019-11-26 02:47:57
1.介绍 docker 图形化管理提供了很多工具,有Portainer、Docker UI、Shipyard等等,本文主要介绍Portainer。 Portainer是一个开源、轻量级Docker管理用户界面,基于Docker API,提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作)、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和操作、登录用户管理和控制等功能。功能十分全面,基本能满足中小型单位对容器管理的全部需求。 2.创建容器 2.1下载官方镜像 2.2单机运行 如果仅有一个docker宿主机,则可使用单机版运行,Portainer单机版运行十分简单,只需要一条语句即可启动容器,来管理该机器上的docker镜像、容器等数据。 创建数据卷: 运行容器: 参数说明: -d:容器在后台运行; -p 9000:9000 :宿主机9000端口映射容器中的9000端口 -v /var/run/docker.sock:/var/run/docker.sock :把宿主机的Docker守护进程(Docker daemon)默认监听的Unix域套接字挂载到容器中; -v portainer_data:/data :把宿主机portainer_data数据卷挂载到容器/data目录; 查看容器进程: 访问服务: 访问方式: