进程线程调度

进程线程基础知识

link

进程 是处于执行期的程序以及相关的资源的总称,是操作系统资源分配的单位。

进程的资源到底包括什么?
1.打开的文件
2.挂起的信号
3.内核的内部数据
4.处理器的状态
5.内存映射的内存地址空间 等等

Linux系统对线程和进程并不特别区分。线程仅仅被视为一个与其他线程共享某些资源的进程。每个线程都拥有唯一自己的task_struct。

内核调度的对象是根据task_struct结构体。可以说是线程,而不是进程。

不仅仅要有资源,还需要有进程的描述,例如:pid

linux通过task_struct结构体描述一个进程。

mm 成员:描述内存资源
fs 成员:描述文件系统资源
files 成员:进程运行时打开了多少文件,fd的数组
signal 成员:进程接收的信号资源

image

Linux通过slab分配器分配task_struct结构,只需在栈底创建新的结构,struct thread_info。
每个任务的thread_info结构在它的内核栈的尾端分配。

  • Linux进程生命周期(就绪、运行、睡眠、停止、僵死)

fork、vfork、clone

link

感觉这一章讲的东西不多

由于执行fork()引入了写时拷贝并且明确了子进程先执行,所以 vfork()的好处就仅限于不拷贝父进程的页表项mm_struct。vfork()系统调用的实现是通过向clone()系统调用传递一个特殊标志来进行。

vfork场景下父进程会先休眠,等唤醒子进程后,再唤醒父进程。

这么做的好处是:由于子进程被创建出来,与父进程共享地址空间,且只读。只有在执行exec的创建新的内存映射时才会拷贝父进程的数据,来创建新的地址空间。如果此时,父进程还在执行,就有可能产生脏数据,或发生死锁。

调度

  • 介绍进程的调度器,设计的目标:吞吐和响应,轮流让其他进程获取CPU资源。
  • 调度器的其他内容:关于多核、分群、硬实时

讲了非常浅的调度,不过这部分内容应该算是绪论,也没什么好做笔记的地方,甚至我觉得不如GPT详细