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。

    子系统

  1. cpu 子系统,主要限制进程的 cpu 使用率。
  2. cpuacct 子系统,可以统计 cgroups 中的进程的 cpu 使用报告。
  3. cpuset 子系统,可以为 cgroups 中的进程分配单独的 cpu 节点或者内存节点。
  4. memory 子系统,可以限制进程的 memory 使用量。
  5. blkio 子系统,可以限制进程的块设备 io。
  6. devices 子系统,可以控制进程能够访问某些设备。
  7. net_cls 子系统,可以标记 cgroups 中进程的网络数据包,然后可以使用 tc 模块(traffic control)对数据包进行控制。
  8. freezer 子系统,可以挂起或者恢复 cgroups 中的进程。
  9. 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 屏蔽HUP信号 & 屏蔽SIGINT信号

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

每个计算机只有一个,开机关机时显示的东西(内核信息等)其实是显示的在控制台上。
image.png

Terminal Emulator(终端模拟器)

iTerm就是终端模拟器。

孤儿进程

父进程创建了子进程之后退出,会造成子进程没有父进程,从而使子进程变成一个孤儿进程。
在Linux中,每当系统发现一个孤儿进程,就会自动由1号进程(也就是init进程)收养它,这样,原先的子进程就会变成init进程的子进程了。

文件描述符

维护文件描述符的三个表

image.png
进程级:文件描述符标志、文件指针(open file handle)
系统级(open file table):当前文件偏移量、状态标志、i-node指针、文件访问模式(读、写、读写)、文件类型等
i-node:文件类型、文件锁
image.png

  • 在进程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