Docker-Linux Cgroups
Docker-Linux Cgroups什么是Linux CgroupsLinux Cgroups提供了对一组进程以及将来子进程的资源限制、控制和统计的能力,包含CPU、内存、存储、网络等。通过Cgroups,可以方便的限制某个进程的资源占用,并且可以实时统计监控进程和统计消息。
Cgroups的组件cgroupcgroup是对进程分组管理的一种机制,一个cgroup包含一组进程,并且在cgroup 上增加Linux subsystem的各种参数配置,将一组进程和一组subsystem系统参数关联起来
subsystemsubsystem是一组资源控制模块,有下面的几个模块
blkio设置对块设备(比如硬盘)输入输出的访问控制
cpu设置cgroup中进程的CPU被调度的策略
cpuacct可以统计cgroup中进程调度的CPu占用
cpuset在多核机器上设置cgroup中进程可以使用的CPU和内存(此内存仅适用于NUMA架构)
devices控制cgroup中进程对于设备的访问
freezer用于挂起(suspend)和恢复(resume)cgroup中的进程
mem ...
GO-深拷贝
GO-深拷贝复习在 Go 语言中,所有的函数参数传递都是值传递(pass by value),当将参数传递给函数时,实际上是将参数的副本传递给函数。
然而,这并不意味着在函数内部对参数的修改都不会影响原始数据。因为在 Go 中,有些数据类型本身就是引用类型,比如切片(slice)、映射(map)、通道(channel)、接口(interface)和指针(pointer)。当这些类型作为参数传递给函数时,虽然传递的是值,但值本身就是一个引用
代码陷阱切片是结构
预期:Before和After是一样的值,因为参数传递都是值传递
package mainimport ( "fmt" "strconv")type Person struct { Name string Age int Address []string}func changepeople(people []Person) { people[1].Address[0] = "Change"}func main() & ...
结构型模式-装饰器模式
结构型模式-装饰器模式什么是装饰器模式装饰是一种结构型设计模式, 允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为
部件(Component)声明封装器和被封装对象的公用接口
具体部件(Concrete Component)类是被封装对象所属的类。 它定义了基础行为,但装饰类可以改变这些行为
基础装饰(Base Decorator)类拥有一个指向被封装对象的引 用成员变量。该变量的类型应当被声明为通用部件接口,这 样它就可以引用具体的部件和装饰。装饰基类会将所有操作 委派给被封装的对象
具体装饰类(Concrete Decorators)定义了可动态添加到部 件的额外行为。具体装饰类会重写装饰基类的方法,并在调 用父类方法之前或之后进行额外的行为
客户端(Client)可以使用多层装饰来封装部件,只要它能 使用通用接口与所有对象互动即可
Example零件接口package maintype IPizza interface { getPrice() int}
具体零件package maintype VeggieMania stru ...
结构型模式-外观模式
结构型模式-外观模式外观模式外观是一种结构型设计模式, 能为程序库、框架或其他复杂类提供一个简单的接口
外观(Facade)提供了一种访问特定子系统功能的便捷方式, 其了解如何重定向客户端请求,知晓如何操作一切活动部件
创建附加外观(Additional Facade)类可以避免多种不相关 的功能污染单一外观,使其变成又一个复杂结构。客户端和 其他外观都可使用附加外观
复杂子系统(Complex Subsystem)由数十个不同对象构成。 如果要用这些对象完成有意义的工作,你必须深入了解子系 统的实现细节,比如按照正确顺序初始化对象和为其提供正 确格式的数据
子系统类不会意识到外观的存在,它们在系统内运作并且相 互之间可直接进行交互
客户端(Client)使用外观代替对子系统对象的直接调用
Example外观package mainimport "fmt"type WalletFacade struct { account *Account wallet *Wallet securityCode *Se ...
结构型模式-代理模式
结构型模式-代理模式什么是代理模式代理是一种结构型设计模式, 让你能够提供对象的替代品或其占位符。代理控制着对于原对象的访问,并允许在 将请求提交给对象前后进行一些处理
服务接口(Service Interface)声明了服务接口。代理必须遵 循该接口才能伪装成服务对象
服务(Service)类提供了一些实用的业务逻辑。
代理(Proxy)类包含一个指向服务对象的引用成员变量。代 理完成其任务(例如延迟初始化、记录日志、访问控制和缓 存等)后会将请求传递给服务对象。通常情况下,代理会对 其服务对象的整个生命周期进行管理
客户端(Client) 能通过同一接口与服务或代理进行交互, 所以你可在一切需要服务对象的代码中使用代理。
Example主体package maintype server interface { handleRequest(string, string) (int, string)}
代理package maintype Nginx struct { application *Application ...
结构型模式-享元模式
结构型模式-享元模式什么是享元模式享元是一种结构型设计模式, 它摒弃了在每个对象中保存所有数据的方式,通过共享多个对象所共有的相同状态, 让你能在有限的内存容量中 载入更多对象
享元模式只是一种优化。在应用该模式之前,你要确定程序 中存在与大量类似对象同时占用内存相关的内存消耗问题, 并且确保该问题无法使用其他更好的方式来解决
. 享元(Flyweight)类包含原始对象中部分能在多个对象中共 享的状态。同一享元对象可在许多不同情景中使用。享元中 存储的状态被称为“内在状态”。传递给享元方法的状态被 称为“外在状态“
情景(Context)类包含原始对象中各不相同的外在状态。情 景与享元对象组合在一起就能表示原始对象的全部状态。
通常情况下,原始对象的行为会保留在享元类中。因此调用 享元方法必须提供部分外在状态作为参数。但你也可将行为 移动到情景类中,然后将连入的享元作为单纯的数据对象
客户端(Client)负责计算或存储享元的外在状态。在客户 端看来,享元是一种可在运行时进行配置的模板对象,具体 的配置方式为向其方法中传入一些情景数据参数
享元工厂(Flyweight ...
结构型模式-适配器模式
结构型模式-适配器模式什么是适配器模式适配器是一种结构型设计模式, 它能使接口不兼容的对象能够 相互合作
客户端(Client)是包含当前程序业务逻辑的类
客户端接口(Client Interface)描述了其他类与客户端代码 合作时必须遵循的协议
服务(Service)中有一些功能类(通常来自第三方或遗留系 统)。客户端与其接口不兼容,因此无法直接调用其功能
适配器(Adapter)是一个可以同时与客户端和服务交互的 类:它在实现客户端接口的同时封装了服务对象。适配器接 受客户端通过适配器接口发起的调用,并将其转换为适用于 被封装服务对象的调用。
Example客户端package mainimport "fmt"type Client struct {}func (c *Client) InsertLightningConnectorIntoComputer(com Computer) { fmt.Println("Client inserts Lightning connector into compute ...
结构型模式-组合模式
结构型模式-组合模式组合模式组合是一种结构型设计模式, 你可以使用它将对象组合成 树状结构,并且能像使用独立对象一样使用它们
组件(Component)接口描述了树中简单项目和复杂项目所 共有的操作
叶节点(Leaf)是树的基本结构,它不包含子项目。 一般情况下,叶节点最终会完成大部分的实际工作,因为它 们无法将工作指派给其他部分。
容器(Container)——又名“组合(Composite)”——是包含叶 节点或其他容器等子项目的单位。容器不知道其子项目所属 的具体类,它只通过通用的组件接口与其子项目交互。容器接收到请求后会将工作分配给自己的子项目,处理中间 结果,然后将最终结果返回给客户端
客户端(Client)通过组件接口与所有项目交互。因此,客 户端能以相同方式与树状结构中的简单或复杂项目交互
Example组件接口package maintype Component interface { search(string)}
组合package mainimport "fmt"type Folder struct ...
结构型模式-桥接模式
结构型模式-桥接模式什么是桥接模式桥接是一种结构型设计模式, 可将一个大类或一系列紧密 相关的类拆分为抽象和实现 两个独立的层次结构,从而 能在开发时分别使用。
抽象部分(Abstraction)提供高层控制逻辑,依赖于完成底 层实际工作的实现对象。
. 实现部分(Implementation)为所有具体实现声明通用接口。 抽象部分仅能通过在这里声明的方法与实现对象交互。抽象部分可以列出和实现部分一样的方法,但是抽象部分通 常声明一些复杂行为,这些行为依赖于多种由实现部分声明 的原语操作
具体实现(Concrete Implementations)中包括特定于平台的代码
精确抽象(Refined Abstraction)提供控制逻辑的变体。与其父类一样,它们通过通用实现接口与不同的实现进行交互
通常情况下,客户端(Client)仅关心如何与抽象部分合作。 但是,客户端需要将抽象对象与一个实现对象连接起来
Example抽象package maintype Computer interface { Print() SetPrinter(Printer) ...
创建型模式-单例模式
创建型模式-单例模式什么是单利模式单例是一种创建型设计模式, 让你能够保证一个类只有一个实例,并提供一个访问该 实例的全局节点
单例模式,一个类只有一个实例
为该实例提供一个全局访问节点
单例(Singleton)类声明了一个名为 getInstance 获取实 例 的静态方法来返回其所属类的一个相同实例。单例的构造函数必须对客户端(Client) 代码隐藏。 调用 获取实例 方法必须是获取单例对象的唯一方式。
Example简单单例package mainimport ( "fmt" "sync")var lock = &sync.Mutex{}type single struct {}var singleInstance *singlefunc getInstance() *single { if singleInstance == nil { lock.Lock() defer lock.Unlock() ...