第五章作业
5.1
题目:In Section 5.4, we mentioned that disabling interrupts frequently can affect the system’s clock. Explain why this can occur and how such effects can be minimized.
回答:
时钟以固定的周期时间间隔产生中断,此时,操作系统将其存储时间值增加一定的量。
但是如果中断被禁用,这种增加就不发生了,并且时间也将是不正确的。也就是说时钟丢失了正确的时间。
另外,在调度过程中,每一次时钟中断,调度器都要来验证当前的时间片有没有走完。如果没有中断,调度器就无法准确分配时间。
在信号量的实现中,也可以通过启用和禁用中断来实现而不是忙等待,或者使用test或者set指令而不是中断来减少影响。
5.2
题目:Explain why Windows, Linux, and Solaris implement multiple locking mechanisms. Describe the circumstances under which they use spin- locks, mutex locks, semaphores, adaptive mutex locks, and condition variables.In each case, explain why the mechanism is needed.
回答:
在各种操作系统(windows,linux或solaris)中,有多道程序设计和多处理。在这里,有各种各样的线程同时工作以完成任务,有一个多线程在共享内存上工作。所以维护数据的原子性非常重要,也就是说如果某个人正在处理某些内存地址,那么就不能有其他人可以访问它。
于是就有了多种锁定机制:根据要求使用各种类型的锁。但是所有锁的主要目的是相同的:
一个线程正在处理某内存位置,那么首先它将锁定该位置,然后执行其任务,然后它将释放锁,以便其他线程可以访问它。
spin locks自旋锁适用于多处理器系统,自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁。
mutex locks互斥对锁定资源是有用的,能用于交互上下文但是不能用于中断上下文,同一时间只能有一个任务持有互斥锁,而且只有这个任务可以对互斥锁进行解锁。
semaphorse用于线程间通信。
adaptive mutex locks大多数操作系统都使用。想法是在尝试访问由当前运行的线程锁定的资源时使用自旋锁,但是如果线程当前没有运行则要休眠。
condition variables条件变量是与监视器关联的线程队列,线程可以在该队列上等待某些条件变为真。多个条件变量可以与同一个互斥锁相关联。
当资源必须被长时间保存时,信号量和条件变量是更合适的同步工具,因为长时间旋转是不合适的。
5.4
题目:Explain why spinlocks are not appropriate for single-processor systems yet are often used in multiprocessor systems.
回答:
如果一个高优先级的线程声明一个低优先级线程已经拥有的自旋锁,那么它将永远循环:低优先级线程永远不会再有机会运行和释放。(即使两个线程以相同的优先级运行,试图声称自旋锁的那个线程也会旋转,直到用完时间片并且浪费了大量的cpu时间:自旋锁消耗cpu资源。)如果一个中断处理程序试图声称一个拥有的自旋锁线程,中断处理程序也将永远循环。在多处理器设置中,自旋锁更合适,因为多个CPU在多处理器系统中上下文更改的代价更高,可能超出自旋锁的成本;而使用自旋锁,其他进程在其他处理器上执行,从而修改程序状态,来从自旋锁中释放第一个进程。
5.7
题目:Race conditions are possible in many computer systems. Consider a banking system that maintains an account balance with two functions: deposit(amount) and withdraw(amount). These two functions are passed the amount that is to be deposited or withdrawn from the bank account balance. Assume that a husband and wife share a bank account. Concurrently, the husband calls the withdraw() function and the wife calls deposit(). Describe how a race condition is possible and what might be done to prevent the race condition from occurring.
回答:分成两部分回答:
Describe how a race condition is possible
这里bank account是两个进程之间的共享变量。
当两个进程都尝试使用共享变量余额时,就会出现竞争条件。
也就是说两个或多个线程可以访问共享数据的同时,在同一时间,他们都要对数据做更改,所以竞争会产生意外的结果。
举个例子:
假设股票账户最初有5000余额,现在双方要做申请:
首先,丈夫读出存款为5000,然后他要取走2000。
这个时候丈夫的时间片用完(他还没取钱)
妻子开始读,存款是5000,然后她要存钱,存了4000。所以目前账户里有9000,她还没保存现在的余额的时候,她的时间片也用完了。
这个时候又轮到丈夫操作了,他之前读的是5000,然后取走2000,账户余额就变成3000了。
但是重点是,账户的余额应该是5000+4000-2000=7000。
这就出现了错误。
what might be done to prevent the race condition from occurring.
首先,可以锁定共享资源,只有在获得锁定之后才可以使用并且要通知其他人这个进程正在进行中。
或者不要将金额数据声明为全局变量。而该将它声明为取款和存入函数的局部变量。
或者书上写的皮特森算法,让一次只有一个线程进入临界区。一旦线程进入临界区,它就被锁定,除非该线程自己释放锁,否则其他线程不能访问临界区。于是临界区一次只执行一个线程。
5.9
题目:The first known correct software solution to the critical section problem for n processes with a lower bound on waiting of n − 1 turns was presented by Eisenberg and McGuire. The processes share the following variables:
All the elements of flag are initially idle. The initial value of turn is immaterial (between 0 and n-1). The structure of process Pi is shown in Figure 5.22. Prove that the algorithm satisfies all three requirements for the critical-section problem.
回答:首先,all three requirements for the critical-section problem是:
//
// main.cpp
// 操作系统第五章
//
// Created by zsy on 2018/10/24.
// Copyright © 2018年zsy. All rights reserved.
//
#include <stdio.h>
#include <pthread.h>
#define n 10
pthread_mutex_tlock;
enumpstate{idle,want_in, in_cs};
enumpstateflag[n];
intturn =0;
void* thread(void