西北工业大学操作系统实验_OS3(18)
西北工业大学软件与微电子学院Windows程序设计综合训练实验报告实验一

西北⼯业⼤学软件与微电⼦学院Windows程序设计综合训练实验报告实验⼀西北⼯业⼤学《综合创作训练》实验报告学院:软件与微电⼦学院学号:2011303503 2011303513姓名:苗寨⽂张忠钢专业:软件⼯程实验时间: 2014.2.24实验地点:毅字楼310指导教师:西北⼯业⼤学2014 年 2 ⽉⼀、实验⽬的及要求实验⽬的:1)掌握Windows程序设计的相关知识;2)了解使⽤VC++开发Windows程序。
实验要求:1)学会如何使⽤VC++开发windows应⽤程序;2)培养良好的C++代码书写风格;⼆、实验设备(环境)及要求1)P C机最低配置:2G Hz以上CPU;1G以上内存;1G⾃由硬盘空间;2)V C++6.0或者更⾼版本VC++;三、实验内容与步骤1、Windows系统API和SDK(1)CreateDialog:(2) MessageBox:(3) CheckDlgButton(4) CreateBitmap(5) CreateHatchBrush2、VC++调⽤Win32API源程序如下:运⾏之后:选择确认:选择取消:3、代码编写风格(1)变量的命名a.变量名应简短且富于描述。
变量名的选⽤应该易于记忆,即能够指出其⽤途。
b.变量的名字应该是⾮形式的、简单的、容易记忆的。
c. 作为⾮明⽂的规定,局部变量应⽤⼩写字母(如i,j),常量名应全⼤写(如MAX_BUFFER),函数名应该写为动作性的(如CreateDirectory),结构名(类名)应该带有整体性(如class CRaster)。
(2)代码的对齐⽅式“{”、“}”表⽰⼀个块,是⼀个相对独⽴的语义单元。
代码的⾏与⾏之间应该按块对齐,⽽各块之间⼜应当有适当的缩进。
合理使⽤空格也⾮常重要,⼀般在分隔参数、赋值语句和表达式等需要清晰明了的地⽅使⽤空格。
(3)代码的注释注释的所选⽤的风格⼀定要让其他⼈接受,尽量和其他⼈保持风格的⼀致性。
北航ARM9实验报告:实验3uCOS-II实验

北航ARM9实验报告:实验3uCOS-II实验北航 ARM9 实验报告:实验 3uCOSII 实验一、实验目的本次实验的主要目的是深入了解和掌握 uCOSII 实时操作系统在ARM9 平台上的移植和应用。
通过实际操作,熟悉 uCOSII 的任务管理、内存管理、中断处理等核心机制,提高对实时操作系统的理解和应用能力,为后续的嵌入式系统开发打下坚实的基础。
二、实验环境1、硬件环境:ARM9 开发板、PC 机。
2、软件环境:Keil MDK 集成开发环境、uCOSII 源代码。
三、实验原理uCOSII 是一个可裁剪、可剥夺型的多任务实时内核,具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点。
其基本原理包括任务管理、任务调度、时间管理、内存管理和中断管理等。
任务管理:uCOSII 中的任务是一个独立的执行流,每个任务都有自己的堆栈空间和任务控制块(TCB)。
任务可以处于就绪、运行、等待、挂起等状态。
任务调度:采用基于优先级的抢占式调度算法,始终让优先级最高的就绪任务运行。
时间管理:通过系统时钟节拍来实现任务的延时和定时功能。
内存管理:提供了简单的内存分区管理和内存块管理机制。
中断管理:支持中断嵌套,在中断服务程序中可以进行任务切换。
四、实验步骤1、建立工程在 Keil MDK 中创建一个新的工程,选择对应的 ARM9 芯片型号,并配置相关的编译选项。
2、导入 uCOSII 源代码将 uCOSII 的源代码导入到工程中,并对相关的文件进行配置,如设置任务堆栈大小、系统时钟节拍频率等。
3、编写任务函数根据实验要求,编写多个任务函数,每个任务实现不同的功能。
4、创建任务在主函数中使用 uCOSII 提供的 API 函数创建任务,并设置任务的优先级。
5、启动操作系统调用 uCOSII 的启动函数,使操作系统开始运行,进行任务调度。
6、调试与测试通过单步调试、查看变量值和输出信息等方式,对系统的运行情况进行调试和测试,确保任务的执行符合预期。
西工大win32编程实验三实验报告

西北工业大学《综合创作训练》实验报告学院:软件与微电子学院学号:姓名:杜伊专业:软件工程实验时间: 2016年3月实验地点:毅字楼311 指导教师:陈勇西北工业大学2016 年 3 月问答题:(1)Windows支持哪几种坐标系统,你的程序采用的是哪种?答:Windows 一共支持8中不同的坐标系统,分别是MM_TEXT,MM_LOMETRIC,MM_HIMETRIC,MM_LOENGLISH,MM_HIENGLISH,MM_TWIPS,MM_ISOTROPIC, MM_ANISOTROPIC。
我的程序采用的是MM_ANISOTROPIC。
(2)GDI和GDI+:GDI在全称是Graphics Device Interface,即图形设备接口。
是图形显示与实际物理设备之间的桥梁。
GDI接口是基于函数,虽然使程序员省力不少,但是编程方式依然显得麻烦。
例如显示一张位图,我们需要进行“创建位图,读取位图文件信息,启用场景设备,调色板变化“等一系列操作。
然而有了GDI+,繁琐的步骤再次被简化。
顾名思义,GDI+就是GDI的增强版,它是微软在Windows 2000以后操作系统中提供的新接口。
GDI+主要功能:GDI+主要提供以下三种功能:(1) 二维矢量图形:GDI+提供了存储图形基元自身信息的类(或结构体)、存储图形基元绘制方式信息的类以及实际进行绘制的类;(2) 图像处理:大多数图片都难以划定为直线和曲线的集合,无法使用二维矢量图形方式进行处理。
因此,GDI+为我们提供了Bitmap、Image等类,它们可用于显示、操作和保存BMP、JPG、GIF等图像格式。
(3) 文字显示:GDI+支持使用各种字体、字号和样式来显示文本。
相比于GDI,GDI+是基于C++类的对象化的应用程序接口,因此用起来更为简单。
GDI的核心是设备上下文,GDI函数都依赖于设备上下文句柄,程序运行结果展示:四、实验总结122。
西北工业大学-操作系统实验报告-实验七

实验七消息及其传送机制一、实验目的(1)了解什么是消息。
(2)熟悉消息传送的机理。
二、实验内容与要求1、消息的创建、发送和接收。
使用系统调用msgget( ),msgsnd( ),msgrev( ),及msgctl( )编制一长度为256Bytes的消息发送和接收的程序,将自己的进程号传递给对方,并输出至屏幕。
2、对整个实验过程进行分析总结,给出详细步骤。
三、实验过程1、编写程序实现消息的创建、发送和接收。
将参考程序用vi编辑器录入,然后编译执行。
1、client.c#include <unistd.h>#include <stdio.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>#define MSGKEY 75 /*定义一个消息关键字*/struct msgform /*定义一个结构,它是一个消息的模式,只说明结构的形式*/{ long mtype; /*消息类型*/char mtext[256]; /*消息正文数组*/};int main(){{struct msgform msg; /*定义msg是前面说明的消息结构类型的变量*/int msggid,pid,*pint;msggid=msgget(MSGKEY,0777); /*用系统调用创建一个消息队列*/pid=getpid(); /*获得当前进程的PID*/printf(“client:pid=%d\n”, pid);pint=(int*)msg.mtext; /*将消息正文的头指针赋给指针变量pint*/*pint=pid;msg.mtype=1; /*指定客户进程的消息类型为1*/msgsnd(msggid,&msg,sizeof(int),0); /*向msggid的消息队列发送消息msg*/msgrcv(msggid,&msg,256,pid,0); /*接收pid类型的消息 */printf(“client:receive from pid %d\n”,*pint);return 0;}2、server.c#include <unistd.h>#include <stdio.h>#include <stdlib.h>#include < signal.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>#define MSGKEY 75 /*定义一个消息关键字*/struct msgform /*定义一个与客户端相同的消息关键字*/{ long mtype; /*消息类型*/char mtext[256]; /*消息正文数组*/}msg; /*也可以使用这种方式说明消息结构变量*/void cleanup(int signo); /*说明一个外部函数*/int msgqid;int main(){int i,pid,*pint;for ( i=0; i<23; i++) /*对22个软中断的特殊处理*/signal(i, cleanup); /*若收到22个软中断,转向执行cleanup*/msggid=msgget(MSGKEY,0777|IPC_CREAT); /*创建一个与客户程序相同关键字的消息队列,但它的标志是0777与IPC_CREAT 做“或”操作的结果*/ printf(“server:pid=%d\n”, getpid()); /*输出服务端的进程ID*/for(;;) /*用无限循环完成下列语句*/{ msgrcv(msggid,&msg,256,1,0); /*接收来自客户进程或类型为1的消息 */ pint=(int*)msg.mtext; /*将客户端的消息正文传递给pint*/pid=*pint; /*将读出消息指针送pid,此时*pint中是客户进程的pid值*/printf(“server:receive from pid %d\n”,pid);msg.mtype=pid; /*已接受客户进程的pid为消息类型*/*pint=getpid(); /*以本进程pid作为消息构成消息传递内容*/msgsnd(msggid,&msg,sizeof(int),0); /*发送消息*/}}void cleanup(int signo){ msgctl(msggid , IPC_RMID , 0); /*删除消息队列*/exit(0);}如下图所示:client.cserver.c运行结果如下所示:2、思考题(1)单独执行client或server 有什么结果?(2)执行一个server程序,多次执行client有什么结果?(3)消息机制与管道通信的区别?在消息机制中,进程间的数据交换是以格式化的message为单位,程序员直接利用操作系统提供的一组通信命令,不仅能实现大量的数据传递,而且还是隐藏通信细节,是通信过程对用户透明,减少通信程序的复杂性。
西北工业大学计算机学院

西北工业大学计算机学院计算机操作系统实验指导张羽谷建华王海鹏编2009-3一、操作系统课内实验目的:计算机操作系统课内实验作为操作系统课堂理论教学的辅助部分是加强计算机科学与技术专业实践的重要环节之一。
由于操作系统自身的庞大和复杂,造成学生在学过操作系统课程后,总有一种“雾里看花”的感觉,即只是支离破碎的了解了一些操作系统局部知识,而很难将这些知识融会贯通,对于运用操作系统知识从事设计和应用更是无从谈起。
本实验课的目的就是力图解决上述问题。
二、操作系统实验整体安排和要求:1.课内实验将按以下三个方面进行:对常用的系统调用命令的使用方式有一个较熟练的掌握;对典型操作系统的编程基础知识和机制进行学习和了解;运用一些重要的系统调用编写程序模块,对操作系统中的一些重要概念和典型算法进行实现或验证。
实验内容如下:实验一 Linux操作系统的安装及使用实验二 Linux Shell程序实验三 vi编辑器的学习和使用实验四 观察进程的并发性实验五 构造进程家族树实验六 理解进程的独立空间实验七 请求分页存储管理设计操作系统的课内实验共7个,根据具体上机条件和学时选做2~3个,其中实验2、3中必选1个,实验4~6必选,实验7可选做。
由于所有实验均在Linux环境下工作,用C语言编程,因此学生要具备一定的C语言编程能力,同时要求在充分预习实验内容中相关知识后,再进行实验的上机环节。
另外由于操作系统实验有些题目具有一定的难度和规模,建议采用分组方式进行。
2.操作系统课内实验考核:预习报告30%,上机实验35%,实验报告35%。
3.预习报告内容包括两部分,一是对相关知识学习的书面总结(知识综述和参考文献);二是对本次实验的分析报告(主要针对涉及算法的题目)。
实验报告内容主要包括本次实验的上机结果(数据结构、程序框图、源程序文档和运行情况)以及实验中难点分析和心得。
4.实验软、硬件环境要求:80386DX以上兼容机,可以使用Intel、AMD、CRIX处理器,对80386或80486SX的CPU建议具有数字协处理器。
计算机操作系统实验_操作系统引导

西北工业大学操作系统实验实验报告一、实验目的熟悉GeekOS实验环境。
二、实验要求编译运行操作系统的启动代码。
三、实验过程及结果1、编写第一个“操作系统”,代码如下:org 07c00hmov ax,csmov ds,axmov es,axcall DispStrjmp $DispStr:mov ax,BootMessagemov bp,axmov cx,16mov ax,01301hmov bx,00aehmov dl,0int 10hretBootMessage: db "hello,OS world!"times 510-($-$$) db 0dw 0xaa55结果如图:修改boot.asm,修改文字颜色,代码如下:org 07c00hmov ax,csmov ds,axmov es,axcall DispStrjmp $DispStr:mov ax,BootMessagemov bp,axmov cx,16mov ax,01301hmov bx,00aeh //在此处修改BL的值,可以修改颜色mov dl,0int 10hretBootMessage: db "hello,OS world! "times 510-($-$$) db 0dw 0xaa55结果如图:2.在bochs中运行geek OS,结果如图:四、实验分析思考:引导扇区的标志是0x55AA,为何代码中写入的却是 dw 0xAA55?答:因为存储时低位在前,高位在后,所以代码中高低位反过来写。
五、所遇问题及解决方法答:实验过程中,最大的困难就是理解geek OS的代码。
一个原因是我们没有学过有关汇编的知识,导致代码中有关汇编的部分一头雾水,难以理解;另一方面是之前自己接触的源码比较少,第一次见到geek OS这么大的工程代码,感觉理解起来很困难,不过,在老师花费了几个小时的讲解下,我最终还是勉强理解了一部分。
北航os实验报告

北航os实验报告北航OS实验报告一、引言操作系统(Operating System,简称OS)是计算机系统中最基础的软件之一,它负责管理和控制计算机硬件资源,为用户和应用程序提供一个可靠、高效的工作环境。
本文将对北航OS实验进行详细的报告和分析。
二、实验目的本次北航OS实验的目的是让学生深入理解和掌握操作系统的基本原理和实现方式。
通过实践,学生将学会设计和实现一个简单的操作系统,了解操作系统的核心功能和运行机制。
三、实验内容1. 系统引导实验开始时,我们需要编写引导程序,将操作系统加载到计算机的内存中,并跳转到操作系统的入口地址开始执行。
这一步骤是整个实验的起点,也是操作系统正常运行的基础。
2. 中断处理操作系统需要能够处理各种中断事件,如时钟中断、键盘中断等。
学生需要实现中断处理程序,使操作系统能够响应和处理这些中断事件,并根据具体情况进行相应的操作。
3. 进程管理操作系统需要能够管理多个进程的创建、调度和终止。
学生需要设计并实现进程管理模块,包括进程控制块(PCB)的数据结构和进程调度算法。
通过合理的调度策略,提高系统的并发性和响应速度。
4. 内存管理操作系统需要管理计算机的内存资源,包括内存的分配和释放。
学生需要设计并实现内存管理模块,使用合适的算法来管理内存的分配和回收,避免内存泄漏和碎片化问题。
5. 文件系统操作系统需要提供文件系统来管理计算机中的文件和数据。
学生需要设计并实现一个简单的文件系统,包括文件的创建、读写和删除等操作。
通过文件系统,用户可以方便地存储和管理自己的数据。
四、实验过程在实验过程中,我们遇到了许多挑战和问题,但通过不断的尝试和调试,我们最终成功实现了一个简单的操作系统。
以下是我们在实验过程中遇到的一些关键问题和解决方案:1. 内存管理在实验过程中,我们发现内存管理是一个非常关键的问题。
如果内存管理不当,容易导致内存泄漏或者内存碎片化,从而影响系统的性能和稳定性。
我们通过设计一个位图来管理内存的分配和释放,使用首次适应算法来分配内存,并通过合理地回收内存来避免内存泄漏问题。
西工大 操作系统实验报告

西工大操作系统实验报告西工大操作系统实验报告一、引言操作系统是计算机系统中最重要的软件之一,它负责管理计算机硬件和软件资源,为用户提供一个友好、高效的计算环境。
本次实验旨在通过实践操作系统的基本功能和原理,加深对操作系统的理解和掌握。
二、实验目的1. 理解操作系统的基本概念和作用;2. 学习操作系统的安装和配置;3. 掌握操作系统的文件管理和进程管理;4. 实践操作系统的调度算法和内存管理;5. 深入理解操作系统的并发控制和死锁处理。
三、实验环境本次实验使用的操作系统是Linux,具体版本为Ubuntu 20.04 LTS。
实验所需的软件和工具包括GCC编译器、Make工具、Vi编辑器等。
四、实验内容1. 操作系统的安装和配置首先,我们需要下载Ubuntu 20.04 LTS的镜像文件,并通过虚拟机软件创建一个虚拟机。
然后,按照提示进行操作系统的安装和配置,包括选择安装语言、分配磁盘空间、设置用户名和密码等。
安装完成后,我们可以登录系统,并进行一些基本设置,如修改主题、安装常用软件等。
2. 文件管理和进程管理操作系统的文件管理是指对计算机中的文件进行组织、存储和访问的过程。
我们可以使用命令行或图形界面来管理文件,包括创建文件、复制文件、删除文件等。
同时,操作系统还提供了进程管理的功能,可以管理计算机中运行的各个进程。
我们可以使用命令行或系统监视器来查看和管理进程,包括启动进程、终止进程、调整进程优先级等。
3. 调度算法和内存管理操作系统的调度算法是指决定哪个进程在何时执行的算法。
常见的调度算法包括先来先服务、短作业优先、轮转调度等。
我们可以通过修改系统的调度策略来改变进程的执行顺序。
另外,操作系统还负责管理计算机的内存资源,包括内存分配、内存回收等。
我们可以使用命令行或系统监视器来查看和管理内存,包括查看内存使用情况、释放内存空间等。
4. 并发控制和死锁处理操作系统需要保证多个进程之间的并发执行,同时又要避免出现竞争条件和死锁等问题。
西北工业大学-操作系统实验报告-实验五

实验五进程管理一、实验目的(1)加深对进程概念的理解,明确进程和程序的区别;(2)进一步认识并发执行的实质;(3)了解FreeBSD系统中进程通信的基本原理。
二、实验内容与要求1、掌握进程的概念,明确进程的含义;2、编写一段程序,使用系统调用fork( )创建两个子进程。
当此程序运行时,在系统中有一个父进程和两个子进程活动。
让每一个进程在屏幕上显示一个字符:父进程显示'a',子进程分别显示字符'b'和字符'c'。
试观察记录屏幕上的显示结果(多次运行,查看结果是否有变化),并分析原因;3、修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行时屏幕出现的现象(多次运行,查看结果是否有变化),并分析原因;4、如果在程序中使用调用lockf()来给每一个子进程加锁,可以实现进程之间的互斥,观察并分析出现的现象;5、对整个实验过程进行分析总结,给出详细步骤;三、实验过程1、进程的概念与含义狭义:进程就是一段程序的执行过程。
广义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。
它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
进程的概念主要有两点:第一,进程是一个实体。
每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。
文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。
第二,进程是一个“执行中的程序”。
程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们称其为进程。
进程是操作系统中最基本、重要的概念。
是多道程序系统出现后,为了刻画系统内部出现的动态情况,描述系统内部各道程序的活动规律引进的一个概念,所有多道程序设计操作系统都建立在进程的基础上。
西北工业大学_计算机系统基础_实验报告_第3次

西北工业大学计算机系统基础实验报告姓名班级学号实验成绩指导教师实验名称缓冲区溢出攻击实验目的:通过使目标程序跳转到我们预定的位置执行,从而加深对IA-32函数调用规则和栈帧结构的理解。
实验工具:linux、gdb调试器、反汇编工具objdump、将16进制数转化为ASCII码的工具hex2raw。
实验要求:对一个可执行程序“bufbomb”实施一系列缓冲区溢出攻击,也就是设法通过造成缓冲区溢出来改变该可执行程序的运行内存映像,继而执行一些原来程序中没有的行为,例如将给定的字节序列插入到其本不应出现的内存位置等。
实验内容:一、Smoke(让目标程序调用smoke函数)本实验利用getbuf()函数不检查读取字符串长度的漏洞破坏该程序栈帧的返回地址从而达到对主程序造成破坏的目的。
首先用objdump指令反汇编生成bufbomb的汇编语言文本文件。
可以找到getbuf函数代码如下:080491f1 <getbuf>:80491f1: 55 push %ebp80491f2: 89 e5 mov %esp,%ebp80491f4: 83 ec 38 sub $0x38,%esp80491f7: 8d 45 d8 lea -0x28(%ebp),%eax80491fa: 89 04 24 mov %eax,(%esp)80491fd: e8 08 fb ff ff call 8048d0a <Gets>8049202: b8 01 00 00 00 mov $0x1,%eax8049207: c9 leave8049208: c3 ret位于<0x80491f7> 地址处代码为预读的字符串在栈帧创建了0x28(也就是40)字节的空间。
具体位置可以通过gdb在下一行设置断点查找 %eax 的值得到。
为了覆盖被存在返回地址上的值,我们需要读入超过系统默认40字节大小的字符串。
西北工业大学大数据库实验报告材料3

1.利用图形用户界面对实验一中所创建的Student库的S表中,增加以下的约束和索引。
(18分,每小题3分)(1)非空约束:为出生日期添加非空约束。
(2)主键约束:将学号(sno)设置为主键,主键名为pk_sno。
(3)唯一约束:为姓名(sname)添加唯一约束(唯一键),约束名为uk_sname。
(4)缺省约束:为性别(ssex)添加默认值,其值为“男”。
(5)CHECK约束:为SC表的成绩(grade)添加CHECK约束,约束名为ck_grade,其检查条件为:成绩应该在0-100之间。
(6)外键约束:为SC表添加外键约束,将sno,cno设置为外键,其引用表分别是S表和C表,外键名称分别为fk_sno,fk_cno。
2.在图形用户界面中删除以上小题中已经创建的各种约束,用SQL语言分别重新创建第1题中的(2)-(6)小题.(15分,每小题3分,提示:alter table add constraint)(2)alter table Sadd constraint pk_sno primary key(sno)(3)alter table Sadd constraint uk_sname unique(sname)(4)alter table Sadd constraint uk_sex default('男') for ssex(5)alter table SCadd constraint ck_grade check(grade between 0 and 100)(6)alter table SCadd constraint fk_sno foreign key(sno) references S(sno)alter table SCadd constraint fk_cno foreign key(cno) references C(cno)3.利用图形用户界面根据上述SC表中的外键定义画出由S,C,SC表构成的数据库关系图。
[西北工业大学]计算机操作系统(202104)
![[西北工业大学]计算机操作系统(202104)](https://img.taocdn.com/s3/m/ac89f3ec6c85ec3a86c2c59f.png)
A.速度 B.利用率 C.灵活性 D.兼容性 答案:B
15.引入多道程序的目的在于()。 A.充分利用CPU,减少CPU等待时间 B.提高实时响应速度 C.有利于代码共享,减少主、辅存信息交换量 D.充分利用存储器 答案:A
24.可采用静态地址重定位技术进行存储管理的有()。 A.单一分区管理、固定分区管理、可变分区管理 B.单一分区管理、固定分区管理、段式存储管理 C.可变分区管理、页式存储管理、段式存储管理 D.单一分区管理、页式存储管理、段式存储管理 答案:A
25.引入多道程序技术后,处理机的利用率()。 A.降低了 B.有所改善 C.大大提高 D.没有变化,只是程序的执行方便了 答案:C
9.用户在一次计算过程中,或者一次事物处理中,要求计算机完成所做的工作的集合,这是指()。 A.进程 B.程序 C.作业 D.系统调用 答案:C
10.在可变式分区分配方案中,某一作业完成后,系统收回其主存空间,并与相邻空闲区合并,为此 需修改空闲区表,造成空闲区表项数减1的情况是()。 A.无上邻(前邻、低址)空闲区,也无下邻(后邻、高址)空闲区 B.有上邻(前邻、低址)空闲区,但无下邻(后邻、高址)空闲区 C.有下邻(后邻、高址)空闲区,但无上邻(前邻、低址)空闲区 D.有上邻(前邻、低址)空闲区,也有下邻(后邻、高址)空闲区 答案:D
11.进程从运行状态变为阻塞状态的原因是()。 A.输入或输出事件发生 B.时间片到 C.输入或输出事件完成 D.某个进程被唤醒 答案:A
12.()的主要目标是提高系统的吞吐量和效率。 A.实时操作系统 B.多道批处理系统 C.分时操作系统 D.微机操作系统 答案:B
13.操作系统是一种()。 A.应用软件 B.系统软件 C.通用软件 D.工具软件 答案:B
北理操作系统实验三

操作系统课程设计实验报告实验名称:生产者消费者问题姓名/学号:一.实验目的1.学习掌握操作系统中进程之间的通信2.理解掌握使用信号量机制来多进程互斥访问共享内存区的控制3.学习进程的创建及控制,共享内存区的创建和删除,信号量的创建使用删除二.实验内容•一个大小为3的缓冲区,初始为空,每个缓冲区能存放一个长度若为10个字符的字符串。
•2个生产者–随机等待一段时间,往缓冲区添加数据,–若缓冲区已满,等待消费者取走数据后再添加–重复6次•3个消费者–随机等待一段时间,从缓冲区读取数据–若缓冲区为空,等待生产者添加数据后再读取–重复4次说明:•显示每次添加和读取数据的时间及缓冲区的状态•生产者和消费者用进程模拟,缓冲区用共享内存来实现三.实验环境VMware Fushion8:Windows和ubuntu14.10四.程序设计与实现1、Windows下:A:主要函数说明1.PROCESS_INFORMATION StartClone(int nCloneID)功能:创建一个克隆的进程并赋于其ID值,并返回进程和线程信息2.CreateProcess:创建进程3.CreateSemaphore():创建信号量4.CreateFileMapping():在当前运行的进程中创建文件映射对象,模拟共享内存区5.MapViewOfFile():在此文件映射基础上创建视图映射到当前应用程序的地址空间B:程序流程图(下图)C:实验结果:2、Linux下:A:主要函数说明1.void(p):申请缓冲区2.void(v):释放缓冲区3.shmget():用来获得共享内存区域的ID,如果不存在这个内存区,就创建这个共享内存区。
4.semget():返回信号量集的Id,如果不存在就创建这个信号量集B:程序流程图C:实验结果五. 实验收获与体会1、进一步熟悉了Windows 、Linux 中进程的创建与管理2、掌握了WINDOWS 和Linux 下进程之间的通信:Windows 主要在于句柄的获取并用于API 函数的调用,并利用文件映射创建共享缓冲区;Linux 主要使用信号量机制和相关API的调用。
设计项目0

西北工业大学 计算机学院 刘尊
环境说明 我们采用的实验环境是
GeekOS bochs Fedora7 VMware windowsXP 硬件 GeekOS GeekOS HW
GeekOS的可能运行环境
GeekOS Bochs (HW Emulation) Native OS
编辑好了以后可以进行编译,在终端上进入目录
$ cd /home/geekos-0.3.0
编译
$ make depend $ make
如果没有错误,在build目录下会生成相应的磁盘 文件,这里是fd.img。以后的项目可能还会生产 硬盘镜像文件diskc.img。
提示在此处建立新进程
西北工业大学计算机学院
HW
VMware Virtualization
Native OS HW
西北工业大学计算机学院
实验说明 实验环境已经预先设置好了 首先打开程序中的VMware,然后在VMware中打开 虚拟机,并启动该虚拟机,进入linux系统 桌面上有终端、文件浏览器和文件编辑器的快捷 方式可供大家使用 我们的工作目录是/home/geekos-0.3.0,该目录的 结构如前所示,仅根据需要添加了一个replace目 录 当要完成某项目时,首先在终端进入工作目录, 然后进入scripts目录,使用该目录中的脚本 startProject建立项目文件
该函数的主要功能是以参数startFunc指向的代码为进程 体生成一个内核进程。 startFunc是一个Thread_Start_Func类型的函数指针,其 定义在kthread.h中
西北工业大学计算机学院
GeekOS的键盘处理函数 定义在keyboard.h和keyboard.c中。 定义了功能键常量、缓冲区等,请大家自行阅读, 其公用接口有三个Init_Keyboard、Read_Key和 Wait_For_Key 键盘初始化是在Main函数中调用Init_Keyboard实 现的 Read_Key用来获取键值 Wait_For_Key用来等待键盘输入,进程若想获得 键盘输入只要调用该函数即可,该函数返回 keycode类型,是在keyboard.h中定义的一个 ushort_t
西北工业大学高频调频系统(微电子)

高频实验预习报告实验三:调频接收系统实验一、实验目的:图3为实验中的调频接收系统结构图。
通过实验了解与掌握调频接收系统,了解与掌握小信号谐振放大电路、晶体振荡器电路、 集成混频鉴相电路(虚框部分为所采用的集成混频鉴相芯片MC3362P )。
图3. 调频接收系统结构图二、预习内容:.1、给出完整的调幅接收系统结构图。
2、小信号谐振放大电路图1-1为小信号谐振放大电路图。
熟悉电路,并论述其原理。
思考并回答下列问题:A 、小信号谐振放大电路主要分为单调谐、双调谐、参差调谐几种电路形式。
给出单谐振和双谐振放大电路的特点。
单谐振:调整简单,通频带窄,选择性一般。
单谐振放大器的增益与带宽的乘机受到放大器件的限制,增益越大带宽越窄。
鉴频本振1 混频 放大 混频 本振2 MC3362P双谐振:在频率通带内幅频特性比较平坦,在频率边缘上有陡峭的截止,选择性好,通频带宽,但是调整困难。
B、如何测量放大电路的幅频特性,有哪些方法,采用什么仪器,给出测试原理框图。
可以采用测频仪,或者点频法,通过改变不同的输入信号的频率通过观察输出信号的幅值,然后练成一条光滑的曲线,得到放大器的幅频特性曲线。
仪器:函数发生器,扫频仪,示波器。
3、晶体振荡器电路图T4-2为晶体谐振电路图。
熟悉电路,并论述其原理。
思考并回答下列问题:A、比较晶体振荡电路与LC振荡电路特点。
晶体振荡电路的频率稳定性好,输出频率精度高,温漂时漂小,LC振荡电路的可用频率范围宽,电路简单,但频率稳定度低,温漂时漂大。
B、晶体振荡电路中的晶体的特效模型是什么?4、集成混频鉴相电路图T7-2为集成混频鉴相电路图。
熟悉电路,论述其原理。
思考并回答下列问题:A、下载MC3362p的数据手册,给出MC3362p的主要性能指标。
电源电压最大值:7.0Vdc,接入管脚6实验时推荐减压范围:2.0-6.0VDC,接入管脚6输入电压:1Vrms ,接入管脚:1,24结点温度:150c o实验时温度范围:-40-85c o外围部件少,灵敏度高:信纳比为12db,输入电流为0.6uAB、2Y1是何器件?陶瓷滤波器三、给出调频接收系统调试步骤;指出需要哪些仪器、给出仪器与实验电路连接的测试结构图如何利用以上单元模块连接构成调幅接收系统,思考构成系统可能存在的问题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
评语: 课中检查完成的题号及题数:课后完成的题号与题数:成绩: 指导教师:实验报告三实验名称:七、八日期:2013.05.23 班级:10011007 学号:2010302544 姓名:金国超实验七理解线程的相关概念1. 实验目的理解当操作系统引入线程的概念后,进程是操作系统独立分配资源的单位,线程成为系统调度的单位,与同一个进程中的其他线程共享程序空间。
2. 实验预习内容预习线程创建和构造的相关知识,了解C语言程序编写的相关知识。
3. 实验内容及步骤(1)编写一个程序,在其main()函数中创建一个(或多个)线程,观察该线程是如何与主线程并发运行的。
输出每次操作后的结果;(2)在main()函数外定义一个变量shared(全局变量),在main()中创建一个线程,在main()中和新线程shared 进行循环加/减操作,观察该变量的变化;(3)修改程序把shared 变量定义到main()函数之内,重复第(2)步操作,观察该变量的变化。
4. 实验总结(1) 观察上述程序执行结果,并分析原因;(2) 提交源程序清单,并附加流程图与注释。
思考:分析进程和线程的不同之处。
5. 具体实现1)观察线程并发性:#include <stdio.h>#include <unistd.h>#include <pthread.h>void * func(void *params){while(1){printf("i am the thread 2\n");sleep(1);}return NULL;}int main(){pthread_t tid;int res=pthread_create(&tid, NULL,func,NULL);while(1){printf("i am main thread\n");sleep(1);}return 0;}2)全局变量共享#include <stdio.h>#include <unistd.h>#include <pthread.h>int shared=0;void * func(void *params){while(1){shared--;printf("i am thread2 shared=%d\n",shared);sleep(1);}return NULL;}int main(){pthread_t tid;int res=pthread_create(&tid, NULL,func,NULL);while(1){shared++;printf("i am main thread shared=%d\n",shared);sleep(1);}return 0;}3)局部变量,指针传参#include <stdio.h>#include <unistd.h>#include <pthread.h>void * func(void *params){while(1){printf("i am thread2 shared=%d\n",*(int *)params);(*(int *)params)--;sleep(1);}return NULL;}int main(){pthread_t tid;int shared=0;int res=pthread_create(&tid, NULL,func,(void *)(&shared));while(1){shared++;printf("i am main thread shared=%d\n",shared);sleep(1);}return 0;}实验八请求分页存储管理设计1. 实验目的模拟存储管理常用的请求分页存储管理技术,通过本实验使学生更加深入的理解虚拟内存的思想和主要的页面淘汰算法。
2. 实验预习内容学习虚拟存储器的相关基础知识,了解请求分页存储管理系统的原理和具体实现过程,熟悉各种主要的页面调度算法。
3. 实验内容及步骤(1) 通过随机数产生一个指令行列,共320条指令,指令中的地址按下述原则生成:50%的指令是顺序执行;25%的指令均匀分布在前地址部分;25%的指令均匀分布在后地址部分。
(2) 具体实验办法是:在[0,319]之间选一起始点M;顺序执行一条指令,即第M+1条;向前地址[0,M-1]中执行一条指令M;顺序执行一条指令,即第M+1条;向后地址[M+2,319]中执行一条指令M。
如此继续,直至产生320条指令。
使用产生随机数的函数之前,首先要初始化设置RAN()产生序列的开始点,SRAND(400);然后计算随机数,产生指令序列。
例如:a[0]=1.0*rand()/32767*319+1;a[1]=a[0]+1;a[2]=1.0*rand()/32767*(a[1]-1)+1;a[3]=a[2]+1;a[4]=319-1.0*rand()/32767*(a[3]-1);其中rand()和srand()为Linux操作系统提供的函数分别进行初始化和产生随机数,多次重复使用这5条指令,产生以后的指令序列。
(3) 将指令序列变换成页面地址流:假设,页面大小为1KB;用户实存容量(内存区容量)为4页或32页;用户虚存容量(逻辑地址空间容量)为32KB;用户虚存容量32KB,每1KB中放10条指令,共320条指令序列,按其地址0~9在0页,10~19在1页,…….,310~319在31页。
(4) 使用不同的页面调度算法处理缺页中断,并计算不同实存容量下的命中率:先进先出(FIFO)算法;最近最少使用(LRU)算法;命中率的算法为:命中率= 1 - (缺页中断次数/页地址流长度)。
本实验中,页地址流长度为320,缺页中断次数为每次访问相应指令时,该指令所对应的页不在内存的次数。
4. 实验总结(1) 编制的各程序采用的数据结构及符号说明,提交源程序清单,并附加流程图与注释;(2) 打印页表,对不同算法打印每次调出和装入的页面号,执行最后一条指令后在主存中页面号;(3) 根据实验结果分析并比较不同淘汰算法对不同实存容量的命中率,进而作出评价。
5.具体实现Fifo使用循环队列实现#include<stdio.h>#include<time.h>#include<stdlib.h>#define HARD_NUM 4#define INSTRUCT 320#define VIRTUAL_NUM 32int instruct[INSTRUCT]={0}; typedef struct{int id;//虚存idbool flag;//是否装入int count;//最近使用次数}HM;typedef struct{HM hm[HARD_NUM+1];int head;int tail;}FIFO;typedef struct{HM hm[HARD_NUM];}LRU;FIFO fifo;LRU lru;void init();void fifoTest();bool isInFifo(int page);void lruTest();int main(){init();printf("先进先出fifo...\n");fifoTest();printf("\n\n");printf("最近最少使用fifo...\n");lruTest();system("pause");return 0;}void init(){int i,j;srand(time(0));for(i=0; i<INSTRUCT; i+=5){instruct[i] = 1.0 * rand() / RAND_MAX * 320;instruct[i+1] = instruct[i] + 1;instruct[i+2] = 1.0 *rand() / RAND_MAX * instruct[i];instruct[i+3] = instruct[i+2] + 1;instruct[i+4] = 319 - 1.0 *rand() / RAND_MAX * instruct[i+3];}}void fifoTest(){int i,j;int lack=0;//缺页次数//内存初始化for(i=0; i<HARD_NUM; i++){fifo.hm[i].id=0;fifo.hm[i].flag=false;fifo.hm[i].count=0;}//模拟执行320条指令for(i=0; i<INSTRUCT; i++){//计算该指令在那一页,判断是否在FIFO中int page = instruct[i] % VIRTUAL_NUM;bool isIn =isInFifo(page);if(isIn)//在实存中{printf("%d alread in fifo\n",instruct[i]);}else//缺页,插入队列{lack ++;if((fifo.tail + 1)%(HARD_NUM+1) == fifo.head)//队列已满{printf("page %d in,page %dout\n",page,fifo.hm[fifo.head].id);fifo.hm[fifo.head].id = page;fifo.tail =fifo.head;fifo.head = (fifo.head + 1) %(HARD_NUM+1);}else{printf("page %d in\n",page);fifo.hm[fifo.tail].id = page;fifo.hm[fifo.tail].flag = true;fifo.tail = (fifo.tail+1) %(HARD_NUM+1);}}}printf("缺页次数:%d\n",lack);printf("命中:%lf\n",1.0 - 1.0 * lack / INSTRUCT);}bool isInFifo(int page){int cur=fifo.head;if( cur ==fifo.tail)//队列为空return false;while(1){if( cur % (HARD_NUM+1) ==fifo.tail)//已经到队列尾break;if(page == fifo.hm[cur].id && fifo.hm[cur].flag == true) return true;cur++;}return false;}void lruTest(){int i,j;int lack=0;//缺页次数//内存初始化for(i=0; i<HARD_NUM; i++){lru.hm[i].id=0;lru.hm[i].flag=false;lru.hm[i].count=0;}//模拟执行320条指令for(i=0; i<INSTRUCT; i++){//计算该指令在那一页,判断是否在实存中int page = instruct[i] % VIRTUAL_NUM;bool isIn=false;for(j=0; j < HARD_NUM; j++)if(lru.hm[j].id==page && lru.hm[j].flag ==true){isIn=true;lru.hm[j].count ++;}if(isIn)printf("%d alread in...\n",page);else{lack++;//查找最近最少使用的项int cur=0,count=INT_MAX;for(j=0; j < HARD_NUM; j++){if(lru.hm[j].count < count){cur = j;count = lru.hm[j].count;}}if(lru.hm[cur].flag ==false){printf("page %d in\n",page);lru.hm[cur].flag =true;}elseprintf("page %d in,page %dout\n",page,lru.hm[cur].id);lru.hm[cur].id=page;lru.hm[cur].count ++;}}printf("缺页次数:%d\n",lack);printf("命中:%lf\n",1.0 - 1.0 * lack / INSTRUCT);}实验结果:实存为4kb,4个页面结果:(仅打印结果)实存为10Kb,10个页面结果:由以上结果可以看出,最近最少使用算法lru效果比先进先出fifo要好的多,平均超过2倍的性能。