(2)按比例分配算法(3)考虑优先权的分配算法 最佳置换算法(Optimal) 先进先出置换算法(FIFO) 最近最久未使用(LRU) Clock置换算法
设备控制器是在CPU和I/O设备之间的接口,一个设备控制器控制几个设备。
设备控制器的功能接收和识别命令;数据交换;标识和报告设备的状态;地址识别;数据缓冲;差错控制
通道是通过执行通道程序,并与设备控制器共同实现对I/O设备的控制的。通道程序是由一系列通道指令所构成的。
通道程序每条指令: (1)操作码(2)存地址(3)计数(4)通道程序结束位(5)记录结束标志。
设备分配中的数据结构 1、设备控制表DCT
2、控制器控制表COCT、通道控制表CHCT 3、系统设备表 联机命令的类型 系统访问类(login);磁盘操作类format、diskcopy;文件操作类type;目录操作类mkdir;其它命令
spooling 系统组成 (1)输入井和输出井
(2)输入缓冲区和输出缓冲区(3)输入进程spi和输出进程spo SPOOLING 系统的特点
提高了I/O的速度;将独占设备改造为共享设备;实现了虚拟设备功能
设备处理程序通常又称为设备驱动程序。是I/O进程与设备控制器之间的通信程序,以进程的形式存在,故称为设备驱动进程。 连续分配的优缺点:
(1)顺序访问容易(2)顺序访问速度快(3)要求有连续的存储空间(4)必须事先知道文件的长度。
显示是把文件个物理块的指针显式的存放在存的一表中,整个磁盘仅设置一 混合索引分配方式:UNIX系统V的索引结点中: 直接寻址iaddr(0)-iaddr(9); 一次间接寻址iaddr(10);
多次间接寻址iaddr(11) iaddr(12) 对目录管理的要求如下: (1)实现“按名存取”
(2)提高对目录的检索速度 (3)文件共享 (4)允许文件重名
文件与文件控制块一一对应,人们把文件控制块的有序集合称为文件目录
多级目录结构
(1)提高了检索目录的速度(2)在不同的用户目录中,可以使用相同的文件名 (3)不同用户还可以使用不同的文件名来访问同一个共享文件。
输入下列命令:cp file1 file2时,将文件file1拷贝成file2
#include
int main(int argc,char *argv[]) {char buf[88]; int j,n,m; int fd,fd1;
fd=open(argv[1],O_RDWR);
if(fd<0) printf(\else j=creat(argv[2],S_IWRITE | S_IREAD); if(j<0) printf(\else n=read(fd,buf,sizeof(buf));
if(n<0) printf(\else close(fd);
fd1=open(argv[2],O_RDWR);
if(fd1<0) printf(\else
m=write(fd1,buf,n);
if(m<0) printf(\else
close(fd1); } lockf(fd[1],0,0); 利用无名管道(用pipe()创建)} 实现进程间的通信。父进程创建else {if((k=fork())==0) 两个子进程,两个子进程分别向{lockf(fd[1],1,0); 管道中写一条消息: write(fd[1],\am “I am child1.” chlid2\\n\和 “I am child2.” } else #include
对对象操纵和管理的软件集合是文件管理系统的核心部分。
Hash函数,可将记录键值转换为相应记录的地址。 盘块的分配:
(1)顺序扫描位示图,找出值为0的二进制位进行分配。(2)将所找到的每一个位,转换为相应的盘块号b=n(i-1)+j(n为每行位数) (3)修改位示图,令map[i,j]=1 盘块的回收:
1、 将回收的盘块号转换为
行号和列号
i=(b-1)/n+1 j=(b-1)%n+1 2、修改位示图。令
map[i,j]=0
系统调用在本质上是应用程序请求操作系统核完成某功能时的一种过程调用,属于特殊的过程调用 系统调用的类型 (1)进程控制类 (2)文件操纵类 (3)进程通信类
父进程创建一个子进程,父进程等待子进程,子进程执行完后自我终止,并唤醒父进程,父、子进程执行时打印有关信息。
#include
intstatus=0;
childpid=fork();
if(childpid < 0) { printf(\
; } else
if(childpid == 0) {printf(\ } else
{ printf(\
ther\ retpid
=
waitpid(childpid,&status,0);
if(retpid == childpid) {
printf(\finished,
ready to start father...\\n\
}
return 0;}
父进程创建一个子进程,在子进程运行时显示当前目录下的所有文件和目录,父进程输出子进程和自己进程的ID。在程序运行时控制进程的顺序;子进程先执行,父进程后执行。
#include
{
int i; i=fork() if((i==-1)
printf(\child process failed\
else if (i==0) { sleep(3);
execl(\ exit(0); }
else {wait(0); printf(\process is %d, child process is %d \\n\ } }
实现父进程创建子进程,每个进程都在屏幕上显示自己的ID号。观察记录 ID显示的顺序并分析原因。 #include
{ int i,j; if (i=fork()==0) printf(\pid is %d\ else if (j=fork()==0) printf(\
pid is %d\ else printf(\'s pid is %d\}