【Linux】总结2-进程篇2

文章目录

  • 创建子进程
  • 僵尸进程
  • 孤儿进程
  • 前台进程/后台进程
  • 环境变量
  • 进程虚拟地址空间

创建子进程

  • fork():让一个正在运行的进程调用该函数,可以让运行的进程创建出来一个子进程,两者是父子关系。fork函数的返回值:失败返回-1,成功返回两次:父进程返回子进程的PID,子进程返回0。

  • 子进程拷贝父进程的PCB;父子进程代码共享 ,因为子进程拷贝父进程的PCB,所以拥有相同的代码;数据独有(栈区的数据、堆区的数据):因为父子进程各自有各自的程序地址空间;父进程将子进程创建出来之后,子进程就是一个独立的进程,被操作系统独立进行调度,调度的时候和父进程无关,并且 父子进程也是抢占式执行

  • 父子进程代码相同,那子进程是从哪行代码开始执行的呢?从fork之后开始执行的,因为子进程有着和父进程一样的PCB,PCB中的程序计数器保存了程序要执行的下一条指令,这条指令一定是fork之后的汇编代码

  • 正常在命令行当中启动的进程,它的父进程是bash,bash是一个具体的命令行解释器,命令行解释器本质也是一个进程,在命令行中启动一个进程,原理是:命令行解释器的进程创建子进程,让子进程进行程序替换,替换为目标程序

僵尸进程

  • 僵尸状态:Z+,子进程变成了僵尸状态的进程被称为僵尸进程
  • 产生原因:子进程先于父进程退出,子进程在退出的时候,会告知父进程,父进程接收到信息之后是忽略处理,父进程并没有回收子进程的退出状态信息,从而导致子进程变成僵尸进程。
  • 危害:子进程的PCB(struct task_struct{…})没有被操作系统内核释放,从而导致内存泄漏
  • 如果解决:终止其父进程、重启操作系统、进程等待

孤儿进程

  • 有孤儿进程,但是没有孤儿状态!
  • 产生原因:父进程先于子进程退出,既定回收子进程的父进程不在了,所以子进程就变成孤儿了,称之为孤儿进程
  • 孤儿进程的退出信息由谁回收呢?1号进程。1号进程是操作系统的init进程,操作系统的很多进程都是该进程创建出来的,孤儿进程的父进程变成了1号进程,也就意味着,该孤儿进程退出的时候,退出的状态信息是由1号进程进行回收的
  • 孤儿进程有危害吗?没有,因为1号进程会回收孤儿进程的退出状态信息,不会产生内存泄漏

前台进程/后台进程

  • 前台进程:阻塞bash运行的进程,进程状态带有+号
  • 后台进程:不阻塞bash运行的进程,进程状态不带有+号
  • 在命令行当中运行的进程,一般情况下都是要阻塞bash进程的运行的

环境变量

  • 参考之前博文:环境变量_林深方见鹿的博客-CSDN博客

进程虚拟地址空间

  • 虚拟地址:我们在C/C++中看到的地址,全部都是虚拟地址,不是物理地址,物理地址我们用户一概看不到,由OS统一管理,OS需要负责将程序当中的虚拟地址转换为物理地址

  • 进程虚拟地址空间:操作系统为每一个进程虚拟出来一个4G的虚拟地址空间(32位操作系统 ),程序在访问内存的时候,使用的是虚拟地址进行访问,既然是OS虚拟出来的地址,所以并不能直接存储数据,存储数据依然是存储在真实的物理内存当中的。所以OS需要将虚拟地址转化位物理地址进行访问(页表映射)

  • 为什么要使用进程虚拟地址空间呢?因为各个进程访问同一个物理地址空间,会造成不可控。在有限的内存空间中,进程是不清楚哪些内存被其他进程使用,哪些内存是空闲的,进程是没办法知道的。所以在这种场景下,冒昧的使用,一定会导致多个进程在访问物理内存的时候出现混乱,所以,内存由操作系统统一管理起来,但是又不能采用预先分配内存的方式给进程,因为OS也不清楚进程真正要保存多少数据,使用多久。所以,就虚拟的给每一个进程都分配了4G的地址(虚拟地址)

    进程真正的要保存地址或者申请内存的时候,操作的是虚拟地址,之后再让OS给进程分配物理内存,这样就比较合理,同时在真正使用的时候分配也节省很多空间。

  • CPU 通过物理总线访问内存,那么访问地址的范围就受限于机器总线的数量。

    在32位机器上,有32根地址线,每根地址线有高低两种电位分别代表 bit 的 1 和 0,所以,最小就是0x00000000,最大即0xFFFFFFFF,就是4G。

    所以说 32 位机器上插入大于 4G 的内存是无效的,CPU 访问不到多于 4G 的内存。

你可能感兴趣的:(Linux,linux,服务器)