北京大学操作系统实习JOS lab2实验笔记
- 格式:pdf
- 大小:141.85 KB
- 文档页数:6


计算机操作系统实验二一、实验目的本实验旨在通过实际操作,深入理解和掌握计算机操作系统中的进程与线程管理。
通过实验,我们将了解进程的创建、执行、阻塞、唤醒等状态以及线程的创建、同步、通信等操作。
同时,通过实验,我们将学习如何利用进程和线程提高程序的并发性和效率。
二、实验内容1、进程管理a.进程的创建与执行:通过编程语言(如C/C++)编写一个程序,创建一个新的进程并执行。
观察和记录进程的创建、执行过程。
b.进程的阻塞与唤醒:编写一个程序,使一个进程在执行过程中发生阻塞,并观察和记录阻塞状态。
然后,通过其他进程唤醒该进程,并观察和记录唤醒过程。
c.进程的状态转换:根据实际操作,理解和分析进程的状态转换(就绪状态、阻塞状态、执行状态)以及转换的条件和过程。
2、线程管理a.线程的创建与同步:编写一个多线程程序,创建多个线程并观察和记录线程的创建过程。
同时,使用同步机制(如互斥锁或信号量)实现线程间的同步操作。
b.线程的通信:通过消息队列或其他通信机制,实现多个线程间的通信。
观察和记录线程间的通信过程以及通信对程序执行的影响。
c.线程的状态转换:根据实际操作,理解和分析线程的状态转换(新建状态、就绪状态、阻塞状态、终止状态)以及转换的条件和过程。
三、实验步骤1、按照实验内容的要求,编写相应的程序代码。
2、编译并运行程序,观察程序的执行过程。
3、根据程序的输出和实际操作情况,分析和理解进程与线程的状态转换以及进程与线程管理的相关原理。
4、修改程序代码,尝试不同的操作方式,观察程序执行结果的变化,进一步深入理解和掌握进程与线程管理。
5、完成实验报告,总结实验过程和结果,提出问题和建议。
四、实验总结通过本次实验,我们深入了解了计算机操作系统中的进程与线程管理原理和实践操作。
在实验过程中,我们不仅学习了如何利用编程语言实现进程和线程的操作,还通过实际操作观察和分析了进程与线程的状态转换以及进程与线程管理的基本原理。
虚拟内存管理实习报告目录内容一:总体概述 (3)内容二:任务完成情况 (3)任务完成列表(Y/N) (3)具体Exercise的完成情况 (3)内容三:遇到的困难以及解决方法 (11)内容四:收获及感想 (11)内容五:对课程的意见和建议 (11)内容六:参考文献 (11)内容一:总体概述本次lab主要是针对操作系统内存管理的学习,内存管理主要有固定分区、可变分区、页式和段式管理。
现代操作系统主要采用页式内存管理,它把用户程序地址空间划分成大小相等的部分,称为页。
内存空间按页的大小划分为大小相等的区域,称为内存块(物理页面,页框,页帧)。
以页为单位进行分配,逻辑上相邻的页,物理上不一定相邻。
虚拟内存的基本思想:每个程序拥有自己的地址空间,这个空间被分割成多个块,每一块称作一页或者页面,每一页有连续的地址范围。
这些页被映射到物理内存,但并不是所有页都必须在内存中才能运行。
当程序引用到一部分在物理内存中的地址空间时,由硬件立即执行必要的映射。
当程序引导到一部分不在物理内存中德的地址空间时,由操作系统负责将缺失的部分装入屋里内存并重新执行失效的指令。
内容二:任务完成情况任务完成列表(Y/N)Exercise1 Exercise2 Exercise3 Exercise4 Exercise5 Exercise6 Exercise7 Challange 完成情况Y Y Y Y Y Y N N具体Exercise的完成情况一、TLB异常处理目前,Nachos系统对于内存的管理是基于软件模拟的TLB机制。
其工作原理、异常处理、替换算法等方面,与分页式内存管理非常相像。
Exercise 1 源代码阅读Ø阅读code/userprog/,着重理解nachos执行用户程序的过程,以及该过程中与内存管理相关的要点。
Ø阅读code/machine目录下的machine.h(cc),translate.h(cc)文件和code/userprog目录下的exception.h(cc),理解当前Nachos系统所采用的TLB机制和地址转换机制。
操作系统实验报告哈尔滨工程大学计算机科学与技术学院第二讲操作系统的启动一、实验概述1. 实验名称操作系统的启动2. 实验目的跟踪调试EOS在PC机上从加电复位到成功启动的全过程,了解操作系统的启动过程。
查看EOS启动后的状态和行为,理解操作系统启动后的工作方式。
3. 实验类型验证4. 实验内容准备实验调试EOS操作系统的启动过程二、实验环境EOS操作系统和OS Lab集成实验环境,主要运用了C语言。
三、实验过程1. 源程序并附上注释/*提供该示例代码是为了阐释一个概念,或者进行一个测试,并不代表着最安全的编码实践,因此不应在应用程序或网站中使用该示例代码。
对于超出本示例代码的预期用途以外的使用所造成的偶然或继发性损失,北京英真时代科技有限公司不承担任何责任。
*/#include "EOSApp.h"int main(int argc, char* argv[]){int i;for (i = 1; i <= 5; i++) {printf("Hello,world! %d\n", i);Sleep(1000);}printf("Bye-bye!\n");return 0;}2. 程序运行时的初值和运行结果2.1 准备实验1. 启动OS Lab。
2. 新建一个EOS Kernel项目。
3. 在“项目管理器”窗口中打开boot文件夹中的boot.asm和loader.asm两个汇编文件。
boot.asm是软盘引导扇区程序的源文件,loader.asm是loader程序的源文件。
4. 按F7生成项目。
5. 生成完成后,使用Windows资源管理器打开项目文件夹中的Debug文件夹。
找到由boot.asm生成的软盘引导扇区程序boot.bin文件,该文件的大小一定为512字节(与软盘引导扇区的大小一致)。
找到由loader.asm生成的loader程序loader.bin文件,记录下此文件的大小1566字节。
操作系统实验2参考答案进程和进程通信实验参考答案(一) 实验题目父进程输入一个字符,传递给子进程,由子进程得到该字符向后的偏移字符,如果最终字符大于z,那么最终字符显示成a,另外,如果转化成数字字符(0DD9),那么进行进程图像转换,执行ls命令!程序框图如下:(二) 数据结构说明除了main()函数以外,还有其他3个函数,一个是signalfun(),是信号*****对应的处理函数;一个是writetofile函数,是对一个文件写如一定的内容的函数;还有一个是readfromfile,是从一个文件里面读取内容的函数。
子进程的创建都是在main()函数里面!<i>答案</i>(三) 测试方法:黑箱测试法执行程序结果,输入不同的字符与数字,看输出的结果(在屏幕上有输出)。
(四) 测试结果:各种输入输出都符合预定的结果!(五) 实验的步骤:先运行emacs test_2.C命令,编辑程序代码然后编译:gcc Co test_2 test_2.C再反复运行:./test_2下面是部分测试截图:<i>答案</i>(六) 总结与体会:进程间的通信的方法有很多种,可以通过管道(早期用的比较多)、消息、信号、共享内存等等,通过这些方法,可以实现进程的协作,可以实现计算机间的协作,进而完成复杂的任务。
对于这些方法,只有通过实践编程来实现一些具体的功能,才能够有更深刻的理解,才能掌握这些方法!源代码:#include "test_2.h"//信号*****的处理函数void signalfun(int temp){}//向文件写一定长度的字符串,void writetofile(char *filename,char *buf,int len){int fd; //用读写的方式打开文件,如果文件没有,创建文件if ((fd = open(filename,O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1) { //打开文件失败} else { //文件打开后,写入内容!} write(fd,buf,len); printf("error open file"); printf("It is signal processing function.\n");//关闭文件close(fd);}//从文件里读取一定长度的内容,返回值是具体读出的长度int readfromfile(char *filename,char *buf,int len){} int fd; //用只读的方式打开文件,如果失败,返回0;if ((fd = open(filename,O_RDONLY))==-1) return 0; //读取长度为len 的字符串int readlen = read(fd,buf,len); //关闭文件close(fd); return readlen;<i>答案</i>int main() {int status; pid_t pid; //设置信号*****的处理函数为signalfunsignal(*****,signalfun); //创建子进程,同时通过判断返回值来确定当前是否是父进程,pid0,为父进程if (pid = fork()) { } else { //以下是子进程的处理//休眠10毫秒sleep(10); char ch; //读取tempfile.c文件,里面有父进程的输入,等待处理readfromfile("tempfile.c",ch,1); printf("child will do :\nchange %c to",ch); //取得改字符的后续字符ch += 1; //对于比z大的,从a再开始if (ch'z') ch='a'; //将处理结果写回到tempfile.c文件writetofile("tempfile.c",ch,1); //通知子进程下面结束//父进程printf("Parent:will send signal.\n"); char ch; printf("Please input a char:"); //等待输入ch = getchar(); printf("\n"); //将输入写入文件tempfile.c writetofile("tempfile.c", ch,1); //向子进程发送信号,并阻塞本身,kill(pid,*****); //等待子进程结束wait(status); char ch2; //子进程结束后,读取tempfile.c文件,里面有子进程处理的内容readfromfile("tempfile.c",ch2,1); //输出printf("Now parent:%c be changed ,it is %c\n",ch,ch2); printf("status = %d: Parent finished.\n",status);<i>答案</i>} } printf(" %c\nchild finished!\n",ch); //如果处理结果是数字字符,那么进行进程图像转换if (ch='0' ch='9') { } //退出exit(0); printf("!!!yes,now execl begin:\n"); execl("/bin/ls","ls","-l",(char *)0);。