├── Multithread ├── CoinFlip.java ├── CoinFlip2.java └── ThreadExample.java ├── Quiz1.md ├── Quiz2.md ├── Quiz3.md ├── Quiz4.md ├── Quiz5.md ├── Quiz6.md └── README.md /Multithread/CoinFlip.java: -------------------------------------------------------------------------------- 1 | import java.util.concurrent.ExecutorService; 2 | import java.util.concurrent.Executors; 3 | 4 | /** 5 | * Created by Guanzhu Li on 12/1/2016. 6 | */ 7 | 8 | /* Make a coin-flipping class that implements Runnable. The run method should flip 1000 coins 9 | and print out whenever it sees 3 or more consecutive heads. Make a task queue, and put 5 separate 10 | instances of the Runnable class in the queue. In the printouts, you can use Thread.current- 11 | Thread().getName() to identify the thread. You are following variation 1 of the basic threading 12 | approach (separate classes that implement Runnable), so your code will look something like this 13 | (or, you could call execute from a loop):*/ 14 | public class CoinFlip implements Runnable{ 15 | @Override 16 | public void run() { 17 | int numHeads = 0; 18 | for (int i = 0; i < 1000; i++) { 19 | double coin = Math.random(); 20 | if (coin < 0.5) { 21 | numHeads++; 22 | } else { 23 | numHeads = 0; 24 | } 25 | if (numHeads >= 3) { 26 | System.out.printf("%s got %d heads in a row.%n", 27 | Thread.currentThread().getName(), numHeads); 28 | } 29 | } 30 | } 31 | public static void main(String args[]) { 32 | ExecutorService tasks = Executors.newFixedThreadPool(5); 33 | for (int i = 0; i < 5; i++) { 34 | tasks.execute(new CoinFlip()); // invokes CoinFlipper run() method 35 | } 36 | tasks.shutdown(); 37 | } 38 | } 39 | 40 | -------------------------------------------------------------------------------- /Multithread/CoinFlip2.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by Guanzhu Li on 12/1/2016. 3 | */ 4 | /* 5 | Do a similar task (like qn 2), but this time make only one instance of your main class 6 | (the one that implementsRunnable). Still have 5 tasks in the queue. 7 | You are following variation 2 of the basic threadingapproach (main class implementing Runnable). 8 | Now your code will look roughly like this (or, with the calls to execute in a loop): 9 | */ 10 | import java.util.concurrent.*; 11 | 12 | 13 | public class CoinFlip2 implements Runnable { 14 | public static void main(String[] args) { 15 | new CoinFlip2(); 16 | } 17 | 18 | public CoinFlip2() { 19 | int poolSize = 5; 20 | ExecutorService tasks = Executors.newFixedThreadPool(poolSize); 21 | for (int i = 0; i < 5; i++) { 22 | tasks.execute(this); // executes the overriden 'run' below. 23 | } 24 | tasks.shutdown(); 25 | } 26 | 27 | @Override 28 | public void run() { 29 | int numHeads = 0; 30 | for (int i = 0; i < 1000; i++) { 31 | double coin = Math.random(); 32 | if (coin < 0.5) { 33 | numHeads++; 34 | } else { 35 | numHeads = 0; 36 | } 37 | if (numHeads >= 3) { 38 | System.out.printf("%s got %d heads in a row.%n", 39 | Thread.currentThread().getName(), numHeads); 40 | } 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /Multithread/ThreadExample.java: -------------------------------------------------------------------------------- 1 | import java.util.Scanner; 2 | 3 | 4 | /** 5 | * Created by Guanzhu Li on 12/1/2016. 6 | */ 7 | 8 | /*Write a program counts the number of prime integers between 3001 and 6000. 9 | Note : The work is divided among one to five threads. The number of threads is chosen by the user.*/ 10 | 11 | public class ThreadExample extends Thread{ 12 | int count; 13 | int start; 14 | int end; 15 | public ThreadExample (int start, int end) { 16 | this.start = start; 17 | this.end = end; 18 | } 19 | public void run(){ 20 | for (int i = start; i < end; i++) { 21 | if ((ThreadExample.isPrime(i))) { 22 | count++; 23 | System.out.println(i); 24 | System.out.println(Thread.currentThread().getName()); 25 | } 26 | } 27 | 28 | } 29 | 30 | private static boolean isPrime(int n) { 31 | if (n <= 1) return false; 32 | double limit = Math.sqrt(n); 33 | for (long i = 2; i <= limit; i++) { 34 | if (n % i == 0) return false; 35 | } 36 | return true; 37 | } 38 | 39 | public static void main(String args[]){ 40 | Scanner scan = new Scanner(System.in); 41 | int n = scan.nextInt(); 42 | ThreadExample[] pThreads = new ThreadExample[n]; 43 | int base = 3000/n; 44 | for (int i = 0; i < n; i++) { 45 | int start = 3001 + base * i; 46 | int end = 3000 + base * (i + 1); 47 | pThreads[i] = new ThreadExample(start, end); 48 | pThreads[i].start(); 49 | } 50 | try { 51 | for (int i = 0; i < n; i++) 52 | pThreads[i].join(); 53 | } catch (InterruptedException e) { 54 | } 55 | System.out.println("\nThreads have finished"); 56 | int NumPrimes = 0; 57 | for (int i = 0; i < n; i++){ 58 | NumPrimes += pThreads[i].count; 59 | } 60 | System.out.println(" Number of primes is: " + NumPrimes); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /Quiz1.md: -------------------------------------------------------------------------------- 1 | Week 1 2 | =================================== 3 | 4 | 5 | 下列关于操作系统的叙述中,哪一个是错误的? 6 | * 操作系统应为用户提供良好的界面 7 | * **操作系统是计算机系统中的一个应用软件** 8 | * 操作系统向用户屏蔽了硬件操作细节 9 | * 操作系统管理着计算机系统中的各种资源 10 | 11 | 下列关于批处理操作系统的叙述中,哪一个是正确的? 12 | * **用户不能直接干预自己作业的执行** 13 | * 批处理操作系统的系统资源利用率不高 14 | * 批处理操作系统追求的目标是响应时间 15 | * 批处理操作系统的系统吞吐量小 16 | 17 | 用户向操作系统提出服务请求一般有两种方式:终端命令和 18 | * 高级语言 19 | * 宏命令 20 | * **系统调用** 21 | * 汇编语言 22 | 23 | 下列哪一个不是操作系统的特征? 24 | * 随机性 25 | * 并发性 26 | * 共享性 27 | * **制约性** 28 | 29 | 30 | 下列关于并发概念的叙述中,哪个是正确的? 31 | * 并发性是指若干程序在同一时刻执行 32 | * 并发性是指若干程序在不同时刻执行 33 | * **并发性是指若干程序在同一时间间隔内执行** 34 | * 并发性是指若干程序在不同时间间隔内执行 35 | 36 | 37 | 在汽车电子系统中使用的操作系统应属于下列哪一类? 38 | * 个人计算机操作系统 39 | * 分布式操作系统 40 | * 批处理操作系统 41 | * **嵌入式操作系统** 42 | 43 | 44 | 下列哪一项不是嵌入式操作系统的特点? 45 | * **交互性** 46 | * 低成本 47 | * 占有资源少 48 | * 高可靠性 49 | 50 | 51 | 下列关于SPOOLing技术的叙述中,哪一个是错误的? 52 | * 作业的输入输出工作通常由SPOOLing系统完成 53 | * 批处理系统常采用SPOOLing技术实现 54 | * **SPOOLing是一种独占设备技术** 55 | * SPOOLing技术是一种用磁盘空间换取时间的技术 56 | 57 | 58 | 下列哪一项是分布式操作系统与网络操作系统本质区别? 59 | * 满足较大规模的应用 60 | * **系统中若干台计算机相互协作完成同一任务** 61 | * 实现各台计算机之间的通信 62 | * 共享网络中的资源 63 | 64 | 65 | 操作系统对每一种资源的管理所完成的工作包括 66 | * **确定资源分配策略** 67 | * **收回分配出去的资源** 68 | * 对资源使用提供保护机制 69 | * **记录资源的使用状况** 70 | * **实施资源分配** 71 | 72 | 73 | 分时操作系统是典型的交互式系统,下列哪些因素与交互式系统相关? 74 | * 时间片 75 | * 高可靠性 76 | * 吞吐量 77 | * 资源利用率 78 | * 响应时间 79 | 80 | 81 | 设计实时系统时首先要考虑的是如何提高系统的资源利用率。 82 | * 正确 83 | * **错误** 84 | 85 | 86 | 多道批处理系统是指那些有多个处理器同时处理作业的系统。 87 | * **错误** 88 | * 正确 89 | 90 | 91 | 现代操作系统通常采用SPOOLing技术的思想实现网络打印功能。 92 | * 错误 93 | * **正确** 94 | 95 | 96 | 单CPU上可以并发执行多个程序。 97 | * 正确 98 | * **错误** 99 | 100 | -------------------------------------------------------------------------------- /Quiz2.md: -------------------------------------------------------------------------------- 1 | Quiz2 2 | ================================== 3 | 控制和状态寄存器用于控制处理器的操作,在某种特权级别下可以访问、修改。下列哪一个不是控制和状态寄存器 4 | * 指令寄存器(IR) 5 | * **通用寄存器(EAX** 6 | * 程序状态字(PSW) 7 | * 程序计数器(PC) 8 | 9 | x86系列处理器提供了4个处理器特权级别,又称特权环。下列哪一个特权级别最高? 10 | * R2 11 | * R3 12 | * R1 13 | * **R0** 14 | 15 | 16 | 下列对中断和异常的描述中,哪一个是正确的? 17 | * 中断和异常都是由正在执行的指令引发的 18 | * 异常是由外部事件引发的,而中断则是由正在执行的指令引发的 19 | * **中断是由外部事件引发的,而异常则是由正在执行的指令引发的** 20 | * 中断和异常都是由外部事件引发的 21 | 22 | 23 | 中断和异常都是改变执行程序的控制流,处理完成后再恢复执行,但是二者是有区别的。下列选项中,哪一项是异常? 24 | * 存储器校验出错 25 | * 定时器到达规定的时间点 26 | * 右击鼠标 27 | * **运行过程中出现了栈溢出** 28 | 29 | 30 | 中断机制是计算机系统中的核心机制之一。发生中断事件时的中断断点是指 31 | * 中断处理程序入口的第一条指令 32 | * 中断控制器向处理器发出的信号 33 | * 引起中断的那一个事件 34 | * **正在执行的程序的当前指令** 35 | 36 | 37 | 中断向量(中断描述符)的作用非常重要,因为它保存了 38 | * 中断码和程序状态字 39 | * **程序状态字和中断入口程序地址** 40 | * 中断码和中断处理程序入口地址 41 | * 中断断点的地址和中断码 42 | 43 | 44 | 函数fork()属于下列哪一类系统调用? 45 | * 信息维护类 46 | * 设备管理类 47 | * 文件操作类 48 | * **进程控制类** 49 | 50 | 51 | 系统调用扩充了机器指令,增强了系统功能,方便了用户使用。下列哪一项功能不属于系统调用? 52 | * 向某一个进程发送一个消息 53 | * 用户程序创建一个新进程 54 | * 打开磁盘上的一个文件 55 | * **搜索数组中的最大数** 56 | 57 | 58 | 系统调用与一般过程调用是不同的,下列描述中哪一个是正确的? 59 | * 过程调用时调用程序位于用户态,被调用程序位于内核态 60 | * 过程调用和系统调用均位于内核态 61 | * 过程调用和系统调用均位于用户态 62 | * 系统调用时调用程序位于用户态,被调用程序位于内核态 63 | 64 | 65 | 在操作系统中,只能在内核态下运行的指令是 66 | * 陷入指令 67 | * 移位指令 68 | * **禁止中断指令** 69 | * 算术运算指令 70 | * **I/O指令** 71 | * **设置时钟** 72 | 73 | 74 | 中断和异常都是将正常执行的程序打断,完成处理后再恢复执行,但是二者是有区别的。下列选项中,哪一些属于中断事件? 75 | * 内存校验错 76 | * 浮点溢出 77 | * **网卡适配器缓存满** 78 | * 用户程序试图执行特权指令 79 | * 访问内存时地址越界 80 | * **电源掉电** 81 | 82 | 83 | 从用户态转换到内核态是通过设置程序状态字(PSW)寄存器的某一位(某几位)完成的。 84 | * 正确 85 | * **错误** 86 | 87 | 88 | 操作系统所能执行的指令集合是特权指令集合。 89 | * **错误** 90 | * 正确 91 | 92 | 93 | 中断系统中保存现场的工作都是由硬件部件完成的。 94 | * **错误** 95 | * 正确 96 | 97 | 98 | 系统调用的功能是由内核函数实现的。 99 | * 错误 100 | * **正确** 101 | 102 | 103 | 系统调用执行时,参数传递可以利用通用寄存器完成。 104 | * **正确** 105 | * 错误 106 | 107 | -------------------------------------------------------------------------------- /Quiz3.md: -------------------------------------------------------------------------------- 1 | Quiz - Week 3 2 | ================================================== 3 | 多道程序设计技术是操作系统中最早引入的软件技术,引入它的目的是 4 | * 充分利用内存,有利于数据共享 5 | * 提高系统的实时响应速度 6 | * 提高文件系统性能,减少内外存之间的信息传输量 7 | * **充分利用CPU,提高CPU利用率** 8 | 9 | 10 | 下列关于进程控制块PCB的叙述中,哪一个是错误的? 11 | * 操作系统利用PCB描述进程的基本特征 12 | * PCB可用于描述进程的运动变化过程 13 | * **PCB通常保存在磁盘上** 14 | * 一个PCB唯一对应一个进程 15 | 16 | 17 | 在某一条件下,进程会在状态之间相互转换。下列哪一种进程状态转换不会发生? 18 | * **就绪态→等待态** 19 | * 等待态→就绪态 20 | * 运行态→等待态 21 | * 就绪态→运行态 22 | 23 | 24 | 假设某单处理器计算机系统中有10个进程,则系统中处于等待状态的进程最多有几个? 25 | * **10** 26 | * 1 27 | * 9 28 | * 0 29 | 30 | 31 | 下列关于进程控制操作的叙述中,哪一个是不正确的? 32 | * 阻塞原语使一个进程变为等待状态 33 | * **撤销进程就是释放该进程占有的内存资源** 34 | * 一个进程可以使用创建原语建立一个新的进程 35 | * 唤醒原语使从等待队列中撤出进程 36 | 37 | 38 | 下列哪一项工作不是创建进程时所作的? 39 | * 初始化新进程的进程控制块 40 | * 给新进程分配一个唯一标识 41 | * 给新进程分配虚拟地址空间 42 | * **将处理器控制权交给新进程** 43 | 44 | 45 | 进程控制原语有多种,下列哪一项不是进程控制原语? 46 | * 改变进程优先级 47 | * 挂起进程 48 | * **进程上下文切换** 49 | * 进程唤醒 50 | 51 | 52 | 在UNIX操作系统中运行如下C语言程序: 53 | ``` 54 | int main() 55 | { 56 | pid_t pid; 57 | int a=5; 58 | pid = fork(); 59 | if (pid==0) 60 | printf ("This is the son process, a=%d\n", --a); 61 | else 62 | printf ("This is the dad process, a=%d\n", ++a); 63 | } 64 | ``` 65 | 假设编译链接过程正确且程序正确执行,那么运行结果是 66 | * **This is the son process, a=4; This is the dad process, a=6** 67 | * This is the son process, a=4 68 | * This is the dad process, a=4; This is the son process, a=6 69 | * This is the dad process, a=6 70 | 71 | 72 | 进程映像由几部分组成,下列哪一项不属于进程映像? 73 | * 程序代码 74 | * 用户栈 75 | * **就绪队列** 76 | * 进程控制块 77 | 78 | 79 | 80 | 某操作系统在进程中引入了多个执行序列——线程,那么下列叙述中,哪些描述了进程与线程的联系和区别? 81 | * **进程是资源分配的基本单位** 82 | * 线程是资源分配的基本单位 83 | * **线程不能独立于进程而存在** 84 | * 进程是处理器调度的基本单位 85 | * **线程是处理器调度的基本单位** 86 | 87 | 88 | 下列各种事件中,一定产生进程状态改变的事件是 89 | * 新进程创建成功 90 | * **运行的进程时间片用完** 91 | * **运行的进程正常退出** 92 | * **运行的进程因种种原因而阻塞** 93 | * **阻塞的进程被唤醒** 94 | 95 | 96 | 进程运行时,其硬件状态保存在相应寄存器中;当它被切换下CPU时,其硬件状态保存在内核栈中。 97 | * 正确 98 | * **错误** 99 | 100 | 101 | 当某个正在执行的进程需要进行I/O操作时,可以通过调用挂起原语将自己从运行状态变为等待状态。 102 | * **错误** 103 | * 正确 104 | 105 | 106 | 用户级线程执行时,同一进程不同线程的切换不需要内核支持。 107 | * **正确** 108 | * 错误 109 | 110 | 111 | 在支持线程的操作系统中,同一个进程中的各个线程共享该进程的用户栈。 112 | * 正确 113 | * **错误** 114 | 115 | -------------------------------------------------------------------------------- /Quiz4.md: -------------------------------------------------------------------------------- 1 | Quiz4 - Week 4 2 | ======================================================== 3 | 下列哪一个调度算法的开销比较小? 4 | * 短作业优先(SJF) 5 | * 多级反馈队列(Feedback) 6 | * 最高相应比优先(HRRN) 7 | * **先来先服务(FCFS)** 8 | 9 | 10 | 下列哪一个调度算法对短进程不利? 11 | * 时间片轮转(RR) 12 | * 短作业优先(SJF) 13 | * 最高相应比优先(HRRN) 14 | * **先来先服务(FCFS** 15 | 16 | 17 | 假设三个进程P1、P2和P3同时到达,它们的执行时间分别是T1、T2和T3,且T1 1)个进程时,信号量的值为 80 | - 1-k 81 | - k 82 | - k-1 83 | - **-k** 84 | 85 | 86 | 自旋锁采用了忙等待方式,它适用于多处理器。 87 | - 错 88 | - **对** 89 | 90 | -------------------------------------------------------------------------------- /Quiz6.md: -------------------------------------------------------------------------------- 1 | Quiz - Week 6 2 | ======================================== 3 | 下列关于管程的描述中,哪一个是不正确的? 4 | - **管程中需要提供互斥量以保证管程的互斥性** 5 | - 管程有自己的名字 6 | - 管程的主要作用是管理共享资源(数据结构) 7 | - 进程只能调用管程提供的过程对管程中的数据结构进行处理 8 | 9 | 10 | 下列哪一个操作不会唤醒或通知等在条件变量上的进程? 11 | - notify() 12 | - **wait()** 13 | - broadcast() 14 | - signal() 15 | 16 | 17 | 应用消息缓冲机制完成进程间通信的过程中,下列哪一项不是所必需的? 18 | - **同步互斥信号量** 19 | - 消息缓冲区 20 | - send/receive原语 21 | - 消息队列(指针) 22 | 23 | 24 | 采用共享内存进行进程间通信的方法需要程序员解决的问题是 25 | - 保证共享内存空间不被破坏 26 | - 设计共享内存空间的访问原语 27 | - **处理进程在使用共享内存过程中的互斥关系** 28 | - 分配共享内存空间的大小 29 | 30 | 31 | MESA管程应用时需要至少2次对条件的检测。(假设线程都有一个进入队列、等待notify的过程,不存在直接通过的情况。) 32 | - **对** 33 | - 错 34 | 35 | 36 | 若管程中同时出现2个进程,需要采取措施使其中一个进程等待。HOARE管程的解决办法是让先进入管程的进程等待。 37 | - **错** 38 | - 对 39 | 40 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # OperatingSystem 2 | - Coursera online course: Operating System 3 | - Peking University by Professor Chen Xiangqun 4 | - 北京大学 操作系统 5 | 6 | # Content 7 | Questions 8 | * **Correct Answer** 9 | * Normal Option 10 | --------------------------------------------------------------------------------