1. 进程
参考博客及链接:
宋宝华:linux进程及调度课程
【Linux系列】进程PCB控制管理详解_linux进程pcb-CSDN博客
1.1 进程的定义
进程是资源分配的单位,是一个正在执行的程序的实例。程序的代码加数据组成了程序,通用的分配单位是PCB 进程控制块(存储着操作系统对控制一个进程所需要的全部信息)。
pcb一般包含以下几点,
1.进程标识信息
2.处理机状态
3.进程调度信息
4.进程控制信息
在linux的pcb是task_struct 结构体
PID:这是PCB中最为重要的信息,也是我们区分不同的进程的标志。
进程的状态,有就绪、运行、挂起、停止等状态。
进程切换时需要保存和恢复的一些CPU寄存器
内存资源 mm_struct 管理内存mmap指向的虚拟捏村空间
【Linux】Linux的虚拟内存详解(MMU、页表结构)_虚拟存储的页表长度是根据什么怎么设置的呢-CSDN博客
linux内存管理笔记(十三)----页表映射_linux页表映射-CSDN博客
文件系统资源 fs_struct 路径
文件资源 打开的文件描述符
umask掩码 signal等对进程的描述
相关的指令:
查看最大pid数量
cat /proc/sys/kernel/pid_max
32786
来查看进程信息
ls /proc/
pstree:进程树
ps 或 top来查看进程信息
查看一下进程的优先级
ps -elf
nice -n 新NICE值 -p PID 来更改一个已有进程的NICE值
1.2 task_struct管理结构
遍历用链表
父子关系用树
快速查找用哈希表
1.3 进程状态
1、运行状态 (R ):
这个状态表明进程要么正在运行要么就在进程队列中。
2、睡眠状态(S):
表示进程正在等待某个时间的完成。同时睡眠也分为可中断和不可中断的睡眠。这里的睡眠指可中断睡眠。(可中断睡眠就是这里的浅度睡眠,可以被资源唤醒,也可以被信号唤醒)
3、磁盘睡眠状态(D):
这里的睡眠指的即是不可中断睡眠。这个状态的进程往往是在等待IO的结束。(深度睡眠,不能被唤醒)
4、停止状态(T):
这里的停止状态指的是通过指令让一个进程处于暂停状态,同时我们是随时可以将其恢复继续运行的。
stop ctrl z gdb
发送continue可以进入就绪态
ctrl z 可以暂停进程,fg 继续跑进程
cpulimit -l 20 -p 11296
限制pid号为11296 的进程的占用率为20%
@后台运行,$后台运行
5、死亡状态(X):
这个状态并不会在查看进程的时候显示,因为这个状态的进程已经完全停止了,是不可恢复的。
6.僵尸状态(Z):
是由于子进程在运行中退出但父进程并未读取子进程的退出状态码所导致的,并且此时的子进程为了等待父进程读取退出状态码一直处于僵死状态,由此产生僵尸进程,直到父进程也退出
僵尸态,相关的资源已经释放了,无内存泄漏,task_struct还存在,父进程可以查看子进程的死亡原因,父进程可以通过wait_pid查看僵尸态的子进程原因,然后子进程就会销毁
内存泄漏指的是,运行时间越久,耗费内存越多
托孤
如果父进程一直不去接收僵尸态的子进程的死亡原因关闭父进程,或者子进程正常运行关闭父进程,这两种情况下关闭父进程之后,会有subreaper来管理孤儿进程
子进程的父进程会从原来的父进程变成1号进程——init进程(在树上就是subreaper )
reaper 收割机
subreaper 在树上找一个就近的节点负责
睡眠:等待队列 wait queue
uboot启动0号进程,然后0号进程创建1号init进程,0号进程退化成idle进程,所有进程都停止运行了,才会运行idle进程
1.4 进程的创建
fork() 函数是有返回值的,在父进程中fork()返回子进程的PID,在子进程中返回0
由于子进程会完全复制父进程的PID因此子进程在创建后会和父进程一起执行创建进程之后的语句直到进程结束。
fork()
对拷task_struct,mmap 写时拷贝,读时共享
在创建出子进程后,代码段是不需要再次进行拷贝的,可以共享同一个物理内存,而数据段如果我们只是想要看的话不需要拷贝,一份就够了,如果想要更改这个数据,则需要重新拷贝一份
vfork() mm指针一样,内存资源一样
vfork()创建完子进程会优先执行子进程,并且子进程不会完全复制父进程的PCB,为了节省空间子进程会和父进程共用一块虚拟内存,为了不导致调用栈混乱,子进程会阻塞父进程,也就是说父进程会在子进程退出或替换后才会执行
top -H 线程视角查看资源管理器 每一个线程的cpu利用率
用户空间的pid 进程pid getpid()
内核里的pid tgid 就是每个线程的pid
2.进程调度
玩转Linux内核进程调度,这一篇就够(所有的知识点) - 知乎 (zhihu.com)
Linux内核中的进程调度-调度器基础_内核 调度器-CSDN博客
深入理解Linux内核进程的管理与调度(最详细)-腾讯云开发者社区-腾讯云 (tencent.com)
3.多核的进程调度
设置进程的亲和性
-a把进程的所有都设置成 mask(01 02 03 )上的cpu运行
中断的负载均衡
实时性 的意思是可预期
软中断可以被中断打断
中断,软中断,spinlock 里面产生了rt,都不能抢占
延迟不可预期