东北大学操作系统实验 绝对自创 实验报告 含可执行源代码 linux环境可运行 有截图
- 格式:docx
- 大小:970.09 KB
- 文档页数:30
L i n u x操作系统实验实验报告Document number:NOCG-YUNOO-BUYTT-UU986-1986UT实验1:安装Linux系统【实验目的和要求】:安装Linux系统,掌握操作系统的系统配置,建立应用环境的过程。
【实验内容】:1、首先在windows系统中安装虚拟机。
在网上找到VMwareWorksttionPro版本,确定安装目录。
一直下一步,不需要太多的说明。
2、图为安装完成后的界面。
3、然后在阿里巴巴开源镜像网站下载centos系统镜像,然后虚拟机创建新的虚拟机,进行一些简单的虚拟机设置,设置了网络链接nat模式等等。
安装完成后的界面实验2:Linux下c语言开发【实验目的】:学会和掌握用c语言开发一个应用程序的全过程,包括,编译,调试等等。
【实验步骤】:首先在系统中查看是否已经安装有gcc,输入查看命令发现没有,于是需要安装gcc。
在centos系统中可以使用比较简便的yum命令。
在之前已经配置好了yum源。
直接输入yuminstallgcc。
回车自动安装程序和需要的依赖包。
因为虚拟机中和电脑很多地方切换使用不方便,所以安装了xshell软件。
图为xshell中的截图。
安装完毕。
然后使用vi或者vim编写运行,在屏幕上打印出hello,world。
实验3:进程创建【实验目的和要求】1.了解进程的概念及意义;2.了解子进程和父进程3.掌握创建进程的方法。
【实验内容】1.子进程和父进程的创建;2.编写附件中的程序实例【实验步骤】一1、打开终端,输入命令,在文件中输入中的代码;2、输入命令,回车后显示无错误;3、输入命令:./1_fork运行程序。
二、1、打开终端,输入命令,在文件中输入中的代码;2、输入命令,回车后显示无错误:3、输入命令:./2_vfork运行程序。
从上面可以看到两次的运行结果不一样。
我们知道write函数是不带缓存的。
因为在fork之前调用write,所以其数据写到标准输出一次。
linux操作系统实验报告Linux操作系统实验报告一、引言Linux操作系统是一种开源的、免费的操作系统,其内核由Linus Torvalds于1991年首次发布。
Linux操作系统具有稳定性高、安全性强、灵活性大等优点,因此在互联网、服务器、嵌入式系统等领域得到广泛应用。
本实验报告将介绍Linux操作系统的基本特点、安装过程以及常用命令的使用。
二、Linux操作系统的基本特点1. 开源性Linux操作系统的内核及相关软件源代码对用户开放,任何人都可以查看、修改和分发。
这使得Linux操作系统具有高度的透明度和可定制性,用户可以根据自己的需求进行定制和优化。
2. 多用户、多任务Linux操作系统支持多用户同时登录,并且可以同时运行多个任务。
这使得多个用户可以在同一台计算机上独立地进行工作,提高了计算机的利用率。
3. 稳定性和安全性Linux操作系统具有良好的稳定性和安全性。
由于其内核的设计和实现方式,Linux操作系统可以长时间运行而不会出现系统崩溃或死机的情况。
同时,Linux操作系统提供了丰富的安全机制,如文件权限控制、用户身份验证等,可以有效保护系统和用户的数据安全。
三、Linux操作系统的安装过程1. 准备安装介质在安装Linux操作系统之前,需要准备一个可启动的安装介质,如光盘或USB闪存驱动器。
这些介质可以从Linux官方网站或其他可信渠道下载。
2. 进入安装界面将安装介质插入计算机,并按下开机键启动计算机。
在启动过程中,选择从安装介质启动。
随后,将进入Linux操作系统的安装界面。
3. 设置安装选项在安装界面中,可以设置安装选项,如语言、时区、键盘布局等。
根据实际需要进行选择和设置。
4. 分区和格式化磁盘在安装界面中,可以对硬盘进行分区和格式化操作。
根据实际需求,可以选择使用整个硬盘或者将硬盘分为多个分区。
5. 安装系统在分区和格式化完成后,可以开始安装Linux操作系统。
根据安装界面的提示,选择安装位置和安装选项,然后等待安装过程完成。
东北大学linux实验报告东北大学Linux实验报告引言:在当今信息技术高速发展的时代,计算机科学与技术已经成为了各个领域不可或缺的一部分。
作为计算机领域的重要组成部分,操作系统在实际应用中起着至关重要的作用。
Linux作为一种开源的操作系统,具有稳定性、安全性和灵活性等优势,因此在学术界和工业界均得到了广泛的应用和研究。
本文将对东北大学Linux实验进行总结和分析,以期对Linux操作系统有更深入的了解。
一、实验背景东北大学开设的Linux实验课程旨在帮助学生掌握Linux操作系统的基本原理和应用技巧。
通过实验,学生能够了解Linux的启动过程、文件系统管理、用户权限管理、网络配置等关键概念和操作。
实验采用了虚拟机技术,使得学生可以在实验室或家中的个人电脑上进行实验,提高了实验的灵活性和便捷性。
二、实验内容1. Linux的安装与启动在本实验中,我们首先需要在虚拟机中安装Linux操作系统。
通过选择适当的Linux发行版和版本,进行分区、格式化、安装等步骤,最终完成Linux的安装。
安装完成后,我们需要了解Linux的启动过程,包括BIOS、MBR、GRUB等关键环节。
2. 文件系统管理Linux操作系统以文件为中心,因此文件系统管理是Linux实验的重要内容之一。
通过实验,我们学会了使用命令行和图形界面两种方式来管理文件和目录,包括创建、删除、复制、移动、重命名等操作。
此外,还学习了文件权限和所有权的概念,掌握了chmod、chown等命令的使用方法。
3. 用户权限管理在Linux系统中,用户权限管理是非常重要的一部分。
通过实验,我们学会了创建用户、设置密码、分配权限等操作。
同时,还了解了Linux的用户组概念,学习了添加用户到用户组、设置用户组权限等操作。
4. 网络配置网络配置是Linux实验中的另一个重要内容。
通过实验,我们了解了网络接口的配置和管理,包括IP地址、子网掩码、网关等参数的设置。
东北⼤学操作系统实验报告4-2017实验四进程的管道通信⼀、实验⽬的1、加深对进程概念的理解,明确进程和程序的区别。
2、学习进程创建的过程,进⼀步认识进程并发执⾏的实质。
3、分析进程争⽤资源的现象,学习解决进程互斥的⽅法。
4、学习解决进程同步的⽅法。
5、掌握Linux系统中进程间通过管道通信的具体实现⼆、实验内容使⽤系统调⽤pipe()建⽴⼀条管道,系统调⽤fork()分别创建两个⼦进程,它们分别向管道写⼀句话,如:Child process1 is sending a message!Child process2 is sending a message!⽗进程分别从管道读出来⾃两个⼦进程的信息,显⽰在屏幕上注:实际要求最好创建两个以上⼦进程,但不需要太多三、实验要求1、这是⼀个设计型实验,要求⾃⾏、独⽴编制程序。
2、两个⼦进程要并发执⾏。
3、实现管道的互斥使⽤。
当⼀个⼦进程正在对管道进⾏写操作时,另⼀个欲写⼊管道的⼦进程必须等待。
使⽤系统调⽤lockf(fd[1],1,0)实现对管道的加锁操作,⽤lockf(fd[1],0,0)解除对管道的锁定。
4、实现⽗⼦进程的同步,当⽗进程试图从⼀空管道中读取数据时,便进⼊等待状态,直到⼦进程将数据写⼊管道返回后,才将其唤醒。
四、程序流程图⽗进程⼦进程五、程序代码及注释#include#include//写管程⽤到的那些函数⽤到的头⽂件#include#include//wait⽤到这个int main(){int fd[2];pipe(fd); //⽗进程创建管道char outpipe[50],inpipe[50]; //存放字符串int pid1,pid2,pid3; //存放返回值while((pid1 = fork()) == -1); //创建不成功就跳不出来了if(pid1 == 0) //⼦进程1{sleep(1); //sleep函数可以决定⼦进程的顺序,等的时间长的话进⼊就晚,输出也就晚lockf(fd[1], 1, 0); //对管道写⼊端⼝加锁sprintf(outpipe,"\n child process 1 is sending message !\n");write(fd[1], outpipe, 50); //把字符串内容写⼊管道写⼊⼝lockf(fd[1], 0, 0); //对管道写⼊⼝解锁exit(0);}else//⽗进程{while((pid2 = fork()) == -1);if(pid2 == 0) //⼦进程2{sleep(2);lockf(fd[1], 1, 0);sprintf(outpipe,"\n child process 2 is sending message !\n");write(fd[1], outpipe, 50);lockf(fd[1], 0, 0);exit(0);}else//⽗进程{while((pid3 = fork()) == -1);if(pid3 == 0) //⼦进程3{sleep(3);lockf(fd[1], 1, 0);sprintf(outpipe,"\n child process 3 is sending message !\n");write(fd[1], outpipe, 50);lockf(fd[1], 0, 0);exit(0);}else//⽗进程{wait(0); //阻塞,等待⼦进程read(fd[0], inpipe, 50); //从管道读出⼝读出信息放到数组printf("%s\n",inpipe);wait(0);read(fd[0], inpipe, 50);printf("%s\n",inpipe);wait(0);read(fd[0], inpipe, 50);printf("%s\n",inpipe); //三个⼦进程,要输出三次exit(0);}}}}六、运⾏结果及说明因为加了锁,不会出现⼦进程同时往管道⾥写的情况,所以,⼦进程互斥地往管道⾥写,⽗进程从管道⾥读并输出,就显⽰成了如上图模样注:⼀个之前不明⽩的流程由fork创建的新进程被称为⼦进程(child process)。
计算机操作系统 计算机操作系统实验报告学 姓号: 名:2080121 2080121 王佰荣 2009-122009-12-14提交日期: 成 绩:东北大学秦皇岛分校实验报告【实验编号】 实验编号】1【实验名称】 实验名称】 Linux 安装实验 实验内容 1.熟练掌握 内容】 2.掌握虚拟机的使用 掌握虚拟机的使用。
【实验内容】1.熟练掌握 Linux 系统的安装 2.掌握虚拟机的使用。
实验步骤 步骤】 【实验步骤】 一.虚拟机的使用 <1>.新建虚拟机 <1>.新建虚拟机 Vmware,单击菜单“file—new— machine” 1. 打开 Vmware,单击菜单“file—new—virtual machine”,开始创建虚拟机 虚拟机提供两种安装方式“Typical” Custom” 选择“Typical” 2. 虚拟机提供两种安装方式“Typical”和“Custom”,选择“Typical” 选择需要安装的操作系统, Linux— 3. 选择需要安装的操作系统,选择 Linux—Red Hat Linux 4. 输入虚拟机名称和保存文件夹 选择网络连接方式,选择“ networking” 5. 选择网络连接方式,选择“Use bridged networking” 6. 设定虚拟机的硬盘容量为 3G <2>.调整虚拟机的参数 <2>.调整虚拟机的参数 单击出现的“ settings” 调整虚拟机的参数. 单击出现的“Edit virtual machine settings”,调整虚拟机的参数.单击 Memory”可以调整虚拟机的内存; “Memory”可以调整虚拟机的内存;单击 internet”可以调整网卡的工作 “internet” 模式;单击“cd-rom” 文件代替光盘, 模式;单击“cd-rom”可以设置虚拟机的光驱使用 ISO 文件代替光盘,单 add” remove”按钮可以添加、删除硬件。
操作系统实验报告班级物联网1302班学号姓名实验一:熟悉Linux系统目的:①熟悉和掌握Linux系统基本命令,熟悉Linux编程环境,为以后的实验打下基础。
●启动退出、ls(显示目录内容)、cp(文件或目录的复制)、mv(文件、目录更名或移动)、rm(删除文件或目录)、mkdir(创建目录)、rmdir(删除空目录)、cd(改变工作目录)…●C语言编辑、编译内容及要求:●熟练掌握Linux基本文件命令;●掌握Linux编辑程序、对源代码进行编译、连接、运行及调试的过程;●认真做好预习,书写预习报告;●实验完成后要认真总结、完成实验报告login:用户登录系统使用login命令可以允许用户登录系统。
如果没有指定参数,登录时提示输入用户名。
如果该用户不是root,且如果/etc/nologin文件存在,这个文件的内容被显示到屏幕上,登录被终止。
命令语法:Login [选项][用户名]exit:退出系统使用exit命令可以退出shell命令语法:exit[选项]ls:列出目录和文件信息使用ls命令,对于目录而言将列出其中的所有的子目录与文件信息,对于文件而言将输出命令语法:ls[选项][目录|文件]ls命令部分选项含义cp:复制文件和目录使用cp命令可以复制文件vhe目录到其他目录中。
如果同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有的文件或目录复制到该目录中。
若同时指定多个文件或目录,而最后的目的地并非一个已存在的目录,则会出现错误信息。
命令语法:cp [选项][源文件|目录][目标文件|目录]cp命令部分选项含义命令格式:mv [选项] 源文件或目录目标文件或目录.mv命令部分选项含义命令格式:rm [选项] 文件…rm命令部分选项含义能是当前目录中已有的目录命令格式:mkdir [选项] 目录..mkdir命令部分选项含义命令格式:cd [目录名]。
课程编号:B080000070《操作系统》实验报告姓名班级指导教师石凯实验名称《操作系统》实验开设学期2016-2017第二学期开设时间第11周——第18周报告日期2017年7月3日评定成绩评定人石凯评定日期2017年7月5日东北大学软件学院实验一进程的同步与互斥实验题目:通过学习和分析基础例子程序,使用windows进程和线程编程(也可以采用Java 或Unix/Linux的POSIX线程编程)实现一个简单的生产者/消费者问题的程序。
关键代码:import java.util.ArrayList;public class Produce {public Object object;public ArrayList<Integer> list;//用list存放生产之后的数据,最大容量为1public Produce(Object object,ArrayList<Integer> list ){this.object = object;this.list = list;}public void produce() {synchronized (object) {/*只有list为空时才会去进行生产操作*/try {while(!list.isEmpty()){System.out.println("生产者"+Thread.currentThread().getName()+" waiting");object.wait();}int value = 9999;list.add(value);System.out.println("生产者"+Thread.currentThread().getName()+" Runnable");object.notifyAll();//然后去唤醒因object调用wait方法处于阻塞状态的线程}catch (InterruptedException e) {e.printStackTrace();}}}}import java.util.ArrayList;public class Consumer {public Object object;public ArrayList<Integer> list;//用list存放生产之后的数据,最大容量为1public Consumer(Object object,ArrayList<Integer> list ){this.object = object;this.list = list;}public void consmer() {synchronized (object) {try {/*只有list不为空时才会去进行消费操作*/while(list.isEmpty()){System.out.println("消费者"+Thread.currentThread().getName()+" waiting");object.wait();}list.clear();System.out.println("消费者"+Thread.currentThread().getName()+" Runnable");object.notifyAll();//然后去唤醒因object调用wait方法处于阻塞状态的线程}catch (InterruptedException e) {e.printStackTrace();}}}}实验结果:思考题:(1)如何控制进程间的相互通信?答:主要有:管道,信号,共享内存,消息队列(2)什么是进程的同步?什么是进程的互斥?分别有哪些实现方式?答:进程互斥是进程之间的间接制约关系。
操作系统实验报告一实验一进程状态转换及其PCB的变化一、实验目的:自行编制模拟程序,通过形象化的状态显示,使学生理解进程的概念、进程之间的状态转换及其所带来的PCB内容、组织的变化,理解进程与其PCB间的一一对应关系。
二、实验内容及要求:(1)、设计并实现一个模拟进程状态转换及其相应PCB内容、组织结构变化的程序。
(2)、独立编写、调试程序。
进程的数目、进程的状态模型(三状态、五状态、七状态或其它)以及PCB的组织形式可自行选择。
(3)、合理设计与进程PCB相对应的数据结构。
PCB的内容要涵盖进程的基本信息、控制信息、资源需求及现场信息。
(4)、设计出可视性较好的界面,应能反映出进程状态的变化引起的对应PCB内容、组织结构的变化。
(5)、代码书写要规范,要适当地加入注释。
(6)、鼓励在实验中加入新的观点或想法,并加以实现。
(7)、认真进行预习,完成预习报告。
(8)、实验完成后,要认真总结,完成实验报告。
五状态模型:三、主要数据结构:struct Run_type //运行态进程{char name;int state;int needtime;int priority;};struct Ready_type //就绪态进程{char name;int needtime;int priority;};struct Blocked_type //阻塞态进程{char name;int needtime;int priority;};四、程序源代码:#include<stdio.h>#include<stdlib.h>#include<string.h>int i=0; int j=0;struct Run_type{char name;int state;int needtime;int priority;};struct Ready_type{char name;int needtime;int priority;};struct Blocked_type{char name;int needtime;int priority;};struct Run_type Cpu;struct Ready_type Ready[10];struct Blocked_type Blocked[10];void Creat(){ //创建一个新的进程int k=0;label1:printf(" input new process name(input a letter): \n");scanf("%s",&(Ready[i].name));getchar();for(k=0;k<i;k++)if(Ready[i].name==Ready[k].name||Ready[i].name==Ready[k].name+32||Ready[i].n ame==Ready[k].name-32){printf("the process is already exist!");goto label1;}printf("input needtime (input a int number):\n");label3:scanf("%d",&(Ready[i].needtime));getchar();if(Ready[i].needtime<1||Ready[i].needtime>100){printf("please input the true needtime(1--100)\n");goto label3;}printf(" input the priority(1--10): \n");label2:scanf("%d",&(Ready[i].priority));getchar();if(Ready[i].priority<1||Ready[i].priority>10){printf("please 1--10!\n");goto label2;}i++;}void Dispath() //P135{int t;char v;int k;int j;if(Cpu.state==0)if(Ready[i-1].needtime==0){printf("* there is no process ready!\n");exit(0);}else{for(k=0;k<i-1;k++)for(j=0;j<i-k-1;j++)if(Ready[j].priority>Ready[j+1].priority){t=Ready[j].priority;Ready[j].priority=Ready[j+1].priority;Ready[j+1].priority=t;t=Ready[j].needtime;Ready[j].needtime=Ready[j+1].needtime;Ready[j+1].needtime=t;v=Ready[j].name;Ready[j].name=Ready[j+1].name;Ready[j+1].name=v;}--i;=Ready[i].name;Cpu.needtime=Ready[i].needtime;Cpu.priority=Ready[i]. priority;Cpu.state=1;printf("*%5c is send to cpu! \n",);Cpu.needtime--;if(Cpu.needtime==0){printf("*%5c is finished \n",);Cpu.state=0;}}else{Ready[i].name=;Ready[i].needtime=Cpu.needtime;Ready[i].priority=Cpu.priority;for(k=0;k<i;k++)for(j=0;j<i-k;j++)if(Ready[j].priority>Ready[j+1].priority){t=Ready[j].priority;Ready[j].priority=Ready[j+1].priority;Ready[j+1].priority=t;t=Ready[j].needtime;Ready[j].needtime=Ready[j+1].needtime;Ready[j+1].needtime=t;v=Ready[j].name;Ready[j].name=Ready[j+1].name;Ready[j+1].name=v;}=Ready[i].name;Cpu.needtime=Ready[i].needtime;Cpu.priority=Ready[i]. priority;Cpu.state=1;printf("*%5c is send to cpu! \n",);Cpu.needtime--;if(Cpu.needtime==0){printf("*%5c is finished \n",);Cpu.state=0;}}}void Timeout(){if(Cpu.state==0){printf("* there is no process in cpu(please select Dispath!\n");exit(0);}else{Ready[i].name=;Ready[i].needtime=Cpu.needtime;Ready[i].priority=Cpu.priority;printf("%c is timeout \n",);=0;Cpu.needtime=0;Cpu.priority=0;Cpu.state=0;i++;}}void Eventwait(){if(Cpu.state!=0){Blocked[j].name=;Blocked[j].needtime=Cpu.needtime;Blocked[j].priority=Cpu.priority;printf("* %c is Blocked !\n",);j++;=Blocked[j].name;Cpu.needtime=Blocked[j].needtime;Cpu.priority=Blocked[j].priority;Cpu.state=0;}elseprintf("* There is no process in cpu!");}void Eventoccurs(char a){int k=0;int m=0;int n=0;int p=0;if(Blocked[0].needtime==0){printf("* there is no process blocked!\n");exit(0);}else{for(k;k<j;k++)if(Blocked[k].name==a){Ready[i].name=Blocked[k].name;Ready[i].needtime=Blocked[k].needtime;Ready[i].priority=Blocked[k].priority;p=1;m=j-k;for(n;n<m;n++){Blocked[k].name=Blocked[k+1].name;Blocked[k].needtime=Blocked[k+1].needtime;Blocked[k].priority=Blocked[k+1].priority;k++;}j--;i++;}if(p==1)printf("* %c is ready!\n",a);elseprintf("* %c is not found! \n",a);}}void main(){Cpu.state=0;int Cputime=0;int x=6;while(x!=0){printf("\n1:input new process 2:Dispath\n");printf("3:Timeout4:Eventwait\n");printf("5:Eventoccurs(select whose eventoccur ) 0:exit\n");label4:scanf("%d",&x);getchar();printf("\n==============================================================================\n");if(x==0||x==1||x==2||x==3||x==4||x==5){switch(x){case 1:Creat();break;case 2:Dispath();break;case 3:Timeout();break;case 4:Eventwait();break;case 5:char a;scanf("%c",&a);getchar(); Eventoccurs(a);break;default:printf("please select from 0 to 5\n");}printf("----------------------------- Cputime:%3d----------------------------------\n",Cputime);printf("| ProceNsname NeedTime Priority |\n");if(Cpu.state!=0)//显示Cpu中的程序{printf("| Cpu:%16c",);printf("%20d",Cpu.needtime);printf("%18d|\n",Cpu.priority);}elseprintf("| * Cpu is free |\n");int y=0;if(i==0)//显示Ready队列中的数据{printf("| *There is no process ready. |\n");}else{for(y;y<i;y++)//显示Ready中的程序{printf("| Ready%d:",y);printf("%15c",Ready[y].name);printf("%20d",Ready[y].needtime);printf("%18d|\n",Ready[y].priority);}}int z=0;if(j==0) //显示Blocked队列中的程序{printf("| *There is no process blocked. |\n");}else{for(z;z<j;z++){printf("| Blocked%d:",z);printf("%13c",Blocked[z].name);printf("%20d",Blocked[z].needtime);printf("%18d |\n",Blocked[z].priority);}}Cputime++;if(Cpu.state!=0)Cpu.needtime=Cpu.needtime-1;printf("-----------------------------------------------------------------------------\n");}else{printf("please input 0--5\n");goto label4;}}}五、运行结果:1.创建a,b两个进程2、调度进程(由于b优先级高,所以b先进入运行态)3、当b时间片到了,b变为就绪态4、再次调度(由于b优先级高,故还是b变成运行态)5、正在运行的b阻塞6、当b等待的事件发生,b重新进入就绪态六、程序使用说明:编译程序后若无错就执行程序,初始如下:其中:1表示创建新进程,随后输入进程名,所需时间,优先级 2表示系统调度进程,首先调度最高优先级3表示时间片已到,运行中的进程将编程就绪态4表示进程所需的事件尚未发生,进程将被阻塞5表示进程等待的事件已发生,进程从阻塞态变为就绪态 0退出程序10。