进程的退出概念

缺页中断(补充)

之前我们了解了页表相关的知识,现在问大家一个问题,用newmalloc开辟内存的时候是虚拟内存还是物理内存呢?

答案是虚拟内存,这样有几个好处:

1、如果开辟了物理内存一直不使用,久而久之物理内存就满了,即“内存空转”,计算机内存资源被占用却没有被实际得到利用。
2、提高了new,malloc的效率,它只是在虚拟内存中开辟空间,等到实际访问的时候再去物理内存中开辟,然后通过页表关联起来,总时间效率是差不多的,但是new/malloc的效率得以提升。

那开辟虚拟内存等到要访问的时候是什么样的过程呢?下面就来解释所谓的缺页中断

当我们要访问开辟的空间时,通过页表并没有找到映射的物理内存,这时候就会“上报”给操作系统,等操作系统给我们在物理上开辟空间,然后再通过页表连接起来,这个过程就叫做缺页中断

页表中的权限位

下面我们继续来谈下页表,其实页表还有很多其他的属性,并不是我们想象的两列,一列虚拟内存,一列物理内存连接起来就行了,我们这里增加一个权限位的概念,页表中大部分的数据都是被设置成只读的权限,所以当子进程要对数据进行修改的时候,访问页表发现数据是只读的,这时候触发缺页中断,操作系统介入其中,发生写时拷贝,重新开辟物理内存,通过页表连接,紧接着把权限位改为可读可写

char* str = "Hello Linux!";
*str = "Hello";

比如这段代码,我们知道字符串是有常量性是不可修改的,那常性是怎么来的呢,从底层上就是页表中权限被设置位只读,我们要修改写入的时候就会访问页表,发现并没有权限,所以不能修改!

而const只是用来编译器用来检查编译时保证编译时的报错信息,和操作系统无关!

进程退出

下面我们来讲讲进程退出的问题,在这之前我们知道一般我们会在main函数最后加上return 0这一句代码,这是什么意思呢?

这个0我们称之为退出码,它能反应这个程序的退出信息

如果退出码为0,表示程序正常退出
如果退出码非0,表示程序异常退出

在这里插入图片描述
我们可以通过strerror开查看
在这里插入图片描述
在这里插入图片描述

也可以查看其他退出信息:
在这里插入图片描述
并且也可以自定义,这个大家可以自己尝试

另外我们可以通过echo $?来查看上一次程序的退出信息
在这里插入图片描述
那进程通过main函数的退出码来获取信息,那普通函数呢?
函数退出仅仅表示函数调用完毕,调用函数一般我们通常想看到两种结果,第一函数执行成功或者失败。而函数存储了上一次函数调用的错误码。

例如我们经常malloc开辟空间的时候:
在这里插入图片描述
在这里插入图片描述

异常

而进程退出就有着三种情况:
1、程序执行完,正常退出。
2、程序执行完,异常退出。
3、没有执行完,发生异常了。

而只有当程序执行完的时候,结果才有意义。

进程出现退出是进程收到了异常的信号,每个信号都有不同的编号,每个编号都有自己的异常原因。
我们可以通过kill -l 查看有哪些信号:
在这里插入图片描述

在这里插入图片描述

exit

在这里插入图片描述
exit是终止进程 ,其中status:是进程退出时候的退出码。
在这里插入图片描述
在这里插入图片描述
另外还有一个_exit和exit很像,exit是c语言给我们提供的接口,而_exit是linux系统给我们提供的接口,区别是_exit 没有刷新缓冲去,而exit刷新了缓冲区,大家可以自行验证下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值