子进程为什么能继承父进程的环境变量呢?并且具有全局属性?
通过打印地址实验可以发现,进程的环境变量在栈区之上
父进程的环境变量也是由bash继承下来的,必定有页表帮助我们从虚拟到物理的映射,创建子进程的页表时也会将对应父进程的地址空间中环境变量的对应映射建立好,所以即便不传对应的env参数,子进程也能获得环境变量信息。
用户空间和内核空间
0G-2G是给用户使用的
3G-4G是给操作系统的
我们的PCB对象数据结构本身和进程地址空间也要在物理内存中放的哦,操作系统内核中的数据结构一定要映射到地址空间内核空间中
页表级写时拷贝原理
现在再来理解为什么代码不能被修改这句话
因为页表中把代码区的映射标志位设置为只读权限,所以代码就不可写!但是父进程尝试对数据进行写入时就可能会影响到子进程,反之亦然!
无论是父还是子想对数据进行写入,谁先写,谁就要先进行写时拷贝
操作系统是怎么知道父子进程是共享数据块此时需要发生写时拷贝的呢?
在创建子进程前,即便数据是具有读写权限,在创建子进程后,操作系统把父子进程的数据读写权限全部改为只读,此时不管父还是子想要对数据进行写入一定会引发系统级的权限问题,不过此时不会做异常处理,而是转而帮我们做写时拷贝,并且对该数据重新建立页表映射,并且把相关标志位改为读写恢复出来,就完成了写时拷贝。
本身是后续看谁先触发写入的错误,然后再来判断谁要先写时拷贝。
创建多个进程
结论
当子进程被创建出来时哪一个子进程先运行,或者是父进程和子进程哪一个先运行呢?
当创建出多进程时,无论是兄弟关系还是父子关系,到底哪一个进程先运行完全由调度器绝定