四、进行程序转换的具体步骤 (进程执行过程中有哪些操作?)

程序转换的具体步骤(进程执行过程中的操作) 四

一、引言

在计算机科学中,程序转换是指将高级编程语言编写的源代码转换为机器可执行的指令的过程。
这个过程在进程执行过程中扮演着至关重要的角色。
本文将详细介绍进行程序转换的具体步骤和进程执行过程中的操作。

二、程序转换概述

程序转换是软件开发过程中的关键环节,它涉及到将人类可读的源代码转换为计算机可执行的机器代码。
这个过程通常包括以下几个阶段:词法分析、语法分析、语义分析、中间代码生成、代码优化和机器代码生成。
这些阶段在进程执行过程中起着重要作用。

三、程序转换的具体步骤

1. 词法分析(Lexical Analysis):词法分析是程序转换的第一步,也称为扫描或词法扫描。在这一阶段,编译器将源代码分解成一系列的单词(tokens),如关键字、标识符、操作符等。每个单词都有其特定的语法含义和规则。
2. 语法分析(Syntax Analysis):语法分析阶段是对词法分析阶段产生的单词进行组合和解析的过程。编译器将单词组合成有意义的表达式和语句,形成抽象语法树(AST)。这一阶段关注代码的结构和语法规则,检查语法错误。
3. 语义分析(Semantic Analysis):语义分析阶段是对抽象语法树进行静态语义检查的过程。在这一阶段,编译器检查变量的使用是否恰当,函数是否已被正确定义等语义错误。还会进行类型检查,确保变量和表达式的类型正确无误。
4. 中间代码生成(Intermediate Code Generation):在语义分析无误后,编译器会将抽象语法树转换为中间代码。中间代码是一种介于源代码和机器代码之间的表示形式,易于理解和优化。这一阶段的输出通常是接近于机器语言的低级代码。
5. 代码优化(Code Optimization):代码优化阶段是对中间代码进行改进的过程,以提高程序的运行效率。编译器会尝试通过删除冗余代码、优化算法和数据结构等方式,使生成的机器代码更加高效。这一步骤对于提高软件性能至关重要。
6. 机器代码生成(Machine Code Generation):最后,编译器将优化后的中间代码转换为机器代码,这是计算机可以直接执行的指令序列。这一阶段的输出是目标文件或可执行文件,可以在计算机上运行。

四、进程执行过程中的操作

进程执行过程中涉及的操作主要包括加载程序、分配资源、执行指令和监控进程状态等。

1. 加载程序:当进程启动时,操作系统会加载相应的程序到内存中,以便执行。加载程序包括将目标文件或可执行文件加载到内存中的适当位置,为程序执行做好准备。
2. 分配资源:在进程执行过程中,操作系统会分配必要的资源(如CPU时间片、内存空间等)给进程。这些资源是程序执行所必需的,确保进程能够顺利进行。
3. 执行指令:进程执行的核心是执行指令。CPU会按照程序的指令序列逐条执行指令,完成各种运算和操作。执行指令的过程中可能会涉及内存访问、输入输出操作等。
4. 监控进程状态:在进程执行过程中,操作系统会监控进程的状态,如运行状态、等待状态等。这有助于操作系统管理资源、调度进程和处理异常情况。

五、结论

程序转换和进程执行过程是软件开发和计算机运行中的关键环节。
通过详细阐述程序转换的具体步骤和进程执行过程中的操作,我们可以更好地理解计算机如何执行我们的程序代码。
希望本文能够帮助读者对程序转换和进程执行过程有更深入的了解。


当一个进程从“执行”状态转换为“就绪”或“阻塞”时系统应该进行哪些...

1. 进程在生存周期内存在三种状态:就绪、执行、阻塞。 2. 这些状态的转换由进程调度程序控制。 3. 调度程序将处理机执行时间划分为短暂的时间块,确保同一时刻只有一个进程占用时间块。 4. 进程在时间块之间切换,给人以多进程同时执行的错觉。 5. 当执行中的进程时间块用尽,调度程序将其状态从“执行”改为“就绪”。 6. 随后,就绪状态中的某个进程将获得处理机,进入“执行”状态。 7. 如果执行中的进程因资源被占用或I/O操作未完成而无法继续,它将进入“阻塞”状态。 8. 一旦进程等待的资源释放或I/O操作完成,它将回到“就绪”状态。 9. 进程间的状态转换保证了资源的合理分配和系统的有效运行。

Linux 进程管理之进程调度与切换

我们知道,进程运行需要各种各样的系统资源,如内存、文件、打印机和最

宝贵的 CPU 等,所以说,调度的实质就是资源的分配。 系统通过不同的调度算法(Scheduling Algorithm)来实现这种资源的分配。 通常来说,选择什么样的调度算法取决于资源分配的策略(Scheduling Policy)。

有关调度相关的结构保存在 task_struct 中,如下:

active_mm 是为内核线程而引入的,因为内核线程没有自己的地址空间,为了让内核线程与普通进程具有统一的上下文切换方式,当内核线程进行上下文切换时,让切换进来的线程的 active_mm 指向刚被调度出去的进程的 active_mm(如果进程的mm 域不为空,则其 active_mm 域与 mm 域相同)。

在 linux 2.6 中 sched_class 表示该进程所属的调度器类有3种:

进程的调度策略有5种,用户可以调用调度器里不同的调度策略:

在每个 CPU 中都有一个自身的运行队列 rq,每个活动进程只出现在一个运行队列中,在多个 CPU 上同时运行一个进程是不可能的。

运行队列是使用如下结构实现的:

tast 作为调度实体加入到 CPU 中的调度队列中。

系统中所有的运行队列都在 runqueues 数组中,该数组的每个元素分别对应于系统中的一个 CPU。 在单处理器系统中,由于只需要一个就绪队列,因此数组只有一个元素。

内核也定义了一下便利的宏,其含义很明显。

Linux、c/c++服务器开发篇-------我们来聊聊进程的那些事

Linux内核 进程间通信组件的实现

学习地址:C/C++Linux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂

需要C/C++ Linux服务器架构师学习资料加qun获取(资料包括 C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg 等),免费分享

在分析调度流程之前,我们先来看在什么情况下要执行调度程序,我们把这种情况叫做调度时机。

Linux 调度时机主要有。

时机1,进程要调用 sleep() 或 exit() 等函数进行状态转换,这些函数会主动调用调度程序进行进程调度。

时机2,由于进程的时间片是由时钟中断来更新的,因此,这种情况和时机4 是一样的。

时机3,当设备驱动程序执行长而重复的任务时,直接调用调度程序。 在每次反复循环中,驱动程序都检查 need_resched 的值,如果必要,则调用调度程序 schedule() 主动放弃 CPU。

时机4 , 如前所述, 不管是从中断、异常还是系统调用返回, 最终都调用 ret_from_sys_call(),由这个函数进行调度标志的检测,如果必要,则调用调用调度程序。 那么,为什么从系统调用返回时要调用调度程序呢?这当然是从效率考虑。 从系统调用返回意味着要离开内核态而返回到用户态,而状态的转换要花费一定的时间,因此,在返回到用户态前,系统把在内核态该处理的事全部做完。

Linux 的调度程序是一个叫 Schedule() 的函数,这个函数来决定是否要进行进程的切换,如果要切换的话,切换到哪个进程等。

从代码分析来看,Schedule 主要完成了2个功能:

进程上下文切换包括进程的地址空间的切换和执行环境的切换。

对于 switch_mm 处理,关键的一步就是它将新进程页面目录的起始物理地址装入到寄存器 CR3 中。 CR3 寄存器总是指向当前进程的页面目录。

switch_to 把寄存器中的值比如esp等存放到进程thread结构中,保存现场一边后续恢复,同时调用 __switch_to 完成了堆栈的切换。

在进程的 task_struct 结构中有个重要的成分 thread,它本身是一个数据结构 thread_struct, 里面记录着进程在切换时的(系统空间)堆栈指针,取指令地址(也就是“返回地址”)等关键性的信息。

关于__switch_to 的工作就是处理 TSS (任务状态段)。

TSS 全称task state segment,是指在操作系统进程管理的过程中,任务(进程)切换时的任务现场信息。

linux 为每一个 CPU 提供一个 TSS 段,并且在 TR 寄存器中保存该段。

linux 中之所以为每一个 CPU 提供一个 TSS 段,而不是为每个进程提供一个TSS 段,主要原因是 TR 寄存器永远指向它,在任务切换的适合不必切换 TR 寄存器,从而减小开销。

在从用户态切换到内核态时,可以通过获取 TSS 段中的 esp0 来获取当前进程的内核栈 栈顶指针,从而可以保存用户态的 cs,esp,eip 等上下文。

TSS 在任务切换过程中起着重要作用,通过它实现任务的挂起和恢复。 所谓任务切换是指,挂起当前正在执行的任务,恢复或启动另一任务的执行。

在任务切换过程中,首先,处理器中各寄存器的当前值被自动保存到 TR(任务寄存器)所指定的任务的 TSS 中;然后,下一任务的 TSS 被装入 TR;最后,从 TR 所指定的 TSS 中取出各寄存器的值送到处理器的各寄存器中。 由此可见,通过在 TSS 中保存任务现场各寄存器状态的完整映象,实现任务的切换。

因此,__switch_to 核心内容就是将 TSS 中的内核空间(0级)堆栈指针换成 next->esp0。 这是因为 CPU 在穿越中断门或者陷阱门时要根据新的运行级别从TSS中取得进程在系统空间的堆栈指针。

thread_0 指向进程的系统空间堆栈的顶端。 当一个进程被调度运行时,内核会将这个变量写入 TSS 的 esp0 字段,表示这个进程进入0级运行时其堆栈的位置。 换句话说,进程的 thread_struct 结构中的 esp0 保存着其系统空间堆栈指针。 当进程穿过中断门、陷阱门或者调用门进入系统空间时,处理器会从这里恢复期系统空间栈。

由于栈中变量的访问依赖的是段、页、和 esp、ebp 等这些寄存器,所以当段、页、寄存器切换完以后,栈中的变量就可以被访问了。

因此 switch_to 完成了进程堆栈的切换,由于被切进的进程各个寄存器的信息已完成切换,因此 next 进程得以执行指令运行。

由于 A 进程在调用 switch_to 完成了与 B 进程堆栈的切换,也即是寄存器中的值都是 B 的,所以 A 进程在 switch_to 执行完后,A停止运行,B开始运行,当过一段时间又把 A 进程切进去后,A 开始从switch_to 后面的代码开始执行。

schedule 的调用流程如下:

进程状态的转换包括哪些?

题目说的是进程状态的转换,进程状态的转换没有等待态(阻塞态)-运行态和就绪态-等待态(阻塞态)。 因为进程转化为阻塞态是进程主动进行的。 进程转为就绪态为进程被动进行的,所以可以推断没有等待态(阻塞态)-运行态和就绪态-等待态(阻塞态)。

扩展资料:

进程状态的定义

进程:并发执行的程序在执行过程中分配和管理资源的基本单位。

进程状态:一个进程的生命周期可以划分为一组状态,这些状态刻画了整个进程。 进程状态即体现一个进程的生命状态。

进程状态的分类

1、三态模型

一个进程从创建而产生至撤销而消亡的整个生命期间,有时占有处理器执行,有时虽可运行但分不到处理器、有时虽有空闲处理器但因等待某个事件的发生而无法执行,这一切都说明进程和程序不相同,它是活动的且有状态变化的,这可以用一组状态加以刻画。

为了便于管理进程,一般来说,按进程在执行过程中的不同情况至少要定义三种不同的进程状态:

运行(running)态:进程占有处理器正在运行。

就绪(ready)态:进程具备运行条件,等待系统分配处理器以便运行。

等待(wait)态:又称为阻塞(blocked)态或睡眠(sleep)态,指进程不具备运行条件,正在等待某个事件的完成。

2、五态模型

在一个实际的系统里进程的状态及其转换比上节叙述的复杂一些,例如,引入专门的新建态(new)和终止态(exit )。

引入新建态和终止态对于进程管理来说是非常有用的。新建态对应于进程刚刚被创建的状态,创建1个进程要通过两个步骤:

首先,是为一个新进程创建必要的管理信息。

然后,让该进程进入就绪态。 此时进程将处于新建态,它并没有被提交执行,而是在等待操作系统完成创建进程的必要操作。 必须指出的是,操作系统有时将根据系统性能或主存容量的限制推迟新建态进程的提交。

本文原创来源:电气TV网,欢迎收藏本网址,收藏不迷路哦!

相关阅读

添加新评论