首页 > 学生美文 > 学生随笔 > 文件系统设计试验

文件系统设计试验

时间:2018-03-04   来源:学生随笔   点击:

【www.gbppp.com--学生随笔】

文件系统设计试验 第一篇_文件系统设计实验报告

软件学院计算机课程

实 验 报 告 册

课程名称 计算机操作系统

实验学期 2011 年至 2012 年 第 2 学期 学生所在院(系) 软件学院 年级 11级 专业班级 软件工程1 班 学生姓名 朱水云 学号 1115114034 指导教师 陈自刚

实验最终成绩

软件学院实验室制 2012 年 4月

实验报告( 4 )

实验名称: 文件系统设计 实验时间: 2012年5月8日 实验性质

应用性

设计性

综合性

文件系统设计试验 第二篇_操作系统实验五文件系统设计

南昌航空大学实验报告

课程名称:操作系统 实验名称: 文件系统设计 班 级:090451 学生姓名: 杨望 学号:09045131 指导教师评定: 签 名:

一、实验目的

通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。

二、实验内容

为linux系统设计一个简单的二级文件系统。要求做到以下几点:

(1)可以实现下列几条命令(至少4条); login 用户登陆 dir 列文件目录 create 创建文件 delete 删除文件 open 打开文件 close 关闭文件 read 读文件 write 写文件

(2)列目录时要列出文件名、物理地址、保护码和文件长度; (3)源文件可以进行读写保护。

三、实验提示

(1)首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目

录和子目录都以文件的形式存放于磁盘,这样便于查找和修改;

(2)用户创建的文件,可以编号存储于磁盘上。如file0,file1,file2...并以编号作为物理地址,在目录中进行登记。

四、实验源代码设计

<程序设计> (1)设计思想

本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。对这些内容感兴趣的读者,可以在本系统的程序基础上进行扩充。 (2)主要数据结构

a) I节点

struct inode{

struct inode *i_forw; struct inode *i_back; char I_flag;

unsigned int i_into; /*磁盘i节点标号*/ unsigned int i_count; /*引用计数*/

unsigned short di_number; /*关联文件书,当为0时,则删除该文件*/ unsigned short di_mode; /*存取权限*/

unsigned short di_uid; /*磁盘i节点用户*/ unsigned short di_gid; /*磁盘i节点组*/ Unsigned int di_addr[NADDR]; /*物理块号*/

b) 磁盘i结点 Struct dinode

{

unsigned short di_number; /* unsigned short di_mode; /* unsigned short di_uid; unsigned short di_gid;

unsigned long di_size; /*unsigned int di_addr[NADDR]; /*c)目录项结构 Struct direct

{

char d_name[DIRSIZ]; /* unsigned int d_ino; /*}

d)超级块 Struct filsys

{

unsigned short s_isize; /*i unsigned long s_fsize; /* unsigned int s_nfree; /* unsigned short s_pfree; /* unsigned int s_free[NICFREE]; /* unsigned int s_ninode; /* unsigned short s_pinode; /* unsigned int s_inode[NICINOD]; /* unsigned int s_rinode; /* char s_fmod; /*};

e)用户密码 Struct pwd

{

unsigned short P_uid; unsigned short P_gid; char passward[PWOSIZ]; }

f) 目录

关联文件数*/ 存取权限*/ 文件大小*/ 物理块号*/ 目录名*/ 目录号*/ 节点块块数*/ 数据块块数*/ 空闲块块数*/ 空闲块指针*/ 空闲块堆栈*/ 空闲i节点数*/ 空闲i节点指针*/ 空闲i节点数组*/ 铭记i节点*/ 超级块修改标志*/

Struct dir {

strut direct direct[DIRNUM]; int size; }

g).查找i内存节点的hash表 Struct hinode {

strut inode *iforw; }

h).系统打开表 Struct file {

char f_flag; /*文件操作标志*/

unsigned int f_count; /*引用计数*/

struct inode *f_inode; /*指向内存节点*/ unsigned long f_off; /*读/写指针*/ }

i)用户打开表 Struct user {

unsigned short u_default_mode; unsigned short u_uid; /*用户标志*/ unsigned short u_gid; /*用户组标志*/

unsigned short u_ofile[NOFILE]; /*用户打开表*/ }

3.主要函数

(1)i节点内容获取函数iget()(详细描述略)。 (2)节点内容释放函数iput()(详细描述略)。 (3)目录创建函数mkdir()(详细描述略)。

(4)目录搜索函数namei()(详细描述略)。 (5)磁盘块分配函数balloc()(详细描述略)。 (6)磁盘块释放函数bfree()(详细描述略)。 (7)分配i节点区函数ialloc()(详细描述略)。 (8)解释结点区函数ifree( )(详细描述略)。 (9)搜索当前目录下文件的函数iname( )(详细描述略)。 (10)访问控制函数access( )(详细描述略)。 (11)显示目录和文件函数_dir( )(详细描述略)。 (12)改变当前目录用函数chdir( )(详细描述略)。 (13)打开文件函数open( )(详细描述略)。 (14)创建文件函数create( )(详细描述略)。 (15)读文件用函数read( )(详细描述略)。 (16)读文件用函数write( )(详细描述略)。

(17)用户登陆函数login( )(详细描述略)。【文件系统设计试验】

(18)用户退出函数logout( )(详细描述略)。 (19)文件系统格式化函数format( )(详细描述略)。 (20)进入文件系统函数install( )(详细描述略)。 (21)关闭文件函数close( )(详细描述略)。 (22)退出文件系统函数halt( )(详细描述略)。 (23)文件删除函数delecte( )(详细描述略)。 4.主程序说明

begin

Step1 对磁盘进行格式化 Step2 调用install(),进入文件系统 Step3 调用_dir(),显示当前目录 Step4 调用login(),用户注册

Step5 调用mkdir()和chdir()创建目录 Step6 调用create(),创建文件0 Step7 分配缓冲区 Step8 写文件0

Step9 关闭文件0和释放缓冲

Step10 调用mkdir()和chdir()创建子目录 Step11 调用create(),创建文件1 Step12 分配缓冲区 Step13 写文件1

Step14 关闭文件1和释放缓冲

Step15 调用chdir将当前目录移到上一级 Step16 调用create(),创建文件2 Step17 分配缓冲区 Step18 调用write(),写文件2 Step19 关闭文件1和释放缓冲 Step20 调用delecte(),删除文件0 Step21 调用create(),创建文件1

Step22 为文件3分配缓冲区 Step23 调用write(),写文件2 Step24 关闭文件3并释放缓冲区 Step25 调用open(),打开文件2 Step26 为文件2分配缓冲 Step27 写文件3后关闭文件3 Step28 释放缓冲

Step29 用户退出(logout) Step30 关闭(halt) End

由上述的描述过程可知,该文件系统实际是为用户提供一个解释执行相关命令的环境。主程序中的大部分语句都被用来执行相应的命令。 <程序>

编写管理文件makefile

本文件系统程序用编写makefile管理工具进行管理。其内容如下:

makefile

filsys:main.o iallfre.o ballfre.o name.o access.o log.o close.o creat.o delete.o dir.o

open.o rdwt.o format.o install.o halt.o cc-o filsys main.o iallfre.o ballfre.o

name.o access.o log.o close.o creat.o delete.o dir.o open.o format.o install.o halt.o

main.o:main.c filesys.h

cc-c main.c【文件系统设计试验】

igetput.o: igetput.c filesys.h cc-c igetput.c

iallfre.o: iallfre.c filesys.h

cc-c iallfre.c

ballfre.o: ballfre.c filesys.h cc-c ballfre.c name.o:name.c filesys.h

cc-c name.c

access.o:access.c filesys.h cc-c access.c log.o:log.c filesys.h

cc-c log.c

close.o:close.c filesys.h

cc-c close.c

creat.c:creat.c filesys.h cc-c creat.c

delete.o:delete.c filesys.h cc-c delete.c dir.o:dir.c filesys.h cc-c dir.c

open.o:open.c filesys.h cc-c open.c

rdwt.o:rdwt.c filesys.h cc-c rdwt.c

format.o:format.c filesys.h cc-c format.c

install.o: install.c filesys.h

cc-c install.c halt.o:halt.c cc-c halt.c 四、实验小结

通过实验了解了多用户文件系统的组成与结构,加深理解了文件系统的内部功能及内部实现。

文件系统设计试验 第三篇_实验六 文件系统设计

实验六 文件系统设计

1.目的和要求

本实验的目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现。

2.实验内容

为DOS系统设计一个简单的二级文件系统,可以实现下列几条命令

DIR 列文件目录

CREATE 创建文件

DELETE 删除文件

MODIFY 修改文件

OPEN 打开文件

CLOSE 关闭文件

列目录时要列出文件名,物理地址,保护码和文件长度。

3.实验环境

①PC兼容机

②Windows、DOS系统、Turbo c 2.0

③C语言

4.实验提示

①首先应确定文件系统的数据结构:主目录、活动文件等。主目录文件的形式存放于磁盘,这样便于查找和修改。

主目录结构:

Ufdname 用户名

Ufdfile 指向用户的活动文件

活动文件结构:

Fpaddr 文件物理地址

Flength 文件长度

Fmode 文件属性(file mode:0-Read Only;1-Write Only;2-Read and Write(default)) Fname 文件名称

②用户创建的文件,可以编号存储于磁盘上。如:file0,file1,file2…并

以编号作为物理地址,在目录中进行登记。

③本程序需要在c:下建一个名为osfile的目录及一个名为file的子目录,在利用程序创建了文件系统后,可以在这个文件夹下查看到相关的内容。

5.实验程序

文件系统设计试验 第四篇_实验四_文件系统实验

实验四 文件系统实验

一 .目的要求

1、用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。

2、要求设计一个 n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。

二 .例题:

1、设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。

2、程序采用二级文件目录(即设置主目录[MFD])和用户文件目录(UED)。另外,为打开文件设置了运行文件目录(AFD)。

3、为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。

4、算法与框图:

①因系统小,文件目录的检索使用了简单的线性搜索。

②文件保护简单使用了三位保护码:允许读写执行、对应位为 1,对应位为0,则表示不允许读写、执行。

③程序中使用的主要设计结构如下:

主文件目录和用户文件目录( MFD、UFD)

打开文件目录( AFD)(即运行文件目录)

文件系统算法的流程图如下:

三 .实验题:

1、增加 2~3个文件操作命令,并加以实现。(如移动读写指针,改变文件属性,更换文件名,改变文件保护级别)。

#include<iostream>

#include<string>

#include<conio.h>

using namespace std;

struct TYPE_UFD

{

string File_Name;

bool Read;

bool Write;

bool Execute;

int Length_File;

};

struct TYPE_MFD

{

string User_Name;

TYPE_UFD *Pointer;

};

struct TYPE_AFD

{

int File_ID;

bool Read;

bool Write;

bool Execute;

int Pointer;

};

class TYPE_FILE_SYSTEM

{

public:

void Initial( void );

void Start( void );

private:

int _Number_Users;

int _Number_Files;

int _MaxNumber_Open_Files;

TYPE_MFD *_MFD;

TYPE_UFD *_UFD;

TYPE_AFD *_AFD;

};

void TYPE_FILE_SYSTEM::Initial( void )

{

_Number_Users = 10;

_Number_Files = 10;

_MaxNumber_Open_Files = 5;

_UFD = new TYPE_UFD [_Number_Users*_Number_Files];

_MFD = new TYPE_MFD [_Number_Users];

int i=0;

for( i=0 ; i<_Number_Users ; i++ )

{

_MFD[i].Pointer = &(_UFD[i*_Number_Files]);

}

_AFD = new TYPE_AFD [_MaxNumber_Open_Files];

_MFD[0].User_Name = "chaochao";

_UFD[0].File_Name = "chaochao1.txt";

_UFD[0].Length_File = 10;

_UFD[0].Read = true;

_UFD[0].Write = false;

_UFD[0].Execute = true;

_UFD[1].File_Name = "chaochao2.txt";

_UFD[1].Length_File = 20;

_UFD[1].Read = true;

_UFD[1].Write = false;

_UFD[1].Execute = false;

for( i=2 ; i<_Number_Files ; i++ )

{

_UFD[i].File_Name = "";

_UFD[i].Length_File = -1;

_UFD[i].Read = false;

_UFD[i].Write = false;

_UFD[i].Execute = false;

}

}

void TYPE_FILE_SYSTEM::Start( void )

{

int User_ID;

int i,temp_int;

string temp;

char choice;

int Number_Open_Files;

string User_Name;

string Command;

TYPE_UFD *UFD;

do

{

do

{

cout << "User name:";

cin >> User_Name;

for( User_ID=0 ; User_ID<_Number_Users ; User_ID++ )

{

if( _MFD[User_ID].User_Name == User_Name )

break;

}

if( User_ID == _Number_Users )

cout << "Bad user name , please try again ." << endl; }

while( User_ID == _Number_Users );

cout << "Ok , welcome to login , " << User_Name << " !" << endl; UFD = _MFD[User_ID].Pointer;

for( i=0 ; i<_MaxNumber_Open_Files ; i++ )

{

_AFD[i].File_ID = -1;

}

Number_Open_Files = 0;

do

{

cout << "C:\\" << User_Name << ">" ;

cin >> Command;

if( Command == "dir" )

{

cout << endl;

cout << "Files of user " << User_Name << endl;

cout << "\t" << "State\t" << "Length\t" << "File name" << endl;

for( i=0 ; i<_Number_Files ; i++ )

{

if( UFD[i].Length_File != -1 )

{

cout << "\t" ;

if( UFD[i].Read == true )

cout << "R";

else

cout << "-";

if( UFD[i].Write == true )

cout << "W";

else

cout << "-";

if( UFD[i].Execute == true )

cout << "E";

else

cout << "-";

cout << "\t";

文件系统设计试验 第五篇_操作系统文件系统模拟设计实验报告

操作系统课程实验报告

实验题目:文件系统模拟设计

专 业 计算机科学与技术

学 生 姓 名

班 级 学 号 12006715

教 师

指 导 单 位 计算机学院

日 期 2014年11月23日

一、实验目的

通过一个简单文件系统的过程,加深理解文件系统的内部功能和内部实现。

二、实验指导

1.文件系统是操作系统中负责存取和管理信息的模块。文件系统主要是向用户提供简便,统一的使用文件的界面。用户使用界面中的命令,按照文件的逻辑结构,直观透明的对文件实施操作。

一个完善的文件系统必须具有以下功能。

⑴辅助存储空间的管理。

⑵实现按名存放。

⑶文件的存放形式。

⑷文件的查找。

⑸文件的共享和保护。

2.对于一个文件,存在着两种形式的结构:文件的逻辑结构和文件的物理结构。文件的逻辑结构是从用户的观点出所观察的文件组织形式,是指文件中记录的安排情况。文件的物理结构,又称文件的存储结构,是指文件在外存上的存储组织形式。

3.文件管理要解决的重要问题之一,是如何为新创建的文件分配存储空间,其解决方法与内存的分配情况与许多相似之处,即同样可采用连续分配方式或离散分配方式。前者具有较高的文件分配速度,但可能产生较多的外存碎片;后者能有效的利用外存空间,但分配速度较慢。不论哪种分配方式,存储空间分配的基本单位是磁盘块而非字节。

为了实现存储空间的分配,首先系统必须记住存储空间的使用情况,为此,系统应为分配存储空间而设置相应的数据结构;其次,系统应提供对存储空间进行分配和回收的功能。

4.现代操作系统种,存储大量的文件,为了对这些文件进行有效的管理,必须对他们加以妥善组织,这主要是通过文件目录实现的。

5.文件的共享虽然给用户带来了极大的方便,但也存在着危险。为了保障文件的安全性,文件系统必须提供文件的安全管理功能。文件的安全涉及文件的保护和保密。文件的保护是指文件的拥有者本人和其他用户破坏文件内容文件的保密是指未经文件拥有者的许可,任何用户不得访问该文件。为此必须要验证用户的存取操作,这些功能是由一组称为存取控制验证模块的程序提供的。原则上,这种验证可分三步执行:

⑴审定用户的权限。

⑵比较用户权限和本次存取要求是否一致。

⑶讲存取要求和被访问的文件的保密性比较,看是否冲突。

在具体实现存取控制时,可以有许多不同的方案。常用的方法一般有四种: 存取控制矩阵,存取控制表,口令和密码。

三、实验过程描述与分析

1.程序代码:

#include<stdio.h>

void list(){

printf("0--exit 1--create 2--delete 3--read 4--write\n"); }

void read(){

char ch;

FILE *fp;

char file[20];

printf("input file name:");

scanf("%s",&file);

fp=fopen(file,"r");

while((ch=fgetc(fp))!=EOF)

putchar(ch);

putchar('\n');

fclose(fp);

}

void create(){

FILE* fp;

char file[20];

printf("input file name:");

scanf("%s",&file);

fp=fopen(file,"w");

if(fp!=NULL)

printf("%s has been created~\n",file);

else

printf("cannot create %s\n",file);

fclose(fp);

【文件系统设计试验】

}

void write(){

FILE *fp;【文件系统设计试验】

char file[20];

char str[128];

printf("input file name:");

scanf("%s",&file);

fp=fopen(file,"w");

printf("input word:");

scanf("%s",&str);

fprintf(fp,"%s",str);

fclose(fp);

}

void delet(){

char file[20];

printf("input file name:");

scanf("%s",&file);

if(remove(file)==-1)

printf("could not delete %s\n",file); else

printf("delete %s\n",file);

}

int main(){

int n;

while(1){

list();

scanf("%d",&n);

switch(n){

case 0:return 0;

case 1:create();break;

case 2:delet();break;

case 3:read();break;

case 4:write();break;

default:printf("input error"); }

}

return 0;

}

2.运行结果:

文件系统设计试验 第六篇_模拟文件系统实验报告

操作系统大型试验

实验

告姓名:XX 班级:软件工程110x 学号:201126630xxx

一、名称

操作系统大型试验。

二、目的

用C++编写出一个简单的模拟文件系统,实现目录的添加、删除、重命名,文件的添加、删除、重命名、文件和目录、文件的拷贝。

三、要求

开发工具:word,vc win32api

1.设计和实现一个简单的文件系统,要求包括目录、普通文件和文件的存储 2.文件系统的目录结构采用类似Linux的树状结构; 3.要求模拟的操作包括:

a)目录的添加、删除、重命名; b)目录的显示(列表)

c)文件的添加、删除、重命名 d)文件和目录的拷贝

4.用户进入时显示可用命令列表;用户输入help时显示所有命令的帮助文档; 输入某个命令+?时显示该条命令的使用说明

5.用户输入exit时退出该系统 6.实验实现基于windows平台; 7.实验开发语言可以选用C/c++等

四、设计

1.主要思路说明

本模拟系统通过一个大小固定的数组要代表物理盘块,假设共有1024块,新增目录占一块,新增文件占一块,文件中可输入内容,内容假设定义为5个字符占一块,超出则应新申请空间。模拟物理盘块的数组中,数组内容为-99代表改物理盘块内容为空,可使用,其他数字均代表该物理盘块被占用,其中-3代表是占用文件的末结点,其他整数代表是文件内容的下一个寻址下标,另有一个string类型的数组来存储内容,模拟文件写入了对应下标的物理盘块中。设置了一个全局指针指向根结点,一个全局指针指向当前操作目录。搜索空白物理盘块时采用顺序搜索物理盘块数组。存储形式主要采用类似二叉树结构,如目录为根,目录下的第一个文件或目录存在根的子节点,目录下的其他文件或目录存在第一个文件或目录的兄弟节点,以此类推。

本程序仅seperate()函数使用现成代码,此函数功能为将输入命令串分离,仅仅起到美观作用,其余所有代码均为原创!

2.申优功能:

1)能实现动态增长,即当输入文件的内容大小大于分配的模拟物理盘块时系统能够自动寻找空物理盘块并分配,将超出的内容保存在新的物理盘块中,若超出模拟磁盘大小,则超出部分不保存且返回提示。

2)能实现级联删除,即当删除目录(文件夹)时,目录下的所有内容也应当删除并正确释放物理盘块空间。

3)能实现目录的复制,即复制目录时(文件夹)时,该目录下的所有文件和目录也应准确复制至目标目录中,并正确分配物理盘块空间。

3.主要函数和类的定义

1)主要函数定义

#define show_bnum 20 //显示物理盘块的块数

#define block_size 1024 //物理盘块块数 int block[block_size]; //假设有block_size块物理盘块 string content[block_size]; //存放文件内容 int Msize=5; //此处为模拟磁盘大小为输入5个字符 fnode *root=new fnode("WP:",0,0); //设置根目录 fnode *current_path=new fnode(); fnode *seek_flag=new fnode(); fnode *cp_flag=new fnode(); void initialize(); int seekTarget(string name); int seek_log(string name); void delete_node(string name); int freeblock(fnode *); int seekfreeblock(); void show_current_path(); void add_file(string name,int t); void show_curpath_all(); void rename_file(string Oname,string Nname); void seperate(); void cd(); void add_File(); void add_Log(); void delete_file(); void show_memory(); void re_name(); void help(); void show_content(); void write_file(); void Clear_(); void Exit(); void cp(); void cp_log(fnode *target,fnode *source); void cp_file(fnode *target,fnode *source); void cp_node(fnode *target,fnode *source); int find_target_log(); int calculate_logsizeMain(fnode *); int calculate_logsize(fnode *); 2)文件节点类的定义: class fnode { public:

//当前路径 //作为查找标志 //作为复制的位置标志 //初始化 //搜索文件或目录 //搜索目录 //删除节点 //释放物理盘块 //搜索可用物理盘块 //显示当前路径 //增加目录、文件 //显示当前目录下的所有文件//重命名 //分离命令 //进入目录 //增加文件功能入口 //增加目录功能入口 //删除文件或目录功能入口 //显示物理盘块占用情况 //重命名功能入口 //查看帮助 //查看文件内容 //写文件 //清屏 //退出 //复制功能入口 //复制目录 //复制文件 //复制节点 //找到复制的目标目录 //计算目录大小

string filename; //文件名 int type; //文件类型,1为普通文件,0为目录文件 fnode *parent; //父节点 fnode *child; //子节点 fnode *brother; //兄弟节点 int block_num; //表示占用的物理盘块块号 int isBro; //表示是否是在同级目录下,0表示不是,1表示是 int isCld; //是否为目录下第一个节点,1表示是,0表示不是 fnode() //初始化 { type=-1; parent=NULL; child=NULL; brother=NULL; block_num=-1; isBro=0; isCld=0; }

fnode(string n,int t,int b) //根节点初始化 { type=t; filename=n; parent=NULL; child=NULL; brother=NULL; block_num=b; block[block_num]=-3; isBro=0; isCld=0; }

fnode(fnode *p,string name,int t,int b) //文件节点初始化 { parent=p; filename=name; type=t; child=NULL; brother=NULL; block_num=b; block[block_num]=-3; isBro=0; isCld=0; }

void copy(fnode *cp) //拷贝函数 {

filename=cp->filename; type=cp->type; parent=cp->parent; child=cp->child; brother=cp->brother; block_num=cp->block_num; } };

4.命令:

命令 echo md del cd cp dir ren typ wrt mem cls exit

解释

echo命令可以在当前目录下创建一个文件,具体格式:echo+name md命令可以在当前目录下创建一个目录文件,具体格式:md+name del命令可以在当前目录下删除一个已存在的文件或目录(支持级联删除),具体格式:del+name

cd命令可以进入下一级目录或返回上级目录、根目录,具体格式:cd+name或cd+.或cd+..

cp命令可以复制当前目录下一个指定的文件或目录至指定的目录,具体格式:cp+name+road

dir命令可以显示当前目录下的所有文件和目录,具体格式:del

ren命令可以重命名一个存在于当前目录下的文件或目录,具体格式:ren+name +new name

typ命令可以查看当前目录下一个文件的内容,具体格式:typ+name wrt命令可以

本文来源:http://www.gbppp.com/xs/424483/

推荐访问:冲击试验检测系统设计 正交试验设计

热门文章