文章目录
- 查看进程方式
- 批量化注释
- fork
- 进程状态
- R状态
- S状态
- D状态
- T状态
- t状态
- 退出码问题
- X&&Z状态
- 僵尸进程的危害
- makefile 新知识
- 孤儿进程
查看进程方式
ls /proc
ls /proc/13045 (可以查看到之情进程的属性)
ps axj | head -1 && ps ajx | grep myprocess(文件名) | grep -v grep(grep也是属于进程,这里是将他去除只看文件myprocess的进程)
查看pid的命令 getpid() 当系统在运行那个文件时,pid就输出哪个文件的pid
要包的头文件在下面的图片当中
getppid()是父进程,在运行当中的普通文件大多数的父进程都是bash(命令行解释器)
批量化注释
命令模式ctrl +v+j +I+//+esc
取消批量化注释
命令模式ctrl+v +l(L并不是i) +j(用来调整)+d
fork
bash命令行解释器,本质也是一个进程
命令行启动的所有的程序,最终都会变成进程,而该进程对应的父进程都是bash
如何创建的子进程?
fork之后,执行流会变成2个执行流
fork之后,谁先运行是由调度器决定的
fork之后,的代码共享,通常我们通过if和else if进行执行流分流
fork是创建了子进程,一个新的pcb并且他和它的父进程的代码和数据是一样的
进程在运行时是具有独立性的,父子进程也是一样的,
上面图片当中的写时拷贝(简单理解就是,只有在用拷贝时才会调用拷贝,不调用,还是之前的样子)
两个返回值的问题就是,return就是相当于printf在函数当中,属于代码行,公共的代码,谁都会往下运行,所以也就是出现了两个返回值。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
进程状态
阻塞状态:简单理解就是,进程等待某种资源就绪。
举例子:你去银行存钱,银行前台就属于cpu而你就是进程,而填写单子,带上钱,存折,等一系列动作
是属于等待的资源就绪,当前台让你去填写单子的时候,就是把该进程的pcb(task_struct)移到了单子的等待队列。在阻塞状态中,pcb被维护在不同的队列当中。(现在只是简单理解,与实际还是有差距的)
挂起状态:是一种特殊的阻塞状态,也可以称为阻塞挂起。
在进程阻塞时,在占用太多内存时,就会将阻塞的进程的代码和数据放到磁盘当中,把pcb放的内存当中,等待某种资源的队列当中,当资源就绪时,再将该进程的代码和数据进行召回。
R状态
while(1)
{
printf("我是否在运行?");
return 0;
}
上面的这段代码对应的是下面的图片的信息,由于printf一直是被调用,一直循环所以大部分时间都是在显示器的队列等待中。只有那很短的时间是在cpu中运行该进程。所以它的状态并不是S+
while(1)
{
return 0;
}
上面的代码是对应下面的代码,上面的代码并不需要任何的等待,直接与cpu进行交互,所以是属于S+状态
S状态
while(1)
{
int a=0;
scanf("%d",&a);
printf("%d",a);
return 0;
}
上面的代码就是属于S状态,也可以称为阻塞状态,他在准备键盘输入就绪在该队列当中等待。
S是休眠状态,可终止(ctrl+c)
D状态
D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的
进程通常会等待IO的结束。
当进程出现D状态也就是说明,快宕机了,磁盘没有空间压力太大了,但是并不能说明内存也没有空间了。
T状态
T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可
以通过发送 SIGCONT 信号让进程继续运行。
kill -19 (pid)是将正在运行的进程进行停止,让后观察状态时T,kill -18 (pid)是将进程继续运行,但是这里发现ctrl+c并不能终止进程运行,这里就是加号的问题(+),带加号是在前台运行,可以使用ctrl+c进行终止,不带加号就是在后再运行需要使用kill -9 (pid)进行终止。
t状态
t(tracing stop)追踪停止,在代码运行到断点的时候进程状态就属于t
退出码问题
另一种查看返回值是否正确的方式。
echo $?
X&&Z状态
僵尸状态也就是为了让父进程拿到子进程的返回值,而保持的状态。
僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用,后面讲)
没有读取到子进程退出的返回代码时就会产生僵死(尸)进程
僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。
所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态
僵尸进程的危害
进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎
么样了。可父进程如果一直不读取,那子进程就一直处于Z状态?是的!
维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话
说,Z状态一直不退出,PCB一直都要维护?是的!
那一个父进程创建了很多子进程,就是不回收,是不是就会造成内存资源的浪费?是的!因为数据结构
对象本身就要占用内存,想想C中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空
间!
内存泄漏?是的
X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态,只是一瞬间的状态
从上面图片中可以看到子进程返回之后,保持的状态就是Z+(僵尸状态)
这段代码是有问题,只是为了看到僵尸进程,代码并没有等待。
makefile 新知识
$@代表的是目标文件冒号左侧, $^代表的依赖列表冒号右侧文件,这样再写依赖列表的时候会非常的方便
孤儿进程
当父进程退出时,子进程会被OS自动领养(通过让一号进程,成为自己的新父进程),被领养的进程–孤儿进程
孤儿进程为什么会被收养?是因为,当子进程再后续退出时,无人回收,导致内存泄漏。
孤儿进程被OS领养之后,从前台进程,变为了后台进程,也就导致了,不能用ctrl+c进行终止
终止后台进程的方法有两种
1、kill -9 (加上需要杀掉的pid)
2、killall (加上进程文件的名字)