Linux进程的创建

系统的进程管理:
1、系统的进程的运转方式
系统时间:(jiffies系统滴答) 在cpu内部有一个RTC系统定时器 在上电时MKtime函数计算出在目前到1970年经历的秒数 是由初始化时从RTC中读出的参数 转化为时间存入全局变量中,并且会为jiffies所用
10ms一个系统滴答会引发一个系统中断 在syscall中jiffies进行自加 并调用call do_timer
if(CPL)//CPL变量是内核中用来指示被中断程序的特权 0表示内核进程 1表示被中断的是用户进程
utime++用户时间++ stime++内核时间++
counter 进程的时间片
task_struct一个进程 task_struct[]进程向量表
counter的使用 进程的调用就是找task_struct[]进程链表的检索,找时间片最大的那个进程对象 然后运行调用,直到时间片为0退出 之后进程新一轮的调用
counter的设置 当全部的task_struct[]中所有的进程的counter都为0,就进行新一轮的时间片的分配
Linux进程的创建_第1张图片
2、进行创建一个新的进程
进程的本质 在系统就是一个结构体的链表 通过分时技术进行多进程调度
Linux进程的创建_第2张图片Linux进程的创建_第3张图片
进程的创建:Linux在初始化的过程中会进行0号进程的创建(fork函数)cpu运行main.c文件
Linux进程的创建_第4张图片
内核态 不可抢占 用户态 可以抢占
在0号进程中使用init函数 打开标准输入输出 错误的控制台句柄 0号进程不可能结束(如果结束掉 就会死机) 他会在没有其他进程调用的时候调用
创建1号进程 如果创建成功,打开/etc/rc文件(配置文件 开机加载东西啥的) 执行SHELL程序 /bin/sh
2进程的创建 fork 实际是系统调用 这个函数在sys_call.s中
.align 2
_sys_fork://fork的系统调用
call _find_empty_process//调用这个函数 给进程分配一个进程号
testl %eax,%eax
js 1f
push %gs
pushl %esi
pushl %edi
pushl %ebp
pushl %eax
call _copy_process//调用了fork.c中的函数
addl $20,%esp
1: ret
从这个系统调用的理解:进程的创建就是对0号进程或者当前进程的复制(task【0】拷贝到新创建的task_struct中) 0号进程的创建就是初始化结构体
对于栈堆的拷贝,就是创建中复制原有栈堆
1 在task链表中找一个进程空位存放当前的进程 (给当前进程分配一个进程号)
2 创建一个task_struct
3 设置task_struct
如果父进程打开了某个文件 那么子进程也会打开这个文件 将文件打开计数加1
find_empty_process —>copy_process----->copy_mem
Linux进程的创建_第5张图片
Linux进程的创建_第6张图片
Linux进程的创建_第7张图片

你可能感兴趣的:(Linux,linux,运维,服务器)