第一题
可能发生:理想情况下,如仅有一个进程时,某个进程从阻塞态直接到运行态是可能的.
而从就绪态到阻塞态则不可能.
第三题
汇编可以直接操纵底层硬件.
第四题
用户栈空间不足时不至于使操作系统崩溃.
第五题
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;
}
本题
注意: 子进程会复制父进程的任何,(代码以共享的方式)
单线程进程不会出现同时等待输入的情况,因为进程在线程等待输入时会被阻塞
多线程进程不会被阻塞,所以可以创建子进程.
第十二题
内核级线程,否则应用程序也会被阻塞.
注意单个的用户级线程的阻塞会导致整个进程的阻塞.
第十三题
略
第十四题
因为线程会保存寄存器的值.
第十五题
略
第十六题
用户级线程不会被时钟中断抢占,除非整个进程的时间片用完.
内核级线程则会跟随时钟的调度.
第十七题
略
第十八题
用户级线程的优点
- 可以在不支持线程的操作系统中使用
- 创建,销毁和切换线程等线程管理的代价比内核线程少得多,因为保存线程状态的过程和调用程序都只是本地过程
- 允许每个进程定制自己的调度算法,线程管理比较灵活.
- 不需要陷阱,不需要上下文切换,也不需要对内存告诉缓存进行刷新,使得线程调用非常快捷.
- 线程的调度不需要内核直接参与,控制简单
用户级线程的缺点
- 单个线程的阻塞会引起整个进程所有线程的阻塞.
- 页面失效也会产生类似的问题.
- 一个单独的进程内部,没有时钟轮换,所以不可能用轮转调度的方式调度线程
- 资源调度按照进程进行,多处理机下,同一个进程中的线程只能在同一个处理机下分时复用.
用户级线程最突出的优点和缺点
优点: 效率,不需要陷入内核.
缺点: 整个进程会因为一个线程的阻塞而阻塞.
第十九题
有.主程序每次调用完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
能.
第五十二题
以下略