NUAA操作系统OS实验及上机考试记录

Posted ChangYan.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NUAA操作系统OS实验及上机考试记录相关的知识,希望对你有一定的参考价值。

记录nuaa操作系统实验题目

将代码分享出来是为了学弟学妹更好的学习复习,并不是为copy提供便利。里边包含了平时的job及近几年的考试题,我已将代码上传至github:
https://github.com/changyan-maker/NUAA_OS

最后参加机考我拿了90+,来源于平时认真完成job以及考前认真刷题准备,所以平时不要copy代码投机取巧哦,要理解其中的思路,在机考的过程中才能游刃有余!

文章目录


exam

往年考试题的题目和代码已上传至github,建议考前多刷两遍,
https://github.com/changyan-maker/NUAA_OS
毕竟考试相对综合,个人觉得考前时间充裕的话,先刷一遍作业的job,最后再刷往年考试题会很有感觉。我们19级也就是2022年考的特别难,基本没有几个同学完全运行出正确结果,老师最后都是按照过程给分,这里将题目分享出来只是为了长长见识,毕竟在考试前我也没太见过这种题,考试过程中基本全靠临场发挥。不过前几年的题目还是很简单的,听说拿满分的人也有,所以对于2018、2019、2021年的题目,学弟学妹一定要自己写出来,拿下那些题型!

job3

1. myecho.c

myecho.c的功能与系统echo程序相同
接受命令行参数,并将参数打印出来,例子如下:
$ ./myecho x
x
$ ./myecho a b c
a b c

#include<stdio.h>
int main(int argc, char *argv[])

	int i;
	printf("argc=%d\\n",argc);
	for(i=1;i<argc;i++)
		printf("%s ",argv[i]);
	printf("\\n");
	return 0;

2. mycat.c

mycat.c的功能与系统cat程序相同
mycat将指定的文件内容输出到屏幕,例子如下:
要求使用系统调用open/read/write/close实现
$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
…
$ ./mycat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
…

#include<stdio.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>

int main(int argc, char *argv[])

	int fd;
	mode_t mode = 0777;
	fd = open(argv[1],O_RDONLY,mode);
	char ch;
	int count = read(fd, &ch, sizeof(ch));
	while(count)
	
		printf("%c", ch);
		count = read(fd, &ch, sizeof(ch));
	
	close(fd);
	return 0;


3. mycp.c

mycp.c的功能与系统cp程序相同
将源文件复制到目标文件,例子如下:
要求使用系统调用open/read/write/close实现
$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
…
$ ./mycp /etc/passwd passwd.bak
$ cat passwd.bak
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
…

#include<stdio.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>

int main(int argc, char *argv[])

	mode_t mode = 0777;
	int fd1 = open(argv[1], O_RDONLY, mode);
	int fd2 = creat(argv[2],mode);
	char ch;
	int count = read(fd1, &ch, sizeof(ch));
	int count2;
	while(count)
	
		count2 = write(fd2, &ch, sizeof(ch));
		count = read(fd1, &ch, sizeof(ch));
	
	close(fd1);
	close(fd2);
	return 0;


4. mysys.c

mysys的功能与系统函数system相同,要求用进程管理相关系统调用自己实现一遍
使用fork/exec/wait系统调用实现mysys
不能通过调用系统函数system实现mysys
测试程序
#include <stdio.h>

void mysys(char *command)

 实现该函数,该函数执行一条命令,并等待该命令执行结束


int main()

 printf(“--------------------------------------------------\\n”);
 mysys(“echo HELLO WORLD”);
 printf(“--------------------------------------------------\\n”);
 mysys(“ls /”);
 printf(“--------------------------------------------------\\n”);
 return 0;

测试程序的输出结果
--------------------------------------------------
HELLO WORLD
--------------------------------------------------
bin core home lib mnt root snap tmp vmlinuz
boot dev initrd.img lost+found opt run srv usr vmlinuz.old
cdrom etc initrd.img.old media proc sbin sys var
--------------------------------------------------

#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<sys/wait.h>
#include<stdlib.h>

void mysys(char *command)

	int pid;
	pid = fork();
	if(pid==0)
		int i=0;
		char a[5][20];
		int num = 0;
		int j=0;
		while(command[i]!='\\0')
		
			if(command[i]!=' ')
				a[num][j++] = command[i];
					
			else
				a[num++][j++] = '\\0';
				j=0;
			
			i++;
		
		a[num][j++] = '\\0';
		int error;

		char *argv[5];
		for(i=0;i<=num;i++)
			argv[i] = (char *)malloc(sizeof(char)*20);
			strcpy(argv[i],a[i]);
		
		argv[i] = NULL;
		error = execvp(argv[0],argv);
		if(error<0)
			perror("execv");
	
	wait(NULL);


int main()

	printf("--------------------------------------------------\\n");
	mysys("echo HELLO WORLD");	
	printf("--------------------------------------------------\\n");
	mysys("ls /");
	printf("--------------------------------------------------\\n");
	return 0;


5. sh1.c

该程序读取用户输入的命令,调用函数mysys(上一个作业)执行用户的命令,示例如下
# 编译sh1.c
$ cc -o sh1 sh1.c

# 执行sh1
$ ./sh

# sh1打印提示符>,同时读取用户输入的命令echo,并执行输出结果
> echo a b c
a b c

# sh1打印提示符>,同时读取用户输入的命令cat,并执行输出结果
> cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
实现内置命令cd、pwd、exit

#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<sys/wait.h>
#include<stdlib.h>

int main()

	while(1)
		printf("%s","> ");
		char str[105];
		fgets(str,100,stdin);
		int i=0;
		while(str[i]!='\\n')
			i++;
		str[i] = '\\0';
		
		i=0;
		char a[5][20];
		int num = 0;
		int j=0;
		while(str[i]!='\\0')
		
			if(str[i]!=' ')
				a[num][j++] = str[i];
					
			else
				a[num++][j++] = '\\0';
				j=0;
			
			i++;
		
		a[num][j++] = '\\0';
		int error;
		char *argv[5];
		for(i=0;i<=num;i++)
			argv[i] = (char *)malloc(sizeof(char)*20);
			strcpy(argv[i],a[i]);
		
		argv[i] = NULL;

		if(strcmp(argv[0],"cd")==0)
			chdir(argv[1]);
		
		else if(strcmp(argv[0],"exit")==0)
			exit(0);
		
		else if(strcmp(argv[0],"pwd")==0)
			char work_dir[80];

			getcwd(work_dir,sizeof(work_dir));
			printf("%s\\n",work_dir);
		
		else
			int pid;
			pid = fork();
			if(pid==0)
				error = execvp(argv[0],argv);
				if(error<0)
					perror("execv");
			
			wait(NULL);
		
	
	return 0;
	

job4

1. myls.c

myls.c的功能与系统ls程序相同
opendir readdir closedir
在命令行中输入 man opendir 获取帮助
列出指定目录下的文件,例子如下:
$ ./myls job4/test
a
b
c
列出当前目录下的文件,例子如下:
$ cd job4/test
$ ./myls
a
b
c

#include<stdio.h>
#include<dirent.h>
#include<unistd.h>
#include<string.h>

int main(int argc, char *argv[])
	DIR *dir;
	if(argc >= 2)
		dir = opendir(argv[1]);
	else
		dir = opendir(getcwd(NULL,0));
	while(1)
		struct dirent *de = readdir(dir);
		if(de == NULL)	break;
		if(strcmp(de->d_name,"..")!=0 && strcmp(de->d_name,".")!=0)
					
			printf("%s\\n",de->d_name);

		
	
	closedir(dir);
	return 0;


2. mytree.c

mytree.c的功能与系统tree程序相同
使用空格作为缩进,表示层次
$ ./mytree job4/test
test
 a
 b
 x
 y
 z
c

#include<stdio.h>
#include<dirent.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>

void mytree(int k_num, char *work_dir)
	char k[80] = "";
	for(int i=0;i<k_num;i++)
		strcat(k," ");
	DIR *dir = opendir(work_dir);
	if(dir == NULL)
		perror("opendir");
		exit(0);
	
	while(1)
		struct dirent *de = readdir(dir);
		if(de == NULL)	break;
		if(strcmp(de->d_name,"..")!=0 && strcmp(de->d_name,".")!=0)
			printf("%s",k);
			printf("%s\\n", de->d_name);
			if(de->d_type == DT_DIR)
				strcat(work_dir,"/");
				strcat(work_dir,de->d_name);
				mytree(k_num+1,work_dir);
			
		
	
	closedir(dir);



int main(int argc, char *argv[])
	if(argc >= 2)	
		printf("%s\\n",argv[1]);
		mytree(1, argv[1]);
	
	else
		printf("%s\\n",getcwd(NULL,0));
		mytree(1, getcwd(NULL,0));
	
	return 0;


job5

1.sh2.c

实现shell程序,要求在第1版的基础上,增加文件重定向功能
重定向输入
重定向输出
重定向追加

#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<sys/wait.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdlib.h>

void child(char *argv[])
	int num=0;
	int i = 0;
	while(argv[i])
		i++;
		num++;
	

	char str1[80];
	char str2[80];
	if(argv[1]!=NULL && argv[1][0] == '<')
		memcpy(str1, argv[1]+1,sizeof(argv[1]-1));
		int fd1 = open(str1,O_CREAT|O_RDWR,0666);
		dup2(fd1,0);		//input from fd1;
		close(fd1);
		argv[1] = NULL;		//for cat
	
	if(argv[2]!= NULL && argv[2][0] ==  '>')
		int fd2;
		if(argv[2][1]=='>')		// >>
			memcpy(str2,argv[2]+2,sizeof(argv[2]-2));
			fd2 = open(str2,O_CREAT|O_RDWR|O_APPEND,0666);		
		
		else				// >	
			memcpy(str2,argv[2]+1,sizeof(argv[2]-1));
			fd2 = open(str2,O_CREAT|O_RDWR|O_TRUNC,0666);
		
		dup2(fd2,1);	//output into fd2;
		<

老男孩教育运维班100台规模集群存储系统搭建及数据实时备份上机实战

老男孩教育运维班0基础起步上机实战系列项目

老男孩教育运维班100台规模集群存储系统搭建及数据实时备份上机实战

项目要求:

1、全体学员上机实践考试,完成后由排长或班长、或助教打分。

2、时间:90分钟,抄袭0分。

(一)上机服务器业务及IP主机名规划

已知4台服务器主机名主机对应信息见下表:

服务器说明

外网IP

内网IP

主机名

apache web服务器

10.0.0.7/24

172.16.1.7/24

web02

nginx web服务器

10.0.0.8/24

172.16.1.8/24

web01

NFS存储服务器

10.0.0.31/24

172.16.1.31/24

nfs01

rsync备份服务器

10.0.0.41/24

172.16.1.41/24

backup

 

整个项目的逻辑图如下:

技术分享

(二)搭建网站集群后端NFS共享存储搭建及优化解决方案

1、配置NFS服务:

要求:

1)在NFS服务端nfs01上共享/data目录,允许从NFS客户端web01web02上分别挂载共享目录。

2)当在NFS客户端web01上的挂载点/data写入数据时,NFS客户端web02上也可以删除或修改。

3)问答题:如何优化NFS服务?

本项目的整个备份逻辑结构见集群架构图中数字1和2部分

 

(三)搭建网站集群全网备份服务器backup

    要求:在backup服务器上配置Rsync数据同步服务,从nfs01服务器上可以推送数据到backup服务器的/backup目录。本项目的整个备份逻辑结构见集群架构图中数字3部分

具体要求:backup服务器的备份目录必须为/backup

(四)解决网站集群后端NFS共享存储单点实现实时数据同步

1、实时数据同步要求:

当用户通过任意台web服务器将数据写入到NFS服务器nfs01时,同时复制到备份服务器backup

2、本项目的整个备份逻辑结构见集群架构图中数字3和4部分

(五)评分标准及评分人

评分标准见表:

ID

分数

项目

1

40分

完成NFS共享存储搭建及优化解决方案

2

20分

完成搭建网站集群全网备份服务器backup

3

30分

完成NFS实时数据备份

4

10分

完成整体测试机评分人按态度自由给分

 

评分人:各排排长或连长5人组(王志伟、鲍明、廖海林、夏富国、陈荣华)或助教。

 

企业运维岗三项核心职责:

1、企业数据不丢

     备份策略又分为异步备份和实时备份,本文主要解决外部用户更改的数据同步备份问题,数据库数据备份见后面课程。。

2、7*24服务能力

3、用户访问体验好

 

有关几百到上千台全网所有服务器异步备份和实时备份思想策略,可以关注老男孩公众号,近期会有阐述文章。

技术分享

本文出自 “老男孩linux培训” 博客,请务必保留此出处http://oldboy.blog.51cto.com/2561410/1857537

以上是关于NUAA操作系统OS实验及上机考试记录的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 上机操作题 会做的速度进 急,,,

20170721L08-02-02老男孩Linux运维实战培训初级第八节课课前上机实战考试讲解

华为 1+X《网络系统建设与运维(中级)》认证 模拟实验上机试题及其答案全解析

A1-2017级算法上机第一次练习赛 L Bamboo的OS实验

MATLAB模拟调制系统的上机实现

进程管理 os编程