一.进程的概念
程序代码为文本段或代码段,只是被动的实体。
进程包括程序代码 和当前的活动,通过程序计数器,寄存器、堆栈段、 数据段 、堆等动态的资源
2.进程的状态
代表当前的活动 新的(正在被创建)、运行、等待、就绪、终止
注意等待和就绪的区别 等待是等某个事件的发生(如i/o完成或收到信号)而就绪是进程等待分配处理器
新的---》就绪----》运行---》终止 这是一个进程发生的标准过程
而等待状态在运行和就绪态之间发生 当有i/o操作或事件发生时,进程从运行态变为等待态,而当i/o操作或事件完成时候,进程又从等待状态变为就绪态。下图很重要
3.进程控制块
process control block 简称pcb
包括pid 进程状态 程序计数器 寄存器 内存界限 打开的文件列表 cpu调度信息 记账信息 io状态信息等
4.线程 同一个进程执行多个线程 同时执行
二 进程的调度
1.调度队列
作业队列包括系统中的所有进程。就绪态等待运行的进程保存在就绪队列中
用链表数据结构来表示作业队列
新建立的进程开始处于就绪队列,当进程被cpu执行时,可能会发生一下几种情况
a.进程可能发出一个io请求,并被放到io队列中
b.进程可能创建一个新的子进程,并等待其结束
c.进程可能会由于终端而强制释放cpu,并被放回到就绪队列中
前两种情况,进程最终从等待状态切换到就绪态,并放回到就绪队列中。
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
消息传递系统