




已阅读5页,还剩29页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 操作系统 实验报告 指导老师 赵 正 德 2 实验三 进程管理及进程通信 一 实验目的 利用 Linux 提供的系统调用设计程序 加深对进程概念的理解 体会系统进程调 度的方法和效果 了解进程之间的通信方式以及各种通信方式的使用 二 实验准备 复习操作系统课程中有关进程 进程控制的概念以及进程通信等内容 包括软中 断 通信 管道 消息队列 共享内存通信及信号量概念 熟悉本 实验指导 第五部分有关进程控制 进程通信的系统调用 它会引导你学 会怎样掌握进程控 制 阅读例程中的程序段 三 实验方法 用 vi 编写 c 程序 假定程序文件名为 prog1 c 编译程序 gcc o prog1 o prog1 c 或 cc o prog1 o prog1 c 运行 prog1 o 四 实验内容及步骤 用 vi 编写使用系统调用的 C 语言程序 1 编写程序 显示进程的有关标识 进程标识 组标识 用户标识等 经过 5 秒钟 后 执行另一个程序 最后按用户指示 如 Y N 结束操作 3 编译运行结果 2 编写程序 实现父进程创建一个子进程 体会子进程与父进程分别获得 不同 返回值 进而执行不同的程序段的方法 编译运行 思考 子进程是如何产生的 又是如何结束的 子进程被创建后它的运 行环境是怎样建立的 答 子进程由fork 函数创建 通过exit 函数自我结束 子进程被创 建后核心将为其分配一个进程表项和进程标识符 检查同时运行的进程 数目 并且拷贝进程表项的数据 由子进程继承父进程的所有文件 4 3 编写程序 父进程通过循环语句创建若干子进程 探讨进程的家族树以 及子进程继承父进程的资源的关系 程序如下 编译运行 思考 画出进程的家族树 子进程的运行环境是怎样建立的 反复 运行此程序 看会有什么情况 解释一下 1839 2247 2248 2252 2254 2249 2251 2253 2250 5 每一次运行返回的进程号都不相同 但是都符合家族进程树 出现这样 的情况是由于系统本身就是随机分配进程号的 修改程序 使运行结果呈单分支结构 即每个父进程只产生一个子 进 程 画出进程树 解释该程序 用一个break break 语句使父进程在子进程结束后跳出循环 运行结果如下 进程家族树如下 2004 2401 2402 2403 2404 4 编写程序 使用fork 和exec 等系统调用创建三个子进程 子进程 分别启动 不同程序 并结束 反复执行该程序 观察运行结果 结束 的先后 看是否有不同次序 编译代码如下 6 编译运行 7 思考 子进程运行其它程序后 进程运行环境怎样变化的 反复运行此 程序看会有什么情况 解释一下 答 子进程运行其他程序后 这个进程就完全被新程序代替 由于并没 有产生新进程所以进程标识号不改变 除此之外的旧进程的其他信息 代码段 数据段 栈段等均被新程序的信息所代替 新程序从自己的 main 函数开始进行 反复运行此程序发现结束的先后次序是不可预知 的 每次运行结果不一样 原因是当每个子进程运行其他程序时 他们 的结束随着其他程序的结束而结束 所以结束的先后次序在改变 5 编译程序 验证子进程继承父进程的程序 数据等资源 如用父 子进 程修改 公共变量和私有变量的处理结果 父 子进程的程序区和数据 区的位置 编译源代码如下 编译运行结果 8 思考 子进程被创建后 对父进程的运行环境有影响吗 解释一下 答 子进程被创建后 对父进程的运行环境无影响 因为当子进程在运 行时 他有自己的代码段和数据段 这些都可以作修改 但是父进程的 代码段和数据段是不会随着子进程数据段和代码段的改变而改变 6 参照 实验指导 第五部分中 管道操作的系统调用 复习管道通信概 念 编写一个程序 父进程创建两个子进程 父子进程之间利用管道进 行通信 要 求能显示父进程 子进程各自的信息 体现通信效果 源代码 9 编译运行 思考 什么是管道 进程如何利用它进行通信的 解释一下实现方法 修改睡眠时机 睡眠长度 看看会有什么变化 请解释 加锁 解锁起什么作用 不用它行吗 答 1 管道是指能够连接一个写进程和一个读进程 并允许他们以生产 者 消费者方式进行通信的一个共享文件 又称pipe文件 由写进程从 管道的入端将数据写入管道 而读进程则从管道出端读出数据来进行通 信 2 修改睡眠时机和睡眠长度都会引起进程被唤醒的时间不一 因为睡眠 时机决定进程在何时睡眠 睡眠长度决定进程何时被唤醒 3 加锁 解锁是为了解决临界资源的共享问题 不用它将会引起无法有 效管理数据 即数据会被修改导致读错了数据 7 编程验证 实现父子进程通过管道进行通信 进一步编程 验证子进程 结束 由父进 程执行撤消进程的操作 测试父进程先于子进程结束时 系统如何处理 孤儿进程 的 把上题中的父进程中的wait 都去掉 运行结果如下 10 思考 对此作何感想 自己动手试一试 解释一下你的实现方法 答 只要在父进程后加上wait 函数 然后打印 子进程已经结束 一旦子进程结束 父进程撤销进程 把父进程中的wait 去掉 父进程 先于子进程终止时 所有子进程的父进程改变为init进程 称为进程由 init进程领养 8 编写两个程序一个是服务者程序 一个是客户程序 执行两个进程之间 通过消息机制 通信 消息标识MSGKEY 可用常量定义 以便双方都可以 利用 客户将自己的进程 标识 pid 通过消息机制发送给服务者进程 服务者进程收到消息后 将自己的进程 号和父进程号发送给客户 然 后返回 客户收到后显示服务者的pid 和ppid 结束 11 运行结果 服务者 客户程序 思考 想一下服务者程序和客户程序的通信还有什么方法可以实现 解 释一下你 的设想 有兴趣试一试吗 答 还可以用信号量机制来实现 信号量是一个整形计数器 用来控制 多个进程对共享资源的访问 或者通过消息队列信号机制 通过向消息 12 队列发送信息 接收信息来实现进程间的通信 9 这部分内容涉及 实验指导 第五部分中 有关信号处理的系统调用 编程实现软中断信号通信 父进程设定软中断信号处理程序 向子进程 发软中断信号 子进程收到信号后执行相应处理程序 源代码如下 编译运行 思考 这就是软中断信号处理 有点儿明白了吧 讨论一下它与硬中断 有什么区 别 看来还挺管用 好好利用它 答 硬中断是由外部硬件产生的 而软中断是CPU根据软件的某条指令 或者软件对标志寄存器的某个标志位的设置而产生的 10 怎么样 试一下吗 用信号量机制编写一个解决生产者 消费者问 13 题的程序 这可是 受益匪浅的事 本 实验指导 第五部分有关进程 通信的系统调用中介绍了信号量机 制的使用 include include include include include include include include include include include include define define N N 5 5 消费者或者生产者的数目消费者或者生产者的数目 define define MM 1010 缓冲数目缓冲数目 int int M 10 M 10 intint in in 0 0 生产者放置产品的位置生产者放置产品的位置 intint outout 0 0 消费者取产品的位置消费者取产品的位置 intint buff M buff M 0 0 缓冲初始化为缓冲初始化为 0 0 开始时没有产品 开始时没有产品 sem tsem t empty sem empty sem 同步信号量 当满了时阻止生产者放产品同步信号量 当满了时阻止生产者放产品 sem tsem t full sem full sem 同步信号量 当没产品时阻止消费者消费同步信号量 当没产品时阻止消费者消费 pthread mutex tpthread mutex t mutex mutex 互斥信号量 一次只有一个线程访问缓冲互斥信号量 一次只有一个线程访问缓冲 intint product idproduct id 0 0 生产者生产者 id id intint prochase idprochase id 0 0 消费者消费者 id id 信号处理函数信号处理函数 voidvoid Handlesignal intHandlesignal int signo signo printf printf 程序退出程序退出 n signo n signo exit 0 exit 0 打印缓冲情况打印缓冲情况 voidvoid print print inti inti printf printf 产品队列为产品队列为 for ifor i 0 0 i i M M i i printf d printf d buff i buff i printf n printf n 生产者方法生产者方法 voidvoid product product intint id id product id product id while 1 while 1 重复进行重复进行 用用 sleepsleep 的数量可以调节生产和消费的速度 便于观察的数量可以调节生产和消费的速度 便于观察 sleep 2 sleep 2 14 sem wait sem wait pthread mutex lock pthread mutex lock in in in in M M printf printf 生产者生产者 d d 在产品队列中放入第在产品队列中放入第 d d 个产品个产品 t id t id in in buff in buff in 1 1 print print in in pthread mutex unlock pthread mutex unlock sem post sem post 消费者方法消费者方法 voidvoid prochase prochase intidintid prochase id prochase id while 1 while 1 重复进行重复进行 用用 sleepsleep 的数量可以调节生产和消费的速度 便于观察的数量可以调节生产和消费的速度 便于观察 sleep 5 sleep 5 sem wait sem wait pthread mutex lock pthread mutex lock out out outout M M printf printf 消费者消费者 d d 从产品队列中取出第从产品队列中取出第 d d 个产品个产品 t id t id out out buff out buff out 0 0 print print out out pthread mutex unlock pthread mutex unlock sem post sem post intint main main printf printf 生产者和消费者数目都为生产者和消费者数目都为 5 5 产品缓冲为产品缓冲为 10 10 生产者每生产者每 2 2 秒生产一个产品 消秒生产一个产品 消 费者每费者每 5 5 秒消费一个产品秒消费一个产品 Ctrl Ctrl 退出程序退出程序 n n pthread tid1 N pthread tid1 N pthread tid2 N pthread tid2 N 15 inti inti intret N intret N 结束程序结束程序 if signal SIGINT Handlesignal SIG ERR if signal SIGINT Handlesignal SIG ERR 按按 ctrl Cctrl C 产生产生 SIGINTSIGINT 信号信号 printf printf 信号安装出错信号安装出错 n n 初始化同步信号量初始化同步信号量 intini1intini1 sem init M 产品队列缓冲同步产品队列缓冲同步 intini2intini2 sem init 0 线程运行同步线程运行同步 if ini1if ini1 n exit 1 exit 1 初始化互斥信号量初始化互斥信号量 intini3intini3 pthread mutex init NULL if ini3if ini3 0 0 printf printf 线程同步初始化失败 线程同步初始化失败 n n exit 1 exit 1 创建创建 N N 个生产者线程个生产者线程 for ifor i 0 0 i i N N i i ret i ret i pthread create if ret i if ret i 0 0 printf printf 生产者生产者 d d 线程创建失败 线程创建失败 n n i i exit 1 exit 1 创建创建 N N 个消费者线程个消费者线程 for ifor i 0 0 i i N N i i ret i ret i pthread create NULL if ret i if ret i 0 0 printf printf 消费者消费者 d d 线程创建失败 线程创建失败 n n i i exit 1 exit 1 等待线程销毁等待线程销毁 for ifor i 0 0 i i N N i i pthread join id1 i pthread join id1 i NULL NULL pthread join id2 i NULL pthread join id2 i NULL exit 0 exit 0 五 研究并讨论 16 1 讨论Linux 系统进程运行的机制和特点 系统通过什么来管理进程 在 Linux 中 每个进程在创建时都会被分配一个数据结构 称为进程 控制块 Process Control Block 简称 PCB PCB 中包含了很多重要的信 息 供系统调度和进程本身执行使用 所有进程的 PCB 都存放在内核空间中 PCB 中最重要的信息就是进程 PID 内核通过这个 PID 来唯一标识一个进程 PID 可以循环使用 最大值是 32768 init 进程的 pid 为 1 其他进程都是 init 进程的后代 除了进程控制块 PCB 以外 每个进程都有独立的内核堆栈 8k 一个进程描述符结构 这些数据都作为进程的控制信息储存在内核空间中 而进程的用户空间主要存储代码和数据 Linux 操作系统使用一些系统调用 如 fork wait exit 等 来 实现对进程的管理 2 C 语言中是如何使用Linux 提供的功能的 用程序及运行结果举例说 明 C语言是通过在 c文件中添加函数调用的 h文件 来调用进程管理的相 关函数 并通过getpid 和getppid 来查看Linux系统为每个进程分配的 进程号 如下图 父进程通过循环语句创建若干子进程 输出打印每一个进程 的进程号 我们就可以通过进程号画出家族数 17 3 什么是进程 如何产生的 举例说明 进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动 它是操作系统动态执行的基本单元 在传统的操作系统中 进程既是基本的 分配单元 也是基本的执行单元 引起进程创建的事件有用户登录 作业调度 提供服务和应用请求 一 旦操作系统发现了要求创建新进程的事件后 便调用进程创建原语Creat 按下述步骤创建一个新进程 申请空白PCB 为新进程分配资源 初始化进程 控制块 将新进程插入就绪队列 例如用户登入 在分时系统中 用户在终端键入登录命令后 如果是合 法用户 系统将为该终端建立一个进程 并把它插入就绪队列中 4 进程控制如何实现的 举例说明 进程控制一般是由OS的内核中的原语来实现的 例子 唤醒原语wakeup 当被阻塞进程所期待的事件出现时 如I O完成或其所期待的数 据已经到达 则由有关进程 比如用完并释放了该I O设备的进程 调用 唤醒原语wakeup 将等待该事件的进程唤醒 唤醒原语执行的过程 是 首先把被阻塞的进程从等待该事件的阻塞队列中移出 将其PCB中 的现行状态由阻塞改为就绪 然后再将该PCB插入到就绪队列中 5 进程通信方式各有什么特点 用程序及运行结果举例说明 进程间通信可分为4种形式 1 主从式 主进程可自由地使用从进程的资源或数据 从进 程的动作受主进程的控制 主进程和从进程的关系是固定的 2 会话式 使用进程在使用服务进程所提供的服务之前 必须得 到服务进程的许可 服务进程根据使用进程的要求提供服务 但对 所提供服务的控制由服务进程自身完成 使用进程和服务进程在通 信时有固定连接关系 3 消息或邮箱机制 只要存在空缓冲区或邮箱 发送进程就可以 18 发送消息 与会话系统不同 发送进程和接收进程之间无直接连接 关系 接收进程可能在收到某个发送进程发来的消息之后 又转去接 收另一个发送进程发来的消息 发送进程和接收进程之间存在缓冲 区或邮箱用来存放被传送消息 4 共享存储区方式 诸进程可通过对共享存储区中数据的读或写 来实现通信 进程在通信前 先向系统申请获得共享存储区中的一 个分区 并指定该分区的关键字 若系统已经给其他进程分配了这样 的分区 则将该分区的描述符返回给申请者 由申请者把获得的共 享存储分区连接到本进程上 可像读 写普通存储器一样地读 写 该公用存储分区 例子 以下是管道通信的程序说明和代码实现 父进程创建两个子进程 父子进程之间利用管道进行通信 19 程序运行结果 6 管道通信如何实现 该通信方式可以用在何处 向管道 共享文件 提供输入的发送进程 即写进程 以字符流形 式将大量的数据送入管道 而接受管道输出的接收进程 即读进程 则从管道中接收 读 数据 这种通信方式用于数据传输 资源共享和事件通知 7 什么是软中断 软中断信号通信如何实现 软中断是利用硬件中断的概念 用软件方式进行模拟 实现宏观 上的异步执行效果 利用signal和kill实现软中断通信 kill pid signal 向进程pid发送信号signal 若pid进程在可 中断的优先级 低优先级 上睡眠 则将其唤醒 signal sig ps 设置sig号软中断信号的处理方式 三种处理方式 SIG DFL 系统默认方式 一般是终止进程 SIG IGN 忽略 屏蔽 func 用制定义函数func 处理 Signal设置的处理方式 仅一次有效 处理后即回到默认方式 9 SIGKILL 号软中断不允许设置 六 体会 在本次进程管理和进程通信的实验中 我学会了用vim文本编译器编写C语 言实现进程的管理和进程之间的通信 并编译和运行工程文件 掌握了如 何创建子进程 理解了子进程与父进程之间的关系 实现管道通信和软中 断信号通信 对一些必要的基础函数的调用能够识别和运用 实验六 SHELL 编程 20 一一 实验目的 掌握 vi 的三种工作方式 熟悉 vi 编辑程序的使用 学习 Shell 程序设计方法 掌握编程要领 二二 实验准备 复习操作系统课程相关的用户接口概念 熟悉本 实验指导 第三 四部分 三三 实验内容 学习使用 vi 编辑程序 编写 Shell 程序 将程序文件设置为可执行文件 用 chmod 命令 在命令行方式中运行 Shell 程序 四四 实验步骤 1 按本 实验指导 第三部分的内容 熟悉 vi 的三种工作方式 熟悉使用各 种编辑功能 思考 试一试 vi 的三种工作方式各用在何时 用什么命令进入插入方式 怎 样退出插入方式 文件怎样存盘 注意存盘后的提示信息 三种工作方式的使用时机 插入方式 进入插入方式 屏幕下方有一行 Insert 字样表示 需要输入文本 的内容时用到插入方式 可以用退格键来纠正错误 在插入方式中按一下 即退 出插入方式 进入转义命令方式 转义命令方式 刚进入 vi 或退出插入方式 即为转义命令方式 这时键入的任何字符转义为 特殊功能 如 移动 删除 替换等 大多数转义命令由一个或两个字母组成 操作时没有提示符 而且输入命令不需要按 末行命令方式 在转义命令方式中 按冒号 进入末行命令方式 屏幕最末一行的行首 显示冒号作为命令提示 命令行输入后按开始执行 此时用户可进行文件 的全局操作 如 全局查找 替换 文件读 写等 用什么命令进入插入方式 用户输入命令 功能描述 i text 在光标前插入新文本 ENTER 可重起一行 I text 在当前行起始处插入新文本 a text 在光标后输入新的文本 A text 在当前行末尾输入新的文本 o text 在当前行下产生新的一行并输入文本 O text 在当前行上产生新的一行并输入文本 怎样退出插入方式 在插入方式中按一下 即退出插入方式 进入转义命令方式 21 文件怎样存盘 存盘过程只需键 入命令 w 命令 w 将文件以当前名字存入磁盘 并覆盖了文件先前的副本 但 w 命令 不影响缓冲区的内容 如果要将文件以不同的名字保存 例如 newfile 需键入命令 w newfile 如果不存在名为 newfile 的文件 vi 编辑器将存入文件并给出文件的大小 如果这个文件已经存在 那么 vi 会通知你 但并不刷新文件的内容 如果想刷新 已存在的 文件的内容 则可键入命令 w newfile 同样 感叹号 放弃了标准的 vi 防止覆盖文件的保护功能 强制刷新 2 创建和执行 Shell 程序 用前面介绍的 Vi 或其他文本编辑器编写 Shell 程序 并将文件以文本文件 方式保存在相应的目录中 用 chmod 将文件的权限设置为可执行模式 如若文件名为 shdemo h 则命 令如下 chmod 755 shdemo h 文件主可读 写 执行 同组人和其他人可读和 执行 在提示符后执行 Shell 程序 shdemo h 直接键入程序文件名执行 或 sh shdemo h 执行 Shell 程序 或 shdemo h 没有设置权限时可用点号引导 用 vim 编译程序 运行结果如下 22 3 用 vi 编写 实验指导 第四部分 Shell 程序设计 中的例 1 假设文件为 prog1 h 练习内部变量和位置参数的用法 用 vim 编译程序如下 用 chmod 将文件的权限设置为可执行模式 并在提示符后键入命令行 prog1 没有参数 或 sh prog1 屏幕显示 Name not provided 在提示符后键入命令行 prog1 h Theodore 有一个参数 屏幕显示 Your name is Theodore 引用 1 参数的效果 运行结果如下 4 进一步修改程序 prog1 h 要求显示参数个数 程序名字 并逐个显示参数 修改后的程序如下 23 运行如下 5 修改例 1 程序 即上面的 prog1 h 用 read 命令接受键盘输入 若没有输 入显示第一种 提示 否则第二种提示 修改后的程序如下 运行如下 6 用 vi 编写 实验指导 第四部分 Shell 程序设计 中的例 2 例 3 练习 字符串比较运算符 数据比较运算符和文件运算符的用法 观察运行结果 例 2 的运行结果如下 例 3 设当前目录下有一个文件 filea 控制权为 r x r x r x 即 0751 有一个子目录 cppdir 控制权为 d r w x r w x r w x 程序 compare2 h 中有 如下内容 24 运行结果 7 修改例 2 程序 使在程序运行中能随机输入字符串 然后进行字符串比较 编译程序 25 运行结果 8 修改例 3 程序 使在程序运行中能随机输入文件名 然后进行文件属性判 断 26 运行结果 9 用 vi 编写 实验指导 第四部分 Shell 程序设计 中的例 4 例 5 例 6 例 7 掌握控制语句的用法 观察运行结果 例 4 运行结果 例 5 27 运行结果 例 6 运行结果 例 7 运行结果 10 用 vi 编写 实验指导 第四部分 Shell 程序设计 中的例 8 及例 9 掌握 条件语句的用 法 函数的用法 观察运行结果 例 8 28 运行结果 例 9 运行结果 29 11 编程 在屏幕上显示用户主目录名 HOME 命令搜索路径 PATH 并 显示由位置参数指定的文件的类型和操作权限 运行结果 思考 到此为止你对 Shell 有所认识了吧 怎么样 自己再编两个程序 个批处理程序 体会一下批处理概念 运 行结果 30 做个菜单 显示系统环境参数 将此程序设置为人人可用 运行结果 31 五五 讨论 1 Linux 的 Shell 有什么特点 Shell 编程语言具有普通编程语言的很多特点 比如它也有循环结构和分支控制结构等 用这种编程语言编写的 Shell 程序与其他应用程序具有同样的效果 2 怎样进行 Shell 编程 如何运行 有什么条件 shell 程序就是一个包含若干行 shell 或者 linux 命令的文件 像编写高级语言的程序一样 编写一个 shell 程序需要一个文本编辑器 如 vi 和 vim 等 在文本编辑环境下 依据 shell 的语法规则 输入一些 shell linux 命令行 形成一个完整的程序文件 用 chmod 将文件的权限设置为可执行模式 如若文件名为 shdemo h 则命令如下 chmod 755 shdemo h 文件主可读 写 执行 同组人和其他人可读和执行 在提示符后 执行 Shell 程序 32 shdemo h 直接键入程序文件名执行 或 sh shdemo h 执行 Shell 程序 或 shdemo h
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年新能源汽车自动驾驶技术对车险行业的影响与市场反应研究报告
- 建筑施工安全管理信息化在智能建造中的应用研究2025年报告
- 2025年中国高温羊毛行业市场分析及投资价值评估前景预测报告
- 功能性饮料在2025年健身APP运动数据挖掘与市场推广策略
- 本课综合与测试说课稿小学综合实践活动六年级上册沪科黔科版
- 远程医疗助力偏远地区医疗服务体系整体效能提升报告
- 2025年中国高纯羟基化单壁碳纳米管行业市场分析及投资价值评估前景预测报告
- 2025年中国高纯度硒行业市场分析及投资价值评估前景预测报告
- 2025年中国高玻纤块状模塑料行业市场分析及投资价值评估前景预测报告
- 第5节 激光与全息照相说课稿高中物理鲁科版2019选择性必修 第一册-鲁科版2019
- 静脉高营养治疗
- 肉毒素知识培训课件
- 最终版附件1:“跨学科主题学习”教学设计(2025年版)
- 中国血脂管理指南(基层版+2024年)解读
- 艾梅乙防治知识培训课件
- 2025年春新北师大版数学七年级下册课件 第四章 三角形 问题解决策略:特殊化
- 2024年1月版安全环境职业健康法律法规标准文件清单
- 校外培训机构传染病防控健康教育制度
- 大学语文知到智慧树章节测试课后答案2024年秋南昌大学
- 凉菜岗位职责
- 药学本科毕业论文范文
评论
0/150
提交评论