Page 36
2.1 什么是作业?什么是作业步?
答:把在一次应用业务处理过程中,从输入开始到输出结束,用户要求计算机所做的有关该次全部工作称为一个作业,从系统的角度看,作业则是一个比程序更广的概念。它由程序、数据和作业说明书组成,系统通过作业说明书控制文件形式的程序和数据,使之执行和操作。而且,在批处理系统中,作业是抢占内存的基本单位。也就是说,批处理系统以作业为单位把程序和数据调入内存以便执行。作业由不同的顺序相连的作业步组成。
作业步是在一个作业的处理过程中,计算机所做的相对独立的工作。例如,编辑输入是一个作业步,它产生源程序文件;编译也是一个作业步,它产生目标代码文件。
2.2 作业由哪几部分组成?各有什么功能?
答:作业由三部分组成:程序、数据和作业说明书。程序和数据完成用户所要求的业务处理工作,系统通过作业说明书控制文件形式的程序和数据,使之执行和操作。
2.3 作业的输入方式有哪几种?各有什么特点? 答:作业的输入方式有5种:
(1) 联机输入方式:用户和系统通过交互式会话来输入作业。
(2) 脱机输入方式:利用低档个人计算机作为外围处理机进
行输入处理,存储在后援存储器上,然后将此后援存储器连接到高速外围设备上和主机相连,从而在较短的时间内完成作业的输入工作。
(3) 直接耦合方式:直接耦合方式把主机和外围低档机通过
一个公用的大容量外存直接耦合起来,从而省去了在脱机输入中那种依靠人工干预来传递后援存储器的过程。
(4) SPOOLING系统:SPOOLING又可译作外围设备同时联机操
作。 在SPOOLING系统中,多台外围设备通过通道或DMA器件和主机与外存连接起来。作业的输入输出过程由主机中的操作系统控制。
(5) 网络输入方式:网络输入方式以上述几种输入方式为基
础。当用户需要把在计算机网络中某一台主机上输入的信息传送到同一网中另一台主机上进行操作或执行时,就构成了网络输入方式
2.4 试述 SPOOLING 系统的工作原理。
答:在SPOOLING系统中,多台外围设备通过通道或DMA器件和主机与外存连接起来。作业的输入输出过程由主机中的操作系统控制。操作系统中的输入程序包含两个独立的过程,一个过程负责从外部设备把信息读入缓冲区;另一个是写过程, 负责把缓冲区的信息送到外存输入井中。
在系统输入模块收到作业输入请求信号后,输入管理模块中的读过程负责将信息从输入装置读入缓冲区。当缓冲区满时,由写过程将信息从缓冲区写到外存输入井中。读过程和写过程反复循环,直到一个作业输入完毕。当读过程读到一个硬件结束标志之后,系统再次驱动写过程把最后一批信息写入外存并调用中断处理程序结束该次输入。然后,系统为该作业建立作业控制块 JCB,从而使输入井中的作业进入作业等待队列,等待作业调度程序选中后进入内存。
2.5 操作系统为用户提供哪些接口?它们的区别是什么? 答:操作系统为用户提供两个接口界面。一个是系统为用户提供的各种命令接口界面。用户利用这些操作命令来组织和控制作业的执行或管理计算机系统。另一个接口是系统调用。编程人员使用系统调用来请求操作系统提供服务。操作系统的命令控制界面就是用来组织和控制作业运行的。
2.6 作业控制方式有哪几种?调查你周围的计算机的作业控制方式。
答:作业控制的主要方式有两种:联机和脱机方式。
脱机控制方式利用作业控制语言来编写表示用户控制意图的作业控制程序,也就是作业说明书。作业控制语言的语句就是作业控制命令。不同的批处理系统提供不同的作业控制语言。
联机控制方式不要求用户填写作业说明书,系统只为用户提供一组键盘或其他操作方式的命令。用户使用系统提供的操作命令和系统会话,交互地控制程序执行和管理计算机系统。
2.7 什么是系统调用?系统调用与一般用户程序有什么区别?与库函数和实用程序有什么区别?
答:系统调用是操作系统提供给编程人员的唯一接口。编程人员利用系统调用,在源程序一级动态请求和释放系统资源,调用系统中已有的系统功能来完成那些与机器硬件部分相关的工作以及控制程序的执行速度等。因此,系统调用像一个黑箱子那样,对用户屏蔽了操作系统的具体动作而只提供有关的功能。
区别:系统调用是在核心层执行,调用它们需要一个类似于硬件中断处理的中断处理机制来提供系统服务。
2.8 简述系统调用的实现过程。
答:用户在程序中使用系统调用,给出系统调用名和函数后,即产生一条相应的陷入指令,通过陷入处理机制调用服务,引起处理机中断,然后保护处理机现场,取系统调用功能号并寻找子程序入口,通过入口地址表来调用系统子程序,然后返回用户程序继续执行。
2.9 为什么说分时系统没有作业的概念?
答:因为在分时系统中,每个用户得到的时间片有限,用户的程序和数据信息直接输入到内存工作区中和其他程序一起抢占系统资源投入运行,而不必进入外存输入井等待作业调度程序选择。因此,分时系统没有作业控制表,也没有作业调度程序。
2.10 Linux操作系统为用户提供哪些接口?试举例说明。 答:操作系统为用户提供两种接口,即面向操作命令的借口Shell和面向编程用户的接口,即系统调用。常见的Shell命令如:login,logout,vi,emacs,cp,rm,ls,cc,link,adduser,chowm,chmod,service,pgrep等;常见的系统调用如:
read,write,openg,close,creat,mount,fork,wait,exit,socket等。
2.11 编写一个简单的 Shell 程序,完成一个已有数据文件的复制和打印。
答: # ..\\xt\\02\\cplp.sh # copy file
cat copy.c > copy.bak # print file cat copy.c > /dev/lp
2.12 用Linux文件读写的相关系统调用,编写一个copy程序。
答:
// \\home\\os\\xt\\02\\copy.c // usage copy src dst
#include #define BUFSIZE 8192 int main(int argc,char* argv[]) { printf(\"argv[0] : %s\\n\ printf(\"argv[1] : %s\\n\ printf(\"argv[2] : %s\\n\ if (argc!=3) { printf(\"\\nusage : copy src dst \\n\"); return -1; } int src,dst; char buf[BUFSIZE]; int n; src = open(argv[1],O_RDONLY); dst = open(argv[2],O_RDWR | O_CREAT | O_TRUNC,S_IRUSR | S_IWUSR | S_IXUSR); while ((n=read(src,buf,BUFSIZE)) > 0 ) { if (write(dst,buf,n)!=n) printf(\"write error !\"); } if (n<0) printf(\"read error !\"); close(src); close(dst); printf(\"\\nSuccess !!!!\\n\"); exit(0); } 2.13 略 第3章 进程管理 Page 8.3 3.10 设在书 3.6节中所描述的生产者-消费者问题中,其缓冲部分为m个长度相等的有界缓冲区组成,且每次传输数据长度等于有界缓冲区长度,以及生产者和消费者可对缓冲区同时操作。重新描述发送过程deposit(data)和接收过程remove(data)。 答:1:设第i块缓冲区的公用信号量为mutex[i],保证生产者进程和消费者进程对同一块缓冲区操作的互斥,初始值为1。 2:设信号量 avail 为生产者进程的私有信号量,初始值为m。 3: 设信号量 full 为消费者进程的私有信号量,初始值为0。 Deposit(data) Begin P(avail) 选择一个空缓冲区 buf[i] P(mutex[i]) buf[i] data V(full) V(Mutex[i]) End Remove(data) Begin P(full) 选择一个满缓冲区 buf[i] P(mutex[i]) Data buf[i] V(avail) V(Mutex[i]) End 3.11 两进程PA,PB通过两FIFO缓冲区队列连接(如图),每个缓冲区长度等于传送消息长度。进程PA,PB之间的通信满足如下条件: (1) 至少有一个空缓冲区存在时,相应的发送进程才能发送一个 消息。 (2) 当缓冲队列中至少存在一个非空缓冲区时,相应的接收进程才能接收一个消息。 (3) 接受与发送进程可以同时操作缓冲区队列。 试描述发送过程send(i,data)和接收过程receive(i,data)。这里i代表缓冲队列。 答: 1:定义数组 buf[0](图中上面的缓冲区),buf[1](图中下面的缓冲区) 2:设 bufempty[0],buffull[1] 为PA的私有信号量,初始值分别为n,0 3:设 bufempty[1],buffull[0] 为PB的私有信号量,初始值分别为n,0 send(i,data) begin P(bufempty[i]) 按FIFO方式选择一个空缓冲区 buf[i][j] Buf[i][j] data V(buffull[i]); End remove(i,data) begin P(buffull[i]) 按FIFO方式选择一个满缓冲区 buf[i][j] Buf[i][j] data V(bufempty[i]); End 3.14 设有5个哲学家,共享一张放有五把椅子的桌子,每人分得一把椅子。但是,桌子上总共只有5支筷子,在每人两边分开各放一支。哲学家们在肚子饥饿时才试图分两次从两边拾起筷子就餐。 条件: (1) 只有拿到两支筷子时,哲学家才能吃饭。 (2) 如果筷子已在他人手上,则该哲学家必须等待到他人吃完之后才能拿到筷子。 (3) 任一哲学家在自己未拿到两支筷子吃饭之前,决不放下自己手中的筷子。 试: (1) 描述一个保证不会出现两个邻座同时要求吃饭的通信算法。 (2) 描述一个既没有两邻座同时吃饭,又没有人饿死(永远拿不到筷子)的算法。 (3) 在什么情况下,5 个哲学家全部吃不上饭? 答: (1) 设信号量c[0]~c[4],初始值为1,分别表示第i号筷子 (i= 0,1,2,3,4)。 send[i]: 第 I 个哲学家要吃饭 begin P(c[i]) //左手边的筷子 P(c[i+1 mod 5]) //右手边的筷子 吃饭 V(c[i+1 mod 5]) V(c[i]) End (2)解决思路:奇数号的哲学家先取右手边的筷子,偶数号的哲学家先取左手边的筷子; Send(i) Begin If I mod 2 == 0 then { P(c[i]) //左手边的筷子 P(c[i+1 mod 5]) //右手边的筷子 吃饭 V(c[i+1 mod 5]) V(c[i]) } Else { P(c[i+1 mod 5]) //右手边的筷子 P(c[i]) //左手边的筷子 吃饭 V(c[i+1 mod 5]) V(c[i]) } } (3) 算法(1)能保证相邻两个哲学家不会同时吃饭,但会出现5个哲学家一人拿一支筷子,谁也吃不上饭的情况。 因篇幅问题不能全部显示,请点此查看更多更全内容