湖南大学操作系统作业(2)

2020-06-21 16:10

操作系统第二次作业

第三章

3.1 Describe the differences among short-term, medium-term,and long-term scheduling.

描述短程,中程和长程调度的区别

答:长程调度从作业池中选取进程,并装入内存开始执行,它的执行频率较慢,短程调度从准备执行的进程中选择进程并分配CPU时间片,这种调度方式必须频繁地为CPU分配新的进程,且有一定量的时间浪费在CPU的上下文切换上,而中程调度使用的是交换的策略,将进程从CPU竞争中移出,以降低多道程序设计的

程度。被交换出的进程会保存信息,并在换入时继续执行

3.2 Describe the actions taken by a kernel to context-switch between pro-cesses. 描述系统内核在上下文切换时的动作 答:在执行上下文切换时,在某个进程的挂起时(由中断或系统调用引起),先保存该进程状态至该进程控制块PCB中,包括进程的状态,编号,程序计数器PC,寄存器等等,而在程序从挂起状态重新执行时(由中断或系统调用引起),需要从对应的PCB表中读取信息,并从上次中断处继续执行。

3.4 Using the program shown in Figure 3.24, explain what will be output at Line A. 使用3.24的程序,解释LINE A的可能输出 答:因为子进程会复制父进程的堆栈信息,在生成子进程前,堆栈中已经存放全局变量value=5的信息,然后子进程的修改只是在其独有堆栈中,而父进程的打印操作打印的是父进程的value值,故没有被修改过,为5

3.5 The correct producer-consumer algorithm in the ppt,allows only n-1 buffers to be full at any one time .Modify the algorithm to allow all buffers to be utilized fully. 课件中的代码只能存储n-1个缓存空间,要求修改代码实现所有缓存都能被利用 答:本题是一个数据结构问题,在上学期的数据结构课中有所探讨,对于一个顺序队列来说,队空和队满的判断条件其实都是front==rear,所以书上采取的措施是舍弃一个存储单元,当队列中只剩下一个单元时就认为队满。 本题有两个解决思路,分别是:1通过增加flag位修正队满条件2 增加count值来判定队列中元素个数,我在此处使用方法1来完成对于代码的修改。 //使用flag记录最后一个对队列的操作,当判断头尾指针相等时,如果标志记录为删除,则队列空,如果标志记录上一个操作为插入,则队列满 int flag=0; //0代表空,1代表满,2代表不空不满

While(1){ //生产者

While(flag==1) ; //do nothing //队列满等待

buffer[in]=nextProduced; in=(in+1)%BUFFER_SIZE; //否则,存入下一个空位,移动指针

if(in==out) flag=1; else flag=2; //如果生产之后in==out,则队满

}

While(1){ //消费者

While(flag==0) ; //do nothing //队空时无操作

nextconsumed=buffer[out];

out=(out+1)%buffer_size; //否则,取出第一个信息,移动指针 if(in==out) flag=0; //如果消费之后in==out 则队空 else flag=2; } }

第四章作业

4.1 Provide two programming examples in which multithreading does not provide better performance than a single-threaded solution. 举2个例子说明多线程不比单线程处理方式优良的情况 答:1对于单核机器,执行一个具有两个线程的进程耗时要大于执行同一个线程两次,这是因为在线程的切换过程中有上下文切换的耗时,另一方面,线程的创建和销毁也有较多的耗时。 2 单核机器下,对于计算密集型的程序(即IO操作较少),多线程会囿于线程切换的耗时表现不如单线程 3 对于一个要求顺序很强的程序来说,比如对于一个文件的操作,要求先读,后写,这时如果采用多线程则会涉及到对于信号的保护,比如写的时候不能读,读的时候不能写等问题,所以这时多线程的表现也会不如单线程。

4.2 Describe the actions taken by a thread library to context switch between user-level threads. 描述线程库在用户级线程上下文切换时的动作

答:通过轻量级进程LWP,LWP表现为一种应用程序可以调度用户线程来运行的虚拟处理器,通过调用线程库中的函数,将用户级线程通过LWP和内涵线程建立起连接,我的理解是,用户线程通过LWP向内核线程发送消息,内核线程接收消息并作出调度,将当前线程挂起并给予另一个线程CPU资源,这个信息也通过LWP传给另一个将要被切换至的线程,从而导致该线程得以运行。

4.3 Under what circumstances does a multithreaded solution using multiple kernel threads provide better performance than a single-threaded solution on a single-processor system? 什么情况下多核多线程比单核单处理器系统提供更好的表现? 答:一个应用程序可能需要执行多个相似任务,例如网页服务器接收用户关于网页,图像,声音的请求,一个忙碌的网页服务器可能有多个客户并发访问它,如果网页服务器作为传统单个线程的进程来执行,那么一次只能处理一个请求,这样客户必须等待很长的等待时间。

4.5 Can a multithreaded solution using multiple user-level threads achieve better performance on a multiprocessor system than on a single-processor system? 相比单处理器系统,多线程使用多用户线程的解决方案在一个多用户系统上面能够实现更好的表现吗 答:在多用户线程的多线程系统中,操作系统不能调度不同处理器上的其他用户进程的线程,这和多任务的初衷相违背,因此多处理器多用户线程无法获得性能提高。

4.9 Write a multithreaded Java, Pthreads, or Win32 program that outputs prime numbers. This program should work as follows: The user will run the program and will enter a number on the command line. The program will then create a separate thread that outputs all the prime numbers less than or equal to the number entered by the user. 编写多线程的java,pthreads或者win32程序输出素数,程序的功能如下:用户运行程序并输入数字指令,程序如何创建一个线程输出小于等于他的所有素数。 答:整体代码结构和书上无异,只需要更改线程内的函数体即可,代码后附,以下为运行结果 传入参数均为100 Win32程序

运行环境DEVC++ 5.11

Java程序

运行环境Mars.2 Release (4.5.2)

Win32代码

#include #include #include DWORD flag;

DWORD WINAPI Prime(LPVOID Param) { DWORD num =*(DWORD*)Param; printf(\ \ for(DWORD i=3;i<=num;i++ ){ flag=1; for(DWORD j=2;j<=sqrt(i)+1;j++){ if(i%j==0){ flag=0; break; } } if(flag)

printf(\ \ } return 0; }

int main(intargc,char *argv[]){ DWORD ThreadID; HANDLE ThreadHandle; intParam; if(argc!=2){ fprintf(stderr,\未传参给main函数\\n\ return -1; } Param = atoi(argv[1]); if(Param<2){ fprintf(stderr,\整数要大于2\\n\ return -1; } ThreadHandle = CreateThread( NULL, 0, Prime, &Param, 0, &ThreadID); if(ThreadHandle != NULL){ WaitForSingleObject(ThreadHandle,INFINITE); CloseHandle(ThreadHandle); } }

Java代码 /**

* @author zhoudawei

* @version 创建时间:2016年10月15日下午8:48:01 * @version 完成时间:2016年10月16日上午11:57:01 */

class PrimesThread implements Runnable {//定义实现runnable接口的类 private intnum; private int[] primeNums;

public PrimesThread(intnum) { if (num< 2) throw new IllegalArgumentException(); this.num = num; } public void run() {//定义run函数,实现run函数的代码被作为一个独立的线程执行 if(num>=2) System.out.print(\ for(int x=2;x

public class Primes{ public static void main(String args[]) { if (args.length == 0) { System.out.println(\未传入参数args,请在arguments中设置参数\ System.exit(0); } else new Thread(new PrimesThread(Integer.parseInt(args[0]))).start(); } }


湖南大学操作系统作业(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:03历史文化名城保护

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: