实验三:进程同步实验 一、实验任务: (1)掌握操作系统的进程同步原理; (2)熟悉linu x 的进程同步原语; (3)设计程序,实现经典进程同步问题。 二、实验原理: (1)P、V 操作 PV 操作由P 操作原语和V 操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下: P(S):①将信号量S 的值减1,即S=S-1; ②如果S³0,则 该 进程继 续 执 行;否 则 该 进程置 为 等 待 状 态 ,排 入 等 待 队 列 。 V(S):①将信号量S 的值加 1,即S=S+1; ②如果S>0,则 该 进程继 续 执 行;否 则 释 放 队 列 中第 一个 等 待 信号量的进程。 (2)信号量 信号量(semaphore)的数 据 结 构 为 一个 值和一个 指 针 ,指 针 指 向 等 待 该 信号量的下一个 进程。信号量的值与 相 应 资 源 的使 用 情 况 有 关 。当 它 的值大 于 0 时 ,表 示 当 前 可用 资 源 的数 量;当 它 的值小 于 0 时 ,其 绝 对值表 示 等 待 使 用 该 资 源 的进程个 数 。注 意 ,信号量的值仅能 由PV 操作来 改 变 。 一般 来 说 ,信号量S³0 时 ,S 表 示 可用 资 源 的数 量。执 行一次 P 操作意 味 着请求分配一个 单位资 源 ,因此S 的值减1;当 S<0 时 ,表 示 已经没有 可用 资 源 ,请求者必须等 待 别的进程释 放 该 类资 源 ,它 才能 运行下去。而执 行一个V 操作意 味 着释 放 一个 单位资 源 ,因此S的值加 1;若S£ 0,表 示 有 某些进程正在等 待 该 资 源 ,因此要唤醒一个 等 待 状 态 的进程,使之运行下去。 (3)linu x 的进程同步原语 ①wait();阻塞父进程,子 进程执 行; ②#include #include key_t ftok (char*pathname, char proj);它 返 回 与 路 径 pathname 相 对应 的一个 键值。 ③ int semget(key_t key, int nsems, int semflg) 参 数 key 是一个 键 值,由ftok 获 得 ,唯 一标 识 一个 信号灯 集 ,用 法 与 msgget()中的key相 同;参 数nsems 指 定打 开 或 者新 创 建 的信号灯 集 中将包 含 信号灯 的数 目 ;semflg 参 数 是一些标 志 位。参 数 key 和semflg 的取 值,以 及 何 时 打 开 ...