进程控制块PCB——task_struct

为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息。

  • struct task_struct数据结构很庞大

  • Linux进程的状态与操作系统原理中的描述的进程状态似乎有所不同,比如就绪状态和运行状态都是TASK_RUNNING,为什么呢?

  • 进程的标示pid

  • 所有进程链表struct list_head tasks;

    • 内核的双向循环链表的实现方法 - 一个更简略的双向循环链表

  • 程序创建的进程具有父子关系,在编程时往往需要引用这样的父子关系。进程描述符中有几个域用来表示这样的关系

  • Linux为每个进程分配一个8KB大小的内存区域,用于存放该进程两个不同的数据结构:Thread_info和进程的内核堆栈

    • 进程处于内核态时使用,不同于用户态堆栈,即PCB中指定了内核栈,那为什么PCB中没有用户态堆栈?用户态堆栈是怎么设定的?

    • 内核控制路径所用的堆栈很少,因此对栈和Thread_info来说,8KB足够了

  • struct thread_struct thread; //CPU-specific state of this task

  • 文件系统和文件描述符

  • 内存管理——进程的地址空间

参考资料

  • ProgramAndProcess

fork一个子进程的代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char * argv[])
{int pid;/* fork another process */pid = fork();if (pid < 0) { /* error occurred */fprintf(stderr,"Fork Failed!");exit(-1);} else if (pid == 0) {/* child process */printf("This is Child Process!\n");} else { /* parent process  */printf("This is Parent Process!\n");/* parent will wait for the child to complete*/wait(NULL);printf("Child Complete!\n");}
}

建一个新进程在内核中的执行过程

  • fork、vfork和clone三个系统调用都可以创建一个新进程,而且都是通过调用do_fork来实现进程的创建;

  • Linux通过复制父进程来创建一个新进程,那么这就给我们理解这一个过程提供一个想象的框架:

    • 复制一个PCB——task_struct

      err = arch_dup_task_struct(tsk, orig);
    • 要给新进程分配一个新的内核堆

ti = alloc_thread_info_node(tsk, node);
tsk->stack = ti;
setup_thread_stack(tsk, orig); //这里只是复制thread_info,而非复制内核堆栈
  • 要修改复制过来的进程数据,比如pid、进程链表等等都要改改吧,见copy_process内部。

  • 从用户态的代码看fork();函数返回了两次,即在父子进程中各返回一次,父进程从系统调用中返回比较容易理解,子进程从系统调用中返回,那它在系统调用处理过程中的哪里开始执行的呢?这就涉及子进程的内核堆栈数据状态和task_struct中thread记录的sp和ip的一致性问题,这是在哪里设定的?copy_thread in copy_process

    *childregs = *current_pt_regs(); //复制内核堆栈
    childregs->ax = 0; //为什么子进程的fork返回0,这里就是原因!p->thread.sp = (unsigned long) childregs; //调度到子进程时的内核栈顶
    p->thread.ip = (unsigned long) ret_from_fork; //调度到子进程时的第一条指令地址

进程的描述和进程的创建相关推荐

  1. Linux内核分析——进程的描述和进程的创建

    进程的描述和进程的创建 一. 进程的描述 (一)进程控制块PCB--task_struct 1.操作系统的三大管理功能包括: (1)进程管理 (2)内存管理 (3)文件系统 2.PCB task_st ...

  2. 20135337朱荟潼 Linux第六周学习总结——进程的描述和进程的创建

    朱荟潼 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课http://mooc.study.163.com/course/USTC 1000029000 第六周 进程的描述 ...

  3. 《Linux内核分析》 第六节 进程的描述和进程的创建

    <Linux内核分析> 第六节 进程的描述和进程的创建 20135307 张嘉琪 原创作品转载请注明出处 +<Linux内核分析>MOOC课程http://mooc.study ...

  4. Linux内核分析 笔记六 进程的描述和进程的创建 ——by王玥

    一.知识点总结 (一)进程的描述 1.操作系统内核里有三大功能: 进程管理 内存管理 文件系统 2.进程描述符:task_struct 2.进程描述符--struct task_struct 1. p ...

  5. 『操作系统』 进程的描述与控制 Part 1 前驱图与程序执行

    文章目录 2.1 前趋图和程序执行 2.1.1 程序的顺序执行及其特征 1. 程序的顺序执行 2.程序顺序执行时的特征 2.1.2 前趋图 2.1.3 程序的并发执行及其特征 1. 程序的并发执行 2 ...

  6. 模拟进程创建、终止、阻塞、唤醒原语_操作系统第二章--进程的描述与控制

    操作系统第二章--进程的描述与控制 前趋图和程序执行 前趋图 前趋图是一个有向无循环图DAG,用来描述进程之间执行的前后关系 初始结点:没有前趋的结点 终止结点:没有后继的结点 重量:表示该结点所含有 ...

  7. 【操作系统】进程的描述与控制(这知识它不进脑子啊~!)

    文章目录 1 前驱图和程序执行 1.1 程序顺序执行 1.2 程序并发执行 2 进程的描述 2.1 进程的定义和特征 2.2 进程的基本状态及转换 2.3 挂起状态和进程状态的转换 2.4 进程管理中 ...

  8. Linux第六周学习总结——进程额管理和进程的创建

    Linux第六周学习总结--进程额管理和进程的创建 作者:刘浩晨 [原创作品转载请注明出处] <Linux内核分析>MOOC课程http://mooc.study.163.com/cour ...

  9. 操作系统第二章-进程的描述与控制

    前趋图和程序执行 1.前趋图 所谓前趋图(PG),是指一个有向无环图,可记为DAG,用于描述进程之间执行的先后顺序,具体见书上P35. 没有前趋的结点称为初始结点,没有后继的结点称为终止结点,每个结点 ...

最新文章

  1. 笔记 | 深入理解Transformer
  2. 2021年春季学期-信号与系统-第十一次作业参考答案-第二小题
  3. C#面试题整理(不带答案)
  4. tiny服务器系列,项目:TinyHTTP服务器
  5. linux hosts和hostname
  6. jquery 之for 循环
  7. fatal: unable to access 'https://github.com:***' 或者本机ping不通github.com解决方法
  8. GIMP:图层蒙版应用小例
  9. 商标注册服务的详细讲解
  10. android手机电池寿命,手机用多久换电池比较合适?
  11. 图片填满外层div 自适应不拉伸变形
  12. 关于ADC芯片的选型
  13. 程序员面试、算法研究、编程艺术、红黑树、机器学习5大系列集锦(转)
  14. win7计算机无法连接投影仪,手把手操作win7系统无法连接投影仪的修复教程
  15. 【PS】平面设计:如何旋转图片
  16. 浏览器书签同步插件EverSync
  17. 计算机科学期末网页大作业快看漫画源码(纯享免费版)需要自取免费配置环境
  18. aspx连接mysql木马_让你变成ASP木马高手_安全教程_脚本之家
  19. 听完计算机讲座的感想,听讲座心得体会5篇
  20. Android L无法接听/拒接来电现象的分析与解决(文末对比Android M)

热门文章

  1. 新手产品经理怎样去选择一款原型工具
  2. SpringBoot AOP 记录WEB请求日志
  3. oracle启动限制模式
  4. .iOS APP Project or Mac APP Project编译错误提示: My Mac 64-bit is not valid for Running the scheme...
  5. Linux 命令(28)—— tee 命令
  6. mysql(5.6及以下)解析json
  7. 【POJ 1860】Currency Exchange
  8. 关于伪类:after和content的实际应用
  9. Java 蹒跚自学之 第八日 数组 二分查找法
  10. 计算机桌面不来回变黑,电脑屏幕变小了左右黑几种解决方法