写时拷贝技术,虚拟地址空间,进程调度算法,return,exit,_exit区别,进程等待,程序替换

写时拷贝技术

  • 父进程创建子进程,但是并没有直接给子进程开辟空间,拷贝技术,而是跟父进程映射到同一块物理位置,但是如果内存中的数据发生改变,那么对于改变的这块内存,就需要给予子进程开辟新的内存空间,并且更新页表信息。

虚拟地址空间(程序地址空间)

  • 程序地址空间在32位操作系统下oxffffffff到oxc0000000段是内核空间,剩下的3g由上到下分别是(粗略),变量/环境变量,栈信息,共享区,堆,未初始化变量,初始化变量,程序…。虚拟地址空间是为了让内存更加合理化使用当我们从硬盘上唤醒一个可执行程序,加载它到内存中,操作系统创建一个pcb来描述这个进程,其中mm_struct(内存描述符)就是pcb中的内存指针,用这么一个结构体来描述一段物理内存,并且在这个结构体中是虚拟的地址,比如哪一段是变量,哪一段是其他东西,因为是描述,所以就有了虚拟地址空间,(由于每个进程都存在自己的页表数据结构,那么很有可能在相同的虚拟内存上面看到不一样的数据,那时候因为在用户看到的内存地址都是虚拟地址,而数据存储是在物理内存,物理地址的不同则数据就会不同)。在虚拟地址空间和内存之间有一个页表(分页式内存管理),页表有页表项,页表通过虚拟地址映射物理内存实现映射关系。当一个父进程创建一个子进程的时候,子进程就会复制父进程的pcb和mm_struct,但是这个时候他们还都是通过页表映射相同的数据区域如果子进程数据发生改变那么就会立即在物理内存上开辟一个空间来记录数据,并且立即更新页表信息,实现新的映射关系。页表(页号+页内偏移)。
    以前是叫程序地址空间最后存在问题就通过增加中间页段来就变成了虚拟地址空间。

o(1)进程调度算法

  • 空间换时间,二进制位图,进程队列,

1号手册:命令手册
2号手册:系统调用接口手册
3号手册:库函数手册
vfork(),已经被淘汰
return,exit(库函数), _exit:区别(系统调用)

  • return和exit外在表现基本相同,但是具体还是有区别的,return一般在主函数中返回,用vfork创建的子进程不可以在main中返回因为地,vfork创建一个子进程的时候并没有为子进程复制父进程的内存描述符(mm_struct)而是和父进程共用一个,那么在子进程如果在main中退出那么就会释放父进程的资源,那么就会出现错误,或者父进程直接崩溃。正常情况下exit和main退出的时候都会刷新缓冲区,而_exit并不会刷新缓冲区,而是直接退出。fork和vfork在实现的时候都是在内核调用close函数实现的。vfork创建子进程要是陷入死循环或者没有退出,那么父进程将会阻塞,直到子进程退出。vfork创建出来的子进程不退出exit或者不程序替换,父进程就不会继续运行。

进程退出的三种场景

  • 正常退出,结果符合预期,

  • 正常退出,结果不符合预期

  • 非正常退出

一个进程返回值只用一个字节
进程等待:等待子进程退出-----避免产生僵尸进程
*pid_t wait (int status)
阻塞等待任意一个子进程退出,要是当前没有子进程退出那么就一直等待,ststus用于获取子进程退出码,不关注就制空
阻塞:发起一个系统调用完成功能,当前如果不具备完成条件,则等待直到完成功能后返回。
非阻塞:当前如果不具备完成条件,则立即报错返回。
*pid_t waitpid (pid_t pid,int status,int options)
pid :-1等待任意子进程 >0等待任意子进程。
ststus用于获取子进程退出码,不关注就制空
options:0阻塞等待子进程退出
WNOHANG将waitpid设置为非阻塞
返回值:>0表示退出的子进程的pid,==0表示当前没有子进程退出,<0出现错误了
waitpid一般设置成循环等待模式,但是循环一般是由用户自己给出的。
关于status:status可以设置子进程的退出返回值(用户可以通过exic给出返回值) 因为一个status给的是一个4个字节的类型,然而一个返回值类型只给出了一个字节所以,一个字节 的数据如何在四个字节中存储?
四个字节,中的后两个字节中的高8位保存返回值。

写时拷贝技术,虚拟地址空间,进程调度算法,return,exit,_exit区别,进程等待,程序替换