进程的学习

一:进程的概念

内部的数据结构+代码程序和数据

要管理进程怎么做:先描述再组织

二:PCB的描述

1.先看一下进程,我们写一个死循环,先让这个程序一直先运行着,让这个程序成为进程,接着我们再打开一个Xshell,进行查看这个进程。

现在我们就看到这个进程的状态了。其实包括我们在linux里面写的指令也是一个进程,只不过CPU执行很快。

所以进程分为两种:运行完就退出(比如指令ls )和常驻进程

2.task_stuct 的属性

标示符: 描述本进程的唯一标示符,用来区别其他进程。PID:相当于你的学号
状态: 任务状态,退出代码,退出信号等。
有多种状态: R运行状态(running)S睡眠状态(sleeping) D磁盘休眠状态 T停止状态(stopped)X死亡状态(dead)
优先级: 相对于其他进程的优先级。
也就说你的CPU要调度进程的时候,先调度哪个是看优先级的
程序计数器: 程序中即将被执行的下一条指令的地址。
内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等

三 :查看进程

1./proc Linux把进程都给我以文件的形式,放在了/proc的路径下,我们打开会发现许多数字的文件

 

这就是所有进程的文件,如果我想看我刚才的那个程序的进程呢,通过pid看 。

如果我们这个程序跑起来了,但是我们把程序的文件删了程序会不会跑不了,答案是不会,因为进程已经拷贝到内存中了,但是一旦这个进程停止运行,就再也不会开始了。

如果删掉的话,exe就会显示 deleted,已经被删除了。

2.理解cwd

这个叫做当前工作目录,如果我们在代码中,写的是一个文件相关的代码,创建的话,会创建在这个代码的文件夹中。当前路径:当前进程的路径 

3./proc不是磁盘级别的文件。而是数据即文件。

四:任何进程都是由父进程创建的

pid 和ppid

pid在进程中不会改变,但是重启该程序,新进程,pid大概率可能就会改变

ppid 是不会改变的

pid 子进程的标识符 ppid 父进程的标识符,,当我们用ppid查看的时候,我们会发现一个叫bash的命令行解释器。

命令行中,执行命令/执行程序,本质是bash的进程创建的子进程,然后由子进程来执行我们的程序。

为什么创建一个子进程来跑呢?dash进行命令解释,每个指令都是我们的操作,如果我们只有父进程去执行,那么父进程突然崩溃了,bash是不是也会受到影响,那其他的进程该怎么办。所以我们用子进程更加安全。

五 fork

系统调用创建进程--fork

fork有两个返回值  如果是父进程,就返回子进程的pid,如果是子进程,就返回0 !!fork有两个返回值。
父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝)
我们写一份代码,如果按照c 或者 c++ 来看,这个肯定会进行一个死循环 ,但是fork并没有

 

   父子进程来回交替进行。

2为社么子进程返回0 父进程是子进程的pid  

因为父进程对于子进程来说只有一个,而子进程对于父亲来说可以有很多,所以找一个父进程的pid并不难,而找子进程的pid就会有难度,不如直接返回fork,比较方便监控子进程。

3.fork为什么又两个返回值

父亲的代码是共享给子进程的,父进程相当于给子进程一份拷贝的代码,然后子进程跑子进程的,父进程跑父进程的,相当于两个分支各自进行运行。所以有两个返回值。最重要的是 两个进程最后回想我们写 int main() 函数的时候,末尾加return 0 ,而父子进程 也会进行如此的操作,return 也算是代码,所以父子进程各自返回一次。

4 id 这个变量为什么会有两个值

首先进程具有独立性,父子的代码是同样的,子进程进行了写时拷贝,所以 父子进程中各自执行各自的if else 判断。但是父子进程谁先执行,这并不确定,这些由CPU进行决定,把资源合理公平的分配。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值