目录
TASK_STRUCT结构具有统一性和多样性,内核如何对待进程、线程和内核线程?
编写一个程序,使用fork函数来创建一个子进程,并分别输出父子进程的进程ID
3.1进程概述
通过调用fork系统调用来创建一个新的进程,新建的子系统也可以调用fork,从而形成进程树,可用ps指令查看。
进程控制块:
linux内核中把对进程的描述结构叫做task_struct结构。传统的书中,这样的数据结构叫做PCB进程控制块
进程控制块的信息分类:
进程的状态以及转换:
状态用来描述进程的动态变化
就绪 睡眠 运行
进程之间的亲属关系:
系统在创建进程时候具有父子关系,一个进程可以创建几个子进程,子进程之间具有兄弟关系。
进程控制块存放在内存的什么地方?
linux为了节省空间,把内核栈和一个紧挨着PCB的小数据结构thread_info放在一起,占用8KB内存
把PCB与内核栈放在一起有什么好处?
进程的组织方式——进程链表
0号进程永远不会被撤销,它的PCB被静态分配在内核的数据段中,也就是说list_head预先被编译器编译,在运行过程中保持不变,而其他PCB在进程运行的过程中由系统根据当前的内存状况随机分配,撤销时再归还给系统。
实例:
从进程到容器:
对于进程来说,它的静态表现就是程序,平时安安静静呆在磁盘上,一旦运行起来编程计算机中的数据和状态的综合,这就是他的动态表现。
3.2 linux进程创建
为啥觉得创建之后对其没有控制权?
创建这件事情完全由操作系统来控制,你只是发出一个创建请求。
进程和线程:
提出问题:
进程的资源到底有哪些,如何体现?
线程为什么是轻量级的运行单位,如何体现?
进程和线程几乎共享所有的资源,包括代码、数据、进程空间、打开的文件等。
线程只拥有自己的寄存器和栈。
TASK_STRUCT结构具有统一性和多样性,内核如何对待进程、线程和内核线程?
内核使用唯一的数据结构task_struct结构来分别表示他们,也使用相同的调度算法对