西北工业大学操作系统实验_OS3(12)

合集下载

实验报告模板

实验报告模板

西北工业大学操作系统实验实验报告班号:1001040×姓名: ******学号: *********/*文件名请使用“bh”+班号后两位+“xh”+学号+姓名+项目号命名,如10010401班同学张三,学号041234,则其项目0实验报告的文件名是bh01xh041234张三0.doc。

请大家严格遵守。

实验报告提交时请删除本注释*/实验日期: 2007.12.31 实验名称: GeekOS字符回显功能实现一、实验目的1、熟悉GeekOs的项目编译、调试和运行环境,掌握GeekOs运行工作过程三、实验内容1、搭建GeekOS的编译和调试平台,掌握GeekOS的内核进程工作原理完成系统的配置,调试project0并添加输入字符并回显功能2、熟悉键盘操作函数,编程实现新建一个内核进程。

该进程的功能是:接受键盘输入的字符并显示到屏幕,当输入ctrl+d时,结束进程。

四、项目要求及分析熟悉键盘操作函数,编程实现新建一个内核进程。

该进程的功能是:接受键盘输入的字符并显示到屏幕,当输入ctrl+d时,结束进程。

此项目要求掌握如何新建一个内核进程并了解键盘处理函数。

需要了解Start_Kernel_Thread函数struct Kernel_Thread* Start_Kernel_Thread(Thread_Start_Func startFunc,ulong_t arg,int priority,bool detached){struct Kernel_Thread* kthread = Create_Thread(priority, detached);if (kthread != 0) {Setup_Kernel_Thread(kthread, startFunc, arg);Make_Runnable_Atomic(kthread);}return kthread;}该函数的主要功能是以参数startFunc指向的代码为进程体生成一个内核进程。

西北工业大学计算机网络实验报告3

西北工业大学计算机网络实验报告3

题目:1、修改udp实验程序完成两台电脑通讯2、修改tcp实验程序完成两台电脑通讯3、修改IP源代码实现只调用一个函数**: ***学号:**********班号:10011303时间:2015-12-25计算机学院目录摘要1 目的 .................................................... 错误!未定义书签。

2 要求 (1)3 相关知识 (1)4 实验内容及过程................................. 错误!未定义书签。

5参考文献 .. (4)1、实验目的1.学习UDP和TCP及IP的通讯原理。

2.掌握Socket的编程方法。

3.培养学生自己的创新实验的能力。

4、训练修改实验代码能力。

2、实验要求1、熟悉UDP和TCP通讯的原理及socket编程。

2、自己修改UDP和TCP协议代码中的错误部分,完成两台电脑之间通讯。

3、修改IP源代码使所有外部调用函数都放在一个主函数里面。

3、相关知识1、UDP协议UDP协议[2]的全称是用户数据包协议[3],在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。

在OSI模型中,在第四层——传输层,处于IP协议的上一层。

UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。

UDP用来支持那些需要在计算机之间传输数据的网络应用。

包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。

UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在现在,UDP仍然不失为一项非常实用和可行的网络传输层协议。

与所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层。

根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议。

UDP协议的主要作用是将网络数据流量压缩成数据包的形式。

OS3

OS3

实验三P、V 原语的模拟实现实验学时:2实验类型:设计实验要求:必修一、实验目的1) 理解信号量相关理论;2) 掌握记录型信号量结构;3) 掌握P、V 原语实现机制。

二、实验内容本实验针对操作系统中信号量相关理论进行实验,要求学生根据实验指导书提供的代码框架进行实验与测试,可以将所缺代码补充完整,也可以自己重新设计代码框架。

代码主要模拟信号量的P 操作(down)和V 操作(up)。

1) 信号量信号量也称为信号锁,主要应用于进程间的同步和互斥,在用于互斥时,通常作为资源锁。

信号量通常通过两个原子操作down(P)和up(V)来访问。

down 操作使信号量的值+1,up 操作使信号量的值-1。

2) 记录型信号量记录型信号量采用了“让权等待”的策略,由于存在多个进程等待访问同一临界资源的情况,所以记录型信号量需要一个等待链表来存放等待该信号量的进程控制块或进程号。

在本实验中,使用记录型信号量。

三、实验要求1) 完善并添加给定代码;2) 进行功能测试并得出正确结果;3) 分析并在实验报告中画出down 和up 函数流程图;4) 撰写实验报告。

四、实现过程运行过程及结果截图如下:创建进程及信号量:资源信息如下:进程0、1、2、3同时申请资源s1,情况如下:进程4、5、6、7、8同时申请资源s3,情况如下:释放s0资源:再次释放s0:进程8申请资源s2,因为其在阻塞队列中,故无法申请。

如图:进程5也无法申请s2,释放一次s3,进程5就可以申请到s2释放s3四次,进程8可以申请到s4信号量或进程不存在的实例:同一进程在未释放的情况下多次申请同一资源的情况:信号量释放次数超过申请次数的情况:主要代码如下:void down(string name,int pid,pNode *pnode,int pno,signal *sal,int sg) {bool pflag=false;int nodeindex;for(int i=0; i<pno; i++){if(pnode[i].node->pid==pid){pflag=true;nodeindex=i;break;}}if(!pflag){cout<<"进程"<<pid<<"在进程总链中不存在!"<<endl;return;}bool sflag=false;for(int i=0; i<sg; i++){if(sal[i].name==name){if(pnode[nodeindex].block==true){cout<<"该进程现在不能再申请其他资源!"<<endl;return;}if(pnode[nodeindex].flag[i]==true){cout<<"此资源信号量已申请过!"<<endl;return;}sflag=true;sal[i].count--;pnode[nodeindex].flag[i]=true;if(sal[i].count==0){pnode[nodeindex].block=true;sal[i].curpid=pid;cout<<"进程"<<pid<<"申请信号量"<<name<<"已成功!"<<endl;}else if(sal[i].count<0){pnode[nodeindex].block=true;if(sal[i].wHlist==NULL){sal[i].wHlist=&pnode[nodeindex];sal[i].tail=&pnode[nodeindex];}else{sal[i].tail->next=&pnode[nodeindex];sal[i].tail=&pnode[nodeindex];}cout<<"信号量"<<name<<"数量不足,不可用!"<<endl;}return;}}if(!sflag){cout<<"信号量"<<name<<"在信号量数组中不存在!"<<endl;return;}}void up(string name,signal *sal,int sg,pNode *pnode,int sig){bool sflag=false;for(int i=0; i<sg; i++){if(sal[i].name==name){sflag=true;if(sal[i].count==1){cout<<"资源已经满,无需释放!"<<endl;return;}sal[i].count++;if(sal[i].count==1){for(int j=0; j<sig; j++){if(sal[i].curpid==pnode[j].node->pid){pnode[j].flag[i]=false;pnode[j].block=false;break;}}sal[i].curpid=-1;cout<<"信号量释放成功!"<<endl;}else if(sal[i].count<=0){for(int j=0; j<sig; j++){if(sal[i].curpid==pnode[j].node->pid){pnode[j].flag[i]=false;pnode[j].block=false;break;}}pNode *headNode = sal[i].wHlist;sal[i].curpid=sal[i].wHlist->node->pid;sal[i].wHlist=headNode->next;delete headNode;cout<<"释放信号量失败,唤醒队首进程!"<<endl;}return;}}if(!sflag){cout<<"信号量"<<name<<"在信号量数组中不存在!"<<endl;return;}}void showdetail(signal *sal,int sg){for(int i=0; i<sg; i++){cout<<"信号量:"<<sal[i].name<<" 当前的数量为:"<<sal[i].count<<" 当前使用该信号量的进程:"<<sal[i].curpid<<endl;pNode *pnode = sal[i].wHlist;if(pnode == NULL){cout<<"信号量"<<sal[i].name<<"的阻塞队列是空的!"<<endl;}else{while(pnode!=NULL){cout<<pnode->node->pid<<"在"<<sal[i].name<<"的阻塞队列中"<<endl;pnode=pnode->next;}}}}。

西北工业大学计算机学院

西北工业大学计算机学院

西北工业大学计算机学院计算机操作系统实验指导张羽谷建华王海鹏编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这么大的工程代码,感觉理解起来很困难,不过,在老师花费了几个小时的讲解下,我最终还是勉强理解了一部分。

西北工业大学_计算机系统基础_实验报告_第2次

西北工业大学_计算机系统基础_实验报告_第2次

计算机系统基础实验课第二次实验报告对二进制炸弹求解过程的详细描述首先使用objdump命令对bomb程序进行反汇编,并将汇编代码输出到asm.txt中。

阶段一、字符串比较打开asm.txt文件,搜索到phase_1函数,可以看到以下代码。

08048b33 <phase_1>:8048b33: 83 ec 14 sub $0x14,%esp8048b36: 68 7c a0 04 08 push $0x804a07c8048b3b: ff 74 24 1c pushl 0x1c(%esp)8048b3f: e8 3e 05 00 00 call 8049082 <strings_not_equal>8048b44: 83 c4 10 add $0x10,%esp8048b47: 85 c0 test %eax,%eax8048b49: 74 05 je 8048b50 <phase_1+0x1d>8048b4b: e8 29 06 00 00 call 8049179 <explode_bomb>8048b50: 83 c4 0c add $0xc,%esp8048b53: c3 ret可以看出,用户输入字串指针保存在0x1c(%esp),然后调用<strings_not_equal>,待<strings_not_equal>返回后,测试返回值,若equal则进入下一phase,否则<explode_bomb>,从<strings_not_equal>可知该函数用于比较两函数的值,因此需要两个字串作为输入,上面代码中, pushl 0x1c(%esp)用于传递用户字串指针,则push $0x804a07c自然是传递比较字串的指针了。

打开gdb,x/s 0x80497c0, 可以直接查看到该指针指向的子符串:所以第一个炸弹的拆弹指令为:I turned the moon into something I call a Death Star.阶段二、循环在asm.txt文件中可以找到phase_2函数代码如下:08048b54 <phase_2>:8048b54: 56 push %esi8048b55: 53 push %ebx8048b56: 83 ec 2c sub $0x2c,%esp8048b59: 65 a1 14 00 00 00 mov %gs:0x14,%eax8048b5f: 89 44 24 24 mov %eax,0x24(%esp)8048b63: 31 c0 xor %eax,%eax8048b65: 8d 44 24 0c lea 0xc(%esp),%eax8048b69: 50 push %eax8048b6a: ff 74 24 3c pushl 0x3c(%esp)8048b6e: e8 2b 06 00 00 call 804919e <read_six_numbers>8048b73: 83 c4 10 add $0x10,%esp8048b76: 83 7c 24 04 01 cmpl $0x1,0x4(%esp)8048b7b: 74 05 je 8048b82 <phase_2+0x2e>8048b7d: e8 f7 05 00 00 call 8049179 <explode_bomb>8048b82: 8d 5c 24 04 lea 0x4(%esp),%ebx8048b86: 8d 74 24 18 lea 0x18(%esp),%esi8048b8a: 8b 03 mov (%ebx),%eax8048b8c: 01 c0 add %eax,%eax8048b8e: 39 43 04 cmp %eax,0x4(%ebx)8048b91: 74 05 je 8048b98 <phase_2+0x44>8048b93: e8 e1 05 00 00 call 8049179 <explode_bomb>8048b98: 83 c3 04 add $0x4,%ebx8048b9b: 39 f3 cmp %esi,%ebx8048b9d: 75 eb jne 8048b8a <phase_2+0x36>8048b9f: 8b 44 24 1c mov 0x1c(%esp),%eax8048ba3: 65 33 05 14 00 00 00 xor %gs:0x14,%eax8048baa: 74 05 je 8048bb1 <phase_2+0x5d>8048bac: e8 df fb ff ff call 8048790 <__stack_chk_fail@plt>8048bb1: 83 c4 24 add $0x24,%esp8048bb4: 5b pop %ebx8048bb5: 5e pop %esi8048bb6: c3 ret根据call 804919e <read_six_numbers>可以推测题目要求是输入六个数字。

北航os实验报告

北航os实验报告

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

西安工业大学操作系统实验报告

西安工业大学操作系统实验报告

XI`AN TECHNOLOGICAL UNIVERSITY 实验报告西安工业大学实验报告一、实验目的1.利用高级语言实现三种不同的进程调度算法:先来先服务算法、时间片轮转调度算法和优先级调度算法。

2.通过实验理解有关进程控制块、进程队列等的概念。

二、实验原理各调度算法思想:1.先来先服务算法(FCFS)FCFS是最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。

当在作业调度中采用该算法时,系统将按照作业到达的先后次序来进行调度,或者说它是优先考虑在系统中等待时间最长的作业,而不管该作业所需执行时间的长短,从后备作业队列中选择几个最先进入该队列的作业,将它们调入内存,为它们分配资源和创建进程,然后把它放入就绪队列。

当在进程调度中采用FCFS算法时,每次调度是从就绪的进程队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行2.时间片轮转调度算法用于分时系统中的进程调度。

每次调度时,总是选择就绪队列的队首进程,让其在CPU上运行一个系统预先设置好的时间片。

一个时间片内没有完成运行的进程,返回到绪队列末尾重新排队,等待下一次调度。

3.优先级调度算法非抢占式优先权调度算法系统一旦把处理机分配给优先权最高的进程后,便一直执行下去,至完成。

抢占式优先权调度算法只要系统中出现一个新的就绪进程,就进行优先权比较。

若出现优先权更高的进程,则立即停止当前执行,并将处理机分配给新到的优先权最高的进程。

三、实验步骤、数据记录及处理1.算法流程程序流程图菜单用户输入进程信息选择使用的算法SJFFCFS RR四、总结与体会时间片轮转调度算法(RR):给每个进程固定的执行时间,根据进程到达的先后顺序让进程在单位时间片内执行,执行完成后便调度下一个进程执行,时间片轮转调度不考虑进程等待时间和执行时间,属于抢占式调度。

优点是兼顾长短作业;缺点是平均等待时间较长,上下文切换较费时。

适用于分时系统。

先来先服务调度算法(FCFS):根据进程到达的先后顺序执行进程,不考虑等待时间和执行时间,会产生饥饿现象。

西北工业大学操作系统实验报告实验四

西北工业大学操作系统实验报告实验四

实验四进程与线程一、实验目的(1)理解进程的独立空间;(2)理解线程的相关概念。

二、实验内容与要求1、查阅资料,掌握进程创建和构造的相关知识和线程创建和构造的相关知识,了解C语言程序编写的相关知识;2、理解进程的独立空间的实验内容及步骤(1)编写一个程序,在其 main()函数中定义一个变量 shared,对其进行循环加/减操作,并输出每次操作后的结果;(2)使用系统调用 fork()创建子进程,观察该变量的变化;(3)修改程序把 shared变量定义到 main()函数之外,重复第(2)步操作,观察该变量的变化。

3、理解线程的实验步骤(1)编写一个程序,在其 main()函数中创建一个(或多个)线程,观察该线程是如何与主线程并发运行的。

输出每次操作后的结果;(2)在 main()函数外定义一个变量shared(全局变量),在main()中创建一个线程,在 main()中和新线程shared进行循环加/减操作,观察该变量的变化;(3)修改程序把shared变量定义到 main()函数之内,重复第(2)步操作,观察该变量的变化。

4、对整个实验过程进行分析总结,给出详细步骤;(1) 观察上述进程执行结果,并分析原因;(2) 提交源程序清单,并附加流程图与注释。

三、实验过程1、进程的与线程的创建和构造(1).进程的创建和构造进程简单来说就是在操作系统中运行的程序,它是操作系统资源管理的最小单位。

但是进程是一个动态的实体,它是程序的一次执行过程。

进程和程序的区别在于:进程是动态的,程序是静态的,进程是运行中的程序,而程序是一些保存在硬盘上的可执行代码。

新的进程通过克隆旧的程序(当前进程)而建立。

fork()和clone()(对于线程)系统调用可用来建立新的进程。

(2)线程的创建和构造线程也称做轻量级进程。

就像进程一样,线程在程序中是独立的、并发的执行路径,每个线程有它自己的堆栈、自己的程序计数器和自己的局部变量。

北航实验报告实验实验

北航实验报告实验实验

实验三UC-OS移植实验一、实验目的在内核移植了uCOS-II 的处理器上创建任务。

二、实验内容1.运行实验十,在超级终端上观察四个任务的切换。

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

3.引入一个全局变量 BOOLEAN ac_key,解决完整刷屏问题。

4. #define rUTRSTAT0 (*(volatile unsigned *)0x)#define RdURXH0()(*(volatile unsigned char *)0x)当键盘有输入时在超级终端上显示相应的字符。

三、实验设备硬件:ARM嵌入式开发平台、用于ARM920T的JTAG仿真器、PC机Pentium100以上。

软件:PC机操作系统Win2000或WinXP、ARM 集成开发环境、仿真器驱动程序、超级终端通讯程序。

四、实验原理所谓移植,指的是一个操作系统可以在某个微处理器或者微控制器上运行。

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

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

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

要使uCOS一工工可以正常工作,处理器必须满足以下要求:1)处理器的C编译器能产生可重入代码。

2)在程序中可以打开或者关闭中断。

3)处理器支持中断,并A能产生定时中断(通常在10Hz}1000Hz之间)。

4)处理器支持能够容纳一定量数据的硬件堆栈。

5)处理器有将堆栈指针和其它CPU寄存器存储和读出到堆栈(或者内存)的指令。

uCOS-II进行任务调度的时候,会把当前任务的CPU寄存器存放到此任务的堆栈中,然后,再从另一个任务的堆栈中恢复原来的工作寄存器,继续运行另一个任务。

西北工业大学-操作系统实验报告-实验五

西北工业大学-操作系统实验报告-实验五

实验五进程管理一、实验目的(1)加深对进程概念的理解,明确进程和程序的区别;(2)进一步认识并发执行的实质;(3)了解FreeBSD系统中进程通信的基本原理。

二、实验内容与要求1、掌握进程的概念,明确进程的含义;2、编写一段程序,使用系统调用fork( )创建两个子进程。

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

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

试观察记录屏幕上的显示结果(多次运行,查看结果是否有变化),并分析原因;3、修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行时屏幕出现的现象(多次运行,查看结果是否有变化),并分析原因;4、如果在程序中使用调用lockf()来给每一个子进程加锁,可以实现进程之间的互斥,观察并分析出现的现象;5、对整个实验过程进行分析总结,给出详细步骤;三、实验过程1、进程的概念与含义狭义:进程就是一段程序的执行过程。

广义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。

它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。

进程的概念主要有两点:第一,进程是一个实体。

每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。

文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。

第二,进程是一个“执行中的程序”。

程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们称其为进程。

进程是操作系统中最基本、重要的概念。

是多道程序系统出现后,为了刻画系统内部出现的动态情况,描述系统内部各道程序的活动规律引进的一个概念,所有多道程序设计操作系统都建立在进程的基础上。

西北工业大学_计算机系统基础_实验报告_第3次

西北工业大学_计算机系统基础_实验报告_第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字节大小的字符串。

西北工业大学-操作系统实验报告-实验二

西北工业大学-操作系统实验报告-实验二

实验二FreeBSD的应用软件安装一、实验目的学习如何使用FreeBSD安装应用软件。

二、实验内容与要求1、查阅资料,了解FreeBSD 安装软件的主要方式,每种方式的具体步骤、操作指南;2、学习使用FreeBSD安装方法的一种进行安装简单的SSH;3、详细记录探索学习的内容和实验的整个过程,包括资料的查询、资料的来源(资料名称、网址等)、所做的各种尝试、以及最终的结果(包含截屏);三、实验过程1、FreeBSD 安装软件的主要方式(1).package用 package 安装,只要抓取该程序 package 档案,简单的透过 --> 安装pkg_add package_name --> 移除 pkg_delete package_name就可以完成安装 / 移除。

注意:文件名称 .tgz 结尾的是 package 文件名称 .tar.gz 结尾的是 source 注 : 目前已经安装的 package 数据库放在 /var/db/pkg/ 这个数据夹之中。

通常在比较大型的套件(需要编译很久)或是老是无法编译成功以及想先快速了解未使用过的套件是长成什么样子时,我们会采用这种方式来安装套件。

(2)port如果你要使用 ports 安装软件,你必须先确认 /usr/ports 这个目录是否有安装。

如果没有的话,使用 /stand/sysinstall 来安装 ports 的目录:1. 以 root 执行 /stand/sysinstall2. 选择 Configure 后按 Enter3. 选择 Distributions 后按 Enter4. 选择 ports 后按空格键5. 选择 Exit 后按 Enter6. 选择你要从 CDROM 或 FTP 安装等7. 跟着选单照做,最后离开 sysinstall或者我们也可以到 /ports/ 去手动抓回 port.tar.gz 这个档案,将它放在 /usr/ 下。

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

实验报告三
理解线程的相关概念
实验名称:
日期:2013.5
请求分页存储管理设计
班级:
学号:2010302554 姓名:王振10011007
一、实验目的:
1. 理解线程的相关概念
理解当操作系统引入线程的概念后,进程是操作系统独立分配资源的单位,线程成为系统调度的单位,与同一个进程中的其他线程共享程序空间。

2. 请求分页存储管理设计
模拟存储管理常用的请求分页存储管理技术,通过本实验使学生更加深入的理解虚拟内存的思想和主要的页面淘汰算法。

二、实验内容:
1. 理解线程的相关概念
线程创建和构造的相关知识,了解C语言程序编写的相关知识。

2. 请求分页存储管理设计
学习虚拟存储器的相关基础知识,了解请求分页存储管理系统的原理和具体实现过程,熟悉各种主要的页面调度算法。

三、项目要求及分析:
1. 理解线程的相关概念
(1)编写一个程序,在其main()函数中创建一个(或多个)线程,观察该线
程是如何与主线程并发运行的。

输出每次操作后的结果;
(2)在main()函数外定义一个变量shared(全局变量),在main()中创建一个线
程,在main()中和新线程shared 进行循环加/减操作,观察该变量的变化;
(3)修改程序把shared 变量定义到main()函数之内,重复第(2)步操作,
观察该变量的变化。

2. 请求分页存储管理设计
(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 流程图
1. 理解线程的相关概念
开始
设置全局变量shared
创建主进程
创建线程
Sleep 1 S
Shared++
输出Shared的值
结束
开始
创建主进程
设置局部变量shared
创建线程
Sleep 1 S
Shared++
输出Shared的值
结束
2. 请求分页存储管理设计
4.2 添加函数的代码1. 理解线程的相关概念
开始
选择页面调度算法FIFO LRU
产生随机指令
结束
2. 请求分页存储管理设计#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAXNUM 920
#define N_TEST 100
int a[N_TEST];
int *a_p;
int page=10;//页面大小
int mem=100;//主存容量int m=10; //主存页数int point=0;
int hit=0;
//FIFO 算法
void FiFo()
{
int i=0;
hit =0;
point=0;
for(i=0;i<N_TEST;i++)
{
int j=0;
int temp=1;
for(j=0;j<m;j++)
{
if((a[i]/page)==a_p[j])
temp=0;
}
if(temp)
a_p[(point++)%m]=a[i]/page;
else
hit++;
}
printf("命中率:%.3f %%\n",(float)hit/N_TEST*100); }
//LRU
void Lru()
{
int i=0;
hit=0;
point=0;
for(i=0;i<N_TEST;i++)
{
int j=0;
int temp=1;
for(j=0;j<m;j++)
{
if((a[i]/page)==a_p[j])
temp=0;
}
if(temp)
a_p[(point++)%m]=a[i]/page;
else
{
for(j=0;j<m-1;j++)
{
a_p[(point+j)%m]=a_p[(point+1+j)%m];
}
a_p[(point+j)%m]=a[i]/page;
hit++;
}
}
printf("命中率:%.3f%%\n",(float)hit/N_TEST*100);
}
int main()
{
int flag=1;
while(flag)
{
int i=0;
int select=0;
printf("FIFO 输入0,LRU输入1 \n");
scanf("%d",&select);
a_p=(int *)malloc(m*sizeof(int));
srand((unsigned int)time(NULL));
for(i=0;i<m;i++)
a_p[i]=10001;
for(i=0;i<N_TEST;i++)
{
a[i++]=1.0*rand()/RAND_MAX*(MAXNUM-1)+1;
a[i++]=a[0]+1;
a[i++]=1.0*rand()/RAND_MAX*(a[1]-1)+1;
a[i++]=a[2]+1;
a[i]=MAXNUM-1.0*rand()/RAND_MAX*(a[3]-1);
}
for(i=0;i<N_TEST;i++)
{
printf("%d\t",a[i]);
}
printf("\n");
if(0==select)
FiFo();
else if(1==select)
Lru();
else
printf("Input Error!");
printf("继续请按1\n");
scanf("%d",&flag);
if(flag!=1)
exit(0);
}
return 0;
}
五、调试运行结果:
(1)
(2)
六、实验总结:。

相关文档
最新文档