现代操作系统 第二章 进程与线程 答案 自己整理版

第一题

可能发生:理想情况下,如仅有一个进程时,某个进程从阻塞态直接到运行态是可能的.
而从就绪态到阻塞态则不可能.

第三题

汇编可以直接操纵底层硬件.

第四题

用户栈空间不足时不至于使操作系统崩溃.	

第五题

pow(1/2,5) = 1/32

第六题

可以容纳的进程数: (4G - 512m) / 256m = 14
假设每个进程等待I/O的概率是 p
则14个进程都等待I/O的概率是 p^14
令 p ^ 14 = 1 - 0.99 = 0.01 得p = 0.72

第七题

首先明确,一个进程可能处于在等待IO即阻塞状态,或者占用了CPU,即运行态.本题两个进程可并行运行,所以不考虑就绪态.
那么,I/O等待占50%,即I/O等待是20分钟,占用CPU是20分钟,即该进程总共运行40分钟.切不可认为I/O是20 * 0.5 == 10分钟.
则顺序执行,共需要80分钟.
并行执行,cpu的利用率为 1 - p ^ 2 = 1 - 0.5 ^ 2 = 0.75
则每个进程占用占用约为0.375每分钟,
则累计够20分钟cpu时间需要 20 / 0.375 = 53.33分钟.

第八题

如上题: answer = 1 - 0.4 ^ 6 = 0.995

第九题

每个进程下载文件的一部分

第十一题 子进程复制了进程的什么

代码助记

//验证父进程内含有线程时,子进程是否会含有该线程
//父进程会不停的输出0,子进程如果也有该线程,则会输出1
//结果表明,子进程连父进程的线程也会copy
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int i = 0;

void *pf(void *args){
    pid_t pid;
    if((pid = fork()) == 0){
        i = 1;
    }

    while(1){
        printf("%d\n", i);
        sleep(1);
    }
    return NULL;
}

int main(){
    pthread_t ppid;
    pthread_create(&ppid, NULL, &pf, NULL);

    while(1)
        ;

    return 0;
}

本题

注意: 子进程会复制父进程的任何,(代码以共享的方式)
单线程进程不会出现同时等待输入的情况,因为进程在线程等待输入时会被阻塞
多线程进程不会被阻塞,所以可以创建子进程.

第十二题

内核级线程,否则应用程序也会被阻塞.
注意单个的用户级线程的阻塞会导致整个进程的阻塞.

第十三题

第十四题

因为线程会保存寄存器的值.

第十五题

第十六题

用户级线程不会被时钟中断抢占,除非整个进程的时间片用完.
内核级线程则会跟随时钟的调度.

第十七题

第十八题

用户级线程的优点

  1. 可以在不支持线程的操作系统中使用
  2. 创建,销毁和切换线程等线程管理的代价比内核线程少得多,因为保存线程状态的过程和调用程序都只是本地过程
  3. 允许每个进程定制自己的调度算法,线程管理比较灵活.
  4. 不需要陷阱,不需要上下文切换,也不需要对内存告诉缓存进行刷新,使得线程调用非常快捷.
  5. 线程的调度不需要内核直接参与,控制简单

用户级线程的缺点

  1. 单个线程的阻塞会引起整个进程所有线程的阻塞.
  2. 页面失效也会产生类似的问题.
  3. 一个单独的进程内部,没有时钟轮换,所以不可能用轮转调度的方式调度线程
  4. 资源调度按照进程进行,多处理机下,同一个进程中的线程只能在同一个处理机下分时复用.

用户级线程最突出的优点和缺点

优点: 效率,不需要陷入内核.
缺点: 整个进程会因为一个线程的阻塞而阻塞.

第十九题

有.主程序每次调用完pthread_create后,调用pthread_join阻塞自己,等到子线程执行完毕后,再继续循环.

第二十题

第二十一题

第二十二题

可以实现.每次线程被阻塞时就启动定时器,然后把控制返回给线程包.

第二十三题 进程间通信

仍然有效,但也仍旧是忙等待

第二十四题

可行.

第二十五题

第二十六题

不会,轮转调度算法使得L早晚会运行.

第二十七题

用户级线程,每个线程一个栈
内核级线程,也是每个线程一个栈

第二十八题

是的.多处理机,每个处理器运行一个程序,然后对共享变量进行操作,仍然会触发竞争条件.

第二十九题

第三十题

可以处理互斥,因为两个进程不会同时进入临界区.
但是,这是一种严格轮换的解决方式,比如:
若此时turn == 1,则P0无限等待P1,而P1可能并不需要执行,违背了空闲让进和有限等待原则.

第三十一题

第三十三题

如果程序操作按阶段进行,直到两个进程都完成当前阶段才可进入下一阶段,则可以使用屏障.

第三十四题

可以,内核信号量用于同步内核线程.
而不可以同步用户态线程,因为一个线程的阻塞会使得整个进程都处于阻塞状态.

第三十六题

消息传递.消息为订单,饭菜和食品袋.在unix中,该4个进程通过管道连接.

第三十七题

不会导致,不过它是完全的忙等待.

第三十八题

nT seconds

第三十九题

创建了3个子进程,总共4个进程此时.

第四十题 进程间调度

某个进程在列表中出现两次,则可以为它分配两次时间片,从而提高该进程的优先级

第四十一题

可以.进程代码中需要大量进行IO,则是IO密集型的

第四十二题

时间片太长则会影响进程的并发效率
时间片太短,则上下文切换的代价所占比重就比较大,也是浪费.

第四十三题

这题不会做,求讲解

(a) T / (T + S)
(b) T / (T + S)
© Q / (Q + S)

第四十四题

当X小于等于3时: X 3 5 6 9
当X大于9时: 3 5 6 9 X
… …
总之按照最短作业优先即可

第四十五题

(a) 轮转法

前10分钟,每个进程使用CPU为1/5,10分钟时,C结束.(C整好获得了两分钟,此时还剩4个进程均分CPU时间)
继续8分钟,每个进程使用CPU为1/4,18分钟时,D结束.(注意,前10分钟,D获得了2分钟的CPU时间,继续8分钟,D又获得了两分钟的CPU时间,故总共4分钟,整好结束)
继续6分钟,每个进程获得1/3的CPU时间,24分钟时,B结束
继续4分钟,每个进程获得1/2的CPU时间,28分钟时E结束
最后2分钟,30分钟时A结束
周转时间(10 + 18 + 24 + 28 + 30) / 5 = 22

(b) 优先级调度

(6 * 5 + 8 * 4 + 10 * 3 + 2 * 2 + 4 * 1 ) / 5 = 20
结果和答案不一样

© 先来先服务

(10 * 5 + 6 * 4 + 2 * 3 + 4 * 2 + 8 * 1) / 5 = 19.2

(d)最短作业优先

(2 * 5 + 4 * 4 + 6 * 3 + 8 * 2 + 10) / 5 = 14 

第四十六题

CTSS: 兼容分时系统.
注意并不是每次调度只分配给一个时间片,它是按指数分配时间片.即第一次分配一个时间片,第二次分配2个,第三次分配4个,第四次分配8个,第五次分配16个,此时共1 + 2 + 4 + 8 + 16 = 31 > 30,即需要5次调度

第四十七题

第四十八题

第四十九题

第五十题

统统略,调度不学那么详细.

第五十一题 IPC

能.

第五十二题

以下略

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值