进程的描述和进程的创建
进程控制块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; //调度到子进程时的第一条指令地址
进程的描述和进程的创建相关推荐
- Linux内核分析——进程的描述和进程的创建
进程的描述和进程的创建 一. 进程的描述 (一)进程控制块PCB--task_struct 1.操作系统的三大管理功能包括: (1)进程管理 (2)内存管理 (3)文件系统 2.PCB task_st ...
- 20135337朱荟潼 Linux第六周学习总结——进程的描述和进程的创建
朱荟潼 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课http://mooc.study.163.com/course/USTC 1000029000 第六周 进程的描述 ...
- 《Linux内核分析》 第六节 进程的描述和进程的创建
<Linux内核分析> 第六节 进程的描述和进程的创建 20135307 张嘉琪 原创作品转载请注明出处 +<Linux内核分析>MOOC课程http://mooc.study ...
- Linux内核分析 笔记六 进程的描述和进程的创建 ——by王玥
一.知识点总结 (一)进程的描述 1.操作系统内核里有三大功能: 进程管理 内存管理 文件系统 2.进程描述符:task_struct 2.进程描述符--struct task_struct 1. p ...
- 『操作系统』 进程的描述与控制 Part 1 前驱图与程序执行
文章目录 2.1 前趋图和程序执行 2.1.1 程序的顺序执行及其特征 1. 程序的顺序执行 2.程序顺序执行时的特征 2.1.2 前趋图 2.1.3 程序的并发执行及其特征 1. 程序的并发执行 2 ...
- 模拟进程创建、终止、阻塞、唤醒原语_操作系统第二章--进程的描述与控制
操作系统第二章--进程的描述与控制 前趋图和程序执行 前趋图 前趋图是一个有向无循环图DAG,用来描述进程之间执行的前后关系 初始结点:没有前趋的结点 终止结点:没有后继的结点 重量:表示该结点所含有 ...
- 【操作系统】进程的描述与控制(这知识它不进脑子啊~!)
文章目录 1 前驱图和程序执行 1.1 程序顺序执行 1.2 程序并发执行 2 进程的描述 2.1 进程的定义和特征 2.2 进程的基本状态及转换 2.3 挂起状态和进程状态的转换 2.4 进程管理中 ...
- Linux第六周学习总结——进程额管理和进程的创建
Linux第六周学习总结--进程额管理和进程的创建 作者:刘浩晨 [原创作品转载请注明出处] <Linux内核分析>MOOC课程http://mooc.study.163.com/cour ...
- 操作系统第二章-进程的描述与控制
前趋图和程序执行 1.前趋图 所谓前趋图(PG),是指一个有向无环图,可记为DAG,用于描述进程之间执行的先后顺序,具体见书上P35. 没有前趋的结点称为初始结点,没有后继的结点称为终止结点,每个结点 ...
最新文章
- 笔记 | 深入理解Transformer
- 2021年春季学期-信号与系统-第十一次作业参考答案-第二小题
- C#面试题整理(不带答案)
- tiny服务器系列,项目:TinyHTTP服务器
- linux hosts和hostname
- jquery 之for 循环
- fatal: unable to access 'https://github.com:***' 或者本机ping不通github.com解决方法
- GIMP:图层蒙版应用小例
- 商标注册服务的详细讲解
- android手机电池寿命,手机用多久换电池比较合适?
- 图片填满外层div 自适应不拉伸变形
- 关于ADC芯片的选型
- 程序员面试、算法研究、编程艺术、红黑树、机器学习5大系列集锦(转)
- win7计算机无法连接投影仪,手把手操作win7系统无法连接投影仪的修复教程
- 【PS】平面设计:如何旋转图片
- 浏览器书签同步插件EverSync
- 计算机科学期末网页大作业快看漫画源码(纯享免费版)需要自取免费配置环境
- aspx连接mysql木马_让你变成ASP木马高手_安全教程_脚本之家
- 听完计算机讲座的感想,听讲座心得体会5篇
- Android L无法接听/拒接来电现象的分析与解决(文末对比Android M)
热门文章
- 新手产品经理怎样去选择一款原型工具
- SpringBoot AOP 记录WEB请求日志
- oracle启动限制模式
- .iOS APP Project or Mac APP Project编译错误提示: My Mac 64-bit is not valid for Running the scheme...
- Linux 命令(28)—— tee 命令
- mysql(5.6及以下)解析json
- 【POJ 1860】Currency Exchange
- 关于伪类:after和content的实际应用
- Java 蹒跚自学之 第八日 数组 二分查找法
- 计算机桌面不来回变黑,电脑屏幕变小了左右黑几种解决方法