zoukankan      html  css  js  c++  java
  • 计算机操作系统 --- 进程和进程的上下文切换

    问题

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

    程序和进程

         程序是静态的概念,而process进程更像是运行任务,最后面一个例子可以好好理解,一个程序可以被多个进程加载。 1297993-20191105094030675-50570240.png

    进程的概念

    1297993-20191105201804292-1918016637.png

    进程与上下文切换

    1297993-20191125165443809-1682347259.png

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

    1297993-20191125170002827-1078934757.png

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

    1297993-20200109100049114-1600213009.png

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

    用户态和内核态

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

    1297993-20200109100822563-632139033.png

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

    进程的加载和运行

    1297993-20200109141733814-2102210576.png

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

    execve函数执行

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

    1297993-20200115100724779-1628573498.png

    任务的栈结构

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

    1297993-20200115103913887-621685509.png

    总结

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

    参考资料

    • 袁春风老师的课程
  • 相关阅读:
    C#密封类和密封方法
    C#类和结构以及堆和栈大烩菜(本来就迷,那就让暴风来的更猛烈吧!)
    C#类、对象、方法、属性详解(摘)感谢博客园,感谢提供者。
    软件工程第十五周总结
    软件工程课堂十一(计算最长英语单词链)
    软件工程第十四周总结
    梦断代码阅读笔记03
    软件工程课堂十(找水王)
    软件工程课堂九(用户体验评价)
    软件工程第十三周总结
  • 原文地址:https://www.cnblogs.com/Benjious/p/12195508.html
Copyright © 2011-2022 走看看