Cgroups
cgroups 是Linux内核提供的一种可以限制单个进程或者多个进程所使用资源的机制,可以对 cpu,内存等资源实现精细化的控制。Yarn和Docker都是使用cgroups控制CPU资源。
术语表
- task(任务):cgroups 的术语中,task 就表示系统的一个进程。
- cgroup(控制组):cgroups 中的资源控制都以 cgroup 为单位实现。cgroup 表示按某种资源控制标准划分而成的任务组,包含一个或多个子系统。一个任务可以加入某个 cgroup,也可以从某个 cgroup 迁移到另外一个 cgroup。
- subsystem(子系统):cgroups 中的 subsystem 就是一个资源调度控制器(Resource Controller)。比如 CPU 子系统可以控制 CPU 时间分配,内存子系统可以限制 cgroup 内存使用量。
- hierarchy(层级树):hierarchy 由一系列 cgroup 以一个树状结构排列而成,每个 hierarchy 通过绑定对应的 subsystem 进行资源调度。hierarchy 中的 cgroup 节点可以包含零或多个子节点,子节点继承父节点的属性。整个系统可以有多个 hierarchy。
子系统
- cpu 子系统,主要限制进程的 cpu 使用率。
- cpuacct 子系统,可以统计 cgroups 中的进程的 cpu 使用报告。
- cpuset 子系统,可以为 cgroups 中的进程分配单独的 cpu 节点或者内存节点。
- memory 子系统,可以限制进程的 memory 使用量。
- blkio 子系统,可以限制进程的块设备 io。
- devices 子系统,可以控制进程能够访问某些设备。
- net_cls 子系统,可以标记 cgroups 中进程的网络数据包,然后可以使用 tc 模块(traffic control)对数据包进行控制。
- freezer 子系统,可以挂起或者恢复 cgroups 中的进程。
- ns 子系统,可以使不同 cgroups 下面的进程使用不同的 namespace。
权限
ls -al
第一个字符代表这个文件是“目录、文件或链接文件等等”:
- 当为[ d ]则是目录,例如上表文件名为“.config”的那一行;
- 当为[ - ]则是文件,例如上表文件名为“initial-setup-ks.cfg”那一行;
- 若是[ l ]则表示为链接文件(link file);
- 若是[ b ]则表示为设备文件里面的可供储存的周边设备(可随机存取设备);
- 若是[ c ]则表示为设备文件里面的序列埠设备,例如键盘、鼠标(一次性读取设备)。
chgrp 改变所属组
chown 改变所有者
chmod 改变权限
Linux进程
PID:进程唯一标识
PGID:子进程继承父进程的组ID。
SID:每个进程都有,子进程会继承父进程。每个终端(TTY)会创建一个SID,终端就是SID的首进程。会话的首进程ID作为SID。会话是进程集合。囊括用户所有活动进程。
进程组
创建
大部分进程自己就是组Leader,组里就它自己一个进程。
管道连接属于同一进程组 ls | less,ls 是组Leader。
fork()的所有子进程都属于父进程的进程组。CTRL+C后,所有进程都会收到SIGINT退出。
当用户注销或网络断开,终端会收到HUP信号关闭所有子进程。
nohup(no hang up)
HUP信号
setsid
nohup
- 将stdin重定向到/dev/null,于是程序读标准输入将会返回EOF
- 将stdout和stderr重定向到nohup.out或者用户通过参数指定的文件,程序所有输出到stdout和stderr的内容将会写入该文件(有时在文件中看不到输出,有可能是程序没有调用flush)
- 屏蔽掉SIGHUP信号
- 调用exec启动指定的命令(nohup进程将会被新进程取代,但进程ID不变)
tty
当tty收到input的输入后,会检查当前前端进程组是哪一个,然后将输入放到进程组的leader的输入缓存中,这样相应的leader进程就可以通过read函数得到用户的输入。
每一个终端都有一个tty与之对应。
终端、控制台
早年是硬件,现在已经变成软件概念了。显示系统消息的终端成为控制台。Linux现在已经不咋区分了。
控制台 console
每个计算机只有一个,开机关机时显示的东西(内核信息等)其实是显示的在控制台上。
Terminal Emulator(终端模拟器)
孤儿进程
父进程创建了子进程之后退出,会造成子进程没有父进程,从而使子进程变成一个孤儿进程。
在Linux中,每当系统发现一个孤儿进程,就会自动由1号进程(也就是init进程)收养它,这样,原先的子进程就会变成init进程的子进程了。
文件描述符
维护文件描述符的三个表
进程级:文件描述符标志、文件指针(open file handle)
系统级(open file table):当前文件偏移量、状态标志、i-node指针、文件访问模式(读、写、读写)、文件类型等
i-node:文件类型、文件锁
- 在进程A中,文件描述符1和30都指向了同一个打开的文件句柄(#23),这可能是该进程多次对执行
打开
操作 - 进程A中的文件描述符2和进程B的文件描述符2都指向了同一个打开的文件句柄(#73),这种情况有几种可能,1.进程A和进程B可能是父子进程关系;2.进程A和进程B打开了同一个文件,且文件描述符相同(低概率事件=_=);3.A、B中某个进程通过UNIX域套接字将一个打开的文件描述符传递给另一个进程。
- 进程A的描述符0和进程B的描述符3分别指向不同的打开文件句柄,但这些句柄均指向i-node表的相同条目(#1936),换言之,指向同一个文件。发生这种情况是因为每个进程各自对同一个文件发起了打开请求。同一个进程两次打开同一个文件,也会发生类似情况。
参考
https://linuxtools-rst.readthedocs.io/zh_CN/latest/base/index.html