问题
- 一个进程长什么样子的
- 操作系统缺页中断后是如何将磁盘的数据加载到内存中的,过程是怎么样的
程序和进程
程序是静态的概念,而process进程更像是运行任务,最后面一个例子可以好好理解,一个程序可以被多个进程加载。
进程的概念
进程与上下文切换
可以看到两个进程(shell 和 hello 程序)发生切换的时候会从内核态到用户态。
上面这张图非常重要,好好理解! 上面就是我们所说的上下文分两部分,和系统相关的进程信息为系统上下文,而和用户相关的则是用户级上下文, 例如我们的java 进程来说,java 对于操作系统来说是一个进程,一个进程有标识信息吧,进程的标识信息属于系统上下文,而我们写的代码则分配在用户程序块,我们使用代码生成的“对象”等分配在用户堆栈和用户数据块中。
还是以java进程为例,假若操作系统中存在一个 java 进程,那么它的进程空间就可以这样表示。
用户态和内核态
我们现在知道操作系统要不就处于两种状态,要不就执行用户代码,要不就执行内核代码。
处理器为了区分这两种模式,就有一个标识位用于区分两种状态。
进程的加载和运行
上图是加载程序的步骤,其中step3,注意创建的进程是只能读不行写,通过只读来实现写时拷贝(相当于数据库数据从文件加载到内存,然后修改产生脏页,然后脏页再回刷数据回文件的原理,但是次处不是回刷到文件)写的时候发生了保护错了,这时候才真正执行替换的工作,将新进程的东西替换到旧进程的东西,step4 不会从磁盘拷贝代码和数据等内容,而是修改shell(旧进程)页表等东西,使得页表指向的是hello(新进程)页框,这时候就会产生缺页,缺页后就会加载数据到内存中,直到main函数。
execve函数执行
execve函数的执行可以任务是进程前的准备工作,execve的执行到main方法执行之前是需要重要把握的一部分的,会在操作系统后面的课程学习。
任务的栈结构
我们看右边的图,main函数的第二个参数是个数组放的是进程名,例如上面例子中的“Hello”
总结
- fork 命令用于生成一个子进程 ,execute 则是指向进程前的准备,执行完后真正业务进程相关代码的是从 main函数入口。
参考资料
- 袁春风老师的课程
原文地址:https://www.cnblogs.com/Benjious/p/12195508.html