操作系统三四章作业答案
2016-10-23 10:38
309 查看
习题
3.1论述长期、中期、短期调度之间的区别。
答:
1) 长期调度(又称作业调度)是从大容量存储设备(通常为磁盘)的缓冲池中选择进程,并装入内存以准备执行。长期调度程序执行得并不频繁,在系统内新进程的创建之间可能有数分钟的间隔,它主要用来控制内存中进程的数量。只有当进程离开系统后,才可能需要长期调度程序。当作业执行完毕时,长期调度还负责回收系统资源。在批处理系统中,需要有作业调度的过程,以便将它们分批地装入内存,在分时系统和实时系统中,通常不需要长期调度。
2) 中期调度(又称交换调度)的核心思想是能将进程从内存或从CPU竞争中移出,从而降低多道程序设计的程度,之后进程能被重新调入内存,并从中断处继续执行,这种交换的操作可以调整进程在内存中的存在数量和时机。其主要任务是按照给定的原则和策略,将处于外存交换区中的就绪状态或等待状态的进程调入内存,或把处于内存就绪状态或内存等待状态的进程交换到外存交换区。
3) 短期调度(又称CPU调度)从准备执行的进程中选择进程,并为之分配CPU。短期调度程序会频繁地为CPU选择新进程,通常每100ms至少执行一次。
3.2 描述内核在两个进程间进行上下文切换的过程。
答:
将CPU切换到另一个进程需要保存当前进程的状态并恢复另一个进程的状态,这一任务成为上下文切换。当发生上下文切换时,内核会将旧进程的状态保存在PCB中,然后装入经调度要执行的并已保存的新进程的上下文。进程上下文用进程的PCB表示,它包括CPU寄存器的值、进程状态和内存管理信息等。通常通过执行一个状态保存来保存CPU当前状态(不管它是内核模式还是用户模式),之后执行一个状态恢复重新开始运行。
3.4 使用图3.24所示的程序,说明LINE A可能输出什么。
答:
当控制回到父进程时,它的值会保持在5,而子进程将更新并拷贝这个值。
3.5下面设计的优点和缺点分别是什么?系统层次和用户层次都要考虑。
a.同步和异步通信
b.自动和显式缓冲
c.复制传送和引用传送
d.固定大小和可变大小消息
答:
a) 同步和异步通信:所谓同步通信,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。按照这个定义,其实绝大多数函数都是同步调用(例如sin, isdigit等)。但是一般而言,我们在说同步、异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。最常见的例子就是 SendMessage。该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回。当对方处理完毕以后,该函数才把消息处理函数所返回的 LRESULT值返回给调用者。所以由以上可以看出,在系统层次,同步通信会因为等待反馈信息而一直占用内存和系统资源,这是它的缺点所在;但是对于对于用户来说,同步通信保证了用户之间的同时同步性,确保了用户体验。
异步通信的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。以CAsycSocket类为例(注意,CSocket从CAsyncSocket派生,但是起功能已经由异步转化为同步),当一个客户端通过调用Connect函数发出一个连接请求后,调用者线程立刻可以朝下运行。当连接真正建立起来以后,socket底层会发送一个消息通知该对象。所以在系统层面,使用异步通信的优点是可以使系统尽可能快的高效率进行和不同的对象进行通信;但是对于用户来说,在发出信息之后不能立刻得到结果,甚至有可能因为某种错误的发生而不能得到结果,影响用户体验。
b) 自动和显式缓冲:自动缓冲包括有限容量和无限容量的消息系统。在有限容量情况下,队列的长度为有限的n;因此,最多只能有n个消息驻留其中,如果在发送新消息时队列未满,那么该消息可以放在队列中,且发送者可以继续执行而不必等待。不过,线路容量有限。如果线路满,必须阻塞发送者知道队列中的空间可用为止。对于无限容量来说,队列长度可以无限,因此,不管有多少消息都可以在其中等待,从不阻塞发送者。所以对用户来说,采用自动缓冲可以流畅的发送信息而不用担心被阻塞而造成的卡顿情况,但是对于系统来说,这样做会消耗或浪费大量的系统资源和内存空间。
采用显式缓冲可能使用户在发送消息时被阻塞而等待一段时间,但是这样只会使用一小部分内存空间,避免了系统资源的浪费。
c) 复制传送和引用传送:复制发送不允许接收者改变参数的状态,所以保证了参数的不可更改性,这样对系统来说可以保持通信传输之间的一致性,但是对用户来说不能改变参数的状态会造成一些不便。与此相比,引用发送是允许的。引用发送允许的优点之一是它允许程序员写一个分布式版本的一个集中的应用程序。
d) 固定大小和可变大小消息:由进程发送的消息可以是定长的或变长的。如果只能发送定长消息,那么系统级的实现十分简单。不过,这一限制确实的编程任务更加困难。相反地,变长消息要求更复杂的系统级实现,但是编程任务变得简单。这是贯穿整个操作系统设计的一种常见的这种问题。
Thecorrect producer – consumer algorithm in the ppt,allows only n – 1 buffers tobr full at any one time.Modify the algorithm toallow all buffers to be utilizedfully.
Answer:
itemnextProduce
inta=0;
while(true){
while(((in+1)%BUFFER_SIZE)==out)&&(a=1);
buffer[in]=nextProduced;
in=(in+1)%BUFFER_SIZE;
if(in==BUFFER_SIZE){
buffer[in]=nextProduce;
a=1;
}
}
itemnextConsumed
inta=0;
while(true){
while(in==out);
nextConsumed=buffer[out];
out=(out+1)%BUFFER_SIZE;
if((out==BUFFER_SIZE-1)&&(a==1)){
nextConsumed=buffer[out];
a=0;
}
}
4.1 举两个多线程程序设计的例子,其中多线程的性能比单线程的性能差。
答:
1) 单核单处理器,使用单线程,开一个线程跑循环输出10万条打印信息;开100个线程输出10万条信息。多线程性能比单线程差,因为输出端是临界资源,线程抢占的时间大,单线程则无需抢占。
(多道程序系统中存在许多进程,它们共享各种资源,然而有很多资源一次只能供一个进程使用。一次仅允许一个进程使用的资源称为临界资源。许多物理设备都属于临界资源,如输入机、打印机、磁带机等。各进程采取互斥的方式,实现共享的资源称作临界资源。
属于临界资源的硬件有打印机、磁带机等,软件有消息缓冲队列、变量、数组、缓冲区等。各个进程间应采取互斥方式,实现对这种资源的共享。
每个进程中访问临界资源的那段代码称为临界区。显然,若能保证诸进程互斥地进入自己的临界区,便可实现诸进程对临界资源的互斥访问。为此,每个进程在进入临界区之前,应先对欲访问的临界资源进行检查,看它是否正被访问。如果此刻该临界资源未被访问,进程便可进入临界区对该资源进行访问,并设置它正被访问的标志;如果此刻该临界资源正被某进程访问,则本进程不能进入临界区。
在操作系统中,有临界区的概念。临界区内放的一般是被1个以上的进程或线程(以下只说进程)共用的数据。
临界区内的数据一次只能同时被一个进程使用,当一个进程使用临界区内的数据时,其他需要使用临界区数据的进程进入等待状态。
操作系统需要合理的分配临界区以达到多进程的同步和互斥关系,如果协调不好,就容易使系统处于不安全状态,甚至出现死锁现象。例如,打印机不可能同时打印多个进程的结果,若将一个进程的结果打印几行,再打印另一个进程的结果,这会使打印的结果变得无法使用。所以两个或两个以上进程由于不能同时使用同一临界资源,只能一个进程使用完了,另一进程才能使用。
除了物理设备外,还有很多软资源如变量、表格、队列等也都属于临界资源,如果同时使用,同样会引起与时间相关的错误。例如,有两个进程P1和P2共享一个变量count,P1或P2的功能是,每执行完某些操作后,将count的值取出加1,R1和R2是工作寄存器。当两个进程按下述顺序执行时:
P1:操作序列;
Rl=count;
R1=R1+1;
count=R1;
P2:操作序列;
R2=count;
R2=R2+1;
count=R2;
其结果使count的值增加了2;倘若P1和P2按另一种顺序执行,例如:
P1:R1=count;
P2:R2=count;
P1:Rl=Rl+1;count=Rl;
P2:R2=R2+1;count=R2;
按此执行序列,虽使P1和P2都各自对count做了加1操作,但最后的count值却只增加了1,即出现了结果不确定的错误。显然这种错误与执行顺序有关,又叫与时间相关的错误。之所以出现这种错误,是由于变量count是临界资源,P1和P2不能同时使用,即仅当进程P1对count进行修改并退出后,才允许进程P2访问和修改,那么就可以避免上述的错误结果。)
2) 网络服务器处理,这时有10万条请求;使用单线程,只开一个线程处理这10万条请求;使用多线程,每个请求开一个线程,请求处理的时间极短,迅速返回,一次性提交10万个请求,则有10万个线程创建和销毁。这样的话,多线程性能比单线程要差,因为开很多个线程,每个线程只处理很少量的工作,创建线程的开销要远大于实际的工作成本。
4.2 描述线程库进行用户级线程上下文切换的过程所采取的措施。
答:
用户线程是通过线程库实现的。它们可以在没有内核参与下创建、释放和管理。线程库提供了同步和调度的方法。这样进程可以使用大量的线程而不消耗内核资源,而且省去大量的系统开销。用户线程的实现是可能的,因为用户线程的上下文可以在没有内核干预的情况下保存和恢复。每个用户线程都可以有自己的用户堆栈,一块用来保存用户级寄存器上下文以及如信号屏蔽等状态信息的内存区。库通过保存当前线程的堆栈和寄存器内容载入新调度线程的那些内容来实现用户线程之间的调度和上下文切换。
内核仍然负责进程的切换,因为只有内核具有修改内存管理寄存器的权力。用户线程不是真正的调度实体,内核对它们一无所知,而只是调度用户线程下的进程或者轻量级进程,这些进程再通过线程库函数来调度它们的线程。当一个进程被抢占时,它的所有用户线程都被抢占,当一个用户线程被阻塞时,它会阻塞下面的轻量级进程,如果进程只有一个轻量级进程,则它的所有用户线程都会被阻塞。
4.3 在什么环境中,采用多内核线程的多线程方法比单处理器系统的单线程提供更好的性能?
答:
当一个内核线程发生页面错误时,系统会采用有用的方法切换到另一个进程去使用交错时间。而且当发生页面错误时,单线程进程不能有效地发挥作用。因此,在一个程序可能频繁地发生页面错误或者需要等待其他的系统事件的情况下,采用多线程的处理方法是要优于单处理器系统的。
4.5 使用多用户线程的多线程解决方案,在多处理系统中可以比在单处理系统中获得更好的性能吗?
答:
一个包括多用户线程的多线程系统无法在多处理系统上同时使用不同的处理器。操作系统只能看到一个单一的进程,不会调度在不同处理器上的不同进程的线程。因此可以得出结论,多处理器系统执行多个用户线程是没有性能优势的。
4.9 编写一个多线程的Java、Pthread或Win32程序来输出素数。程序应该这样工作:用户运行程序时在命令行输入一个数字,然后创建一个独立线程来输出小于或等于用户输入数的所有素数。
答:
import java.util.Scanner;
public class ThreadTest3 implementsRunnable{
public static int a = 0;
public static void main(String[] args) {
Threadthread = new Thread(new ThreadTest3 ());
Scannersc = new Scanner(System.in);
System.out.println("Please enter a:");
if(sc.hasNextInt()){
a=sc.nextInt();
}
thread.start();
}
public static boolean isPrime(int input){
for (int i = 2; i < input; i++){
if (input % i == 0){
returnfalse;
}
}
returntrue;
}
public void run(){
int j=0;
while(true){
for(int i=1;i<=a;i++){
if(isPrime(i)){
System.out.println("素数="+i);
}
j++;
}
if(j>=a)
break;
}
}
}
输出结果:
3.1论述长期、中期、短期调度之间的区别。
答:
1) 长期调度(又称作业调度)是从大容量存储设备(通常为磁盘)的缓冲池中选择进程,并装入内存以准备执行。长期调度程序执行得并不频繁,在系统内新进程的创建之间可能有数分钟的间隔,它主要用来控制内存中进程的数量。只有当进程离开系统后,才可能需要长期调度程序。当作业执行完毕时,长期调度还负责回收系统资源。在批处理系统中,需要有作业调度的过程,以便将它们分批地装入内存,在分时系统和实时系统中,通常不需要长期调度。
2) 中期调度(又称交换调度)的核心思想是能将进程从内存或从CPU竞争中移出,从而降低多道程序设计的程度,之后进程能被重新调入内存,并从中断处继续执行,这种交换的操作可以调整进程在内存中的存在数量和时机。其主要任务是按照给定的原则和策略,将处于外存交换区中的就绪状态或等待状态的进程调入内存,或把处于内存就绪状态或内存等待状态的进程交换到外存交换区。
3) 短期调度(又称CPU调度)从准备执行的进程中选择进程,并为之分配CPU。短期调度程序会频繁地为CPU选择新进程,通常每100ms至少执行一次。
3.2 描述内核在两个进程间进行上下文切换的过程。
答:
将CPU切换到另一个进程需要保存当前进程的状态并恢复另一个进程的状态,这一任务成为上下文切换。当发生上下文切换时,内核会将旧进程的状态保存在PCB中,然后装入经调度要执行的并已保存的新进程的上下文。进程上下文用进程的PCB表示,它包括CPU寄存器的值、进程状态和内存管理信息等。通常通过执行一个状态保存来保存CPU当前状态(不管它是内核模式还是用户模式),之后执行一个状态恢复重新开始运行。
3.4 使用图3.24所示的程序,说明LINE A可能输出什么。
答:
当控制回到父进程时,它的值会保持在5,而子进程将更新并拷贝这个值。
3.5下面设计的优点和缺点分别是什么?系统层次和用户层次都要考虑。
a.同步和异步通信
b.自动和显式缓冲
c.复制传送和引用传送
d.固定大小和可变大小消息
答:
a) 同步和异步通信:所谓同步通信,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。按照这个定义,其实绝大多数函数都是同步调用(例如sin, isdigit等)。但是一般而言,我们在说同步、异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。最常见的例子就是 SendMessage。该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回。当对方处理完毕以后,该函数才把消息处理函数所返回的 LRESULT值返回给调用者。所以由以上可以看出,在系统层次,同步通信会因为等待反馈信息而一直占用内存和系统资源,这是它的缺点所在;但是对于对于用户来说,同步通信保证了用户之间的同时同步性,确保了用户体验。
异步通信的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。以CAsycSocket类为例(注意,CSocket从CAsyncSocket派生,但是起功能已经由异步转化为同步),当一个客户端通过调用Connect函数发出一个连接请求后,调用者线程立刻可以朝下运行。当连接真正建立起来以后,socket底层会发送一个消息通知该对象。所以在系统层面,使用异步通信的优点是可以使系统尽可能快的高效率进行和不同的对象进行通信;但是对于用户来说,在发出信息之后不能立刻得到结果,甚至有可能因为某种错误的发生而不能得到结果,影响用户体验。
b) 自动和显式缓冲:自动缓冲包括有限容量和无限容量的消息系统。在有限容量情况下,队列的长度为有限的n;因此,最多只能有n个消息驻留其中,如果在发送新消息时队列未满,那么该消息可以放在队列中,且发送者可以继续执行而不必等待。不过,线路容量有限。如果线路满,必须阻塞发送者知道队列中的空间可用为止。对于无限容量来说,队列长度可以无限,因此,不管有多少消息都可以在其中等待,从不阻塞发送者。所以对用户来说,采用自动缓冲可以流畅的发送信息而不用担心被阻塞而造成的卡顿情况,但是对于系统来说,这样做会消耗或浪费大量的系统资源和内存空间。
采用显式缓冲可能使用户在发送消息时被阻塞而等待一段时间,但是这样只会使用一小部分内存空间,避免了系统资源的浪费。
c) 复制传送和引用传送:复制发送不允许接收者改变参数的状态,所以保证了参数的不可更改性,这样对系统来说可以保持通信传输之间的一致性,但是对用户来说不能改变参数的状态会造成一些不便。与此相比,引用发送是允许的。引用发送允许的优点之一是它允许程序员写一个分布式版本的一个集中的应用程序。
d) 固定大小和可变大小消息:由进程发送的消息可以是定长的或变长的。如果只能发送定长消息,那么系统级的实现十分简单。不过,这一限制确实的编程任务更加困难。相反地,变长消息要求更复杂的系统级实现,但是编程任务变得简单。这是贯穿整个操作系统设计的一种常见的这种问题。
Thecorrect producer – consumer algorithm in the ppt,allows only n – 1 buffers tobr full at any one time.Modify the algorithm toallow all buffers to be utilizedfully.
Answer:
itemnextProduce
inta=0;
while(true){
while(((in+1)%BUFFER_SIZE)==out)&&(a=1);
buffer[in]=nextProduced;
in=(in+1)%BUFFER_SIZE;
if(in==BUFFER_SIZE){
buffer[in]=nextProduce;
a=1;
}
}
itemnextConsumed
inta=0;
while(true){
while(in==out);
nextConsumed=buffer[out];
out=(out+1)%BUFFER_SIZE;
if((out==BUFFER_SIZE-1)&&(a==1)){
nextConsumed=buffer[out];
a=0;
}
}
4.1 举两个多线程程序设计的例子,其中多线程的性能比单线程的性能差。
答:
1) 单核单处理器,使用单线程,开一个线程跑循环输出10万条打印信息;开100个线程输出10万条信息。多线程性能比单线程差,因为输出端是临界资源,线程抢占的时间大,单线程则无需抢占。
(多道程序系统中存在许多进程,它们共享各种资源,然而有很多资源一次只能供一个进程使用。一次仅允许一个进程使用的资源称为临界资源。许多物理设备都属于临界资源,如输入机、打印机、磁带机等。各进程采取互斥的方式,实现共享的资源称作临界资源。
属于临界资源的硬件有打印机、磁带机等,软件有消息缓冲队列、变量、数组、缓冲区等。各个进程间应采取互斥方式,实现对这种资源的共享。
每个进程中访问临界资源的那段代码称为临界区。显然,若能保证诸进程互斥地进入自己的临界区,便可实现诸进程对临界资源的互斥访问。为此,每个进程在进入临界区之前,应先对欲访问的临界资源进行检查,看它是否正被访问。如果此刻该临界资源未被访问,进程便可进入临界区对该资源进行访问,并设置它正被访问的标志;如果此刻该临界资源正被某进程访问,则本进程不能进入临界区。
在操作系统中,有临界区的概念。临界区内放的一般是被1个以上的进程或线程(以下只说进程)共用的数据。
临界区内的数据一次只能同时被一个进程使用,当一个进程使用临界区内的数据时,其他需要使用临界区数据的进程进入等待状态。
操作系统需要合理的分配临界区以达到多进程的同步和互斥关系,如果协调不好,就容易使系统处于不安全状态,甚至出现死锁现象。例如,打印机不可能同时打印多个进程的结果,若将一个进程的结果打印几行,再打印另一个进程的结果,这会使打印的结果变得无法使用。所以两个或两个以上进程由于不能同时使用同一临界资源,只能一个进程使用完了,另一进程才能使用。
除了物理设备外,还有很多软资源如变量、表格、队列等也都属于临界资源,如果同时使用,同样会引起与时间相关的错误。例如,有两个进程P1和P2共享一个变量count,P1或P2的功能是,每执行完某些操作后,将count的值取出加1,R1和R2是工作寄存器。当两个进程按下述顺序执行时:
P1:操作序列;
Rl=count;
R1=R1+1;
count=R1;
P2:操作序列;
R2=count;
R2=R2+1;
count=R2;
其结果使count的值增加了2;倘若P1和P2按另一种顺序执行,例如:
P1:R1=count;
P2:R2=count;
P1:Rl=Rl+1;count=Rl;
P2:R2=R2+1;count=R2;
按此执行序列,虽使P1和P2都各自对count做了加1操作,但最后的count值却只增加了1,即出现了结果不确定的错误。显然这种错误与执行顺序有关,又叫与时间相关的错误。之所以出现这种错误,是由于变量count是临界资源,P1和P2不能同时使用,即仅当进程P1对count进行修改并退出后,才允许进程P2访问和修改,那么就可以避免上述的错误结果。)
2) 网络服务器处理,这时有10万条请求;使用单线程,只开一个线程处理这10万条请求;使用多线程,每个请求开一个线程,请求处理的时间极短,迅速返回,一次性提交10万个请求,则有10万个线程创建和销毁。这样的话,多线程性能比单线程要差,因为开很多个线程,每个线程只处理很少量的工作,创建线程的开销要远大于实际的工作成本。
4.2 描述线程库进行用户级线程上下文切换的过程所采取的措施。
答:
用户线程是通过线程库实现的。它们可以在没有内核参与下创建、释放和管理。线程库提供了同步和调度的方法。这样进程可以使用大量的线程而不消耗内核资源,而且省去大量的系统开销。用户线程的实现是可能的,因为用户线程的上下文可以在没有内核干预的情况下保存和恢复。每个用户线程都可以有自己的用户堆栈,一块用来保存用户级寄存器上下文以及如信号屏蔽等状态信息的内存区。库通过保存当前线程的堆栈和寄存器内容载入新调度线程的那些内容来实现用户线程之间的调度和上下文切换。
内核仍然负责进程的切换,因为只有内核具有修改内存管理寄存器的权力。用户线程不是真正的调度实体,内核对它们一无所知,而只是调度用户线程下的进程或者轻量级进程,这些进程再通过线程库函数来调度它们的线程。当一个进程被抢占时,它的所有用户线程都被抢占,当一个用户线程被阻塞时,它会阻塞下面的轻量级进程,如果进程只有一个轻量级进程,则它的所有用户线程都会被阻塞。
4.3 在什么环境中,采用多内核线程的多线程方法比单处理器系统的单线程提供更好的性能?
答:
当一个内核线程发生页面错误时,系统会采用有用的方法切换到另一个进程去使用交错时间。而且当发生页面错误时,单线程进程不能有效地发挥作用。因此,在一个程序可能频繁地发生页面错误或者需要等待其他的系统事件的情况下,采用多线程的处理方法是要优于单处理器系统的。
4.5 使用多用户线程的多线程解决方案,在多处理系统中可以比在单处理系统中获得更好的性能吗?
答:
一个包括多用户线程的多线程系统无法在多处理系统上同时使用不同的处理器。操作系统只能看到一个单一的进程,不会调度在不同处理器上的不同进程的线程。因此可以得出结论,多处理器系统执行多个用户线程是没有性能优势的。
4.9 编写一个多线程的Java、Pthread或Win32程序来输出素数。程序应该这样工作:用户运行程序时在命令行输入一个数字,然后创建一个独立线程来输出小于或等于用户输入数的所有素数。
答:
import java.util.Scanner;
public class ThreadTest3 implementsRunnable{
public static int a = 0;
public static void main(String[] args) {
Threadthread = new Thread(new ThreadTest3 ());
Scannersc = new Scanner(System.in);
System.out.println("Please enter a:");
if(sc.hasNextInt()){
a=sc.nextInt();
}
thread.start();
}
public static boolean isPrime(int input){
for (int i = 2; i < input; i++){
if (input % i == 0){
returnfalse;
}
}
returntrue;
}
public void run(){
int j=0;
while(true){
for(int i=1;i<=a;i++){
if(isPrime(i)){
System.out.println("素数="+i);
}
j++;
}
if(j>=a)
break;
}
}
}
输出结果:
相关文章推荐
- 操作系统一二章作业答案
- 操作系统作业答案整理
- 操作系统五六章作业答案
- 操作系统课后习题答案(作业题)
- 操作系统形成性考核册作业答案
- 计算机操作系统调度算法——短作业优先算法简单实现
- 操作系统的作业调度和进程调度算法
- 操作系统常见面试题及答案
- 【求助(高手看下)】一道作业题能编译,但是运行的时候答案是错的,求指正。
- 操作系统中作业、程序、进程、线程及管程的定义与联系
- 网站分析快速作业:十三个网站数据分析的问题及答案
- 自考(2017年版)《操作系统》——第二章思考与练习题参考答案(自做)
- s15day12作业:MySQL练习题参考答案
- 操作系统课堂笔记(3)用户接口和作业管理
- 《操作系统》课程作业(数据结构实现-作业一:学生学籍管理程序)
- 操作系统作业---实验0
- 操作系统实验二 作业调度
- 操作系统第三次作业
- 操作系统作业~分页式存储管理(作业)
- 【操作系统 - 1】先来先服务FCFS和短作业优先SJF进程调度算法