操作系统原理实验01
操作系统原理实验指导书

目录实验一系统功能调用 (1)实验二熟悉Linux环境 (6)实验三 shell脚本 (14)实验四进程控制 (18)实验五进程间通信 (22)(一) 信号量机制实验 (22)实验五进程间通信 (28)(二) 进程的管道通信实验 (28)实验五进程间通信 (32)(三) 消息的发送与接收实验 (32)实验五进程间通信 (37)(四) 共享存储区通信 (37)实验六死锁避免的算法 (43)实验七存储管理 (45)1. 常用页面置换算法 (45)2.动态分区分配算法 (54)实验八文件操作 (55)实验一系统功能调用【实验目的】1.熟悉操作系统的系统功能调用。
2.掌握用C语言实现系统功能调用的方法和步骤。
3.掌握利用10H号功能调用(BIOS的显示I/O功能调用)来实现对屏幕的操作与控制。
【预习内容】1.预习DOS、BIOS系统功能调用。
2.预习C语言实现系统功能调用的方法。
【实验内容】1.在屏幕的指定区域内显示字符串。
(必做题)2.在屏幕的指定区域内画框,在框内显示字符串。
(提高题)3. 在屏幕的指定区域内动画显示字符串。
(附加题)【实验报告】1.列出调试通过程序的清单,并加注释。
2.给出必要的程序设计思路和方法(或列出流程图)。
3.总结上机调试过程中所遇到的问题和解决方法及感想。
【实验相关资料】int86(0X10, &r, &r)函数:对BIOS调用的标准函数其中0X10是BIOS调用类型号(相当于INT n调用的中断类型号n),是10H号中断调用,是一个显示I/O调用。
BIOS借助此中断产生的功能调用控制PC机屏幕上的文本和图形。
通过给AH 寄存器设置适当的值选择想要的功能调用,然后发中断10H。
第一个&r是指向联合类型REGS的指针,用于接收调用的功能号及其它一些指定的入口参数,以便传给相应寄存器。
第二个&r是指向联合类型REGS的指针,用于接收功能调用后的返回值,即出口参数。
操作系统原理实验报告

《操作系统原理》实验报告班级:姓名:学号:指导老师:目录:实验题目:实验一线程创建与撤销 (2)实验题目:实验二线程同步 (6)实验题目:实验三线程互斥 (11)实验题目:实验四进程通信 (17)实验题目:实验五读者-写者问题 (21)实验题目:实验六进程调度 (37)实验题目:实验七存储管理之动态链接库 (52)实验题目:实验八存储管理之内存分配 (56)实验题目:实验九存储管理之页面置换算法 (69)实验题目:实验十设备管理 (84)实验题目:实验十一文件管理之文件读写 (98)实验题目:实验一线程创建与撤销完成人:XXX报告日期:2018年3月31日一、实验内容简要描述(1)熟悉VC++、Visual Studio开发环境。
(2)使用相关函数创建和撤销线程。
(3)在一个进程中创建3个线程,名字分别为threada、threadb、threadc。
threada输出“hello world! ”。
threadb输出“My name is …”。
threadc输出“Please wait…”,然后sleep 5秒钟,接着输出“I wake up”。
二、程序设计1、设计思路该函数创建一个在调用进程的地址空间中执行的线程。
2、主要数据结构HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,DWORD dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,DWORD dwCreationFlags,LPDWORD lpThreadId);VOID ExitThread(DWORD dwExitCode);VOID Sleep(DWORD dwMilliseconds);VOID Sleep(DWORD dwMilliseconds);三、实验结果1、基本数据lpThreadAttributes:指向一个SECURITY_ATTRIBUTES结构,该结构决定了返回的句柄是否可被子进程继承。
操作系统原理实验

操作系统原理实验一、实验目的本实验旨在通过实际操作,加深对操作系统原理的理解,掌握操作系统的基本功能和调度算法。
二、实验环境1. 操作系统:Windows 102. 虚拟机软件:VirtualBox3. 实验工具:C语言编译器(如gcc)、汇编语言编译器(如nasm)、调试器(如gdb)三、实验内容1. 实验一:进程管理在这个实验中,我们将学习如何创建和管理进程。
具体步骤如下:a) 创建一个C语言程序,实现一个简单的计算器功能。
该计算器能够进行基本的加减乘除运算。
b) 使用fork()系统调用创建一个子进程,并在子进程中执行计算器程序。
c) 使用wait()系统调用等待子进程的结束,并获取子进程的退出状态。
2. 实验二:内存管理在这个实验中,我们将学习如何进行内存管理。
具体步骤如下:a) 创建一个C语言程序,模拟内存分配和释放的过程。
该程序能够动态地分配和释放内存块。
b) 使用malloc()函数分配一块内存,并将其用于存储数据。
c) 使用free()函数释放已分配的内存块。
3. 实验三:文件系统在这个实验中,我们将学习如何进行文件系统的管理。
具体步骤如下:a) 创建一个C语言程序,实现一个简单的文件系统。
该文件系统能够进行文件的创建、读取、写入和删除操作。
b) 使用open()系统调用打开一个文件,并进行读取和写入操作。
c) 使用unlink()系统调用删除一个文件。
四、实验步骤1. 安装虚拟机软件VirtualBox,并创建一个虚拟机。
2. 在虚拟机中安装操作系统Windows 10。
3. 在Windows 10中安装C语言编译器、汇编语言编译器和调试器。
4. 根据实验内容,编写相应的C语言程序并保存。
5. 在命令行中使用gcc编译C语言程序,并生成可执行文件。
6. 运行可执行文件,观察程序的执行结果。
7. 根据实验要求,进行相应的操作和测试。
8. 完成实验后,整理实验报告,包括实验目的、实验环境、实验内容、实验步骤和实验结果等。
哈工大威海计算机操作系统原理实验报告1

计算机操作系统原理实验报告专业: 110420x学号: 1104202xx姓名: xxx哈尔滨工业大学(威海)实验一进程同步和互斥一、实验目的1.掌握临界资源、临界区概念及并发进程互斥、同步访问原理。
2.学会使用高级语言进行多线程编程的方法。
3.掌握利用VC++或Java语言线程库实现线程的互斥、条件竞争,并编码实现P、V操作,利用P、V操作实现两个并发线程对有界临界区的同步访问。
4.通过该实验,学生可在源代码级完成进程同步互斥方案的分析、功能设计、编程实现,控制进程间的同步、互斥关系。
二、实验要求1.知识基础:学生应在完成进程和线程及调度等章节的学习后进行。
2.开发环境与工具:硬件平台——个人计算机。
软件平台-Windows操作系统,VC++语言或Java语言开发环境。
3.运用高级语言VC++或Java语言线程库及多线程编程技术进行设计实现。
三、实验内容1.实现临界资源、临界区、进程或线程的定义与创建。
2.利用两个并发运行的进程,实现互斥算法和有界缓冲区同步算法。
四、程序流程图1.2.生产者消费者问题生产者:消费者:五、实验结果1.互斥问题2.生产者消费者问题六、结果分析有上述程序运行结果可知,此次试验已经基本达到了实验要求,在互斥问题中,由于采用了“模拟一个竞争条件——全局变量”来建立互斥,所以不会明显的条件来判断2个线程是否正确、独立的运行,所以,在运行时间上加以限制,让2个线程在有序运行时只能持续15秒。
在生产者消费者问题中,生产者与消费者的最大上限为10,并且生产者只能生产“同一种物品”,而消费者也只能购买“同一种物品”。
操作系统原理实验报告(终版)

操作系统原理实验报告(终版)————————————————————————————————作者:————————————————————————————————日期:[键入文字]XX学校实验报告课程名称:学院:专业班:姓名:学号:指导教师:2011 年3 月目录实验1 进程管理 (3)一、实验目的 (3)二、实验内容 (3)三、实验要求 (3)四、程序说明和程序流程图 (4)五、程序代码 (5)六、程序运行结果及分析 (7)七.指导教师评议 (8)实验2 进程通信 (9)一、实验目的 (9)二、实验内容 (9)三、实验要求 (9)四、程序说明和程序流程图 (9)五、程序代码 (11)七.指导教师评议 (14)实验3 存储管理 (15)一、实验目的 (15)二、实验内容 (15)三、实验要求 (15)四、程序说明和程序流程图 (16)六、程序运行结果及分析 (23)七.指导教师评议 (23)实验4 文件系统 (24)一、实验目的 (24)二、实验内容 (24)三、实验要求 (24)四、程序说明和程序流程图 (24)五、程序代码 (26)六、程序运行结果及分析 (26)七.指导教师评议 (27)实验1 进程管理一、实验目的1. 弄清进程和程序的区别,加深对进程概念的理解。
2. 了解并发进程的执行过程,进一步认识并发执行的实质。
3. 掌握解决进程互斥使用资源的方法。
二、实验内容1. 管道通信使用系统调用pipe( )建立一个管道,然后使用系统调用fork( )创建2个子进程p1和p2。
这2个子进程分别向管道中写入字符串:“Child process p1 is sending message!”和“Child process p2 is sending message!”,而父进程则从管道中读出来自两个子进程的信息,并显示在屏幕上。
2. 软中断通信使用系统调用fork( )创建2个子进程p1和p2,在父进程中使用系统调用signal( )捕捉来自键盘上的软中断信号SIGINT(即按Ctrl-C),当捕捉到软中断信号SIGINT后,父进程使用系统调用kill( )分别向2个子进程发出软中断信号SIGUSR1和SIGUSR2,子进程捕捉到信号后分别输出信息“Child process p1 is killed by parent!”和“Child process p2 is killed by parent!”后终止。
《操作系统原理》课程实验指导书

}
else { //大于0是父进程
printf("The parent:%d\n", getpid());
x=4;
}
printf("x=%d\n",x);
}
验证操作:
(45)程序运行共输出了几条语句?
(46)x的值输出了几次?
思考:
(47)x为什么会输出不同的值?
16.并发执行
#include <sys/types.h>
相关准备知识
Linux操作系统命令接口。
实验步骤
以图形化方式登录Linux系统,在桌面单击鼠标右键,选新建终端。
8.文件、目录管理。
(29)pwd
功能:显示用户当前所处的目录的绝对路径。
语法:pwd
例如,以root身份登录后,使用命令pwd将显示/root信息。
(30)ls
功能:列出目录的内容,类似于DOS下的dir命令。
(37)rm
功能:删除一个目录中的一个或多个文件或目录。
语法:rm 文件名…
例如,rm /tmp/my.c将删除/tmp目录下的my.c文件。
(38)clear
功能:清除屏幕上的信息,清屏后,提示符移动到屏幕左上角。
9.C程序开发
(39)使用vi编辑C语言源程序
(40)gcc编译和链接
(41)运行程序。
实验对象
本实验开设对象为计算机科学与技术和网络工程专业本科学生,本课程为必修课程。
课程简介
《操作系统原理》是计算机专业的核心课程之一。通过本课程的学习和实验,使学生掌握操作系统基本概念和原理,提高自身计算机的应用素质,并且培养学生熟练使用系统调用编程技能,为他们以后的专业学习奠定良好的基础。
操作系统原理实验教学大纲(本科)-2013

《操作系统原理》实验教学大纲一、实验教学内容与基本要求实验一 批处理系统的作业调度1 目的要求1.加深对作业概念的理解;2.深入了解批处理系统如何组织作业、管理作业和调度作业。
2 实验内容编写程序完成批处理系统中的作业调度,要求采用响应比高者优先的作业调度算法。
实验具体包括:首先确定作业控制块的内容,作业控制块的组成方式;然后完成作业调度;最后编写主函数对所做工作进行测试。
3 所需实验设施设备PC、windows操作系统4 教学形式及过程演示、学生独立完成实验二 进程管理1 目的要求1.加深对进程概念的理解,明确进程和程序的区别。
2.深入了解系统如何组织进程、创建进程。
3.进一步认识如何实现处理器调度。
2 实验内容编写程序完成单处理机系统中的进程调度,要求采用时间片轮转调度算法。
实验具体包括:首先确定进程控制块的内容,进程控制块的组成方式;然后完成进程创建原语和进程调度原语;最后编写主函数对所做工作进行测试。
3 所需实验设施设备PC、windows操作系统4 教学形式及过程演示、学生独立完成实验三 动态分区存储管理方式的主存分配回收1 目的要求深入了解动态分区存储管理方式主存分配回收的实现。
2 实验内容编写程序完成动态分区存储管理方式的主存分配回收的实现。
实验具体包括:首先确定主存空间分配表;然后采用最优适应算法完成主存空间的分配和回收;最后编写主函数对所做工作进行测试。
3 所需实验设施设备PC、windows操作系统4 教学形式及过程演示、学生独立完成实验四 页式虚拟存储管理中地址转换和缺页中断1 目的要求1.深入了解页式存储管理如何实现地址转换;2.进一步认识页式虚拟存储管理中如何处理缺页中断。
2 实验内容编写程序完成页式存储管理中地址转换过程和模拟缺页中断的处理。
实验具体包括:首先对给定的地址进行地址转换工作,若发生缺页则先进行缺页中断处理,然后再进行地址转换;最后编写主函数对所做工作进行测试。
操作原理报告

《操作系统原理》 课内实验报告2017年12月学院: 专业: 班级: 学号: 姓名: 指导教师:温 静学院:机械与电子信息学院专业:计算机网络技术班级:学号:姓名:指导教师:一、实验目的:1.掌握命令行窗口的显示设置;2.学会系统的基本配置;3.显示系统基本信息;4.掌握系统配置管理。
二、实验内容:1.进入windows命令行窗口;2.使用chcp命令设置活动代码页;3.使用命令prompt $v$g显示更改windows命令提示符;4.使用命令color fc改变windows命令行窗口的前景及背景色;5.使用命令title “windows 命令行窗口”改变windows命令行窗口的标题;6.使用命令date显示或设置系统日期;7.使用命令time显示或设置系统时间;8.使用命令w32tm/tz显示当前时区设置;9.使用命令doskey ls=dir /w创建宏;10.使用命令systeminfo |more显示系统信息;11.使用命令tasklist显示任务进程;12.使用命令taskkill 结束任务进程;13.基本命令的使用;14.宏命令的使用。
三、实验结果及分析:1、进入windows命令行窗口执行“开始”→“运行”→cmd。
2、设置活动代码页步骤一:输入命令chcp 936。
步骤二:输入命令ver.步骤三:输入命令chcp 437.步骤四:输入命令ver。
步骤五:比较结果。
3、显示更改windows命令提示符输入命令prompt $v$g。
4、改变windows命令行窗口的前景和背景色输入命令color fc。
5、改变命令行窗口的标题输入命令title “windows 命令行窗口”。
6、显示或设置系统日期输入date。
7、显示或设置系统时间输入命令time。
8、显示当前时区设置输入命令w32tm/tz。
9、创建宏输入命令doskey ls=dir /w.10、系统信息输入命令systeminfo |more.11、命令tasklist:显示任务进程输入命令tasklist.12、命令taskkill:结束任务进程输入命令taskkill 进程号显示窗口消失13、基本命令的使用四、评阅意见:批阅教师:批阅日期:。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 运行到断点位置,查看此时CPU寄存器、函数参数 ctx、call stack等等信息
目录
• 熟悉开发环境
– 实验环境 – 编译、运行与调试
• 编写系统调用 • FAQ • 附录
– A: C与C++语法区别 – B:调试内核
FAQ
• Q1:能解释一下系统调用的命名规则吗?
– A1:如果系统调用的用户接口名字是foo,那么该系统调用的号码 用SYSCALL_foo表示,在内核里面的实现函数是sys_foo。
– g_timer_ticks记录了EPOS启动以来定时器中断的总次数
• 宏定义HZ
– HZ是定时器每秒钟中断的次数,即定时器中断的频率
– K2、在kernel/kernel.h的后面,加入声明
• time_t sys_time();
实验步骤
• Kernel space
– K3、在include/syscall-nr.h中,定义系统调用 的号码
可以直接引用寄存器哦 查看栈顶的16个字节 反汇编从EIP开始的4条指令 命令x的格式说明
获取帮助
退出调试
常用的GDB命令 break location watch var rwatch var
解释 Set a breakpoint at a location, line number, or file (e.g. "main", "5", or "hello.c:23") Break when a variable is written to Break when a variable is read from
《操作系统原理》实验
一、系统调用
重庆大学软件学院 洪明坚 2017年2月
目录
• 熟悉开发环境
– 实验环境 – 编译、运行与调试
• 编写系统调用 • FAQ • 附录
– A: C与C++语法区别 – B:调试内核
实验环境
• 安装
– Windows:下载expenv.7z – Debian/Ubuntu:安装方法 – Mac OS X:安装方法
That’s all Enjoy hacking
• #define SYSCALL_time 2016
– K4、在kernel/machdep.c的函数syscall中,增 加“case SYSCALL_time”分支
• 读取参数的值
– time_t*loc = *(time_t **)(ctx->esp+4);
• 调用系统调用的实现函数sys_time
系统调用的分发
void syscall(struct context *ctx) 只保留字符 系统调用号码 { switch(ctx->eax) { case SYSCALL_putchar: ctx->eax = sys_putchar((*((uint32_t *)(ctx->esp+4)))&0xff); break; } }
epos/userapp
• 该目录包括
– 应用程序源文件
• lib/crt0.S
– 应用程序的入口,调用main
• lib/syscall-wrapper.S
– 系统调用的C语言包裹
• main.c
– 主函数main
• 等等
– 项目管理文件
• Makefile
目录
• 熟悉开发环境
– 实验环境 – 编译、运行与调试
附录A:C和C++语法区别
A4、结构体(struct)/枚举型(enum)/联合体型(union)的定义 用struct定义变量 struct mystruct { int i; float x; } 在C中声明变量要这么写:struct mystruct a; 而在C++中不用写struct,即mystruct a; 一种兼容的用法是: typedef struct _mystruct { int i; float x; } mystruct; 然后在C中可以用“mystruct a;”声明变量。
• 包括
– 编译器、链接器、调试器
• GCC、LD、GDB
– PC模拟器(虚拟机)
• Qemu
实验内容
• 进入实验环境
– Windows:双击expenv/setvars.bat – 其他操作系统:打开终端
• 检出(checkout)EPOS的源代码
– svn checkout /svn/epos
• Q4:g_startup_time、g_timer_ticks和HZ要自己定义吗?
– A4:不要,直接用即可
目录
• 熟悉开发环境
– 实验环境 – 编译、运行与调试
• 编写系统调用 • FAQ • 附录
– A: C与C++语法区别 – B:调试内核
附录A:C和C++语法区别
A1、变量的定义 C语言的变量定义必须语句块的最前面,而C++无此限制。比如 for(int i=0;i<100;i++) s+=i; 在C++中是正确的,但是在C语言中是错误的。 又比如 switch(i) { switch(i) case 1: case 1: { int j; int j; j++; j++; break; } } break; } 左边在C++中是正确的,而在C中是错误的;右边在C和C++中都是正确的。 A2、布尔类型 C++中有bool类型和true/false值,C中则没有。在C中,非零即为真,零就是假。 A3、函数参数默认值 C语言中的函数不能有参数默认值,在C++中可以有。
Kernel space – entry.S:_ int0x82_syscall – machdep.c:syscall(struct context *ctx) » 函ቤተ መጻሕፍቲ ባይዱsyscall根据保存在ctx->eax中的系统调用号码做分发 » case SYSCALL_putchar: » 从用户栈上读取参数a的值 » 调用系统调用的实现函数 sys_putchar(a) – entry.S:_ret_from_syscall
– ctx->eax=sys_time(); – if(loc != NULL) » *loc = ctx->eax;
实验步骤
• User space
– U1、在userapp/lib/syscall-wrapper.S末尾,加 入汇编语言接口“WRAPPER(time)” – U2、在userapp/include/syscall.h中,加入C语 言声明 “time_t time(time_t *loc);” – U3、在userapp/main.c中调用该系统调用,并 打印出结果
• 编译及运行
– cd epos – make run
• 清除所有的临时文件
– make clean
epos/kernel
• 该目录包括
– 内核源文件
• entry.S
– 汇编语言文件 – 内核的入口,不能改为entry.s!
• 等等
– 链接器脚本
• kernel.ld.in
– 项目管理文件
• Makefile
• 编写系统调用 • FAQ • 附录
– A: C与C++语法区别 – B:调试内核
系统调用的流程
• 例子:putchar(int a)
– 参数a的值入栈 – userapp/lib/syscall-wrapper.S:_putchar
• movl $SYSCALL_ putchar, %eax //系统调用号码入eax • int $0x82 User space
undisplay num
printf fmt expressions set variable expression backtrace info all-registers
Stop showing an expression identified by its number
Do some formatted output with printf() e.g. printf "i = %d, p = %s\n", i, p Set a variable to value, e.g. set variable x=20 Show the call stack Dump all registers to screen
附录B:调试内核
• make clean debug
连接到QEMU
在函数entry处设置断点 继续运行
反汇编函数entry
单条指令(进入函数) 单条指令(跳过函数)
显示源代码
单条语句(进入函数) 单条语句(跳过函数) 打印变量的值,还可以用表达式哦
查看已设置的断点
删除断点1,多个断点用空格分隔 查看CPU寄存器
– 数据类型time_t其实就是long
• typedef long time_t;
实验步骤
• Kernel space
– K1、在kernel/machdep.c中,编写系统调用的 实现函数“time_t sys_time()”,计算用户需 要的秒数。需要用到
• 变量g_startup_time,它记录了EPOS启动时,距离 格林尼治时间1970年1月1日午夜的秒数 • 变量g_timer_ticks
• 要测试loc分别为NULL和非NULL两种情况
调试系统调用
• 调试方法