进程
- 01.进程是什么?
1.进程是什么?其实当你点开网易云音乐的时候你就会发现的你的任务管理器上有多了一个进程。Linux下也是一样的当你运行一段代码,你也可以通过查看进程从而观察到多了一个进程。但是你可以不要以为进程就是一段代码,代码是“死的”,而进程则是真真切切的“活着的”。
2.从内核来讲,进程是资源分配的最小单位,同样在没有线程的情况下,进程也是程序执行的最小单位。
3.进程在PC上是如何管理的呢?答案是先被OS统一用一个PCB的东西进行描述,PCB记录了进程的所有信息,那么此时一个PCB就可以代表一个进程了,然后OS用链表的形式将所有PCB连起来,这样就达到了管理进程的目的。
4.为什么OS要引入进程呢?理论上讲,是为了对进程的进行抽象,实际上讲,因该是计算机发展的必然趋势,是为了多道程序并发的执行,同时也是为了更好地对进程进行组织和管理。
- 02.进程的描述-PCB
1.在操作系统书上讲进程是通过一个叫做进程控制块的结构进行描述,或者可以说进程的相关信息都保存在这个结构体中,而这个结构体称之为PCB,而在Linux则程这个结构叫做test_struct
2.PCB都管理着进程哪些信息呢?或者可以说内核是怎么看待进程的呢?
- 03.进程的组织
1.正如前面所述,进程在内核中是通过链表将所有PCB连起来,从而有效地组织和管理。
2.当一个新的进程创建时,就会申请一个空白的PCB,将自己的信息写上去,插入到现有的PCB链表中,那么就可以说多了一个进程。
- 04.进程的查看
方式一:windows下直接打开任务管理器,就可以看到进程的各种东西了,比如CPU的占比,内存占比等
![]()
方式二:Linux下通过ps/top指令进行查看
![]()
![]()
方式三:Linux下通过查看/proc文件
- 05.进程的状态
![]()
进程状态转变图
- 06.进程的创建
Linux下通过fork/vfork来进程创建
1.fork有两个返回值
2.fork出来的父子进程间,程序共享,数据采用写时拷贝。
![]()
结果:
- 07.进程优先级
1.我们通过ps -l 来看一下进程信息
![]()
2.知道了nice值,那么我们可以修改nice值从而修改进程优先级
- 08.几种特殊的进程-僵尸进程
- -
1.什么是僵死?僵死也是一种进程状态。
2.僵尸进程的原因是,子进程退出,父进程没有查看子进程的退出信息,从而子进程没有释放自己,一直在等待父进程的查看,从而造成了子进程
3.僵尸进程的危害:由于父进程没有读取子进程的退出信息,所以子进程要一直不断的维持退出的状态,PCB也一直在维护。所以这就造成内核还要维护一个已经完成任务的进程,同时PCB占用的内存也造成了浪费,当父进程创建大量子进程而不回收时,内存泄漏非常严重。
//构造一个僵尸进程
int main()
{
int ret = fork();
if(ret<0)
{
perror("fork");
return -1;
}
else if(ret==0) //子进程
{
sleep(5);
std::cout<<"5s后,子进程退出!"<<std::endl;
}
else
{
for(size_t i=0;i<60;++i)
{
std::cout<<"父进程正在运行... "<<std::endl;
sleep(1);
}
}
return 0;
}
通过运行两个终端来检测一下上述代码中僵尸的产生过程
![]()
可以看到进程状态由’ S+’ 变成了’ Z’ 状态。
- 09.几种特殊的进程–孤儿进程
1.什么是孤儿进程?就同他的名字一样,是个” 孤儿 “(zzz)。
2.孤儿进程产生原因:父进程先退出,子进程后退出,那么子进程就变成孤儿进程
3.孤儿进程的危害:变成僵尸进程后,会被1号进程也就是init进程所领养,之后进行资源的回收。好像也没有什么危害,可能就是当孤儿进程夺得时候,init进程有点累吧!
//构造一个孤儿进程
int main()
{
int ret = fork();
if(ret<0)
{
perror("fork");
return -1;
}
else if(ret==0) //子进程
{
sleep(30);
std::cout<<"30s后,子进程退出!"<<std::endl;
}
else
{
sleep(5);
std::cout<<"5s后,父进程退出 "<<std::endl;
}
return 0;
}
上面程序的运行及检测结果
![]()
可以看到进程状态从’ S+ ‘变成’ S ‘状态。
- 10.进程地址空间
1.经过计算机的长期发展,内存管理已经由分段,分页变成了现在的分页加上虚拟内存的技术。
2.用一张图来说明进程地址空间
如有错误,可以私信,在这提前谢谢了。