《Linux内核--分析Linux内核创建一个新进程的过程 》 20135311傅冬菁
20135311傅冬菁
分析Linux内核创建一个新进程的过程
一、学习内容
进程控制块——PCB task_struct数据结构
PCB task_struct中包含:
进程状态、进程打开的文件、进程优先级信息
操作系统管理的三个功能:
1.进程管理 2.内存管理 3.文件系统
Linux进程的状态:

进程状态分析:

long state是进程的运行状态,-1是未执行,0是执行中,大于0则是暂停;
*stack 是建立一个内核堆栈;
flags 是定义了每个进程的标识符;

list_head tasks 这部分是定义双向链表的;
mm_struct *mm 这部分是定义内存管理中,进程的地址空间;
以上这部分代码也属于进程任务堆栈;

定义进程的PID标识符;

定义进程间父子的继承关系;

与CPU相关的线程的定义;(在Linux系统中,系统将线程看作是轻量级的进程,基本上将进程和线程一视同仁)
该部分定义了线程的数据结构、文件结构、信号量等;
进程创建分析:
大部分进程都是由fork()函数创建出来的;而调用fork()函数实际上是调用了clone();

fork()函数代码及分析:
#include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 int main(int argc, char * argv[])
5 {
6 int pid;
7 /* fork another process */
8 pid = fork();//调用fork创建一个进程;
9 if (pid < 0)
10 {
11 /* error occurred */
12 fprintf(stderr,"Fork Failed!");
13 exit(-1);
14 }
15 else if (pid == 0)
16 {
17 /* child process */
18 printf("This is Child Process!\n");//创建子进程 fork系统调用在父进程和子进程各返回一次
19 }
20 else
21 {
22 /* parent process */
23 printf("This is Parent Process!\n");
24 /* parent will wait for the child to complete*/
25 wait(NULL);
26 printf("Child Complete!\n");
27 }
28 }
fork、vfork和clone三个系统调用都可以创建一个新进程,而且都是通过调用do_fork来实现进程的创建。
创建新进程是通过复制当前进程实现的。do_fork主要是复制了父进程的task_struct,然后修改必要的信息,从而得到子进程的task_struct。复制一个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、进程链表等。
二、实验过程





三、学习小结
1.Linux通过clone()系统调用实现fork()
2.fork(),vfork(),和clone()库函数都是根据各自需要的参数标志去调用clone(),然后由clone()调用do_fork。其中do_fork函数调用了copy_process()函数,然后让进程执行 Linux通过复制父进程创建新进程,fork、vfork、clone都是通过do_exit实现进程的创建。
3.进程创建的内容:
复制一个PCB struct
给新进程分配一个新的内核堆栈
对子进程进行初始化,修改复制的数据。
4.父进程和子进程各返回一次。
《Linux内核--分析Linux内核创建一个新进程的过程 》 20135311傅冬菁的更多相关文章
- linux内核分析作业6:分析Linux内核创建一个新进程的过程
task_struct结构: struct task_struct { volatile long state;进程状态 void *stack; 堆栈 pid_t pid; 进程标识符 u ...
- 第六周分析Linux内核创建一个新进程的过程
潘恒 原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 task_struct结构: ...
- 实验 六:分析linux内核创建一个新进程的过程
实验六:分析Linux内核创建一个新进程的过程 作者:王朝宪 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029 ...
- 20135202闫佳歆--week6 分析Linux内核创建一个新进程的过程——实验及总结
week 6 实验:分析Linux内核创建一个新进程的过程 1.使用gdb跟踪创建新进程的过程 准备工作: rm menu -rf git clone https://github.com/mengn ...
- 作业六:分析Linux内核创建一个新进程的过程
分析Linux内核创建一个新进程的过程 进程描述符PCB----task_struct数据结构 操作系统:1.进程管理 2.内存管理 3 文件系统 一.新进程如何创建和修改task_struct数据结 ...
- Linux内核分析-分析Linux内核创建一个新进程的过程
作者:江军 ID:fuchen1994 实验题目:分析Linux内核创建一个新进程的过程 阅读理解task_struct数据结构http://codelab.shiyanlou.com/xref/li ...
- Linux内核分析第六周学习笔记——分析Linux内核创建一个新进程的过程
Linux内核分析第六周学习笔记--分析Linux内核创建一个新进程的过程 zl + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...
- 第六周——分析Linux内核创建一个新进程的过程
"万子恵 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 &q ...
- 分析Linux内核创建一个新进程的过程
一.原理分析 1.进程的描述 进程控制块PCB——task_struct,为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息. struct task_struct ...
随机推荐
- digital ocean 内存不足时增加swap文件的方法
买了比较低配的digitalocean 云主机,在执行composer update的时候出现内存不足的问题,但是内存大小已经固定了,除非加钱,还有别的方法吗? 有,增加swap分区,这样就可以弥补内 ...
- Azkaban学习之路 (二)Azkaban的安装
安装过程 1.软件介绍 Azkaban Web 服务器:azkaban-web-server-2.5.0.tar.gz Azkaban Excutor 执行服务器:azkaban-executor-s ...
- FileUriExposedException_Android7.0适配
一. FileUriExposedException的解决 问题 由于在Android7.0上,google使用了新的权限机制,所以导致在调用相机的时候,如果传递的URI为”file://”类型,的系 ...
- 通过SSH秘钥登录线上MySQL数据库(基于Navicat)
前言 生产环境的数据库往往需要经过严格的安全限制,所以禁用密码登录,使用秘钥的方式是一种相对安全的登录方式. 原理: 角色: 主机A:其他主机,有访问线上数据库的权限 主机B:线上数据库的主机 主机C ...
- JS输入框邮箱自动提示(带有demo和源码)
今天在javascriptQQ群里面 有童鞋问到 有没有 "JS输入框邮箱自动提示"插件,即说都找遍了github上源码 都没有看到这样类似的插件,然后我想了下 "JS输 ...
- Python2.7-robotparser
robotparser 模块,用于解析网站的 robots.txt 文件,robots.txt 文件是用于指定搜索引擎爬虫的访问权限的,此模块在 python3 中重命名为 urllib.robotp ...
- maven使用及创建项目
一:简单介绍 他是一个帮我们管理jar,并帮助我们处理jar包依赖. 他是一个我们编译.测试.运行.打包的一键构建. 我们在使用后面的命令的同时,前面的过程也自动执行. 二.仓库的分类: 分本地仓库. ...
- CSS3注意点
1.background-Origin属性指定了背景图像的位置区域.content-box, padding-box,和 border-box区域内可以放置背景图像.注意:背景色是不起作用的 2.ba ...
- js获取图片的原始尺寸
<!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...
- always on 集群
准备工作 1. 四台已安装windows server 2008 r2 系统的虚拟机,配置如下: CPU : 1核 MEMORY : 2GB DISK : 40GB(未分区) NetAdapter ...