进程退出
- 缺页中断(补充)
- 页表中的权限位
- 进程退出
- 异常
- exit
缺页中断(补充)
之前我们了解了页表相关的知识,现在问大家一个问题,用new
和malloc
开辟内存的时候是虚拟内存还是物理内存呢?
答案是虚拟内存,这样有几个好处:
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刷新了缓冲区,大家可以自行验证下。