计算机操作系统 --- 进程和进程的上下文切换

Posted benjious

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算机操作系统 --- 进程和进程的上下文切换相关的知识,希望对你有一定的参考价值。

问题

  • 一个进程长什么样子的
  • 操作系统缺页中断后是如何将磁盘的数据加载到内存中的,过程是怎么样的

程序和进程

     程序是静态的概念,而process进程更像是运行任务,最后面一个例子可以好好理解,一个程序可以被多个进程加载。 技术图片

进程的概念

技术图片

进程与上下文切换

技术图片

    可以看到两个进程(shell 和 hello 程序)发生切换的时候会从内核态到用户态。

技术图片

    上面这张图非常重要,好好理解!     上面就是我们所说的上下文分两部分,和系统相关的进程信息为系统上下文,而和用户相关的则是用户级上下文, 例如我们的java 进程来说,java 对于操作系统来说是一个进程,一个进程有标识信息吧,进程的标识信息属于系统上下文,而我们写的代码则分配在用户程序块,我们使用代码生成的“对象”等分配在用户堆栈和用户数据块中。

技术图片

    还是以java进程为例,假若操作系统中存在一个 java 进程,那么它的进程空间就可以这样表示。

用户态和内核态

    我们现在知道操作系统要不就处于两种状态,要不就执行用户代码,要不就执行内核代码。

技术图片

处理器为了区分这两种模式,就有一个标识位用于区分两种状态。

进程的加载和运行

技术图片

    上图是加载程序的步骤,其中step3,注意创建的进程是只能读不行写,通过只读来实现写时拷贝(相当于数据库数据从文件加载到内存,然后修改产生脏页,然后脏页再回刷数据回文件的原理,但是次处不是回刷到文件)写的时候发生了保护错了,这时候才真正执行替换的工作,将新进程的东西替换到旧进程的东西,step4 不会从磁盘拷贝代码和数据等内容,而是修改shell(旧进程)页表等东西,使得页表指向的是hello(新进程)页框,这时候就会产生缺页,缺页后就会加载数据到内存中,直到main函数。

execve函数执行

execve函数的执行可以任务是进程前的准备工作,execve的执行到main方法执行之前是需要重要把握的一部分的,会在操作系统后面的课程学习。

技术图片

任务的栈结构

我们看右边的图,main函数的第二个参数是个数组放的是进程名,例如上面例子中的“Hello”

技术图片

总结

  • fork 命令用于生成一个子进程 ,execute 则是指向进程前的准备,执行完后真正业务进程相关代码的是从 main函数入口。

参考资料

  • 袁春风老师的课程

以上是关于计算机操作系统 --- 进程和进程的上下文切换的主要内容,如果未能解决你的问题,请参考以下文章

编写系统调用来计算进程的上下文切换

结合中断上下文切换和进程上下文切换分析Linux内核一般执行过程

结合中断上下文切换和进程上下文切换分析Linux内核的一般执行过程

结合中断上下文切换和进程上下文切换分析Linux内核的一般执行过程

结合中断上下文切换和进程上下文切换分析Linux内核的一般执行过程

结合中断上下文切换和进程上下文切换分析Linux内核的一般执行过程