已阅读5页,还剩36页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
11121763-盛俊 操作系统上机实验报告SHANGHAI UNIVERSITY计算机操作系统实验报告(实验三、六)学 院 计算机工程与科学学院专 业 计算机科学与技术组 号 第 28 组姓 名 11121763 盛俊 教 师 沈俊 赵正德 日 期 2013-10-25实验三进程管理及进程通信一. 实验目的利用Linux提供的系统调用设计程序,加深对进程概念的理解。体会系统进程调度的方法和效果。了解进程之间的通信方式以及各种通信方式的使用。二. 实验准备复习操作系统课程中有关进程、进程控制的概念以及进程通信等内容(包括软中断通信、管道、消息队列、共享内存通信及信号量概念)。熟悉本实验指导第五部分有关进程控制、进程通信的系统调用。它会引导你学会怎样掌握进程控制。阅读例程中的程序段。三. 实验方法用vi 编写c 程序(假定程序文件名为prog1.c)编译程序$ gcc -o prog1.o prog1.c 或$ cc -o prog1.o prog1.c 运行$./prog1.o四. 实验内容及步骤1. 编写程序。显示进程的有关标识(进程标识、组标识、用户标识等)。经过5 秒钟后,执行另一个程序,最后按用户指示(如:Y/N)结束操作。2. 参考例程1,编写程序。实现父进程创建一个子进程。体会子进程与父进程分别获得不同返回值,进而执行不同的程序段的方法。思考:子进程是如何产生的?又是如何结束的?子进程被创建后它的运行环境是怎样建立的?答:是由父进程用fork()函数创建形成的,通过exit()函数自我结束,子进程被创建后核心将其分配一个进程表项和进程标识符,检查同时运行的进程数目,并且拷贝进程表项的数据,由子进程继承父进程所有文件。3. 参考例程2,编写程序。父进程通过循环语句创建若干子进程。探讨进程的家族树以 及子进程继承父进程的资源的关系。思考题:画出进程的家族树。子进程的运行环境是怎样建立的?反复运行此程序看会有什么情况?解释一下。修改程序,使运行结果呈单分支结构,即每个父进程只产生一个子进程。画出进程树,解释该程序。22641.22712269226522702268226622672.修改之后的程序运行结果:2340234123422343解释:当该进程为父进程时就创建子进程并退出,当该进程为子进程时返回标识号4. 参考例程3 编程,使用fork( )和exec( )等系统调用创建三个子进程。子进程分别启动不同程序,并结束。反复执行该程序,观察运行结果,结束的先后,看是否有不同次序。思考:子进程运行其它程序后,进程运行环境怎样变化的?反复运行此程序看会有什么情况?解释一下。答:子进程运行其他程序后,这个进程就完全被新程序代替。由于并没有产生新进程所以进程标识号不改变,除此之外的旧进程的其他信息,代码段,数据段,栈段等均被新程序的信息所代替。新程序从自己的main()函数开始进行。反复运行此程序发现结束的先后次序是不可预知的,每次运行结果不一样。原因是当每个子进程运行其他程序时,他们的结束随着其他程序的结束而结束,所以结束的先后次序在改变。5. 参考例程4编程,验证子进程继承父进程的程序、数据等资源。如用父、子进程修改公共变量和私有变量的处理结果;父、子进程的程序区和数据区的位置。思考:子进程被创建后,对父进程的运行环境有影响吗?解释一下。答:子进程被创建后,对父进程的运行环境无影响,因为当子进程在运行时,他有自己的代码段和数据段,这些都可以作修改,但是父进程的代码段和数据段是不会随着子进程数据段和代码段的改变而改变。6. 参照实验指导第五部分中“管道操作的系统调用”。复习管道通信概念,参考例程5,编写一个程序。父进程创建两个子进程,父子进程之间利用管道进行通信。要求能显示父进程、子进程各自的信息,体现通信效果。代码:思考:什么是管道?进程如何利用它进行通信的?解释一下实现方法。修改睡眠时机、睡眠长度,看看会有什么变化。请解释。加锁、解锁起什么作用?不用它行吗?答:1.管道是指能够连接一个写进程和一个读进程,并允许他们以生产者-消费者方式进行通信的一个共享文件,又称pipe文件。由写进程从管道的入端将数据写入管道,而读进程则从管道出端读出数据来进行通信。2.修改睡眠时机和睡眠长度都会引起进程被唤醒的时间不一,因为睡眠时机决定进程在何时睡眠,睡眠长度决定进程何时被唤醒。3.加锁、解锁是为了解决临界资源的共享问题。不用它将会引起无法有效管理数据,即数据会被修改导致读错了数据。7. 编程验证:实现父子进程通过管道进行通信。进一步编程,验证子进程结束,由父进程执行撤消进程的操作。测试父进程先于子进程结束时,系统如何处理“孤儿进程”的。思考:对此作何感想,自己动手试一试?解释一下你的实现方法。答:只要在父进程后加上wait()函数,然后打印“子进程已经结束”,一旦子进程结束,父进程撤销进程。当父进程先于子进程终止时.所有子进程的父进程改变为init进程称为进程由init进程领养。8. 编写两个程序一个是服务者程序,一个是客户程序。执行两个进程之间通过消息机制通信。消息标识MSGKEY 可用常量定义,以便双方都可以利用。客户将自己的进程标识(pid)通过消息机制发送给服务者进程。服务者进程收到消息后,将自己的进程号和父进程号发送给客户,然后返回。客户收到后显示服务者的pid和ppid,结束。以下例程6 基本实现以上功能。这部分内容涉及实验指导第五部分中“IPC系统调用”。先熟悉一下,再调试程序。思考:想一下服务者程序和客户程序的通信还有什么方法可以实现?解释一下你的设想,有兴趣试一试吗。服务者程序客户程序:答:还可以用信号量机制来实现。信号量是一个整形计数器,用来控制多个进程对共享资源的访问。或者通过消息队列信号机制,通过向消息队列发送信息、接收信息来实现进程间的通信。9. 这部分内容涉及实验指导第五部分中“有关信号处理的系统调用”。编程实现软中断信号通信。父进程设定软中断信号处理程序,向子进程发软中断信号。子进程收到信号后执行相应处理程序。思考:这就是软中断信号处理,有点儿明白了吧?讨论一下它与硬中断有什么区别?看来还挺管用,好好利用它。答:硬中断是由外部硬件产生的,而软中断是CPU根据软件的某条指令或者软件对标志寄存器的某个标志位的设置而产生的。10.怎么样,试一下吗?用信号量机制编写一个解决生产者消费者问题的程序,这可是 受益匪浅的事。本实验指导第五部分有关进程通信的系统调用中介绍了信号量机 制的使用。代码:#include #include #include #include #include #include #define N 5 / 消费者或者生产者的数目#define M 10 / 缓冲数目/int M=10;int in = 0; / 生产者放置产品的位置int out = 0; / 消费者取产品的位置int buffM = 0 ; / 缓冲初始化为0,开始时没有产品sem_tempty_sem; / 同步信号量,当满了时阻止生产者放产品sem_tfull_sem; / 同步信号量,当没产品时阻止消费者消费pthread_mutex_tmutex; / 互斥信号量,一次只有一个线程访问缓冲intproduct_id = 0; /生产者idintprochase_id = 0; /消费者id/信号处理函数voidHandlesignal(intsigno)printf(程序退出n,signo);exit(0);/* 打印缓冲情况 */void print() inti;printf(产品队列为);for(i = 0; i M; i+)printf(%d, buffi);printf(n);/* 生产者方法 */void *product() intid = +product_id; while(1) /重复进行 /用sleep的数量可以调节生产和消费的速度,便于观察sleep(2);sem_wait(&empty_sem);pthread_mutex_lock(&mutex);in= in % M;printf(生产者%d在产品队列中放入第%d个产品t,id, in);buffin= 1;print(); +in;pthread_mutex_unlock(&mutex);sem_post(&full_sem); /* 消费者方法 */void *prochase() intid = +prochase_id; while(1) /重复进行 /用sleep的数量可以调节生产和消费的速度,便于观察sleep(5);sem_wait(&full_sem);pthread_mutex_lock(&mutex);out= out % M;printf(消费者%d从产品队列中取出第%d个产品t,id, out);buffout= 0;print(); +out;pthread_mutex_unlock(&mutex);sem_post(&empty_sem); int main() printf(生产者和消费者数目都为5,产品缓冲为10,生产者每2秒生产一个产品,消费者每5秒消费一个产品,Ctrl+退出程序n); pthread_tid1N; pthread_tid2N;inti;intretN; /结束程序 if(signal(SIGINT,Handlesignal)=SIG_ERR)/按ctrl+C产生SIGINT信号printf(信号安装出错n); / 初始化同步信号量 intini1 = sem_init(&empty_sem, 0, M);/产品队列缓冲同步 intini2 = sem_init(&full_sem, 0, 0);/线程运行同步if(ini1 & ini2 != 0) printf(信号量初始化失败!n);exit(1); /初始化互斥信号量 intini3 = pthread_mutex_init(&mutex, NULL);if(ini3 != 0) printf(线程同步初始化失败!n);exit(1); / 创建N个生产者线程for(i = 0; i N; i+) reti= pthread_create(&id1i, NULL, product, (void *) (&i);if(reti != 0) printf(生产者%d线程创建失败!n, i);exit(1); /创建N个消费者线程for(i = 0; i N; i+) reti= pthread_create(&id2i, NULL, prochase, NULL);if(reti != 0) printf(消费者%d线程创建失败!n, i);exit(1); /等待线程销毁for(i = 0; i N; i+) pthread_join(id1i, NULL);pthread_join(id2i,NULL); exit(0);一. 研究并讨论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系统为每个进程分配的进程号。如下图:父进程通过循环语句创建若干子进程,输出打印每一个进程的进程号,我们就可以通过进程号画出家族数。1. 什么是进程?如何产生的?举例说明。进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。 引起进程创建的事件有用户登录、作业调度、提供服务和应用请求。一旦操作系统发现了要求创建新进程的事件后,便调用进程创建原语Creat( )按下述步骤创建一个新进程。申请空白PCB、为新进程分配资源、初始化进程控制块、将新进程插入就绪队列例如用户登入,在分时系统中,用户在终端键入登录命令后,如果是合法用户,系统将为该终端建立一个进程,并把它插入就绪队列中。2. 进程控制如何实现的?举例说明。 进程控制一般是由OS的内核中的原语来实现的。例子:唤醒原语wakeup( )当被阻塞进程所期待的事件出现时,如I/O完成或其所期待的数据已经到达,则由有关进程(比如用完并释放了该I/O设备的进程)调用唤醒原语wakeup( ),将等待该事件的进程唤醒。唤醒原语执行的过程是:首先把被阻塞的进程从等待该事件的阻塞队列中移出,将其PCB中的现行状态由阻塞改为就绪,然后再将该PCB插入到就绪队列中。3. 进程通信方式各有什么特点?用程序及运行结果举例说明。进程间通信可分为4种形式:(1) 主从式: 主进程可自由地使用从进程的资源或数据; 从进程的动作受主进程的控制; 主进程和从进程的关系是固定的。(2) 会话式: 使用进程在使用服务进程所提供的服务之前,必须得到服务进程的许可; 服务进程根据使用进程的要求提供服务,但对所提供服务的控制由服务进程自身完成。 使用进程和服务进程在通信时有固定连接关系。(3) 消息或邮箱机制: 只要存在空缓冲区或邮箱,发送进程就可以发送消息。 与会话系统不同,发送进程和接收进程之间无直接连接关系,接收进程可能在收到某个发送进程发来的消息之后,又转去接收另一个发送进程发来的消息。 发送进程和接收进程之间存在缓冲区或邮箱用来存放被传送消息。(4) 共享存储区方式: 诸进程可通过对共享存储区中数据的读或写来实现通信。进程在通信前,先向系统申请获得共享存储区中的一个分区,并指定该分区的关键字;若系统已经给其他进程分配了这样的分区,则将该分区的描述符返回给申请者。由申请者把获得的共享存储分区连接到本进程上。可像读、写普通存储器一样地读、写该公用存储分区。例子:以下是管道通信的程序说明和代码实现:父进程创建两个子进程,父子进程之间利用管道进行通信。程序运行结果:4. 管道通信如何实现?该通信方式可以用在何处? 向管道(共享文件)提供输入的发送进程(即写进程),以字符流形式将大量的数据送入管道;而接受管道输出的接收进程(即读进程),则从管道中接收(读)数据。这种通信方式用于数据传输、资源共享和事件通知。5. 什么是软中断?软中断信号通信如何实现?软中断是利用硬件中断的概念,用软件方式进行模拟,实现宏观上的异步执行效果。利用signal和kill实现软中断通信:kill(pid,signal): 向进程pid发送信号signal,若pid进程在可中断的优先级(低优先级)上睡眠,则将其唤醒。signal(sig,ps): 设置sig号软中断信号的处理方式;三种处理方式:SIG_DFL:系统默认方式,一般是终止进程; SIG_IGN:忽略(屏蔽);func(): 用制定义函数func()处理。 Signal设置的处理方式,仅一次有效,处理后即回到默认方式。 9(SIGKILL)号软中断不允许设置。实验六SHELL 编程一. 实验目的掌握vi 的三种工作方式,熟悉vi 编辑程序的使用。学习Shell 程序设计方法。掌握编程要领。二. 实验准备复习操作系统课程相关的用户接口概念。熟悉本实验指导第三、四部分。三. 实验内容学习使用vi 编辑程序。编写Shell 程序。将程序文件设置为可执行文件(用chmod命令)。在命令行方式中运行Shell 程序。四. 实验步骤1. 按本实验指导第三部分的内容。熟悉vi 的三种工作方式。熟悉使用各种编辑功能。思考:试一试vi 的三种工作方式各用在何时?用什么命令进入插入方式?怎样退出插入方式?文件怎样存盘?注意存盘后的提示信息。Vi有三种基本的工作模式:指令行模式、文本输入模式、行末模式。他们的相互关系如所示。指令模式(Command Mode) 下输入 a、i、o进入文本输入模式(Input Mode)文本输入模式(Input Mode) 下按ESC进入指令模式(Command Mode)指令模式(Command Mode)下输入:进入末行模式(Last line Mode)末行模式(Last line Mode)下指令错误则返回指令模式(Command Mode)下面分别介绍这三种模式1、指令模式(Command Mode)指令模式主要使用方向键移动光标位置进行文字的编辑,下面列出了常用的操作命令及含义。0 光标移动至行首h 光标左移一格l 光标右移一格j 光标下移一行k 光标上移一行$+A将光标移动到该行最后PageDn 向下移动一页PageUp 向上移动一页d+方向键 删除文字dd 删除整行pp 整行复制r 修改光标所在的字符S 删除光标所在的列,并进入输入模式2、文本输入模式(Input Mode)在指令模式下(Command Mode)按aA键、i/I键、oO键进入文本模式,文本输入模式的命令及其含义如下所示。a 在光标后开始插入A 在行尾开始插入i 从光标所在位置前面开始插入I 从光标所在列的第一个非空白字元前面开始插入o 在光标所在列下新增一列并进入输入模式O 在光标所在列上方新增一列并进入输入模式ESC 返回命令行模式3、末行模式(Last line Mode)末行模式主要进行一些文字编辑辅助功能,比如字串搜索、替代、保存文件等操作。主要命令如下:q 结束Vi程序,如果文件有过修改,先保存文件:q! 强制退出Vi程序:wq 保存修改并退出程序:set nu 设置行号需要注意的是,以上指令都是在英文输入模式下才有效,在linux 终端下有时我们用的是中文输入模式,输入中文的“:”就不能转换模式了文件创建后保存:用vi编辑器,用vi编辑器打开一个文件例如:vi work.c然后就进入work.c文件里了,之后就是vi编辑器的使用方法了。刚进去的时候是命令状态,此时按i进入编辑状态,你可以编写内容。写完之后按esc,进入命令模式,再按shift + : 输入wq就保存并退出了。2. 创建和执行Shell 程序用前面介绍的Vi 或其他文本编辑器编写Shell 程序,并将文件以文本文件方式保存在相应的目录中。用chmod将文件的权限设置为可执行模式,如若文件名为shdemo.h,则命令如下:$ chmod 755 shdemo.h(文件主可读、写、执行,同组人和其他人可读和执行) 在提示符后执行Shell 程序: $ shdemo.h(直接键入程序文件名执行)或 $ shshdemo.h(执行Shell 程序)或 $ .shdemo.h(没有设置权限时可用点号引导)3. 用vi 编写实验指导“第四部分Shell 程序设计”中的例1(假设文件名为prog1.h),练习内部变量和位置参数的用法。用chmod将文件的权限设置为可执行模式,并在提示符后键入命令行:$./prog1. 或$sh prog1. 屏幕显示: Name not provided #没有参数在提示符后键入命令行:$./prog1.h Theodore 屏幕显示: Your name is Theodore #有一个参数#引用$1 参数的效果4. 进一步修改程序prog1.h,要求显示参数个数、程序名字,并逐个显示参数。5. 修改例1程序(即上面的prog1.h),用read命令接受键盘输入。若没有输入显示第一种提示,否则第二种提示。6. 用vi 编写实验指导“第四部分Shell 程序设计”中的例2、例3,练习字符串比较运算符、数据比较运算符和文件运算符的用法,观察运行结果。7. 修改例2程序,使在程序运行中能随机输入字符串,然后进行字符串比较。8. 修改例3程序,使在程序运行中能随机输入文件名,然后进行文件属性判断。9. 用vi 编写实验指导“第四部分Shell 程序设计”中的例4、例5、例6、例7,掌握控制语句的用法,观察运行结果。10. 用vi 编写实验指导“第四部分Shell 程序设计”中的例8 及例9掌握条件语句的用法,函数的用法,观察运行结果。11. 编程,在屏幕上显示用户主目录名(HOME)、命令搜索路径(PATH),并显示由位置参数指定的文件的类型和操作权限。思考:到此为止你对Shell 有所认识了吧?怎么样?自己再编两个程序:做个批处理程序,体会一下批处理概念。做个菜单,显示系统环境参数。将此程序设置为人人可用。五. 讨论1. Linux 的Shell 有什么特点?答:优点方面:1.shell的语法和结构比较简单,易于掌握2.学习和使用也比较方便,上手比较容易3.常用命令也比较好记,不清楚的情况下,可以通过man命令迅速找到相关的说明4.shell是解释型语言,运行之前不需要编译5.文本处理方面,主要依赖于awk、sed,能够方便快捷地处理相当复杂的问题6.程序开发的效率非常高,依赖于功能强大的命令可以迅速地完成开发任务缺点方面:1.弱类型语言,对变量定义的查检不是很严格2.效率上存在的劣势:shell相当于一个接口,大部分的功能全部靠外部程序来完成,如shell在调用awk、sed的进程来处理文件时,需要产生一个新的进程,并且还需要使用管道进行IPC进程通信,那么就会增大相应的开销。在文本处理过程中,原本一个工具一次能完成的任务,在需要经过awk和sed等多次管道后,程序性能的降低是必然的。因此,按照这个观点来看的话,完成同样功能的C代码要比shell快.结合shell易于开发,但效率不高的特点,可以用一句话来概括:“shell的开发产能优于运行的性能”3.I/O性能不高:之前看过一篇文章介绍,shell的I/O性能比perl要差,我会进一步做测试来验证这个观点是否正确。4.一些细节上的不足:向awk传入shell定义的变量时,表达式比较复杂,且对shell的变量是只能读取而不能修改不同版本shell的特点:主要有下列版本的Shell:Bourne Shell:是贝尔实验室开发的。Bourne shell是UN最初使用的shell,并且在每种UN上都可以使用。Bourne shell在shell编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种shell。BASH:是GNU的Bourne Again Shell,是GNU操作系统上默认的shell。Bash放在/bin/bash中,它有许多特色,可以提供如命令补全、命令编辑和命令历史表等功能,它还包含了很多C shell和Korn shell中的优点,有灵活和强大的编程接口,同时又有很友好的用户界面。Korn Shell:是对Bourne SHell的发展,在大部分内容上与Bourne Shell兼容。Korn shell集合了C shell和Bourne shell的优点并且和Bourne shell完全兼容。Linux系统提供了pdksh(ksh的扩展),它支持任务控制,可以在命令行上挂起、后台执行、唤醒或终止程序。C Shell:是SUN公司Shell的BSD版本。C shell是一种比Bourne shell更适于编程的shell,它的语法与C语言很相似。Linux为喜欢使用C shell的人提供了Tcsh。Tcsh是C shell的一个扩展版本。Tcsh包括命令行编辑、可编程单词补全、拼写校正、历史命令替换、作业控制和类似C语言的语法,它不仅和Bash shell是提示符兼容,而且还提供比Bash shell更多的提示符参数。Z Shell:The last shell youll ever need! Z是最后一个字母,也就是终极Shell。它集成了bash、ksh的重要特性,同时又增加了自己独有的特性。2. 怎样进行Shell编程?如何运行?有什么条件?答:shell 是操作系统的最外层。shell 合并编程语言以控制进程和文件,以及启动和控制其它程序。shell 通过提示您输入,向操作系统解释该输入,然后处理来自操作系统的任何结果输出来管理您与操作系统之间的交互。当登录到系统中时,系统定位要执行的 shell 的名称。在它执行之后,shell 显示一个命令提示符。普通用户的此提示符通常是一个 $(美元符)。当提示符下输入命令并按下 Enter 键时,shell 对命令进行求值,并尝试执行它。取决于命令说明,shell 将命令输出写到屏幕或重定向到输出。然后它返回命令提示符,并等待您输入另一个命令。3. vi 编辑程序有几种工作方式?查找有关的详细资料,熟练掌握屏幕编辑方式、转移命令方式以及末行命令的操作。学习搜索、替换字符、字和行,行的复制、移动,以及在vi中执行Shell命令的方式。答:Vi有三种基本的工作模式:指令行模式、文本输入模式、行末模式。他们的相互关系如所示。指令模式(Command Mode) 下输入 a、i、o进入文本输入模式(Input Mode)文本输入模式(Input Mod
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 郑州采油气井口装置项目可行性研究报告
- 长丝生产技术改造融资投资立项项目可行性研究报告(2025咨询)2025
- 防火门可行性研究报告样本8
- 陶瓷加工项目可行性研究报告项目建议书
- 黄栀子深加工项目可行性研究报告完整立项报告
- 2025年山东档案职称考试《档案工作实务》考试题库(浓缩500题)
- 2020-2025年中级经济师之中级经济师经济基础知识题库与答案
- 2020-2025年初级经济师之初级经济师人力资源管理基础试题库和答案要点
- 代领三方协议书
- 屠宰厂待宰协议书
- 家庭用电安全教育课件
- 职业生涯的评估与修正
- 2025年教师时事政治题考点及完整答案
- 2025年中石油考试题大全及答案
- 九小消防安全培训课件
- 湖北省黄石市十四中2025年十月质量监测九年级语文试卷(含答案)
- 纯水储罐清洗施工方案
- T-ZZB 2937-2022 推车式(干粉、水基)灭火器
- 作业设计讲解
- 学堂在线 人工智能原理 章节测试答案
- 大学生城市地下空间工程职业生涯规划
评论
0/150
提交评论