zoukankan      html  css  js  c++  java
  • 操作系统基础-进程

    进程的创建

    四种基本的事件导致进程的创建:

    • 系统初始化
    • 正在执行的进程发出系统调用,创建一个活多个进程
    • 用户请求创建一个新进程
    • 一个批处理作业的初始化

    在全部的情形中,新进程都是因为一个以存在的进程运行了一个用与创建进程的系统调用而创建的。
    Unix 进程的创建:
    fork(系统调用)--> 创建一个与系统调用相同的副本 --> 子进程运行execve或一个类似的系统调用 --> 改动其存储映像并运行一个新的程序。 在调用fork后,父进程和子进程拥有相同的存储映像,相同的环境字符串,相同的打开文件。比如,当用户在shell中输入一个sort命令时,shell就创建一个子进程运行sort,之所以安排两步建立进程,是为了在fork之后但在execve之前同意该子进程处理其文件描写叙述符,这样能够完毕对标准输入,标准输出和标准出错的重定向。

    Windows 进程的创建:
    win32函数调用CreateProcess即处理进程的创建,也负责把正确的程序装入新的进程。该调用有10个參数,当中包含要运行的程序,输入给该程序的命令行參数,各种安全属性,有关打开的文件是否继承的控制位,优先级信息,为该进程所须要创建的窗体规格以及指向一个结构的指针,在该结构中新创建进程的信息被返回给调用者。处了CreateProcess win32中大约有100多个其它的函数用于处理进程的管理,同步以及相关的事物。

    进程的终止

    进程的终止通常由下列条件引起:

    • 正常退出(自愿)
    • 出错退出(自愿)
    • 严重错误(非自愿):运行了一条非法指令,引用不存在的内存,或是除数为0.有些系统中(unix),进程能够通知OS,它希望自行处理某些类型的错误。在这类错误中,进程会收到信号(被中断),而不是这类错误出现时终止。
    • 被其它进程杀死(非自愿):Unix(kill),Windows(TerminateProcess)。在有些系统中,当一个进程终结时,不论是自愿还是其它原因,该进程创建的进程也一律被马上杀死。可是Unix和Windows都不是这样的工作方式。

    进程的层次结构

    • 进程仅仅有一个父进程,可是能够有多个子进程。
    • 在Unix中,进程和它全部的子女进程及其后裔共同组成一个进程组(比如,unix中全部的进程都属于以init为根的一棵树)。当用户从键盘上发出一个消息的时候,该信号被送给当前与键盘相关的进程组的全部的成员,每一个成员能够捕获该信号,忽略该信号或者採取默认的动作,即该信号被杀死。
    • 在Windows中没有进程层次的概念,全部进程的地位都是同样的。在创建进程的时候父进程能够得到一个句柄用来控制子进程,可是父进程能够把句柄传递给某个进程,这样就不存在进程层次了。在Unix中,进程不能剥夺其子女的继承权。

    进程的状态

    进程的三种状态:

    • 执行态(该时刻进程实际占用CPU)
    • 就绪态(可执行,但由于其它进程正在执行而临时停止)
    • 堵塞态(除非某种外部事件发生,否则进程不能执行)

    状态的切换:

    • 执行-->堵塞:进程为等待输入而堵塞
    • 执行-->就绪:调度程序选择还有一个进程
    • 就绪-->执行:调度程序选择这个进程
    • 堵塞-->就绪:出现有效输入

    进程的实现

    为了实现进程模型,操作系统维护者一张表格即进程表。每一个进程占用一个进程表项,该表型包括了进程状态的重要信息。包括程序计数器,堆栈指针,内存分配状况,所打开文件的状态,账号和调度信息,以及其它进程由执行状态转到就绪或堵塞状态时必须保存的信息。进程表项的一些字段:

    • 进程管理:寄存器,程序计数器,程序状态字,堆栈指针,进程状态,优先级,调度參数,进程ID,父进程,进程组,信号,进程開始时间,使用的CPU时间,子进程的CPU时间,下次报警时间
    • 存储管理:代码段指针,数据段指针,堆栈段指针
    • 文件管理:根文件夹,工作文件夹,文件描写叙述符,用户ID,组ID

    进程的切换

    在某一时刻,一个正在执行的进程被中断,操作系统指定还有一个进程为执行态,并把控制权交给这个进程。进程切换能够在操作系统从当前正在执行的进程中获得控制权的不论什么时刻发生。那么什么时候进行进程切换?由三种类型进程中断机制:

    • 中断:当前指令的外部运行,对异步外部事件的反应。
    • 陷阱:与当前指令的运行相关,处理一个错误或异常条件。
    • 系统调用:显示请求,调用操作系统函数

    实际上,大多数操作系统区分两种类型的系统中断。一种称为中断,还有一种称为陷阱。前者与当前正在执行的进程无关的某种类型的外部事件相关,如完毕一次I/O 操作;后者与当前正在执行的进程所产生的错误或异常条件相关,如非法的文件訪问。对于普通中断,控制首先转移给中断处理器,它做一些主要的辅助工作,然后转到与已经发生的特定类型的中断相关的操作系统例程。 
    中断

    • 时钟中断:操作系统确定当前正在运行的进程的运行时间是否已经超过了最大同意时间段(时间片,即进程在被中断前能够运行的最大时间段),假设超过了,进程必须切换到就绪态,调入还有一个进程。
    • I/O 中断:操作系统确定是否发生了I/O 活动。假设I/O 活动是一个或多个进程正在等待的事件,操作系统就把全部对应的堵塞态进程转换到就绪态(堵塞/挂起态进程转换到就绪/挂起态),操作系统必须决定是继续运行当前处于运行态的进程,还是让具有高优先级的就绪态进程抢占这个进程。
    • 内存失效:处理器訪问一个虚拟内存地址,且此地址单元不在内存中时,操作系统必须从外存中把包括这个引用的内存块(页或段)调入内存中。在发出调入内存块的I/O 请求之后,操作系统可能会运行一个进程切换,以恢复还有一个进程的运行,发生内存失效的进程被置为堵塞态,当想要的块调入内存中时,该进程被置为就绪态。

    陷阱
    操作系统确定错误或异常条件是否是致命的。假设是,当前正在执行的进程被转换到退出态,并发生进程切换;假设不是,操作系统的动作取决于错误的种类和操作系统的设计,其行为能够是试图恢复或通知用户,操作系统可能会进行一次进程切换或者继续执行当前正在执行的进程。

    系统调用
    操作系统可能被来自正在运行的程序的系统调用激活。比如,一个用户进程正在运行,而且正在运行一条请求I/O 操作的指令,如打开文件,这个调用导致转移到作为操作系统代码一部分的一个例程上运行。通常,使用系统调用会导致把用户进程置为堵塞态。


    From: http://blog.csdn.net/liufei_learning/article/details/27229589

  • 相关阅读:
    Java并发初识
    go交叉编译
    MRC与ARC混合开发配置
    Hibernate配置文件
    LEFT JOIN重复数据
    Ext.ViewPort布局
    Hibernate学习映射文件
    AjaxMethod方法
    DataBinder
    subsonic 获取记录数量
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4213058.html
Copyright © 2011-2022 走看看