因为进程具有独立性,一个进程对被共享的数据做修改,如果影响了其他进程,不能称之为独立性。
尽管父进程与子进程的虚拟地址是相同的但经过页表印射后其物理地址不一定相同。故拿到的值也有可能不同。
为什么存在虚拟地址空间?
1.如果让进程直接访问物理内存,进程可能越界非法操作,非常不安全
2.虚拟地址空间的存在,可以更方便的进行进程和进程的数据代码的解耦,保证了进程的独立性
3.让进程以统一的视角,来看待进程对应的代码和数据等各个区域,方便编译器以统一的视角进行编译代码。
1.如何理解fork返回之后,给父进程子进程的pid,给子进程返回0?
父亲与孩子唯一对应,孩子有唯一的父亲
而父亲不一定只有一个孩子,
故父进程需要子进程的pid来找到对应的子进程。
fork函数有操作系统提供,在操作系统中实现。
2.如何理解fork有两个返回值?
fork函数执行以后子进程创建成功有两个执行流。
fork函数之后代码共享 父进程和子进程各自执行return。
3.如何理解同一个id值,着吗可能保存两个不同的值,让if...else if 同时执行?
pid_t id =fork() 同一个id,地址一样,但是内容却不一样。
返回的本质是写入,所以谁先返回,谁就先写入id,因为进程具有独立性,及写时拷贝
一个程序加载到内存时,程序会有两套地址。
1物理地址:.标识程序在内存中得什么位置。
2:虚拟地址:程序内部函数之间相互调用。
虚拟地址经过页表印射可以找到物理地址
写时拷贝:
操作系统重新分配一段空间,并且将旧空间的数据拷贝到新空间。并重新建立页表的印射。
底行模式下使用man手册。