Docker源码学习进度(2)

3.容器资源限制的实现 (Cgroup,subsystem,hierarchy)

总的思想是向Cgroup里的文件写限制内容实现。

①subsystem相关结构实现

type ResourceConfig struct{

    MemoryLimit string

    CpuShare      string

    Cpuset            string

}

//set, apply, remove都是通过将内容写入到cgroup文件中来实现的

type Subsystem interface 

    Name() string

    Set(path string, res *ResourceConfig) error    //Set的作用是加入资源限制

    Apply(path string, pid int) error                        //将进程pid加入Cgroup中

    Remove(path string) error                               //删除Cgroup

}

//这里创建了subsystem的三个实例,分别是CPUset,memory,CPU.

var (

    SubsystemsIns = []Subsystem{

        &CpusetSubSystem{},        

        //这里创建了一个无名的MemorySubSystem结构类型

        //但上面的切片类型为Subsystem,这就有点像C++中的向上类型转换.

        &MemorySubSystem{},       

        &CpuSubSystem{},

    }

)

②MemorySubSystem

func (s *MemorySubSystem) Set(cgroupPath string, res *ResourceConfig) error

//获得Cgroup root的绝对地址

if subsysCgroupPath, err := GetCgroupPath(s.Name(), cgroupPath, true); err == nil {

if res.MemoryLimit != "" {

//将cgroup中的内存限制写入到memory.limit_in_bytes文件中

if err := ioutil.WriteFile(path.Join(subsysCgroupPath, "memory.limit_in_bytes"), []byte(res.MemoryLimit), 0644)

}

4.Pipe的实现

你可能感兴趣的:(Docker源码学习进度(2))