目录
吞吐率:衡量一个系统效率的一个指标
采用多道程序设计可以显著提高吞吐率。
但是,并不是内存程序数量越多越好,下面有三点否定:
前驱图:反映和研究系统内所发生事件之间的一种关系。
进程是程序在一个数据集合上的运行过程,是系统进行资源分配和调度的一个独立单位。
简单来说,就是内存核心区的一部分,专门存放进程的相关信息。
老师是先讲三状态,再到五,最后补充为七状态。
三状态分别是就绪、运行和阻塞,这可以是一个单向循环的过程(就绪→运行→阻塞→就绪),只有运行可以转过头来回到就绪。在这中间,就绪是指一个进程已经得到了系统分配的资源,准备好开始计算了,如果一个就绪的进程被调度,那就意味着它开始运行了,运行就是上面所说的计算,运行好了以后,作为一个进程,它有时候是指程序中的一小段,可能是要你用键盘进行输入,也可能是需要用屏幕进行输出,这些动作都需要I/O设备,所以统称为I/O,当一个进程运行完了以后,不能进行I/O,那就需要等待I/O,也就是等待事件发生,如果事件发生了,那就说明进程I/O完了,这时候就又回到就绪状态,等待下一次调度。上面还提到了从运行到就绪,那就是因为这个进程它被分配给的时间片到了,时间片一到,就需要把自己占用的CPU让给下一个时间片的进程,此时这个进程就又回到就绪状态。要注意的是,如果有高优先级的进程就绪,可能会马上抢占CPU,这时候CPU上的低优先级进程就会由运行状态转变为就绪状态。
在三状态的基础上加上另外两个,新建和完成。新建就是新建一个进程,这个作业被接纳后才是就绪状态。而完成则是进程已经终止了,就是完成状态。
接下来再补充两个状态,静止就绪和静止阻塞。内存中如果就绪进程过多,占满了空间,就会将其中的一些就绪进程挂起,也就是放到外存,这样的状态就是静止就绪,阻塞的挂起也同理。
在语句fpid=fork()之前,只有一个进程在执行这段代码,但在这条语句之后,就变成两个进程在执行了,这两个进程的几乎完全相同,将要执行的下一条语句都是if(fpid<0)……
为什么两个进程的fpid不同呢,这与fork函数的特性有关。fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:
1)在父进程中,fork返回新创建子进程的进程ID;
2)在子进程中,fork返回0;
3)如果出现错误,fork返回一个负值;
在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。我们可以通过fork返回的值来判断当前进程是子进程还是父进程。
引用一位网友的话来解释fpid的值为什么在父子进程中不同。“其实就相当于链表,进程形成了链表,父进程的fpid(p 意味point)指向子进程的进程id, 因为子进程没有子进程,所以其fpid为0.
fork出错可能有两种原因:
1)当前的进程数已经达到了系统规定的上限,这时errno的值被设置为EAGAIN。
2)系统内存不足,这时errno的值被设置为ENOMEM。
创建新进程成功后,系统中出现两个基本完全相同的进程,这两个进程执行没有固定的先后顺序,哪个进程先执行要看系统的进程调度策略。
每个进程都有一个独特(互不相同)的进程标识符(process ID),可以通过getpid()函数获得,还有一个记录父进程pid的变量,可以通过getppid()函数获得变量的值。
一个进程包含多个线程。
答案:A C
解析:A和C无疑是对的,而D肯定是错的,这里有问题的是B。
fork确实创建了一个子进程并完全复制父进程,但是子进程是从fork后面那个指令开始执行的。对于原因也很合逻辑,如果子进程也从main开头到尾执行所有指令,那它执行到fork指令时也必定会创建一个子子进程,如此下去这个小小的程序就可以创建无数多个进程可以把你的电脑搞瘫痪,所以fork作者肯定不会傻到这种程度
答案:C
解析:处理器的效率和运行的进程数以及总运行时间有关,注意,这里强调的是运行,所以就绪的进程数目是多少跟处理器效率无关。
答案:B
解析:线程的TCB是由应用程序通过线程库来进行创建,并不是由操作系统创建。