清华大学操作系统lab1_实验报告
操作系统实验lab1
实验一 Linux系统的基本操作1.目的要求熟悉Linux系统运行环境,掌握Linux操作系统上的基本操作。
2、实验内容1)登录Linux系统和使用GNOMEa)在启动系统,登陆进入系统后,桌面上有3个图标,它们的名字和作用是什么?它们和windows系统的什么软件功能相当?(1)名字:计算机作用:为用户提供管理计算机的接口,和windows的我的电脑作用相同。
(2)名字:Root的主文件夹作用:为当前的用户提供保存资料。
它和windows的我的文档作用相同。
(3)名字:回收站作用:存放用户所删除的文件它和windows的回收站作用相同b)在屏幕的最下方,有一个快捷栏,其中有哪些图标,它们的名字和作用是什么?它们和windows系统的什么软件功能相当?A.Hard disk(硬盘)作用:用于存储数据,文件等;和windows 磁盘功能相当work adapter(网络适配器) 作用:用于建立网络连接;和windows inode 功能相当C.Sound card(声卡) 作用:用于调节音量;和windows 音量控制器功能相当D.Printer (打印机) 作用:用于输出数据的打印;和windows 打印机功能相当E.Genesys logic USB storage( USB 插件) 作用:管理即插即用设备;和windowsUSB硬件功能相当F.Message log(信息记录) 作用:用于提醒用户系统消息;和windows 消息提醒功能相当2)Linux系统的基本命令a)列举打开Linux终端的两种方式,分别叙述其过程单击applications,选择accessories,再选择terminal单击右键,选择terminalb) 使用PWD命令可以查看用户当前所处的工作目录,你的工作目录是DIRb)使用______MORE___________命令可以查看当前文件夹的内容c)分别键入命令who,man date,cal5,exit解释各个命令具体实现的功能A.who指令显示了当前登陆在该机器上的所有用户的列表B.man date指令用来查看系统中关于date命令的使用说明C.cal 5命令:日历命令,显示本年12个月日历D.exit命令:退出终端3)Linux系统的文件、目录和权限a)查询当前用户所处的位置使用pwd命令b)在当前文件夹下创建一个名为os的文件夹Mkdir osc)使os目录成为当前目录Cd osd)创建一个名为file.c的文本文件,该文件放置在文件夹os中Cd os cat>file.ce)把file.c文件拷贝到用户主目录中(登陆进系统时所处的目录),文件名不变Cp /root/gaoting/file.c/root/file.cf)把主目录中的file.c文件更名为source.cMv –l file.c source.cg)返回到主目录Cd /h)使用命令"ls –l",其显示内容是什么?对各列内容进行解释?Drwxr-xr 2 gaoting gaoting 4096 mar 26 2011 desktop文件类型权限链接数所属用户所属组文件大小创建时间文件名i)删除文件夹osRm –rf osj)删除当前目录下所有以source开始的文件Rm source.*4)Linux通配符的使用。
操作系统实验实验报告
操作系统实验实验报告一、实验目的操作系统是计算机系统中最为关键的核心软件,它管理着计算机的硬件资源和软件资源,为用户提供了一个方便、高效、稳定的工作环境。
本次操作系统实验的目的在于通过实际操作和实践,深入理解操作系统的基本原理和核心概念,掌握操作系统的基本功能和操作方法,提高对操作系统的认识和应用能力。
二、实验环境本次实验使用的操作系统为 Windows 10 专业版,开发工具为Visual Studio 2019,编程语言为 C 和 C++。
实验硬件环境为一台配备Intel Core i7 处理器、16GB 内存、512GB SSD 硬盘的个人计算机。
三、实验内容(一)进程管理实验1、进程创建与终止通过编程实现创建新的进程,并在完成任务后终止进程。
在实验中,我们使用了 Windows API 函数 CreateProcess 和 TerminateProcess 来完成进程的创建和终止操作。
通过观察进程的创建和终止过程,深入理解了进程的生命周期和状态转换。
2、进程同步与互斥为了实现进程之间的同步与互斥,我们使用了信号量、互斥量等同步对象。
通过编写多线程程序,模拟了多个进程对共享资源的访问,实现了对共享资源的互斥访问和同步操作。
在实验中,我们深刻体会到了进程同步与互斥的重要性,以及不正确的同步操作可能导致的死锁等问题。
(二)内存管理实验1、内存分配与释放使用 Windows API 函数 VirtualAlloc 和 VirtualFree 进行内存的分配和释放操作。
通过实验,了解了内存分配的不同方式(如堆分配、栈分配等)以及内存释放的时机和方法,掌握了内存管理的基本原理和操作技巧。
2、内存分页与分段通过编程模拟内存的分页和分段管理机制,了解了内存分页和分段的基本原理和实现方法。
在实验中,我们实现了简单的内存分页和分段算法,对内存的地址转换和页面置换等过程有了更深入的理解。
(三)文件系统实验1、文件操作使用 Windows API 函数 CreateFile、ReadFile、WriteFile 等进行文件的创建、读取和写入操作。
操作系统 实验报告
操作系统实验报告操作系统实验报告引言:操作系统是计算机系统中最重要的软件之一,它负责管理计算机硬件资源,并提供程序运行环境。
操作系统的设计和实现是计算机科学领域的重要研究方向之一。
本篇实验报告将介绍我们在操作系统实验中所进行的实践和实验结果。
一、实验目的我们的实验目的是通过实践操作系统的基本功能,深入理解操作系统的原理和实现方式。
具体来说,我们的实验目标包括:1. 学习并掌握操作系统的基本概念和原理;2. 理解操作系统与硬件之间的交互过程;3. 实践操作系统的进程管理、内存管理和文件系统等功能;4. 分析操作系统的性能和优化策略。
二、实验环境我们使用了一台配置较高的计算机作为实验环境,该计算机配备了一块主频为2.5GHz的多核处理器、8GB内存和500GB硬盘。
我们选择了一款常见的操作系统作为实验平台,以便于进行实验和调试。
三、实验过程1. 进程管理在进程管理实验中,我们实现了进程的创建、调度和终止等功能。
首先,我们编写了一个简单的程序,用于创建多个进程并进行调度。
然后,我们通过观察进程的执行顺序和时间片分配情况,分析操作系统的调度算法对系统性能的影响。
2. 内存管理在内存管理实验中,我们实现了内存的分配和回收等功能。
我们编写了一个模拟程序,用于模拟内存的分配和释放过程。
通过观察内存分配的效率和内存碎片的情况,我们评估了不同的内存管理算法的性能。
3. 文件系统在文件系统实验中,我们实现了文件的创建、读写和删除等功能。
我们编写了一个简单的文件操作程序,用于测试文件系统的性能和可靠性。
通过观察文件系统的读写速度和文件恢复的效果,我们评估了不同的文件系统实现方式的优劣。
四、实验结果通过实验,我们获得了以下结果:1. 进程管理实验中,我们发现不同的调度算法对系统性能的影响差异较大。
短作业优先算法在短时间内能够提高系统的响应速度,而时间片轮转算法则能够保证公平性。
2. 内存管理实验中,我们发现不同的内存管理算法对内存利用率和碎片情况有很大的影响。
《操作系统》课内实验报告
《操作系统》课内实验报告一、实验目的本次《操作系统》课内实验的主要目的是通过实际操作和观察,深入理解操作系统的基本原理和功能,掌握常见操作系统命令的使用,提高对操作系统的实际应用能力和问题解决能力。
二、实验环境本次实验在计算机实验室进行,使用的操作系统为 Windows 10 和Linux(Ubuntu 发行版)。
实验所使用的计算机配置为:Intel Core i5 处理器,8GB 内存,500GB 硬盘。
三、实验内容1、进程管理在 Windows 系统中,通过任务管理器观察进程的状态、优先级、CPU 使用率等信息,并进行进程的结束和优先级调整操作。
在 Linux 系统中,使用命令行工具(如 ps、kill 等)实现相同的功能。
2、内存管理使用 Windows 系统的性能监视器和资源监视器,查看内存的使用情况,包括物理内存、虚拟内存的占用和分配情况。
在 Linux 系统中,通过命令(如 free、vmstat 等)获取类似的内存信息,并分析内存的使用效率。
3、文件系统管理在 Windows 系统中,对文件和文件夹进行创建、复制、移动、删除等操作,了解文件的属性设置和权限管理。
在 Linux 系统中,使用命令(如 mkdir、cp、mv、rm 等)完成相同的任务,并熟悉文件的所有者、所属组和权限设置。
4、设备管理在 Windows 系统中,查看设备管理器中的硬件设备信息,安装和卸载设备驱动程序。
在 Linux 系统中,使用命令(如 lspci、lsusb 等)查看硬件设备,并通过安装内核模块来支持特定设备。
四、实验步骤1、进程管理实验(1)打开 Windows 系统的任务管理器,切换到“进程”选项卡,可以看到当前系统中正在运行的进程列表。
(2)选择一个进程,右键点击可以查看其属性,包括进程 ID、CPU 使用率、内存使用情况等。
(3)通过“结束任务”按钮可以结束指定的进程,但要注意不要随意结束系统关键进程,以免导致系统不稳定。
操作系统--实验一实验报告
操作系统课程实验指导书【实验名称】:并发程序设计(实验1)【实验目的】:掌握在程序中创建新进程的方法,观察并理解多道程序并发执行的现象。
【实验原理】:fork():建立子进程。
子进程得到父进程地址空间的一个复制。
返回值:成功时,该函数被调用一次,但返回两次,fork()对子进程返回0,对父进程返回子进程标识符(非0值)。
不成功时对父进程返回-1,没有子进程。
【实验内容】:首先分析一下程序运行时其输出结果有哪几种可能性,然后实际调试该程序观察其实际输出情况,比较两者的差异,分析其中的原因。
void main (void){ int x=5;if( fork( ) ){x+=30;printf (“%d\n”,x);}elseprintf(“%d\n”,x);printf((“%d\n”,x);}【实验要求】:每个同学必须独立完成本实验、提交实验报告、源程序和可执行程序。
实验报告中必须包含预计的实验结果,关键代码的分析,调试记录,实际的实验结果,实验结果分析等内容。
【预计的实验结果】355355【关键代码分析】1,这个实验代码只有几行,看起来很简单。
可以看到,重点就是fork()函数和一个if else 条件分支语句。
2,关于fork()函数,它是Linux的系统调用。
函数定义:int fork( void );返回值:子进程中返回0,父进程中返回子进程ID,出错返回-1函数说明:一个现有进程可以调用fork函数创建一个新进程。
由fork创建的新进程被称为子进程(child process)。
fork函数被调用一次但返回两次。
两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。
子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。
注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间,它们之间共享的存储空间只有代码段。
3,如果不知道fork()函数的作用的话,一定会对为什么会有两组输出结果感到疑惑。
OS-lab1实验报告
OS-lab1实验报告lab1实验报告⼀、实验思考题Thinking 1.1也许你会发现我们的readelf程序是不能解析之前⽣成的内核⽂件(内核⽂件是可执⾏⽂件)的,⽽我们之后将要介绍的⼯具readelf则可以解析,这是为什么呢?(提⽰:尝试使⽤readelf -h,观察不同)答:通过readelf -h读取vmlinux和testELF的结果如下图所⽰:vmlinux:testELF:从Data属性⼀栏中可以看到vmlinux为⼤端存储⽽testELF为⼩端存储,我们的readelf程序只能对⼩端存储进⾏解析,所以⽆法解析内核⽂件。
Thinking 1.2内核⼊⼝在什么地⽅?main 函数在什么地⽅?我们是怎么让内核进⼊到想要的 main 函数的呢?⼜是怎么进⾏跨⽂件调⽤函数的呢?答:内核⼊⼝在0x8000_0000,main函数在0x8001_0000。
通过执⾏跳转指令jal跳转到main函数。
跨⽂件调⽤函数时,会先将需要的参数保存在寄存器a0-a3中,然后执⾏跳转指令跳转⾄函数执⾏,将返回值保存在寄存器v0-v1中。
⼆、实验难点图⽰本次实验中⽐较难的地⽅,我认为是如何读懂已有的代码。
⽐如对于Exercise 1.2,如果不提前仔细了解ELF的⽂件⼤体结构。
乍⼀看kerelf.h的代码是很迷茫的。
这样“冗长”的⼀个结构体到底是什么意思,结构体中的各个变量代表着什么属性,只有结合注释和理论的知识才能理解,从⽽加以运⽤。
对于Exercise 1.5,这⼀点就更加明显了。
想要完成Exercise 1.5,需要阅读三个代码⽂件,了解printf函数的具体实现过程,需要了解这三个⽂件之中与printf实现相关的函数功能以及具体实现⽅法,⽐如printf.c中的myoutput函数和printf函数,这两个函数与我们需要补写的内容密切相关。
了解了这两个函数之后再去读print.c的函数内容,才能⽐较好的理解lp_Print函数的具体实现过程。
操作系统 (第一个实验)
操作系统实验报告哈尔滨工程大学计算机科学与技术学院第一讲实验环境的使用一、实验概述1. 实验名称实验环境的使用2. 实验目的(1)熟悉操作系统集成实验环境OS Lab的基本使用方法。
(2)练习编译、调试EOS操作系统内核以及EOS应用程序。
3. 实验类型(验证、设计)验证型实验4. 实验内容(1)学习OS Lab的基本使用方法;(2)EOS内核项目的生成和调试;(3)EOS应用程序项目的生成和调试。
二、实验环境EOS操作系统和OS Lab集成实验环境,主要运用了C语言。
三、实验过程1.源程序并附上注释/* 定义控制台应用程序的入口点*/#include "console.h"int main(int argc, char* argv[]){/* TODO: 在此处添加自己的代码*/int Func(int n); //声明Func()函数int n=0;n=Func(10); //调用Func()函数printf("Hello world!\n"); //输出return 0;}int Func(int n) //定义Func()函数{n=n+1;return n;}2.程序运行时的初值和运行结果(1)启动OS Lab在安装有OS Lab的计算机上,可以使用两种不同的方法来启动OS Lab:在桌面上双击“Tevation OS Lab”图标;或者点击“开始”菜单,在“程序”中的“Tevation OS Lab”中选择“Tevation OS Lab”。
OS Lab每次启动后都会首先弹出一个用于注册用户信息的对话框(可以选择对话框标题栏上的“帮助”按钮获得关于此对话框的帮助信息)。
在此对话框中填入学号和姓名后,点击“确定”按钮完成本次注册。
(2)学习OS Lab的基本使用方法:1)新建Windows控制台应用程序项目新建一个Windows控制台应用程序项目的步骤如下:1.1) 在“文件”菜单中选择“新建”,然后单击“项目”。
清华大学操作系统实验lab1实验报告
练习1、理解通过make生成执行文件的过程。
[练习1.1] 操作系统镜像文件ucore.img 是如何一步一步生成的?在proj1执行命令make V=可以得到make指令执行的过程从这几条指令中可以看出需要生成ucore.img首先需要生成bootblock,而生成bootblock需要先生成bootmain.o和bootasm.o还有sign,这三个文件又分别由bootmain.c、bootasm.S、sigh.c来生成。
ld -m elf_i386 -N -e start -Ttext 0x7C00 obj/boot/bootasm.o obj/boot/bootmain.o –o obj/bootblock.o这句话用于生成bootblock,elf_i386表示生成elf头,0x7C00为程序的入口。
'obj/bootblock.out' size: 440 bytes这句话表示生成的bootblock的文件大小,因为大小不到512字节,所以需要给blootblock填充,填充的功能在sign.c中有所体现,最后两字节设置为了0x55,0xAAbuf[510] = 0x55;buf[511] = 0xAA;FILE *ofp = fopen(argv[2], "wb+");size = fwrite(buf, 1, 512, ofp);[练习1.2] 一个被系统认为是符合规范的硬盘主引导扇区的特征是什么?前面已经提到过:引导扇区的大小为512字节,最后两个字节为标志性结束字节0x55,0xAA,做完这样的检查才能认为是符合规范的磁盘主引导扇区。
Sign.c文件中有作检查:if (size != 512) {fprintf(stderr, "write '%s' error, size is %d.\n", argv[2], size);return -1;}练习2:使用qemu执行并调试lab1中的软件。
《操作系统》课内实验报告
《操作系统》课内实验报告一、实验目的操作系统是计算机系统的核心组成部分,本次《操作系统》课内实验旨在通过实际操作和观察,深入理解操作系统的基本原理、功能和运行机制。
具体目的包括:1、熟悉操作系统的常用命令和操作,如文件管理、进程管理、内存管理等。
2、掌握操作系统的资源分配和调度策略,观察其对系统性能的影响。
3、培养解决操作系统相关问题的能力,提高动手实践和分析问题的能力。
二、实验环境本次实验在以下环境中进行:1、操作系统:Windows 10 专业版2、开发工具:Visual Studio Code三、实验内容及步骤(一)文件管理实验1、创建、删除和重命名文件及文件夹打开文件资源管理器,在指定目录下创建新的文件夹和文本文件。
对创建的文件和文件夹进行重命名操作,观察文件名的变化。
选择部分文件和文件夹进行删除操作,验证是否成功删除。
2、文件复制、移动和属性设置选取一些文件,将其复制到其他目录,并观察复制过程和结果。
把特定文件移动到不同的位置,检查文件是否正确迁移。
设置文件的属性,如只读、隐藏等,查看属性设置后的效果。
(二)进程管理实验1、查看系统进程打开任务管理器,观察当前正在运行的进程列表。
了解进程的名称、PID(进程标识符)、CPU 使用率、内存占用等信息。
2、进程的终止和优先级设置选择一个非关键进程,尝试终止其运行,观察系统的反应。
调整某些进程的优先级,观察其对系统资源分配和运行效率的影响。
(三)内存管理实验1、查看内存使用情况通过系统性能监视器,查看物理内存和虚拟内存的使用情况。
观察内存使用量随时间的变化趋势。
2、内存优化操作关闭一些不必要的后台程序,释放占用的内存资源。
调整虚拟内存的大小,观察对系统性能的改善效果。
四、实验结果与分析(一)文件管理实验结果1、成功创建、删除和重命名文件及文件夹,系统能够准确响应操作,文件名和文件夹名的修改即时生效。
2、文件的复制和移动操作顺利完成,数据无丢失和损坏。
《操作系统》课程实验报告
《操作系统》课程实验报告一、实验目的本次《操作系统》课程实验的主要目的是通过实际操作和观察,深入理解操作系统的工作原理、进程管理、内存管理、文件系统等核心概念,并掌握相关的操作技能和分析方法。
二、实验环境1、操作系统:Windows 10 专业版2、开发工具:Visual Studio Code3、编程语言:C/C++三、实验内容(一)进程管理实验1、进程创建与终止通过编程实现创建新进程,并观察进程的创建过程和资源分配情况。
同时,实现进程的正常终止和异常终止,并分析其对系统的影响。
2、进程同步与互斥使用信号量、互斥锁等机制实现进程之间的同步与互斥。
通过模拟多个进程对共享资源的访问,观察并解决可能出现的竞争条件和死锁问题。
(二)内存管理实验1、内存分配与回收实现不同的内存分配算法,如首次适应算法、最佳适应算法和最坏适应算法。
观察在不同的内存请求序列下,内存的分配和回收情况,并分析算法的性能和优缺点。
2、虚拟内存管理研究虚拟内存的工作原理,通过设置页面大小、页表结构等参数,观察页面的换入换出过程,以及对系统性能的影响。
(三)文件系统实验1、文件操作实现文件的创建、打开、读取、写入、关闭等基本操作。
观察文件在磁盘上的存储方式和文件系统的目录结构。
2、文件系统性能优化研究文件系统的缓存机制、磁盘调度算法等,通过对大量文件的读写操作,评估不同优化策略对文件系统性能的提升效果。
四、实验步骤(一)进程管理实验步骤1、进程创建与终止(1)使用 C/C++语言编写程序,调用系统函数创建新进程。
(2)在子进程中执行特定的任务,父进程等待子进程结束,并获取子进程的返回值。
(3)通过设置异常情况,模拟子进程的异常终止,观察父进程的处理方式。
2、进程同步与互斥(1)定义共享资源和相关的信号量或互斥锁。
(2)创建多个进程,模拟对共享资源的并发访问。
(3)在访问共享资源的关键代码段使用同步机制,确保进程之间的正确协作。
(4)观察并分析在不同的并发情况下,系统的运行结果和资源竞争情况。
操作系统实验报告一
操作系统实验报告一操作系统实验报告一引言:操作系统是计算机系统中最核心的软件之一,它负责管理和协调计算机硬件和软件资源的分配和调度,为用户提供一个友好、高效、安全的计算环境。
本实验报告旨在总结和分析我在操作系统实验一中所学到的知识和经验,包括实验目的、实验环境、实验过程和实验结果等方面。
一、实验目的操作系统实验一的主要目的是熟悉和掌握操作系统的基本概念和基本操作。
通过实际操作,了解操作系统的启动过程、命令行界面的使用、文件和目录管理、进程管理等内容,为后续的实验和学习打下基础。
二、实验环境本次实验使用的操作系统是Linux,具体是Ubuntu 20.04 LTS版本。
实验所需的软件包括VirtualBox虚拟机软件和Ubuntu镜像文件。
三、实验过程1. 虚拟机环境搭建首先,需要安装VirtualBox虚拟机软件,并导入Ubuntu镜像文件。
通过设置虚拟机的内存大小、硬盘空间等参数,创建一个适合的虚拟机环境。
2. 操作系统启动启动虚拟机后,选择Ubuntu系统进行启动。
在启动过程中,可以观察到操作系统加载各种驱动程序和初始化系统资源的过程。
3. 命令行界面的使用Ubuntu系统默认使用命令行界面,需要掌握基本的命令行操作。
比如,使用cd命令切换目录,使用ls命令查看目录内容,使用mkdir命令创建新目录等。
4. 文件和目录管理在命令行界面下,可以使用各种命令进行文件和目录的管理。
比如,使用touch命令创建新文件,使用cp命令复制文件,使用rm命令删除文件等。
5. 进程管理操作系统需要管理和调度各个进程的执行。
在实验中,可以使用ps命令查看当前运行的进程,使用kill命令终止指定的进程。
四、实验结果通过实验,我成功地搭建了虚拟机环境,并启动了Ubuntu操作系统。
在命令行界面下,我熟练地使用了各种命令进行文件和目录的管理,也了解了进程的基本管理方法。
实验结果表明,我对操作系统的基本概念和基本操作有了初步的了解和掌握。
操作系统课程实验报告
操作系统课程实验报告操作系统课程实验报告一、引言操作系统是计算机系统中最基础的软件之一,扮演着管理计算机硬件和软件资源的重要角色。
为了更好地理解操作系统的工作原理和实践操作系统的相关技术,我们在本学期的操作系统课程中进行了一系列的实验。
二、实验一:进程管理在本实验中,我们学习了进程管理的基本概念和实现方法。
通过编写代码,我们实现了一个简单的进程管理系统。
在这个系统中,我们可以创建、销毁和调度进程,并且实现了进程间的通信和同步机制。
通过这个实验,我们深入了解了进程的创建、调度和通信机制,以及进程的状态转换和资源管理。
三、实验二:内存管理内存管理是操作系统中非常重要的一部分。
在这个实验中,我们学习了内存管理的基本原理和实现方法。
通过编写代码,我们实现了一个简单的内存管理系统。
在这个系统中,我们可以分配和释放内存块,并且实现了虚拟内存和页面置换算法。
通过这个实验,我们深入了解了内存的分配和释放机制,以及虚拟内存的概念和实现。
四、实验三:文件系统文件系统是计算机系统中用于管理和组织文件的一种机制。
在这个实验中,我们学习了文件系统的基本概念和实现方法。
通过编写代码,我们实现了一个简单的文件系统。
在这个系统中,我们可以创建、读取和写入文件,并且实现了文件的目录结构和权限控制。
通过这个实验,我们深入了解了文件的组织和管理机制,以及文件的访问和保护机制。
五、实验四:设备管理设备管理是操作系统中负责管理计算机硬件设备的一部分。
在这个实验中,我们学习了设备管理的基本原理和实现方法。
通过编写代码,我们实现了一个简单的设备管理系统。
在这个系统中,我们可以管理设备的分配和释放,并且实现了设备的互斥和同步机制。
通过这个实验,我们深入了解了设备的管理和调度机制,以及设备的并发和互斥机制。
六、实验总结通过这一系列的实验,我们对操作系统的工作原理和实践操作系统的相关技术有了更深入的了解。
我们学习了进程管理、内存管理、文件系统和设备管理的基本概念和实现方法,并且通过编写代码实现了简单的操作系统功能。
操作系统实验报告1
[student@enjoy abc]$
2.“鸡兔同笼”问题
输入程序:
#include<stdio.h>
main()
{
int h,f;
int x,y;
printf("请输入头数和脚数:");
scanf("%d,%d",&h,&f);
x=(4*h-f)/2;
y=(f-2*h)/2;
例:以长格式显示当前目录中所有文件的详细信息:#Is-1
将当前目录下的文件file1.text复制成file2.text,包括隐藏文件:#Is-a
(2.)rm(删除文件或目录)
命令格式:rm【选项】文件
(3.)Cp(拷贝文件)
命令格式:cp【选项】【源文件或目录目标文件或目录】
说明:该命令把指定的源文件复制到目标文件或把多个源文件复制到目标目录中
通过本次实验,在终端里面输入指令,执行内部程序,熟悉了Linux命令程序的基本运用操作。
五、分析与讨论
六、教师评语
签名:
日期:
成绩
(6)Pwd(显示用户当前所在目录)
如:执行命令pwd结果显示:/home/lhy,表示当前处于目录/home/lhy中。
(7)Cd:让用户切换到目标目录。
格式:cd【dirName】该命令的作用是将工作目录切换至dirName
(8.)Kill:杀死或结束某一进程。
(9.)mv:将文件及目录移到另一目录或更换文件及目录名称。
(10.)ps -a:显示终端上的所有进程,包括其他用户的进程
实验操作:
1.在vi中编写一个abc.c程序,对程序进行编译、连接、运行。具体如下:
《操作系统》实验报告(1)
1)vi newfile1.c
2)输入
#include <stdio.h>
int main(void)
{
int sum =0;
int i;
for (i=1;i<=100;i++)
{
if(i%2 == 0)
{
sum += i;
}
}
printf(“sum = %d\n”,sum);
return 0;
7、编写一个C语言程序newfile2.c,显示字符串“Hello,Linux!”,将其反向输出,并写出编译和运行的命令。
8、熟悉Linux系统的目录结构,报告Linux内核的行为。
报告以下内容:
CPU类型和型号
内核版本
从系统最后一次启动以来经历了多长时间?形式为dd:hh:mm:ss
当前配置的内存数量
(6)显示有关计算机系统信息的命令:uname(显示操作系统的名称)、uname–n(显示系统域名)、uname–p(显示系统的CPU名称)
(7)使用man命令来获得每个Linux命令的帮助手册,用man ls,man passwd,man pwd命令得到ls、passwd、pwd三个命令的帮助手册。也可以使用:命令名--help格式来显示该命令的帮助信息,如who–help
当前可用内存数量
自系统启动以来,发生的所有的中断的次数
从系统启动开始创建的进程数
内核执行的上下文转换的次数
三、源程序及运行结果------实验内容中的3(回答问题)、6、7(编写C语言程序,编译并运行)和8(报告Linux内核的行为,注意:第8题如果使用命令查看,只需写出相关命令;如果编写程序,需要编译并运行,并写出编译和运行的命令。)
lab1_并发程序设计
《操作系统实验指南》实验一并发程序设计一、实验目的掌握Windows环境下,多进程并发程序设计方法,并通过程序的运行结果来验证分时系统和并发程序设计的优越性。
二、实验要求熟悉Windows操作系统及VC++程序设计方法三、实验内容在单进程(单用户、单任务)运行时,系统资源为单进程所独占,当进程在读/写磁盘文件时,CPU是处于等待I/O完成的空闲状态,因此造成较大的资源浪费。
在多进程运行(多任务)时,当某进程在等待I/O结果时,可以自动阻塞(blocked)起来,CPU可选择另一个就绪(ready)进程来执行,从而提高系统的运行效率,增加系统的吞吐量,提高系统交互操作性能。
本实验设计两个进程,WriteFile(写U盘)进程和Calculate(计算)进程,每个进程大约费时5秒。
设计两进程顺序执行程序,并测试所需时间。
设计两进程并发执行程序,并测试所需时间。
四、Windows及VC++并发程序设计简介1、Windows进程简介在Windows环境下,一个执行文件(*.exe)在执行时被看成是一个进程,即在Windows中最小的进程单位为执行文件。
但Windows是一个多任务的环境,允许多个执行文件(进程)同时(并发)运行。
2、VC++并发程序设计简介⑴、在程序中启动一个执行文件采用WinExec(LPCSTR lpCmdLine, UNIT uCmdShow)函数可启动一个执行文件的运行。
其中,lpCmdLine表示一个命令行,uCmdShow表示执行文件窗口显示特性。
最简洁的启动运行函数形式为:WinExec(“*.exe”, NULL);⑵、创建进程采用CreateProcess( LPCTSTR lpszImageName, // 执行文件名(进程名)LPCTSTR lpszCmdLine, // 命令行(参数)LPSECURITY_ATTRIBUTES lpsaProcess, // 进程安全属性LPSECURITY_ATTRIBUTES lpsaThread, // 线程安全属性BOOL bInheritHandles, // 继承特性DWORD fdwCreate, // 进程类型和优先级LPVOID lpvEnvironment, // 环境变量,由SET设置LPTSTR lpszCurrentDir, // 当前目录LPSTARTUPINFO lpStartupInfo, // 进程开始信息LPPROCESS_INFORMATION lpProcInfo) // 进程创建返回信息函数可创建一个进程。
操作系统实验报告1
操作系统实验报告1实验一进程控制与描述一、实验目的1. 利用Windows提供的API函数,编写程序,实现进程的创建和终止(如创建写字板进程及终止该进程)。
2. 加深对操作系统进程概念的理解,观察操作系统进程运行的动态性能,获得包含多进程的应用程序编程经验。
二、实验内容与步骤1. 进程的创建和终止。
编写一段程序,可以创建一个进程,并终止当前创建的进程。
试观察记录程序执行的结果,并分析原因。
2. 利用VC++6.0实现上述程序设计和调试操作,对于进程创建的成功与否、终止进程操作的成功与否提供一定的提示框。
3. 通过阅读和分析实验程序,学习创建进程、观察进程和终止进程的程序设计方法。
三、实验中遇到的问题及解决方法1.进程的句柄与退出代码查阅相关资料,对句柄的概念有一个初步的了解:从数据类型上来看它只是一个32位(或64位)的无符号整数。
在Windows环境中,句柄是用来标识项目的。
WINDOWS程序中并不是用物理地址来标识一个内存块,文件,任务或动态装入模块的。
相反,WINDOWS API给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来进行操作。
在程序设计中,句柄是一种特殊的智能指针。
当一个应用程序要引用其他系统(如数据库、操作系统)所管理的内存块或对象时,就要使用句柄。
句柄与普通指针的区别在于,指针包含的是引用对象的内存地址,而句柄则是由系统所管理的引用标识,该标识可以被系统重新定位到一个内存地址上。
这种间接访问对象的模式增强了系统对引用对象的控制。
在本实验中,Create Process()中创建了进程pi ,可直接用pi.hProcess获取。
2.句柄和进程ID的区别句柄实际是一个指针,他指向一块包含具体信息数据的内存,可以当做索引,所以进程句柄是当你要访问该进程时取得的,使用完毕必须释放。
id一般是一个标识符,用来区别不同项一个进程在不同的调用时间中有可能句柄的值是不一样的,但是ID只有也只能有一个。
《操作系统》实验报告
《操作系统》实验报告一、实验目的操作系统是计算机系统的核心组成部分,本次实验的主要目的是深入理解操作系统的工作原理和功能,通过实际操作和观察,掌握操作系统的进程管理、内存管理、文件系统管理等方面的知识和技能。
二、实验环境本次实验使用的操作系统为 Windows 10,开发工具为 Visual Studio 2019,编程语言为 C++。
三、实验内容及步骤1、进程管理实验(1)创建进程通过编程实现创建新的进程。
在代码中使用了 Windows API 函数CreateProcess 来创建一个新的进程。
首先,设置进程的启动信息,包括命令行参数、工作目录等。
然后,调用CreateProcess 函数创建进程,并检查返回值以确定创建是否成功。
(2)进程同步使用互斥量(Mutex)实现进程间的同步。
创建一个共享资源,多个进程尝试访问该资源。
通过互斥量来保证同一时间只有一个进程能够访问共享资源,避免了数据竞争和不一致的问题。
(3)进程通信采用管道(Pipe)进行进程间的通信。
创建一个匿名管道,一个进程作为发送端,向管道写入数据;另一个进程作为接收端,从管道读取数据。
通过这种方式实现了进程之间的数据交换。
2、内存管理实验(1)内存分配使用 Windows API 函数 VirtualAlloc 来分配内存。
指定分配的内存大小、访问权限等参数,并检查返回的内存指针是否有效。
(2)内存释放在不再需要使用分配的内存时,使用 VirtualFree 函数释放内存,以避免内存泄漏。
(3)内存保护设置内存的保护属性,如只读、读写等,以防止非法访问和修改。
3、文件系统管理实验(1)文件创建与写入使用 CreateFile 函数创建一个新文件,并通过 WriteFile 函数向文件中写入数据。
(2)文件读取使用 ReadFile 函数从文件中读取数据,并将读取的数据输出到控制台。
(3)文件属性操作获取文件的属性信息,如文件大小、创建时间、修改时间等,并进行相应的操作和显示。
操作实验系统实验报告
实验名称:操作实验系统实验日期:2023年3月15日实验地点:XX大学计算机实验室实验目的:1. 熟悉实验系统的基本操作流程。
2. 掌握实验系统的基本功能使用方法。
3. 培养动手实践能力和团队协作精神。
实验原理:实验系统是一种模拟真实工作环境的软件平台,通过该平台可以完成各种实验任务。
本实验系统基于Windows操作系统,采用C#语言开发,具有图形界面和丰富的功能模块。
实验内容:1. 系统启动与关闭2. 系统界面熟悉3. 功能模块使用4. 实验任务完成实验步骤:一、系统启动与关闭1. 打开实验系统所在的文件夹,找到实验系统可执行文件。
2. 双击可执行文件,系统开始加载,出现启动界面。
3. 系统加载完成后,进入主界面。
4. 完成实验任务后,点击“退出”按钮,系统开始关闭。
二、系统界面熟悉1. 观察主界面,了解系统各个功能模块的布局。
2. 点击各个功能模块,了解其功能及使用方法。
3. 查看系统帮助文档,了解系统功能和使用技巧。
三、功能模块使用1. 数据管理模块:(1)创建数据表:点击“创建数据表”按钮,输入数据表名称,选择数据类型,点击“确定”按钮。
(2)添加数据:选择数据表,点击“添加数据”按钮,输入数据,点击“保存”按钮。
(3)查询数据:选择数据表,点击“查询数据”按钮,输入查询条件,点击“查询”按钮。
2. 图形处理模块:(1)打开图片:点击“打开图片”按钮,选择要处理的图片。
(2)图片编辑:对图片进行缩放、裁剪、旋转等操作。
(3)保存图片:点击“保存图片”按钮,选择保存路径和文件名,点击“保存”按钮。
3. 文本处理模块:(1)打开文本文件:点击“打开文本文件”按钮,选择要处理的文本文件。
(2)文本编辑:对文本进行复制、粘贴、删除等操作。
(3)保存文本:点击“保存文本”按钮,选择保存路径和文件名,点击“保存”按钮。
四、实验任务完成1. 根据实验要求,选择合适的功能模块。
2. 完成实验任务,记录实验数据。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验1:系统软件启动过程练习1:(1)操作系统镜像文件ucore.img 是如何一步一步生成的?在命令行中输入“make V=”1、首先把C的源代码进行编译成为.o文件,也就是目标文件(红色方框内)2、ld命令将这些目标文件转变成可执行文件,比如此处的bootblock.out(绿色方框内)3、dd命令把bootloder放到ucore.img count的虚拟硬盘之中4、还生成了两个软件,一个是Bootloader,另一个是kernel。
(2)一个被系统认为是符合规范的硬盘主引导扇区的特征:在/lab1/tools/sign.c中我们可以了解到规范的硬盘引导扇区的大小为512字节,硬盘结束标志位55AA练习2:(1)从CPU 加电后执行的第一条指令开始,单步跟踪BIOS 的执行改写Makefile文件lab1-mon: $(UCOREIMG)$(V)$(TERMINAL) -e "$(QEMU) -S -s -d in_asm -D $(BINDIR)/q.log -monitor stdio -hda $< -serial null"$(V)sleep 2$(V)$(TERMINAL) -e "gdb -q -x tools/lab1init"在调用qemu时增加-d in_asm -D q.log参数,便可以将运行的汇编指令保存在q.log 中。
(2)在初始化位置0x7c00 设置实地址断点,测试断点正常。
在tools/gdbinit结尾加上set architecture i8086b *0x7c00 //在0x7c00处设置断点。
continuex /2i $pc //显示当前eip处的汇编指令(3)将执行的汇编代码与bootasm.S 和bootblock.asm 进行比较,看看二者是否一致。
Notice:在q.log中进入BIOS之后的跳转地址与实际应跳转地址不相符,汇编代码也与bootasm.S 和bootblock.asm不相同。
这是由于在gdb之中调试的原因,可以直接输入make debug,在生成的qemu虚拟机之中进行调试可以看到在虚拟机中运行的汇编代码,之后再与bootasm.S 和bootblock.asm 进行比较。
与bootasm.S和bootblock.asm中的代码相同。
练习3:分析bootlloader进入保护模式的过程(/lab1/boot/bootasm.S).globl startstart:.code16# 关中断,并清除方向标志,即将DF 置“0”,这样(E)SI 及(E)DI 的修改为增量clicld# 清零各数据段寄存器:DS、ES、FSxorw %ax, %axmovw %ax, %dsmovw %ax, %esmovw %ax, %ss# 使能A20 地址线,这样80386 就可以突破1MB 访存现在,而可访问4GB 的32 位地址空间seta20.1:inb $0x64, %al # 等待8042键盘控制器不忙testb $0x2, %aljnz seta20.1movb $0xd1, %aloutb %al, $0x64seta20.2:inb $0x64, %al # 等待8042键盘控制器不忙testb $0x2, %aljnz seta20.2movb $0xdf, %al # 打开A20outb %al, $0x60# 初始化gdtlgdt gdtdesc# 进入保护模式movl %cr0, %eaxorl $CR0_PE_ON, %eaxmovl %eax, %cr0# 长跳转ljmp $PROT_MODE_CSEG, $protcseg.code32protcseg:# 设置段寄存器,并建立堆栈movw $PROT_MODE_DSEG, %axmovw %ax, %ds # -> DS: Data Segmentmovw %ax, %es # -> ES: Extra Segmentmovw %ax, %fs # -> FSmovw %ax, %gs # -> GSmovw %ax, %ss # -> SS: Stack Segment# 设置堆栈movl $0x0, %ebpmovl $start, %esp # 栈顶为0x7c00# 进入bootmain,不再返回call bootmainspin:jmp spin练习4:分析bootloader加载ELF格式的OS的过程读一个扇区的流程可参看bootmain.c 中的readsect 函数实现。
大致如下:1. 读I/O 地址0x1f7,等待磁盘准备好;2. 写I/O 地址0x1f2~0x1f5,0x1f7,发出读取第offseet 个扇区处的磁盘数据的命令;3. 读I/O 地址0x1f7,等待磁盘准备好;4. 连续读I/O 地址0x1f0,把磁盘扇区数据读到指定内存。
static voidreadsect(void *dst, uint32_t secno) {// wait for disk to be readywaitdisk();outb(0x1F2, 1); // count = 1outb(0x1F3, secno & 0xFF);outb(0x1F4, (secno >> 8) & 0xFF);outb(0x1F5, (secno >> 16) & 0xFF);outb(0x1F6, ((secno >> 24) & 0xF) | 0xE0);outb(0x1F7, 0x20); // cmd 0x20 - read sectors// wait for disk to be readywaitdisk();// read a sectorinsl(0x1F0, dst, SECTSIZE / 4);}该函数封装在readseg函数中,该函数完成读取任意的长度。
Notice: uint32_t secno = (offset / SECTSIZE) + 1; # 0号扇区已被引导占用。
最后在bootmain函数中完成加载ELF格式os的操作:1: 读取ELF的头部2: 判断ELF文件是否是合法3: 将描述表的头地址存在ph4: 按照描述表将ELF文件中数据载入内存5: 根据ELF头部储存的入口信息,找到内核的入口(不再返回)Notice:可能会出现内存长度>文件长度的现象多读入部分包含bss节,需要清0练习5:实现函数调用堆栈跟踪函数print_stackframe(void) {uint32_t ebp = read_ebp(), eip = read_eip();int i, j;for (i = 0; ebp != 0 && i < STACKFRAME_DEPTH; i ++) {cprintf("ebp:0x%08x eip:0x%08x args:", ebp, eip);uint32_t *args = (uint32_t *)ebp + 2;//(uint32_t)calling arguments [0..4] = the contents in address (unit32_t)ebp +2 [0..4]for (j = 0; j < 4; j ++) {cprintf("0x%08x ", args[j]);}cprintf("\n");print_debuginfo(eip - 1);/*call print_debuginfo(eip-1) to print the C calling function name and line number, etc.*/eip = ((uint32_t *)ebp)[1];ebp = ((uint32_t *)ebp)[0];//popup a calling stackframe}Notice:ss:ebp指向的堆栈位置储存着caller的ebp,以此为线索可以得到所有使用堆栈的函数ebp。
ss:ebp+4指向caller调用时的eip,ss:ebp+8等是(可能的)参数。
练习6:(1)中断向量表中一个表项占多少字节?其中哪几位代表中断处理代码的入口?中断向量表一个表项占用8字节,其中2-3字节是段选择子,0-1字节和6-7字节拼成位移,入口地址=段选择子+段内偏移量。
(2) 完善kern/trap/trap.c中对中断向量表进行初始化的函数idt_init可以在/lab1/kern/mm/mmu.h中可以找到SETGATE函数,查找其具体操作。
idt_init(void) {extern uintptr_t __vectors[];int i;for (i = 0; i < sizeof(idt) / sizeof(struct gatedesc); i ++) {SETGATE(idt[i], 0, GD_KTEXT, __vectors[i], DPL_KERNEL); //设置IDT }lidt(&idt_pd); //载入IDT表(3) 完善trap.c中的中断处理函数trap,在对时钟中断进行处理的部分填写trap函数case IRQ_OFFSET + IRQ_TIMER:ticks ++; //一次中断累加1if (ticks % TICK_NUM == 0) {print_ticks();}break;扩展:(1)内核态切换到用户态:lab1_switch_to_user(void) {asm volatile ("sub $0x8, %%esp \n"// esp-8 为下一步复制的栈帧留好tf_ss和tf_esp的位置"int %0 \n""movl %%ebp, %%esp":: "i"(T_SWITCH_TOU));}case T_SWITCH_TOU:if (tf->tf_cs != USER_CS) {switchk2u = *tf;switchk2u.tf_cs = USER_CS;switchk2u.tf_ds = switchk2u.tf_es = switchk2u.tf_ss = USER_DS;switchk2u.tf_esp = (uint32_t)tf + sizeof(struct trapframe) - 8;//在执行int120前系统在核心态,int不会引起栈的切换switchk2u.tf_eflags |= FL_IOPL_MASK;*((uint32_t *)tf - 1) = (uint32_t)&switchk2u;}break;最后iret时返回5个值。