进程的创建和进程的状态

进程

**浅层认识:**程序从硬盘上要开始执行起来,先要加载到内存上,然后描述起来(创建PCB),然后在运行,运行起来的程序叫进程。

**从操作系统的角度来看进程: **

操作系统就是管理者,进程就是被管理者,要管理进程需要:

1.操作系统不直接管理进程,先将进程描述起来
2.描述进程的载体是一种结构体,一个进程具有一个结构体,这个结构体叫做进程的PCB(进程控制块)
3.然后把所有的结构体组织起来,组织起来的方式就是用指针将结构体连成一个链表 (或者用其他高级数据结构组织起来)


PCB–描述进程

PCB是包含进程的信息(描述进程的信息,有优先级,状态等)的一种结构体,

linux下描述进程的PCB叫 task_struct

##task_structl里面的内容

标识符:pid,描述本进程的唯一标识符,用来普别其他进程
状态:任务状态,退出代码,退出信息等
优先级:cpu资源分配的先后顺序
程序计数器:程序中即将被执行的吓一条指令的地址。
内存指针:程序代码和进程相关数据的指针等,可以指向虚拟地址空间,通过页表映射到物理内地址,最终在内存中找到这个进程所要运行的代码和数据。
上下文数据:进程执行时处理器中的寄存器的数据(进程正在执行时寄存器中的数据)(时间片:进程在cpu上运行的时间,分时机制:aa)
i/o状态信息:进程打开的文件信息
记账信息:可能包含处理器的时间总和(运行时间)等

##查看进程
每个进程都有自己的PID
查看进程指令有: ls /proc/ , ps aux 等
系统调用获取进程标识符(id):

getpid()             //获取进程pid
getppid()            //获取父进程pid

创建进程

创建进程有两个函数:fork 和 vfork

pid _t fork(void )

有两个返回值:对于子进程来说,返回0;对于父进程来说,返回子进程的id,创建失败返回-1。

创建子进程:以父进程为模板,父子进程代码段相同,但数据不同,fork的返回值起到分流的作用,用户通过fork的返回值来判断哪个是子进程,哪个是父进程。

fork之后,父子进程谁先运行,由调度器决定,父子进程分别独立自己的,执行自己的任务

fork之后内核的做法:

  1. 分配新的内存块和内核数据给子进程
  2. 将父进程的部分数据内容拷贝到子进程中
  3. 添加子进程到系统的进程的列表中
  4. fork返回,开始调度
    代码如下:
    这里写图片描述
    打印结果:
    这里写图片描述

变量地址相同,内容不同;通常,父子进程代码共享,父子不在写入时,数据也是共享的,当任意一方要写入时,就以写实拷贝的方式来处理

vfork

pid_t vfork(void)
也是用来创建子进程的但是vfork创建的子进程和父进程共享虚拟地址,但fork创建的子进程具有独立的虚拟空间;
vfork保证子进程先运行,在它调用exit后,父进程才可能被调度运行

代码:这里写图片描述
运行结果:
这里写图片描述
地址相同,变量内容相同,因为虚拟地址相同
创建进程图:
这里写图片描述
这里写图片描述

fork和vfork的区别
1.fork:子进程拷贝父进程的数据段,代码段。
2.vfork:子进程和父进程共享代码段。
3.fork(),创建的父子进程的执行次序不确定,vfork()保证子进程先运行,在子进程调用exit()之后父进程才被调用。

进程状态

统一描述:就绪,态运行态,阻塞态
linux下进程的状态:

运行状态  (R)       //要么在运行这种,要么在运行的队列中
睡眠状态(S)         //浅睡眠,可以被唤醒
磁盘休眠状态(D)       //深度睡眠,不可以被唤醒,不能被中断(不可终端睡眠状态)
停止状态(T)       //可以发送信号给进程让其暂停,也可以发送信号让它继续运行 
跟踪状态(t)      //跟踪进程的状态
死亡状态(X)
僵尸状态(Z)

僵尸进程

概念:进程退出,父进程没有读取到子进程的返回代码时 就会产生僵尸进程。

僵尸进程产生原因以及危害:

1.子进程先于父进程退出(父进程没有关心子进程的退出状态)
2.进程退出为了保存自己退出的原因,因此退出后资源不会被完全释放,等待父进程来获取退出状态(这就是为什么要进程等待),然后释放子进程所有资源,所以假如父进程没有关心子进程的退出,那么这个时候退出子进程将成为一个僵尸进程,占着资源不释放,成为僵尸进程,造成资源泄漏(资源没有完全释放),正常进程可能无法创建。

孤儿进程

父进程先于子进程退出,这个孤儿进程将被孤儿院init进程所领养,子进程退出后由init回收释放

进程的优先级

cpu分配资源的先后顺序,调整优先级的命令 nice,renice,其实是调整NI的值,nice的值影响进程的而优先级

交互式进程:优先级应该高一点
批处理进程:优先级可以低一点

程序与进程

程序是硬盘上的一个文件。
进程是放在内存里,还要被操作系统管理。

管理:

管理和被管理者不直接沟通
被管理的对象需要描述起来(利用数据)
为了高效,描述对象也要被组织起来

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值