I/O多路复用
memcached使用介绍
[TOC]
memcached 有2个版本。需要注意。
介绍
特点:
- 协议简单
- 基于
libevent
的时间处理。 - 内置内存存储方式;
- 采用互不通信的分布式。(这里的分布式只是为了扩大能存多少的问题,而不是稳定性。)
从上述特点4可见,基于memcached的memcacheq
有个很大的缺点,就是做分布式其实不稳定,如果其中一个服务器down掉,就会丢失消息,这时只能通过重启机器来解决。也就是必须有个监控服务才能保证稳定性。
基本特性
(1)mc的核心职能是KV内存管理,value存储最大为1M(可修改,改源代码,编译安装),它不支持复杂数据结构(哈希、列表、集合、有序集合等);
(2)mc不支持持久化;
(3)mc支持key过期;
(4)mc持续运行很少会出现内存碎片,速度不会随着服务运行时间降低;
(5)mc使用非阻塞IO复用网络模型,使用监听线程/工作线程的多线程模型;
GMP调度器
GMP调度器
主要内容来自 潘少 的 gnet开源说。 https://github.com/gocn/opentalk
G、M、P 是什么
G: 表示 Goroutine,每个 Goroutine 对应一个 G 结构体,G 存储 Goroutine 的运行堆栈、状态以及任务函数,可重用。G 并非执行体,每个 G 需要绑 定到 P 才能被调度执行。
P: Processor,表示逻辑处理器, 对 G 来说,P 相当于 CPU 核,G 只有绑定到 P(在 P 的 local runq 中)才能被调度。对 M 来说,P 提供了相关的执行 环境(Context),如内存分配状态(mcache),任务队列(G)等,P 的数量决定了系统内最大可并行的 G 的数量(前提:物理 CPU 核数 >= P 的数量),P 的数量由用户设置的 GOMAXPROCS 决定,但是不论 GOMAXPROCS 设置为多大,P 的数量最大为 256。
M: Machine,OS 线程抽象,代表着真正执行计算的资源,在绑定有效的 P 后,进入 schedule 循环;而 schedule 循环的机制大致是从 Global 队列、P 的 Local 队列以及 wait 队列中获取 G,切换到 G 的执行栈上并执行 G 的函数,调用 goexit 做清理工作并回到 M,如此反复。M 并不保留 G 状态,这是 G 可以跨 M 调度的基础,M 的数量是不定的,由 Go Runtime 调整,为了防止创建过多 OS 线程导致系统调度不过来,目前默认最大限制为 10000个。
Go 网络并发模型
原码、补码、反码
原码、补码、反码
一个数在计算机中的二进制表示形式, 叫做这个数的机器数
。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1.
将带符号位的机器数对应的真正数值称为机器数的真值
。如: 10000011 的真值是3。
原码
: 原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。原码是人脑最容易理解和计算的表示方式.
反码
:反码的表示方法是: 正数的反码是其本身,负数的反码是在其原码的基础上, 符号位不变,其余各个位取反。
补码
: 补码的表示方法是:正数的补码就是其本身,负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)