第三周测验:进程线程模型

  1. 多道程序设计技术是操作系统中最早引入的软件技术,引入它的目的是

    • 提高系统的实时响应速度
    • 充分利用内存,有利于数据共享
    • 充分利用CPU,提高CPU利用率
    • 提高文件系统性能,减少内外存之间的信息传输量
  2. 下列关于进程控制块PCB的叙述中,哪一个是错误的?

    • 操作系统利用PCB描述进程的基本特征

    • 一个PCB唯一对应一个进程

    • PCB可用于描述进程的运动变化过程

    • PCB通常保存在磁盘上

      PCB进程控制块是进程的静态描述,由PCB、有关程序段和该程序段对其进行操作的数据结构集三部分组成

      PCB一般包括:

      1.程序ID(PID、进程句柄):它是唯一的,一个进程都必须对应一个PID。PID一般是整形数字

      2.特征信息:一般分系统进程、用户进程、或者内核进程等

      3.进程状态:运行、就绪、阻塞,表示进程现的运行情况

      4.优先级:表示获得CPU控制权的优先级大小

      5.通信信息:进程之间的通信关系的反映,由于操作系统会提供通信信道

      6.现场保护区:保护阻塞的进程用

      7.资源需求、分配控制信息

      8.进程实体信息,指明程序路径和名称,进程数据在物理内存还是在交换分区(分页)中

      9.其他信息:工作单位,工作区,文件信息等

  3. 在某一条件下,进程会在状态之间相互转换。下列哪一种进程状态转换不会发生?

    • 等待态→就绪态
    • 就绪态→运行态
    • 就绪态→等待态
    • 运行态→等待态
  4. 假设某单处理器计算机系统中有10个进程,则系统中处于等待状态的进程最多有几个?

    • 0
    • 1
    • 9
    • 10
  5. 下列关于进程控制操作的叙述中,哪一个是不正确的?

    • 一个进程可以使用创建原语建立一个新的进程
    • 撤销进程就是释放该进程占有的内存资源
    • 阻塞原语使一个进程变为等待状态
    • 唤醒原语使从等待队列中撤出进程

    进程撤销

    释放进程占有的资源只是撤销进程过程的一部分。

    当进程完成任务或在执行的过程中发生异常时,系统将调用进程终止原语来终止该进程。根据被终止进程的标识符从PCB集合中查找到该进程的PCB,从中读出该进程的状态,终止该进程的执行;若干该进程还有子孙进程,应该讲其所有子孙进程终止,防止它们成为不可控进程;然后回收进程所拥有的资源,最后将被终止进程从所在队列中移出,等待其它程序来收集信息

  6. 下列哪一项工作不是创建进程时所作的?

    • 给新进程分配一个唯一标识
    • 给新进程分配虚拟地址空间
    • 初始化新进程的进程控制块
    • 将处理器控制权交给新进程
  7. 进程控制原语有多种,下列哪一项不是进程控制原语?

    • 改变进程优先级
    • 挂起进程
    • 进程唤醒
    • 进程上下文切换

    创建原语的执行过程:

    1. 为新进程分配一个唯一的进程标识号,并申请一个空白的PCB(PCB是有限的)。若PCB申请失败则创建失败。
    2. 为进程分配资源,为新进程的程序和数据、以及用户栈分配必要的内存空间(在PCB 中体现)。注意:这里如果资源不足(比如内存空间),并不是创建失败,而是处于”等待状态“,或称为“阻塞状态”,等待的是内存这个资源。
    3. 初始化PCB,主要包括初始化标志信息、初始化处理机状态信息和初始化处理机控制信息,以及设置进程的优先级等。
    4. 如果进程就绪队列能够接纳新进程,就将新进程插入到就绪队列,等待被调度运行。

    撤销原语的执行过程:

    1. 根据被终止进程的标识符,检索PCB,从中读出该进程的状态。
    2. 若被终止进程处于执行状态,立即终止该进程的执行,将处理机资源分配给其他进程。
    3. 若该进程还有子进程,则应将其所有子进程终止。
    4. 将该进程所拥有的全部资源,或归还给其父进程或归还给操作系统。
    5. 将该PCB从所在队列(链表)中删除。

    唤醒原语的执行过程:

    1. 在该事件的等待队列中找到相应进程的PCB。
    2. 将其从等待队列中移出,并置其状态为就绪状态。
    3. 把该PCB插入就绪队列中,等待调度程序调度。

    阻塞原语的执行过程是:

    1. 找到将要被阻塞进程的标识号对应的PCB。
    2. 若该进程为运行状态,则保护其现场,将其状态转为阻塞状态,停止运行。
    3. 把该PCB插入到相应事件的等待队列中去。

    进程切换的过程如下:

    1. 保存处理机上下文,包括程序计数器和其他寄存器。
    2. 更新PCB信息。
    3. 把进程的PCB移入相应的队列,如就绪、在某事件阻塞等队列。
    4. 选择另一个进程执行,并更新其PCB。
    5. 更新内存管理的数据结构。
    6. 恢复处理机上下文。
  8. 在UNIX操作系统中运行如下C语言程序:

    int main()
    {
     pid_t pid;
     int a=5;
     pid = fork();
        
     if (pid==0)   
         printf ("This is the son process, a=%d ", --a);
     else
         printf ("This is the dad process, a=%d ", ++a);
    }
    

    假设编译链接过程正确且程序正确执行,那么运行结果是

    • This is the son process, a=4

      This is the dad process, a=6

    • This is the son process, a=4

    • This is the dad process, a=6

    • This is the dad process, a=4

      This is the son process, a=6

    fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:

    1)在父进程中,fork返回新创建子进程的进程ID;
    2)在子进程中,fork返回0;
    3)如果出现错误,fork返回一个负值;

    在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。我们可以通过fork返回的值来判断当前进程是子进程还是父进程。

  9. 进程映像由几部分组成,下列哪一项不属于进程映像?

    • 进程控制块
    • 程序代码
    • 用户栈
    • 就绪队列

    进程映像是进程执行的上下文环境,包括处理机中各通用寄存器的值,进程的内存映像,打开文件的状态和进程占用资源的信息等。它是一个内存级的实体并由:

    进程控制块(PCB)
    进程执行的代码(code)/程序
    进程执行时所用的数据/ 数据集合
    进程执行时使用的工作区组成。

  10. 某操作系统在进程中引入了多个执行序列——线程,那么下列叙述中,哪些描述了进程与线程的联系和区别?

    • 进程是资源分配的基本单位
    • 进程是处理器调度的基本单位
    • 线程是资源分配的基本单位
    • 线程是处理器调度的基本单位
    • 线程不能独立于进程而存在
  11. 下列各种事件中,一定产生进程状态改变的事件是

    • 运行的进程正常退出
    • 运行的进程因种种原因而阻塞
    • 新进程创建成功
    • 阻塞的进程被唤醒
    • 运行的进程时间片用完
  12. 进程运行时,其硬件状态保存在相应寄存器中;当它被切换下CPU时,其硬件状态保存在内核栈中。(❌)

    将CPU硬件状态从一个进程换到另一个进程的过程称为上下文切换

    进程运行时,其硬件状态保存在CPU上的寄存器中,这些寄存器包括:程序计数器、程序状态寄存器、栈指针、通用寄存器、其他控制寄存器的值

    进程不运行时,这些寄存器的值保存在进程控制块PCB中;当操作系统要运行一个新的进程时,将PCB中的相关值送到对应的寄存器中

  13. 当某个正在执行的进程需要进行I/O操作时,可以通过调用挂起原语将自己从运行状态变为等待状态。(❌)

    阻塞原语

  14. 用户级线程执行时,同一进程不同线程的切换不需要内核支持。(✔️)

  15. 在支持线程的操作系统中,同一个进程中的各个线程共享该进程的用户栈。(❌)

    线程共享的环境包括:进程代码段、进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯)、进程打开的文件描述符、信号的处理器、进程的当前目录和进程用户ID与进程组ID

    堆:是大家共有的空间,分全局堆和局部堆。全局堆就是所有没有分配的空间,局部堆就是用户分配的空间。堆在操作系统对进程初始化的时候分配,运行过程中也可以向系统要额外的堆,但是记得用完了要还给操作系统,要不然就是内存泄漏。

    栈:是个线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,每个线程的栈互相独立,因此,栈是thread safe的。操作系统在切换线程的时候会自动的切换栈,就是切换SS/ESP寄存器。栈空间不需要在高级语言里面显式的分配和释放。

你可能感兴趣的:(第三周测验:进程线程模型)