UNIX系统是一个交互式的分时操作系统
1974年《ACM通信》上发表了K. Thompson 和 D. Ritchie的论文“The UNIX Time-Sharing System”,UNIX系统公布于世。
作者:美国BELL实验室
Ken Thompson(K.汤普逊)Dennis Ritchie (D.里奇)(C语言的创始人)
1965年:麻省理工大学、BELL实验室、通用电器公司组成MAC课题组联合研制Multics操作系统。
Multics操作系统设计目标是要向大的用户团体提供对计算机的同时访问,支持强大的计算能力与数据存储,以及允许用户带需要的时候容易共享他们的数据。
1969年Multics在GE645计算机上运行了,但它既没有能提供预定的综合计算服务,而且连它自己究竟什么时候算达到开发的目标。
BELL实验室退出了该课题组。
Multics操作系统开发失败的原因是当时操作系统设计的指导思想所导致的。
当时操作系统设计的指导思想是“满足所有用户的所有要求”。
UNIX系统的作者认为:操作系统的设计不应也不可能做到“满足所有用户的所有要求”,而应为广大的计算机用户提供一种良好的程序设计环境。
1969年K. Thompson和 D. Ritchie 为了改善他们的程序设计环境,设计了一个纸面的文件系统设计,这个设计后来演化成UNIX系统早期的版本。并在PDP-11计算机上实现,后来Dennis Ritchie创造了C语言, 并用C语言改写了早期的UNIX系统。
1974年在《ACM通信》上发表了“The UNIX Time-Sharing System”的论文,UNIX正式公布于世。
由于UNIX系统生逢其时,品质优秀很快风靡全球,成为当令各种计算机系统的主流操作系统。
目前,国内流行的UNIX操作系统:
SCO UNIX
AT&T UNIX SVR 4X
惠普计算机上的HP-UX
IBM小型机上的AIX
苹果Mac上的AUX
免费的UNIX版本,如Linux、Minix和FreeBSD
1.设计思想的正确合理
UNIX系统的设计者认为操作系统的设计和实现不可能做到满足所有用户的所有要求,而应是“为广大的计算机用户提供一个良好的程序设计环境”。UNIX系统的实践证明了这种设计思想的正确性,后来的Windows 95系统的实践也证明了这一点。
2.生逢其时、选择恰当
在60年代初,产生了多用户计算机,这时人们都在盼望有一个大小适中、功能齐全、使用方便的分时操作系统见世,就在人们翘首以待的时候,UNIX系统产生了。
其次是选择恰当,UNIX系统设计者选择了在PDP-11系列的计算机上实现,当时占据小型计算机的主要市场,为UNIX系统的广泛配置创造了物质条件。
3.特色明显、品质优良
UNIX系统的成功,外部的原因起到了一定的作用,但起决定作用的是UNIX系统内部的原因,这就是UNIX系统有着别的系统无法比拟的特征和优良的品质。使它成为操作系统的一代霸主。
其主要特点是:
⑴ 该系统用高级语言编写,使之易读、易懂、易修改、易移植到别的计算机上。
⑵ 它有一个简单的用户界面—shell
⑶ 它使用了在维护上容易的、实现上是高效的树形结构的文件系统。
⑷ 文件、设备统一处理
⑸ 内核和核外程序的有机结合
⑹ 丰富的核外系统程序
linux的起源和发展确实令人惊奇。
它是一个芬兰人Linus Torvalds(二十三岁计算机系学生)的业余发明。但如今已经成长为一个羽翼丰满的32位计算机的操作系统,其性能可与商业的x86UNIX操作系统相媲美。
linux是自由软件,并且在专用的网站上公布了该系统的源代码。因此,引起了全世界操作系统爱好者的兴趣,不断地对linux进行修改和补充,不断地增加功能,用户可以不断地下载更新的版本,并在各种系统配合下进行测试,这使得linux日趋完善和成熟。
特别块是在磁盘格式化时建立的,当一个文件子系统安装到系统中时,系统将申请一个内存缓冲区来存放特别块。
文件的静态结构
UNIX系统中,一个文件存在要占用如下资源:至少占用一个文件目录项;仅占用一磁盘I节点;占用一个或多个磁盘块(物理块)。
在i结构中的索引表有13个表目,
前10个表目存放文件数据块的地址,采用直接索引;如果文件的长度超过10个数据块;
第11个表目登记的是一次间接索引块的物理块号,该块存放索引表,而不是文件的内容,采用一次间接索引;
第12个表目登记二次间接索引块的物理块号,该块存放二次间接索引表,每个表目中登记的是一次间索引表的物理块号;
第13个表目登记的是三次间接索引块的物理块号,该块存放三次间接索引表,每个表目中登记的是存放二次间接索引表的物理块号。
这种结构对于小于等于10个物理块的文件采用直接索引,可从i结构的索引表中直接取到文件数据块的物理块号,不需要进行任何转换和计算,加快文件存取的速度,提高文件系统的使用效率;对于一些大型文件或巨型文件,系统采用间接索引的方法也可以方便的管理和使用,只不过要付出些代价。因此,不论是几KB仍至几个字节的文件,还是几十MB、甚至更大的文件都能存在于UNIX系统中。
UNIX系统中采用这种方法主要是照顾小型文件,保证对小型文件的存取高效快速,同时又兼顾大型文件和巨型文件。这与UNIX系统的环境有关,UNIX系统的设计者提供以下的统计资料说明他采用这种结构的理由。其统计资料说:在UNIX系统的环境下,小于10个物理块的文件约占所有使用文件的80%,其它文件约占20%,其中巨型文件不到1%。在实际应用中的文件大小的分布情况与这个统计结果是相符的。
一、三种文件类型
UNIX系统中有普通文件、目录文件和特别文件。
目录文件是由文件目录项组成的文件。
文件目录项由文件名和文件I节点号组成
I节点号(2) 文件名(14)
UNIX系统中文件目录项只包括文件名和I节点号,把通常目录项中的信息放在一个叫索引节点(I节点)的结构中,有两个优点:其一是便于文件的共享,即不同的用户可以通过不同的文件路径名来共享一个文件;其二是加快文件检索的速度。
整个系统有个根目录文件(DOS、WINDOWS系统中有一个根目录区),相当于一棵树的树根,
并有多级目录文件(与DOS概念相同,WINDOWS中叫做文件夹),相当于树枝。
还有许多文件(普通文件和特别文件),相当于树叶。
二、文件的安装和拆卸
UNIX系统采用树型目录结构,整个文件系统由根文件系统和若干个子文件系统所组成 。
根文件系统是基本文件系统,在系统生成时产生。
子文件系统是驻留其它文件存储介质上的文件系统,例如,一片软盘、一盘的逻辑分区、一卷磁带、一个磁鼓等,在UNIX环境下格式化后成为一个子文件系统,经过UNIX系统提供的安装命令装到系统中,与根文件系统和已经安装在系统中的其它子文件系统一起形成一个完整的文件系统,当某个子系统不再使用时,用拆卸命令将该子文件系统拆卸下来。
踪上所述,在UNIX环境下总只有一个完整的树型目录结构。所以,在UNIX系统环境下使用文件只要给出文件的路径名即可。
三、文件的联接
UNIX系统是一个多用户的操作系统,为了使多个用户能方便地共享系统中的某些文件,UNIX系统提供文件的联接操作(取别名),方法见用户手册。
用户在使用文件之前必须要使打开文件操作,为什么?
文件是存放在磁盘上的。磁盘属于外存储器,它是CPU不能直接访问的存储器,当然,用户就不能直接存取存放在磁盘上的文件。但用户又要使用文件,这样,在使用文件之前,就要在内存中建立存取文件的结构,然后,通过对这个结构的访问来达到对文件的访问。
内存中建立的存取文件的结构,称为文件控制块(FCB),包含文件目录的信息和对文件存取的有关信息。
该结构是在打开文件操作中建立的,并向用户返回FCB的首地址,用户以后使用文件(如读、写)就使用FCB首址。显然,用户要使用具体的内存地址,这对用户来说是非常困难的。
UNIX系统中打开文件的结构包括活动I节点表,系统打开文件表和用户文件描述符表
一、活动I节点
i_flag打开文件的标志
ILOCK:锁位
IUPD:修改标志
IMOUNT:安装点
IWANT:有进程等待
ITEXT:纯正文段
i_count:访问计数
i_dev:文件所在设备号
i_number:I节点号
二、打开文件表
f_flag:标志
FREAD:读
FWRITE:写
FPIPE:管道
f_count:访问计数
f_inode:指向活动I节点指针
f_offset:读写指针
三、用户文件描述符表(进程打开文件表)
每个进程有一个用户文件描述符表,存放在进程的user结构中,u.u_ofile[NOFILE]。
NOFILE=15是一常数,表示一个进程最多能同时打开15个文件。
这一个结构类似于一般操作系统中的FCB。
四、打开文件结构之间的关系
文件共享的三个层次:
1.父子进程共享同一文件,子进程在创建时继承了父进程的所有打开的文件,体现在对某个打开文件表目的共享;
2.不同的用户打开了同一个文件(以不同的文件名)
进程2 open(“/unix/li.c”,READ)
进程3 open(“/user/ll.i”,WRITE)
文件/unix/li.c和/user/ll.i是同一个文件;
3.不同的进程以不同的用途打开同一个文件
进程1
open(“/user1/ll”,READ)
进程3
open(“/user1/ll”,WRITE)
一、文件系统调用及其它算法的关系
二.系统调用 open
使用文件之前必须使打开文件操作,UNIX系统中打开文件的系统调用是open,其调用格式是:
fd=open(pathname,flags);
功能:打开一个指定的文件;
输入参数:pathname 要打开文件的路径名
flags 指示打开文件的类型(读或写)
返回参数:fd 文件描述符(一个小的正整数)
若fd=-1则表示系统调用失败,对所有系统
调用都是。
执行过程:
①调用namei()将文件的路径名转换成I节点;
②文件不存在或非法访问,返回-1;
③申请打开文件表项,f_count++;f_offset置0; f_inode指向I节点;
④分配用户文件描述表项,将打开文件表首地址填入;
⑤若打开文件的类型是清文件,则释放该文件占用的所有磁盘块;
⑥返回用户描述表项的编号。
三.系统调用 creat
调用格式:
fd=creat(pathname,modes);
功能:创建一个新文件;
输入参数:pathname 要创建文件的路径名
modes 指示创建文件的类型(读或写)
返回参数:fd 文件描述符(一个小的正整数)
执行过程:
①调用namei()取得文件路径名的I节点;
②文件存在且不允许访问,则释放I节点,返回-1;
③文件不存在,则申请分配一I节点;
④在其父目录中建立目录项,包括文件名和I节点号;
⑤分配用户文件描述表项,打开文件表首地址填入;
⑥若文件在创建时已存在,则释放该文件占用的所有磁盘块;
⑦返回用户描述表项的编号。
四. 系统调用 close
调用格式:
fd=creat(pathname,modes);
功能:关闭文件;
输入参数:fd 文件描述符
返回参数:无
执行过程:
⑴if(f_count-- > 0) return;
⑵ 释放该表目;
⑶if(i_count-- > 0) return;
⑷ 如果活动I节点修改,则将有关盘上I节点的内存写回到相应盘上I节点;释放此I节点,return;
⑸如果活动I节点未修改,释放此I节点,return。
五.系统调用read,write
Read 读文件;
write写文件。
调用格式:
n=read(fd,buffer,size);
n=write(fd,buffer,size);
输入参数
fd 文件描述符;
buffer 缓冲区,对于读是将读文件的信息存放在缓冲区中;对于写是将缓冲区中的信息写到文件中;
size 读(或写)信息的长度,单位字节。
返回值:
对于读操作
n=0 读到文件尾
n > 0 实际读的字节数。
对于写操作
n > 0 实际写的字节数,n与size应相等。
执行过程:
读(或写)操作先按文件表中的位移量设置U区中的位移量,然后调用低层读(或写)磁盘块的操作,读完指定的字节数后,返回实际读的字节数。
低层读磁盘块的操作
计算出文件的逻辑块号;
查活动I节点中的文件索引表,找到相应的物理块号;
读磁盘块。
linux系统简介
linux是自由软件,并且在专用的网站上公布了该系统的源代码。因此,引起了全世界操作系统爱好者的兴趣,不断地对linux进行修改和补充,不断地增加功能,用户可以不断地下载更新的版本,并在各种系统配合下进行测试,这使得linux日趋完善和成熟。