zoukankan      html  css  js  c++  java
  • 进程

    一.进程的概念

    程序代码为文本段或代码段,只是被动的实体。
    进程包括程序代码   和当前的活动,通过程序计数器,寄存器、堆栈段、 数据段 、堆等动态的资源
    2.进程的状态
    代表当前的活动 新的(正在被创建)、运行、等待、就绪、终止
    注意等待和就绪的区别   等待是等某个事件的发生(如i/o完成或收到信号)而就绪是进程等待分配处理器
    新的---》就绪----》运行---》终止   这是一个进程发生的标准过程
    而等待状态在运行和就绪态之间发生   当有i/o操作或事件发生时,进程从运行态变为等待态,而当i/o操作或事件完成时候,进程又从等待状态变为就绪态。下图很重要
                            进程 - 骡子 - stupidmule@126 的博客

     3.进程控制块

    process control block   简称pcb
    包括pid   进程状态    程序计数器    寄存器   内存界限    打开的文件列表   cpu调度信息  记账信息   io状态信息等
    4.线程   同一个进程执行多个线程  同时执行
    二 进程的调度
    1.调度队列
    作业队列包括系统中的所有进程。就绪态等待运行的进程保存在就绪队列中   
    用链表数据结构来表示作业队列
    新建立的进程开始处于就绪队列,当进程被cpu执行时,可能会发生一下几种情况
    a.进程可能发出一个io请求,并被放到io队列中
    b.进程可能创建一个新的子进程,并等待其结束
    c.进程可能会由于终端而强制释放cpu,并被放回到就绪队列中
    进程 - 骡子 - stupidmule@126 的博客
     前两种情况,进程最终从等待状态切换到就绪态,并放回到就绪队列中。
    2.调度程序
    进程提交后被放到大容量存储设备的缓冲池中。长期调度程序从池中选择进程,并装入内存以准备执行。短期调度程序或cpu调度程序从准备执行的进程中选择进程。两个调度程序的主要差别是他们执行的频率。
    3.上下文切换
    进程的上下文用进程的pcb表示,包括cpu寄存器的值,进程状态和内存管理信息等。
    状态保存和状态恢复
    a b两个进程   从a切换到b进程
    a状态保存在pcb中,然后调度程序将b装入(改变b的pcb的状态项)。
    三.进程操作  资源包括cpu时间   内存    文件    io设备
    1.创建   pid唯一标识进程   
    时序:父子进程并发执行或者父进程等待子进程执行完后在执行
    地址:父子用相同的程序和数据或者子进程装入另外一个新程序
    父进程利用fork()系统调用生成子进程    返回值不同  父进程返回子进程的id号,而子进程返回0
    看实例  程序示例
    windows和unix系统的方法不同  注意
    2.进程终止
    exit()系统调用删除自身时,进程终止。此时进程返回状态值通常为整数到父进程。所有该进程占据的资源都被系统释放
    其他情况下也可以终止进程,只有父进程才能执行终止子进程的系统调用。标识符来确定
    终止的原因:
    a紫禁城使用了超过分配的资源    b分配给子进程的任务已经不再需要    c父进程退出
    父进程可以通过系统调用wait()以等待子进程的终止。wait返回终止子进程的进程标识符。
    级联终止的意思就是父进程退出,它的所有子进程都退出。
    四 进程间通信
    并发执行的进程可以是独立的或协作的进程。互相协作的进程需要一种进程间通信机制  ipc来允许进程相互交换数据与信息。
    两种基本模式   共享内存    消息传递
    消息传递对于交换较少数量的数据很有用,因为不需要避免冲突。
         A   共享内存系统
    两个进程将共享内存区的地址空间放到自己的进程地址空间中,此共享区域不受操作系统控制
    生产者和消费者模型   在此共享区中划分出一个缓冲区常驻在共享内存中,生产者产生一项,消费者使用另一项两者必须同步。
    缓冲分两类  一种是无限缓冲  大小无限制。有限缓冲,如果缓冲为空,消费者必须等待,如果缓冲为满,生产者必须等待。
    定义
    #define BUFFER_SIZE 10
    typedef struct{     }  item;
    item buffer[BUFFER_SIZE];
    int in=0;
    int out=0;
    共享缓冲是通过循环数组和两个逻辑指针来实现的 in 和out指针
    in为buffer中的下一个空位     out为buffer中的第一个满位
    while  in=out             buffer=empty
    while (in+1)%BUFFER_SIZE==out      buffer is full
    生产者进程   需要看循环队列中的判空和判满的方法
    intem nextproduced
    while(true){
    while(((in+1)%BUFFER_SIZE)==out)
    ;//此时buffer满 不做任何事
    buffer[in]=nextproduced;
    in=(in+1)%BUFFER_SIZE;
    }
    消费者进程
    item nextconsumed
    while(true){
    while(in==out);   //buffer为空时  不做
    nextconsumed=buffer[out];
    out=(out+1)%BUFFER_SIZE;
    }
    缓冲区项目最多为BUFFER_SIZE-1
    消息传递系统
  • 相关阅读:
    每日一题20180325
    Linux下MySQL表名区分大小写
    CentOS删除编译安装的Python3
    HTTPS配置
    测试 js 方法运行时间(转)
    使用dbutils进行批处理
    oracle生成主键
    JDBC学习笔记(10)——调用函数&存储过程(转)
    easyui Draggable
    blob
  • 原文地址:https://www.cnblogs.com/dongguolei/p/7902800.html
Copyright © 2011-2022 走看看