OS实验二

合集下载

uCOS-II

uCOS-II

实验一、任务创建与删除1、uC/OS-II介绍对于操作系统的学习,创建任务和删除任务是最为基础的工作,uC/OS-II以源代码的形式发布,是开源软件, 但并不意味着它是免费软件。

可以将其用于教学和私下研究;但是如果将其用于商业用途,那么必须通过Micrium获得商用许可。

uC/OS-II属于抢占式内核,最多可以支持64个任务,分别对应优先级0~63,每个任务只能对应唯一的优先级,其中0为最高优先级。

63为最低级,系统保留了4个最高优先级的任务和4个最低优先级的任务,所有用户可以使用的任务数有56个。

uC/OS-II提供了任务管理的各种函数调用,包括创建任务,删除任务,改变任务的优先级,任务挂起和恢复等。

系统初始化时会自动产生两个任务:一个是空闲任务,它的优先级最低,该任务仅给一个整型变量做累加运算;另一个是系统任务,它的优先级为次低,该任务负责统计当前cpu的利用率。

μC/OS-II可管理多达63个应用任务,并可以提供如下服务,本章将针对以下服务分别以例程的方式来介绍1)信号量2)互斥信号量3)事件标识4)消息邮箱5)消息队列6)任务管理7)固定大小内存块管理8)时间管理2、任务创建与删除想让uC/OS-II管理用户的任务,用户必须要先建立任务,在开始多任务调度(即调用OSStart())前,用户必须建立至少一个任务。

uC/OS-II提供了两个函数来创建任务:OSTask Create()或OSTaskCreateExt()。

可以使用其中任意一个即可,其函数原型如下:INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U pri o)INT8U OSTaskCreateExt (void(*task)(void *pd),void *pdata,SD_STK *ptos,INT8U prio, INT16U id,OS_STK *pbos,INT32U stk_size, void *pext,INT16U opt)task:任务代码指针pdata:任务的参数指针ptos:任务的堆栈的栈顶指针prio:任务优先级id:任务特殊的标识符(uC/OS-II中还未使用)pbos:任务的堆栈栈底的指针(用于堆栈检验)stk_size:堆栈成员数目的容量(宽度为4字节)pext:指向用户附加的数据域的指针opt:是否允许堆栈检验,是否将堆栈清零,任务是否要进行浮点操作等等删除任务,是说任务将返回并处于休眠状态,任务的代码不再被uC/OS-II调用,而不是删除任务代码。

OS实验2--PV操作(1)

OS实验2--PV操作(1)

实验二 PV操作
1.实验目的
(1)加深对进程概念的理解,明确进程和程序的区别。

(2)进一步认识并发执行的实质。

(3)验证用信号量机制实现进程互斥的方法。

(4)验证用信号机制实现进程同步的方法。

2.实验预备内容
(1)阅读课本有关进程管理以及进程同步的有关章节,对临界区和临界资源概念要清晰,充分理解信号信号量机制。

(2)阅读几种经典进程同步问题的算法并理解。

熟练掌握生产者—消费者的算法思想。

3.实验环境
(1)一台运行Windows XP操作系统的计算机。

(2)选用以C、C++、Java等任何一种语言。

4.实验时间:4个机时。

5.实验内容
(1)桌上有一空盘,允许存放一只水果。

爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。

规定当盘空时一次只能放一只水果供吃者用,请用P、V原语实现爸爸、儿子、女儿三个并发进程的同步。

分析在本题中,爸爸、儿子、女儿共用一个盘子,盘中一次只能放一个水果。

当盘子为空时,爸爸可将一个水果放入果盘中。

若放入果盘中的是桔子,则允许儿子吃,女儿必须等待;若放入果盘中的是苹果,则允许女儿吃,儿子必须等待。

本题实际上是生产者-消费者问题的一种变形。

这里,生产者放入缓冲区的产品有两类,消费者也有两类,每类消费者只消费其中固定的一类产品。

(2)请用PV操作实现司机和售票员的同步。

操作系统实验二并发与调度

操作系统实验二并发与调度

实验二并发与调度一、实验目的在本实验中,通过对事件和互斥体对象的了解,来加深对Windows 2000线程同步的理解。

通过分析实验程序,了解管理事件对象的API。

了解在进程中如何使用事件对象,在进程中如何使用互斥体对象,线程如何通过文件映射对象发送数据。

二、实验环境硬件环境:计算机一台,局域网环境;软件环境:Windows 2000 Professional,Visual C++ 6.0专业版或企业版。

三、实验内容和步骤第一部分:互斥体对象本程序中显示的类CCountUpDown使用了一个互斥体来保证对两个线程间单一数值的访问。

每个线程都企图获得控制权来改变该数值,然后将该数值写入输出流中。

创建者实际上创建的是互斥体对象,计数方法执行等待并释放,为的是共同使用互斥体所需的资源(因而也就是共享资源) 。

1、利用互斥体保护共享资源程序参见实验指导书分析程序的运行结果,可以看到线程(加和减线程) 的交替执行(因为Sleep() API允许Windows切换线程) 。

在每次运行之后,数值应该返回初始值(0) ,因为在每次运行之后写入线程在等待队列中变成最后一个,内核保证它在其他线程工作时不会再运行。

1)请描述运行结果(如果运行不成功,则可能的原因是什么?) :2) 根据运行输出结果,对照分析程序,可以看出程序运行的流程吗?请简单描述:_____逆向运行__________第二部分线程通过文件对象发送数据Windows 2000提供的线程间通讯类内核对象允许同一进程或跨进程的线程之间互相发送信息,包括文件、文件映射、邮件位和命名管道等,其中最常用的是文件和文件映射。

这类对象允许一个线程很容易地向同一进程或其他进程中的另一线程发送信息。

1、演示线程通过文件对象发送数据程序参见实验指导书运行结果(如果运行不成功,则可能的原因是什么?) :阅读和分析程序,请回答问题:1) 程序中启动了多少个单独的读写线程?__________100__________________________________________________________2) 使用了哪个系统API函数来创建线程例程?_________ CreateThread()________________________________3) 文件的读和写操作分别使用了哪个API函数?_______ ReadFile()______ WriteFile()_____________ 每次运行进程时,都可看到程序中的每个线程从前面的线程中读取数据并将数据增加,文件中的数值连续增加。

软件测试实验二实验报告

软件测试实验二实验报告

软件测试实验二实验报告一、实验目的本次软件测试实验的主要目的是熟悉并掌握软件测试的基本方法和技术,通过对一个具体软件系统的测试,发现软件中存在的缺陷和问题,提高软件的质量和可靠性。

二、实验环境1、操作系统:Windows 102、测试工具:Jmeter、Selenium、Bugzilla3、开发语言:Java4、数据库:MySQL三、实验内容1、功能测试对软件的登录功能进行测试,包括输入正确和错误的用户名、密码,验证登录是否成功以及相应的提示信息是否准确。

测试软件的注册功能,检查输入的各项信息是否符合要求,如用户名长度、密码强度等。

对软件的搜索功能进行测试,输入不同的关键词,检查搜索结果的准确性和完整性。

2、性能测试使用 Jmeter 工具对软件的并发性能进行测试,模拟多个用户同时登录、搜索等操作,观察系统的响应时间、吞吐量等性能指标。

对软件的数据库操作性能进行测试,包括插入、查询、更新和删除数据,检查数据库的响应时间和资源占用情况。

3、兼容性测试在不同的浏览器(如 Chrome、Firefox、IE 等)上运行软件,检查界面显示和功能是否正常。

在不同的操作系统(如 Windows、Mac OS、Linux 等)上安装和运行软件,验证其兼容性。

4、安全测试对软件的用户认证和授权机制进行测试,检查是否存在未授权访问和越权操作的情况。

测试软件对 SQL 注入、XSS 攻击等常见安全漏洞的防范能力。

四、实验步骤1、功能测试步骤打开软件登录页面,输入正确的用户名和密码,点击登录按钮,观察是否成功登录并跳转到相应页面。

输入错误的用户名或密码,检查提示信息是否清晰准确。

进入注册页面,输入合法和不合法的注册信息,如用户名过短、密码强度不够等,查看系统的校验结果。

在搜索框中输入关键词,点击搜索按钮,对比搜索结果与预期是否一致。

2、性能测试步骤打开 Jmeter 工具,创建测试计划,添加线程组、HTTP 请求等元素。

uC_OS-II实验指导书

uC_OS-II实验指导书
3.1 µC/OS-II 概述............................................................................................................................. 5 3.2 µC/OS-II 的特点......................................................................................................................... 6 3.3 µC/OS-II 主要源代码文件介绍.................................................................................................7 4 LambdaTOOL 集成开发环境简介....................................................................................................... 7 5 µC/OS-II 实验内容简介........................................................................................................................ 8 5.1 任务管理实验............................................................................................................................ 8 5.2 优先级反转实验........................................................................................................................ 8 5.3 优先级继承实验........................................................................................................................ 9 5.4 哲学家就餐实验........................................................................................................................ 9 5.5 内存管理实验............................................................................................................................ 9 5.6 时钟中断实验............................................................................................................................ 9 5.7 消息队列实验............................................................................................................................ 9 6 预备实验:嵌入式开发环境的建立................................................................................................... 9 6.1 目的............................................................................................................................................ 9 6.2 实验步骤及说明...................................................................................................................... 10

操作系统实验二(进程管理)

操作系统实验二(进程管理)

操作系统进程管理实验实验题目:(1)进程的创建编写一段程序,使用系统调用fork( )创建两个子进程。

当此程序运行时,在系统中有一个父进程和两个子进程活动。

让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。

试观察记录屏幕上的显示结果,并分析原因。

(2)进程的控制修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行时屏幕上出现的现象,并分析原因。

(3)编制一段程序,使其实现进程的软中断通信。

要求:使用系统调用fork( )创建两个子进程,再用系统调用signal( )让父进程捕捉键盘上来的中断信号(即按Del键);当捕捉到中断信号后,父进程调用系统调用kill( )向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止: Child process 1 is killed by parent! Child process 2 is killed by parent! 父进程等待两个子进程终止后,输出如下的信息后终止: Parent process is killed! 在上面的程序中增加语句signal(SIGINT, SIG_IGN)和signal(SIGQUIT, SIG_IGN),观察执行结果,并分析原因。

(4)进程的管道通信编制一段程序,实现进程的管道通信。

使用系统调用pipe( )建立一条管道线;两个进程P1和P2分别向管道各写一句话: Child 1 is sending a message! Child 2 is sending a message! 而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。

要求父进程先接收子进程P1发来的消息,然后再接收子进程P2发来的消息。

实验源程序及报告:(1)、进程的创建#include <stdio.h>int main(int argc, char *argv[]){int pid1,pid2; /*fork first child process*/if ( ( pid1=fork() ) < 0 ){printf( "ProcessCreate Failed!");exit(-1);}if ( ( pid1=fork() ) == 0 ){printf( "b\n" );}/*fork second child process*/if ( ( pid2=fork() ) < 0 ){printf( "ProcessCreate Failed!"); exit(-1);}if ( ( pid2=fork() ) == 0 ){printf( "c\n" );}/*parent process*/else{wait(NULL);printf( "a\n" );exit(0);}return 0;}(2)、进程的控制#include <stdio.h>int main(int argc, char *argv[]){ int pid1,pid2;/*fork first child process*/if ( ( pid1=fork() ) < 0 ){printf( "ProcessCreate Failed!");exit(-1);}if ( ( pid1=fork() ) == 0 ){printf( "This is my Unix OS program!\n" ); }/*fork second child process*/if ( ( pid2=fork() ) < 0 ){printf( "ProcessCreate Failed!");exit(-1);}if ( ( pid2=fork() ) == 0 ){printf( "This is the second Child process!\n" ); }/*parent process*/else{wait(NULL);printf( "This is the Parent process\n" );exit(0);}return 0;}(3)编制一段程序,使其实现进程的软中断通信。

操作系统实验2

操作系统实验2

操作系统实验2操作系统实验报告哈尔滨工程大学软件学院一、实验概述1. 实验名称实验环境的使用2. 实验目的熟悉操作系统集成实验环境OS Lab的基本使用方法。

练习编译、调试EOS操作系统内核以及EOS应用程序。

3. 实验类型验证二、实验环境OS Lab三、实验过程新建:调试:使用Bochs作为远程目标机:调试:调试软盘引导扇区程序:查看boot.lst文件:查看最后指令字节码调试加载程序:调试内核:EOS启动后的状态和行为:ID是31的是应用程序的进程,ID31的是系统进程。

应用程序的优先级是8,而系统进程的优先级是24,应用程序的进程数是1,而系统进程的进程数是10,并且应用程序是有名字的,而系统程序没有名字。

Id是33的是应用程序的主线程,它与系统线程主要的区别就是优先级不同。

四、思考题1、为什么EOS操作系统从软盘启动时要使用boot.bin和loader.bin两个程序?使用一个可以吗?它们各自的主要功能是什么?如果将loader.bin的功能移动到boot.bin文件中,则boot.bin文件的大小是否仍然能保持小于512字节?答:在IDE环境启动执行EOS操作系统的时候,会把boot.bin、loader.bin和kernel.dll三个二进制文件写到软盘镜像文件中,然后让虚拟机来执行软盘里的EOS操作系统。

仅使用其中的一个是不能运行的。

Boot.bin程序的功能是:在Boot.bin程序执行的过程中,CPU始终处于实模式状态。

Boot.bin程序利用BIOS提供的int 0x13中断服务程序读取软盘FAT12文件系统的根目录,在根目录中搜寻loader.bin文件。

Loader.bin程序的功能是:Loader.bin程序的任务和Boot.bin程序很相似,同样是将其它的程序加载到物理内存中,但这次加载的是EOS内核。

除此之外,Loader.bin程序还负责检测内存大小,为内核准备保护模式执行环境等工作。

os实验要求

os实验要求
实验一 编程模拟进程的同步与互斥 理解操作系统原理中 “互斥” 和 “同步” 的涵义。
利用程序设计语言编程,模拟并发执行进程的同步
与互斥(要求:进程数目不少于 ቤተ መጻሕፍቲ ባይዱ 个)。
实验二 编程模拟进程的调度算法
(一)实验目的 1. 了解引起处理机调度的原因; 于第14周完成;
利用程序设计语言编程,模拟并发执行进程的同步与互斥(要求:进程数目不少于 3 个)。 分析比较各调度算法的基本思想及其优缺点。
3. 理解操作系统原理中 “互斥” 和 “同步” 的涵义。 掌握实现页面置换的 Optimal 、FIFO 和 LRU 算法基本思想。
(2)程序检查在实验课上进行,最迟 (1)按要求独立完成 3 个实验内容 进一步理解 “临界资源” 的概念;
(二)实验内容 利用程序设计语言编程,模拟并发执行进程的同步与互斥(要求:进程数目不少于 3 个)。
(二)实验内容 进一步理解几种典型的处理机调度算法;
理解操作系统原理中 “互斥” 和 “同步” 的涵义。 利用程序设计语言编程,模拟并发执行进程的同步与互斥(要求:进程数目不少于 3 个)。
利用程序设计语言编程,模拟实现处理机调度中: 实验一 编程模拟进程的同步与互斥
利用程序设计语言编程,模拟实现处理机调度中:先来先服务、高优先权和时间片轮转调度算法。
中 Optimal、FIFO 和 LRU 页面置换算法。 (要求:进程分配的物理块数目不少于 5 个)
进一步理解 “临界资源” 的概念;
分析比较各调2度.算法把的基握本思在想及多其优个缺点进。 程并发执行过程中对临界资源访问时的
于第14周完成;
必要约束条件; (要求:等待调度的进程数目不少于 5 个)
利用程序设计语言编程,模拟实现处理机调度中:先来先服务、高优先权和时间片轮转调度算法。 实验三 编程模拟页面置换算法

北航os实验报告

北航os实验报告

北航os实验报告北航OS实验报告一、引言操作系统(Operating System,简称OS)是计算机系统中最基础的软件之一,它负责管理和控制计算机硬件资源,为用户和应用程序提供一个可靠、高效的工作环境。

本文将对北航OS实验进行详细的报告和分析。

二、实验目的本次北航OS实验的目的是让学生深入理解和掌握操作系统的基本原理和实现方式。

通过实践,学生将学会设计和实现一个简单的操作系统,了解操作系统的核心功能和运行机制。

三、实验内容1. 系统引导实验开始时,我们需要编写引导程序,将操作系统加载到计算机的内存中,并跳转到操作系统的入口地址开始执行。

这一步骤是整个实验的起点,也是操作系统正常运行的基础。

2. 中断处理操作系统需要能够处理各种中断事件,如时钟中断、键盘中断等。

学生需要实现中断处理程序,使操作系统能够响应和处理这些中断事件,并根据具体情况进行相应的操作。

3. 进程管理操作系统需要能够管理多个进程的创建、调度和终止。

学生需要设计并实现进程管理模块,包括进程控制块(PCB)的数据结构和进程调度算法。

通过合理的调度策略,提高系统的并发性和响应速度。

4. 内存管理操作系统需要管理计算机的内存资源,包括内存的分配和释放。

学生需要设计并实现内存管理模块,使用合适的算法来管理内存的分配和回收,避免内存泄漏和碎片化问题。

5. 文件系统操作系统需要提供文件系统来管理计算机中的文件和数据。

学生需要设计并实现一个简单的文件系统,包括文件的创建、读写和删除等操作。

通过文件系统,用户可以方便地存储和管理自己的数据。

四、实验过程在实验过程中,我们遇到了许多挑战和问题,但通过不断的尝试和调试,我们最终成功实现了一个简单的操作系统。

以下是我们在实验过程中遇到的一些关键问题和解决方案:1. 内存管理在实验过程中,我们发现内存管理是一个非常关键的问题。

如果内存管理不当,容易导致内存泄漏或者内存碎片化,从而影响系统的性能和稳定性。

我们通过设计一个位图来管理内存的分配和释放,使用首次适应算法来分配内存,并通过合理地回收内存来避免内存泄漏问题。

北航ARM9嵌入式系统实验实验三uCOS-II实验

北航ARM9嵌入式系统实验实验三uCOS-II实验

北航ARM9嵌⼊式系统实验实验三uCOS-II实验实验三 uCOS-II实验⼀、实验⽬的在内核移植了uCOS-II 的处理器上创建任务。

⼆、实验内容1)运⾏实验⼗,在超级终端上观察四个任务的切换。

2)任务1~3,每个控制“红”、“绿”、“蓝”⼀种颜⾊的显⽰,适当增加OSTimeDly()的时间,且优先级⾼的任务延时时间加长,以便看清三种颜⾊。

3)引⼊⼀个全局变量BOOLEAN ac_key,解决完整刷屏问题。

4)任务4管理键盘和超级终端,当键盘有输⼊时在超级终端上显⽰相应的字符。

三、预备知识1)掌握在EWARM 集成开发环境中编写和调试程序的基本过程。

2)了解ARM920T 处理器的结构。

3)了解uCOS-II 系统结构。

四、实验设备及⼯具1)2410s教学实验箱2)ARM ADS1.2集成开发环境3)⽤于ARM920T的JTAG仿真器4)串⼝连接线五、实验原理及说明所谓移植,指的是⼀个操作系统可以在某个微处理器或者微控制器上运⾏。

虽然uCOS-II的⼤部分源代码是⽤C语⾔写成的,仍需要⽤C语⾔和汇编语⾔完成⼀些与处理器相关的代码。

⽐如:uCOS-II在读写处理器、寄存器时只能通过汇编语⾔来实现。

因为uCOS-II 在设计的时候就已经充分考虑了可移植性,所以,uCOS-II的移植还是⽐较容易的。

要使uCOS-II可以正常⼯作,处理器必须满⾜以下要求:(1)处理器的C编译器能产⽣可重⼊代码可重⼊的代码指的是⼀段代码(如⼀个函数)可以被多个任务同时调⽤,⽽不必担⼼会破坏数据。

也就是说,可重⼊型函数在任何时候都可以被中断执⾏,过⼀段时间以后⼜可以继续运⾏,⽽不会因为在函数中断的时候被其他的任务重新调⽤,影响函数中的数据。

(2)在程序中可以打开或者关闭中断在uCOS-II中,可以通过OS_ENTER_CRITICAL()或者OS_EXIT_CRITICAL()宏来控制系统关闭或者打开中断。

这需要处理器的⽀持,在ARM920T的处理器上,可以设置相应的寄存器来关闭或者打开系统的所有中断。

嵌入式实时操作系统ucosII实验2

嵌入式实时操作系统ucosII实验2

嵌入式实时操作系统实验报告任务间通信机制的建立系别计算机与电子系专业班级电子0901班学生姓名高傲指导教师黄向宇提交日期 2012 年 4 月 1 日一、实验目的二掌握在基于嵌入式实时操作系统μC/OS-II的应用中,任务使用信号量的一般原理。

掌握在基于优先级的可抢占嵌入式实时操作系统的应用中,出现优先级反转现象的原理及解决优先级反转的策略——优先级继承的原理。

二、实验内容1.建立并熟悉Borland C 编译及调试环境。

2.使用课本配套光盘中第五章的例程运行(例5-4,例5-5,例5-6),观察运行结果,掌握信号量的基本原理及使用方法,理解出现优先级反转现象的根本原因并提出解决方案。

3.试编写一个应用程序,采用计数器型信号量(初值为2),有3个用户任务需要此信号量,它们轮流使用此信号量,在同一时刻只有两个任务能使用信号量,当其中一个任务获得信号量时向屏幕打印“TASK N get the signal”。

观察程序运行结果并记录。

4. 试编写一个应用程序实现例5-7的内容,即用优先级继承的方法解决优先级反转的问题,观察程序运行结果并记录。

5.在例5-8基础上修改程序增加一个任务HerTask,它和YouTask一样从邮箱Str_Box里取消息并打印出来,打印信息中增加任务标识,即由哪个任务打印的;MyTask发送消息改为当Times为5的倍数时才发送,HerTask接收消息采用无等待方式,如果邮箱为空,则输出“The mailbox is empty”, 观察程序运行结果并记录。

三、实验原理1. 信号量µC/OS-II中的信号量由两部分组成:一个是信号量的计数值,它是一个16位的无符号整数(0 到65,535之间);另一个是由等待该信号量的任务组成的等待任务表。

用户要在OS_CFG.H中将OS_SEM_EN开关量常数置成1,这样µC/OS-II 才能支持信号量。

在使用一个信号量之前,首先要建立该信号量,也即调用OSSemCreate()函数(见下一节),对信号量的初始计数值赋值。

基于LambdaEDU+x86虚拟机的uC_OS-II实验指导书

基于LambdaEDU+x86虚拟机的uC_OS-II实验指导书
uC/OS-II 实验指导书
uC/OS-II 实验指导书
(基于 LambdaEDU+x86 虚拟机)
电子科技大学嵌入式软件工程中心 北京科银京成技术有限公司 2008 年 5 月
-1-
uC/OS-II 实验指导书
目录
目录 .......................................................................................................................................................... 2
第 1 章 实验系统简介及入门 .............................................................................................................5
1.1. 实验系统的目的 .....................................................................................................................5 1.2. 实验系统的构成 .....................................................................................................................5 1.3. 操作系统简介 .........................................................................................................................5

实验二交换机配置方式及基本命令的熟悉

实验二交换机配置方式及基本命令的熟悉

实验二交换机的配置方式及基本命令的熟悉【实验目的】通过对交换机设备的几种配置手段、配置模式和基本配置命令的认识,获得交换机的基本使用能力。

【实验任务】1、认识交换机的的配置方式;2、按照给出的参考拓扑图构建逻辑拓扑图;3、按照给出的配置参数表配置各个设备;4、练习交换机的一些基本命令。

【实验背景】在前面的实验中我们已经接触了Cisco的路由器运行的Cisco互联网络操作系统(ISO,Internetwork Operating System),熟悉了Cisco ISO软件内置的命令行界面(CLI,command-line interface )。

同样,交换机可以通过一个菜单驱动程序的界面,或者通过命令行界面〔CLI〕,或者在交换机配置了IP地址后通过Telnet远程登录、web登录的方式对交换机来进行配置。

交换机除了可以通过Console端口与计算机直接连接外还可以通过交换机的普通端口进行连接。

如果是堆叠型的,也可以把几台交换机一起进行配置,因为实际上这个时候它们是一个整体,这时通过普通端口对交换机进行管理时,就不再使用超级终端了,而是以Telnet 虚拟终端或Web浏览器的方式实现与被管理交换机的通信。

前提是在本地配置方式中已为交换机配置好了IP地址,我们可通过IP地址与交换机进行通信,不过要注意,只有是网管型的交换机才具有这种管理功能。

实际上最常用的Catalyst交换机OS被称为Catalyst OS、Catos,其最大的特点是基于set命令。

但我们常用的是与路由器的IOS相类似的基于IOS的Catalyst OS。

下面简单介绍交换机的各种命今模式以及各种常用的命令。

表3.1 交换机的各种命令模式的访问方式、提示符、退出方法及其描述表3.2 常用的命令及其完成的任务【实验设备】Calalyst2950,运行终端仿真程序的PC、Console扁平线缆和相应的DB-9或DB-25适配器,直通线(本实验在packet tracer 5.3 环境下完成)【实验拓扑与参数配置】表3.3 配置参数表图3.1 参考拓扑图【实验步骤】步骤1 设计一个局域网,并按照所设计的拓扑图进行连接。

嵌入式系统实验报告

嵌入式系统实验报告

嵌入式系统实验报告学院:计算机科学与工程姓名:学号:______________专业:指导老师:完成日期:实验一:流水灯案例、8位数码管动态扫描案例一、实验目的1.1进一步熟悉Keil C51集成开发环境调试功能的使用;1.2学会自己编写程序,进行编译和仿真测试;1.3利用开发板下载hex文件后验证功能。

二、实验原理2.1:实验原理图2.2:工作原理2.2.1:流水灯电路中有LO,1,L2,L3,4,L5,L6,L7 共八个发光二极管,当引脚LED_ SEL输入为1,对于A、B、C、D、E、F、G、H引脚,只要输入为1,则点亮相连接的发光二极管。

A~H引脚连接STM32F108VB芯片的PE8~PE15,程序初始化时,对其进行初始设置。

引脚LED_ SEL 为1时,发光二极管才工作,否则右边的数码管工作。

注意,LED SEL 连接于PB3,该引脚具有复用功能,在默认状态下,该引脚的I0不可用,需对AFIO_ MAPR寄存器进行设置,设置其为10可用。

2.2.2:8位数码管数码管中的A~G、DP段分别连接到电路图中的A~G、H线上,当某段上有一-定的电压差值时,便会点亮该段。

当E3输入为1,也就是LED_ SEL输入为0时,根据SELO~SEL2的值确定选中的数码管,即位选,再根据A~H引脚的高低电平,点亮对应段,即段选。

三、实验结果3.1:流水灯对于给出的流水灯案例,下载HEX文件后,在开发板上可观察到L0-L7从左至右依次点亮,间隔300ms。

当全部点亮八个发光二极管后,八个发光二极管同时熄灭,间隔300ms后,发光二极管再次从左至右依次点亮。

如此反复循坏。

3.2:8位数码管对于给出的8位数码管动态扫描案例,下载后,在开发板上可观察到8个数码管从左至右依次显示对应的数字,且每一个数码显示的数字在1-9之间循环。

可以通过加快扫描频率,使得八位数码管在人眼看上去是同时显示。

在后续的案例中可以看到该现象。

实验一、二(OS)

实验一、二(OS)

实验一进程同步和互斥(建议4学时)一、实验目的1.掌握临界资源、临界区概念及并发进程互斥、同步访问原理。

2.学会使用高级语言进行多线程编程的方法。

3.掌握利用VC++或Java语言线程库实现线程的互斥、条件竞争,并编码实现P、V 操作,利用P、V操作实现两个并发线程对有界临界区的同步访问。

4.通过该实验,学生可在源代码级完成进程同步互斥方案的分析、功能设计、编程实现,控制进程间的同步、互斥关系。

二、实验要求1.知识基础:学生应在完成进程和线程及调度等章节的学习后进行。

2.开发环境与工具:硬件平台——个人计算机。

软件平台-Windows操作系统,vc++语言或Java语言开发环境。

3.运用高级语言VC++或Java语言线程库及多线程编程技术进行设计实现。

三、实验内容1.实现临界资源、临界区、进程或线程的定义与创建。

2.利用两个并发运行的进程,实现互斥算法和有界缓冲区同步算法。

四、实验方案指导该实验方案由以下几个关键设计项目组成:1.并发访问出错。

即设计一个共享资源,创建两个并发线程,二者并发访问该共享资源。

当没有采用同步算法设计时,线程所要完成的某些操作会丢失。

2.互斥锁。

并发线程使用线程库提供的互斥锁,对共享资源进行访问。

3.软件方法。

设计并编程实现计数信号量、P操作函数、V操作函数,并发线程通过调用P,V操作函数实现线程的互斥。

4.同步访问多缓冲区。

利用上面的软件方法完成P,V操作,可实现两个线程对多缓冲区的同步访问。

五、实验方案实现范例以下是对该项目中包含的部分设计功能的实现方法、实现过程、技术手段的描述,供师生参考。

1.模拟线程并发运行。

假设我们使用POSIX线程库,而POSIX并没有真正提供线程间的并发运行需求。

我们设计的系统应支持符合RR调度策略的并发线程,每个线程运行一段时间后自动挂起,另一个线程开始运行。

这样一个进程内所有线程以不确定的速度并发执行。

2.模拟一个竞争条件——全局变量。

Windows操作系统实验二实验报告

Windows操作系统实验二实验报告

Windows 操作系统C/C++ 程序实验:____ 王晨璐___学号:__ 1131000046 ___班级:_ 1 班_____院系:___信息工程学院___2015__年_10_月_26_日实验二Win dows 2000/xp进程控制、背景知识、实验目的三、工具/准备工作四、实验容与步骤请回答:Windows 所创建的每个进程都是以调用CreateProcess()API函数开始和以调用TerminateProcess()或ExitProcess() API 函数终止。

1. 创建进程步骤5:编译完成后,单击“ Build ”菜单中的“ Build 2-1 .exe”命令,建立2-1 .exe可执行文件。

操作能否正常进行?如果不行,则可能的原因是什么?可以正常运行。

清单2-1展示的是一个简单的使用CreateProcess() API函数的例子。

首先形成简单的命令行,提供当前的EXE 文件的指定文件名和代表生成克隆进程的。

大多数参数都可取缺省值, 但是创建标志参数使用了:CREATE NEW CONSOLE标志,指示新进程分配它自己的控制台,这使得运行示例程序时,在任务栏上产生许多活动标 记。

然后该克隆进程的创建方法关闭传递过来的句柄并返回 一进程的执行主线程暂停一下,以便让用户看到其中的至少一个窗口。

CreateProcess()函数有10个核心参数?本实验程序中设置的各个参数的值是: a. LPCSTR IpApplivetio nN amemain()函数。

在关闭程序之前,每 szFlle name b. LPCSTR lpComma ndLineszCmdL inec. LPSECURITY_A TTRIBUTES IpProcessAttributesNULL d. LPSECURITY_ATTRIBUTES lpThreadAttributes NULLe.BOOL bI nheritha ndle Falsef. DWORD dwCreatio nFlage CREATE NEW CONSOLEg. LPVOID ipE nvironment NULLh. LPCTSTR lpCurre ntDirectory NULL I. STARTUPINFO lp startup info &siJ. LPPROCESS INFORMA TIONlpProcess In formati on &pi程序运行时屏幕显示的信息是:提示:部分程序在Visual C++环境完成编译、之后,还可以在Windows 2000/xp的“命令提示符”状态下尝试执行该程序,看看与在可视化界面下运行的结果有没有不同?为什么?界面是一样的2. 正在运行的进程步骤10:编译完成后,单击“ Build ”菜单中的“ Build 2-2.exe”命令,建立2-2.exe可执行文件。

操作系统实验心得(精选多篇)

操作系统实验心得(精选多篇)

第一篇:操作系统实验每一次课程设计度让我学到了在平时课堂不可能学到的东西。

所以我对每一次课程设计的机会都非常珍惜。

不一定我的课程设计能够完成得有多么完美,但是我总是很投入的去研究去学习。

所以在这两周的课设中,熬了2个通宵,生物钟也严重错乱了。

但是每完成一个任务我都兴奋不已。

一开始任务是任务,到后面任务就成了自己的作品了。

总体而言我的课设算是达到了老师的基本要求。

总结一下有以下。

2、同学间的讨论,这是很重要的。

老师毕竟比较忙。

对于课程设计最大的讨论伴侣应该是同学了。

能和学长学姐讨论当然再不过了,没有这个机会的话,和自己班上同学讨论也是能够受益匪浅的。

大家都在研究同样的问题,讨论起来,更能够把思路理清楚,相互帮助,可以大大提高效率。

3、敢于攻坚,越是难的问题,越是要有挑战的心理。

这样就能够达到废寝忘食的境界。

当然这也是不提倡熬夜的,毕竟有了精力才能够打持久战。

但是做课设一定要有状态,能够在吃饭,睡觉,上厕所都想着要解决的问题,这样你不成功都难。

在编程中以下几类做法容易导致段错误,基本是是错误地使用指针引起的1)访问系统数据区,尤其是往系统保护的内存地址写数据,最常见就是给一个指针以0地址2)内存越界(数组越界,变量类型不一致等) 访问到不属于你的内存区域3)其他例如:<1>定义了指针后记得初始化,在使用的时候记得判断是否为null<2>在使用数组的时候是否被初始化,数组下标是否越界,数组元素是否存在等<3>在变量处理的时候变量的格式控制是否合理等解决方法1.利用gdb逐步查找段错误:2.分析core件3.段错误时启动调试:4.利用backtrace和objdump进行分析:总而言之,对待课设要像对待自己的作品一样,不要当作任务来完成。

第二篇:操作系统实验总结学号:姓名:班级:在本学期的计算机操作系统这门课学习当中,为了更的了解操作系统相关知识,我们通过os lab平台做了几个实验。

《操作系统课程》实验(实训)指导大纲

《操作系统课程》实验(实训)指导大纲

《操作系统课程》实验(实训)指导大纲课程编号:G611SG0004课程性质:学科基础课适用专业:计算机科学与技术网络工程数字媒体实验学时:16实验教材:自编符合《认证标准》:具有运用工程基础知识和本专业基本理论知识解决问题的能力,具有系统的工程实践学习经历;完成本课程实验(实训)总软件最少行数: 2000实验成绩评价方法:学生每完成一个实验项目,要求独立认真的填写实验报告。

实验指导教师将根据学生完成实验的态度和表现,结合填写的实验报告评定实验成绩,成绩的评定按百分制评分。

老师根据平时实验的分数之和取平均分,得出综合成绩。

实验(实训)内容:实验一操作系统安装及熟练使用(一)实验目的熟悉Windows//Linux操作系统的安装过程与安装方法,并掌握该操作系统所提供的用户接口环境,并为后续实验做好编程环境准备。

(二)实验项目内容1、熟悉Windows//Linux操作系统的安装过程与安装方法,并掌握该操作系统所提供的用户接口环境,通过系统提供的用户管理程序、查看系统中的用户情况、进程、线程、内存使用情况等,学会使用它进行监视进程的状况、系统资源的使用情况及用户情况。

并为后续实验做好编程环境准备。

2、用C语言编写一小段程序,使其可以通过某个系统调用来获得OS提供的某种服务。

(三)主要仪器设备一台PC机(四)实验室名称计算机中心实验室(五)实验报告撰写(撰写的格式采用教务处所提供的样本见附件)......实验二编程模拟进程间的同步和互斥(一)实验目的通过实验加强对进程同步和互斥的理解,并掌握进程(线程)的创建和调用方法。

学会使用信号量解决资源共享问题。

学生可以自己选择在Windows或Linux系统下编写。

代码不得少于200行。

(二)实验项目内容1.以下为Linux系统下参考程序,请编译、运行并观察程序的输出,并分析实验结果,写出实验报告。

#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<time.h>#include<sys/types.h>#include<sys/wait.h>#include<linux/sem.h>#define NUM_PROCS 5#define SEM_ID 250#define FILE_NAME "/tmp/sem_aaa"#define DELAY 4000000void update_file(int sem_set_id, char *file_path, int number){struct sembuf sem_op;FILE *file;//等待信号量的数值变为非负数,此处设为负值,相当于对信号量进行P操作sem_op.sem_num=0;sem_op.sem_op=-1;sem_op.sem_flg=0;semop(sem_set_id,&sem_op,1);//写文件,写入的数值是当前进程的进程号file=fopen(file_path,"w");if(file){//临界区fprintf(file,"%d\n",number);printf("%d\n",number);fclose(file);}//发送信号,把信号量的数值加1,此处相当于对信号量进行V操作sem_op.sem_num=0;sem_op.sem_op=1;sem_op.sem_flg=0;semop(sem_set_id,&sem_op,1);}//子进程写文件void do_child_loop(int sem_set_id,char *file_name){ pid_t pid=getpid();int i,j;for(i=0;i<3;i++){update_file(sem_set_id,file_name,pid);for(j=0;j<4000000;j++);}}int main(int argc,char **argv){int sem_set_id; //信号量集的IDunion semun sem_val; //信号量的数值,用于semctl()int child_pid;int i;int rc;// 建立信号量集,ID是250,其中只有一个信号量sem_set_id=semget(SEM_ID,1,IPC_CREAT|0600);if(sem_set_id==-1){perror("main: semget");exit(1);}//把第一个信号量的数值设置为1sem_val.val=1;rc=semctl(sem_set_id,0,SETVAL,sem_val);if(rc==-1){perror("main:semctl");exit(1);}//建立一些子进程,使它们可以同时以竞争的方式访问信号量for(i=0;i<NUM_PROCS;i++){child_pid=fork();switch(child_pid){case -1:perror("fork");case 0: //子进程do_child_loop(sem_set_id,FILE_NAME);exit(0);default: //父进程接着运行break;}}//等待子进程结束for(i=0;i<NUM_PROCS;i++){int child_status;wait(&child_status);}printf("main:we're done\n");fflush(stdout);return 0;}2.写一程序模拟PV操作同步机构,且用PV操作解决生产者——消费者问题。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验二进程管理实验目的通过进程的创建、撤销和运行加深对进程概念和进程并发执行的理解,明确进程与程序的区别。

实验内容1、了解系统调用fork()、exec()、exit()和waitpid()的功能和实现过程。

2、编写一段程序,使用系统调用fork()创建两个子进程。

当此程序运行时,在系统中有一个父进程和两个子进程活动。

让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和“c”。

试观察记录屏幕上的显示结果,并分析原因。

3、编写一段程序,使用系统调用fork()来创建一个子进程,子进程通过系统调用exec()更换自己的执行代码,显示新的代码“new program.”后,调用exit()结束。

而父进程则调用waitpid()等待子进程结束,并在子进程结束后显示子进程的标识符,然后正常结束。

实验指导一、所涉及的系统调用1、getpid在2.4.4版内核中,getpid是第20号系统调用,其在Linux函数库中的原有用到pid_t类型,pid_t类型即为进程ID的类型。

事实上,在i386架构上(就是我们一般PC计算机的架构),pid_t类型是和int类型完全兼容的,我们可以用处理整形数的方法去处理pid_t类型的数据,比如,用"%d"把它打印出来。

标识符都不相同。

2、fork系统调用格式:pid=fork( )fork( )返回值意义如下:0:在子进程中,pid变量保存的fork( )返回值为0,表示当前进程是子进程。

>0:在父进程中,pid变量保存的fork( )返回值为子进程的id值(进程唯一标识符)。

-1:创建失败。

如果fork( )调用成功,它向父进程返回子进程的PID,并向子进程返回0,即fork( )被调用了一次,但返回了两次。

此时OS在内存中建立一个新进程,所建的新进程是调用fork( )父进程(parent process)的副本,称为子进程(child process)。

子进程继承了父进程的许多特性,并具有与父进程完全相同的用户级上下文。

父进程与子进程并发执行。

核心为fork( )完成以下操作:(1)为新进程分配一进程表项和进程标识符进入fork( )后,核心检查系统是否有足够的资源来建立一个新进程。

若资源不足,则fork( )系统调用失败;否则,核心为新进程分配一进程表项和唯一的进程标识符。

(2)检查同时运行的进程数目超过预先规定的最大数目时,fork( )系统调用失败。

(3)拷贝进程表项中的数据将父进程的当前目录和所有已打开的数据拷贝到子进程表项中,并置进程的状态为“创建”状态。

(4)子进程继承父进程的所有文件对父进程当前目录和所有已打开的文件表项中的引用计数加1。

(5)为子进程创建进程上、下文进程创建结束,设子进程状态为“内存中就绪”并返回子进程的标识符。

(6)子进程执行虽然父进程与子进程程序完全相同,但每个进程都有自己的程序计数器PC(注意子进程的PC开始位置),然后根据pid变量保存的fork( )返回值的不同,执行了不同的分支语句。

例:3、exit不像fork那么难理解,从exit的名字就能看出,这个系统调用是用来终止一个进程的。

无论在程序中的什么位置,只要执行到exit系统调用,进程就会停止剩下的所有操作,清除包括PCB在内的各种数据结构,并终止本进程的运行。

前,在执行到exit(0)时,进程就已经终止了。

exit系统调用带有一个整数类型的参数status,我们可以利用这个参数传递进程结束时的状态,比如说,该进程是正常结束的,还是出现某种意外而结束的,一般来说,0表示没有意外的正常结束;其他的数值表示出现了错误,进程非正常结束。

我们在实际编程时,可以用wait系统调用接收子进程的返回值,从而针对不同的情况进行不同的处理。

exit和_exit_exit()函数的作用最为简单:直接使进程停止运行,清除其使用的内存空间,并销毁其在内核中的各种数据结构;exit()函数则在这些基础上作了一些包装,在执行退出之前加了若干道工序,也是因为这个原因,有些人认为exit已经不能算是纯粹的系统调用。

exit()函数与_exit()函数最大的区别就在于exit()函数在调用exit系统调用之前要检查文件的打开情况,把文件缓冲区中的内容写回文件。

在Linux的标准函数库中,有一套称作“高级I/O”的函数,我们熟知的printf()、fopen()、fread()、fwrite()都在此列,它们也被称作“缓冲I/O(buffered I/O)”,其特征是对应每一个打开的文件,在内存中都有一片缓冲区,每次读文件时,会多读出若干条记录,这样下次读文件时就可以直接从内存的缓冲区中读取,每次写文件的时候,也仅仅是写入内存中的缓冲区,等满足了一定的条件(达到一定数量,或遇到特定字符,如换行符\n和文件结束符EOF),再将缓冲区中的内容一次性写入文件,这样就大大增加了文件读写的速度,但也为我们编程带来了一点点麻烦。

如果有一些数据,我们认为已经写入了文件,实际上因为没有满足特定的条件,它们还只是保存在缓冲区内,这时我们用_exit()函数直接将进程关闭,缓冲区中的数据就会丢失,反之,如果想保证数据的完整性,就一定要使用exit()函数。

在一个进程调用了exit之后,该进程并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构。

在Linux进程的5种状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进父进程正忙着睡觉,不可能对它进行收集,这样,我们就能保持子进程60秒的僵尸状态。

编译这个程序:成一个僵尸进程,并不能将其完全销毁。

僵尸进程虽然对其他进程几乎没有什么影响,不占用CPU时间,消耗的内存也几乎可以忽略不计,但有它在那里呆着,还是让人觉得心里很不舒服。

而且Linux系统中进程数目是有限制的,在一些特殊的情况下,如果存在太多的僵尸进程,也会影响到新进程的产生。

那么,我们该如何来消灭这些僵尸进程呢?僵尸进程的概念是从UNIX上继承来的。

僵尸进程中保存着很多对程序员和系统管理员非常重要的信息,首先,这个进程是怎么死亡的?是正常退出呢,还是出现了错误,还是被其它进程强迫退出的?其次,这个进程占用的总系统CPU 时间和总用户CPU时间分别是多少?发生页错误的数目和收到信号的数目。

这些信息都被存储在僵尸进程中,试想如果没有僵尸进程,进程一退出,所有与之相关的信息都立刻归于无形,而此时程序员或系统管理员需要用到,就不行了。

如何收集这些信息,并终结这些僵尸进程呢?就要靠waitpid调用和wait调用。

这两者的作用都是收集僵尸进程留下的信息,同时使这个进程彻底消失。

4、wait和waitpid某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait 就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。

参数status用来保存被收集进程退出时的一些状态,它是一个指向int类型的指针。

但如果我们对这个子进程是如何死掉的毫不在意,只想把这个僵尸进程5、waitpid出了两个可由用户控制的参数pid和options:pid从参数的名字pid和类型pid_t中就可以看出,这里需要的是一个进程ID。

但当pid取不同的值时,在这里有不同的意义。

pid>0时,只等待进程ID等于pid的子进程,不管其它已经有多少子进程运行结束退出了,只要指定的子进程还没有结束,waitpid就会一直等下去。

pid=-1时,等待任何一个子进程退出,没有任何限制,此时waitpid和wait 的作用一模一样。

optionsoptions提供了一些额外的选项来控制waitpid,目前在Linux中只支持WNOHANG和WUNTRACED两个选项,这是两个常数,可以用"|"运算符把它即返回,不会像wait那样永远等下去。

而WUNTRACED参数,由于涉及到一些跟踪调试方面的知识,加之极少用到,这里就不多费笔墨了。

返回值和错误waitpid的返回值比wait稍微复杂一些,一共有3种情况:当正常返回的时候,waitpid返回收集到的子进程的进程ID;如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0;如果调用中出错,则返回-1;当pid所指示的子进程不存在,或此进程存在,但不是调用进程的子进程,因为这只是一个例子程序,不便写得太复杂,所以我们就让父进程和子进程分别睡眠了10秒钟和1秒钟,代表它们分别作了10秒钟和1秒钟的工作。

父子进程都有工作要做,父进程利用工作的简短间歇察看子进程的是否退出,如退出就收集它。

6、exec说是exec系统调用,实际上在Linux中,并不存在一个exec()的函数形式,其中只有execve是真正意义上的系统调用,其它都是在此基础上经过包装的库函数。

exec函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件。

这里的可执行文件既可以是二进制文件,也可以是任何Linux下可执行的脚本文件。

与一般情况不同,exec函数族的函数执行成功后不会返回,因为调用进程的实体,包括代码段,数据段和堆栈等都已经被新的内容取代,只留下进程ID等一些表面上的信息仍保持原样,看上去还是旧的躯壳,却已经注入了新的灵魂。

只有调用失败了,它们才会返回一个-1,从原程序的调用点接着往下执行。

每当有进程认为自己不能为系统和用户做出任何贡献了,他就调用任何一个exec,让自己以新的面貌重生;或者,更普遍的情况是,如果一个进程想执行另一个程序,它就可以fork出一个新进程,然后调用任何一个exec,这样看起来就好像通过执行应用程序而产生了一个新进程一样。

事实上第二种情况被应用得如此普遍,以至于Linux专门为其作了优化,我们已经知道,fork会将调用进程的所有内容原封不动的拷贝到新产生的子进程中去,这些拷贝的动作很消耗时间,而如果fork完之后我们马上就调用exec,这些辛辛苦苦拷贝来的东西又会被立刻抹掉,这看起来非常不划算,于是人们设计了一种"写时拷贝(copy-on-write)"技术,使得fork结束后并不立刻复制父进程的内容,而是到了真正使用的时候才复制,这样如果下一条语句是exec,它就不会白白作无用功了,也就提高了效率。

上面6条函数看起来似乎很复杂,但实际上无论是作用还是用法都非常相似,只有很微小的差别。

相关文档
最新文档