2023年山东大学计算机学院操作系统实验报告.pdf
《2023年山东大学计算机学院操作系统实验报告.pdf》由会员分享,可在线阅读,更多相关《2023年山东大学计算机学院操作系统实验报告.pdf(59页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、操 作 系 统 课 程 设 计 报 告 00 0 0 0 6 0000 0 0 0学 院:计 算 机 科 学 与 技 术 学 院 专 业:计 算 机 科 学 与 技 术 班 级:20*级*班 姓 名:*目 录-实 验 平 台.4二 P ro je c tl建 立 线 程 系 统.4Taskl.l 实 现 KThread.joinO.41.要 求.42.分 析.43.方 案.44.实 现 代 码.4Taskl.2利 用 中 断 提 供 原 子 性,直 接 实 现 条 件 变 量.61.要 求.62.分 析.63.方 案.74.实 现 代 码.7Taskl.3 实 现 waitUntil.91.要
2、 求.92.分 析.93.方 案.104.实 现 代 码.10Taskl.4用 条 件 变 量,不 使 用 信 号 量,实 现 同 步 发 送 接 收 消 息,speak,listen.121.要 求.122.分 析.133.方 案.134.实 现 代 码.14Taskl.5完 成 Priorityscheduler实 现 优 先 级 调 度.161.要 求.162.分 析.163.方 案.174.实 现 代 码.17L23.要 33123222三 P roject2多 道 程 序 设 计 32223333求 析 案 要 分 方 L23.41424243求 析 案 要 分 方 实 LZ3.4.
3、码 代 求 析 案 现 要 分 方 实 LZ3.45556655555求 析 案 现 要 分 方 实 LZ3.4.一 实 验 平 台 开 发 语 言:Jav a开 发 工 具:E clipse L u n a操 作 系 统:Ubuntul4.04=P r o j e c t l建 立 线 程 系 统 T a s k l.l 实 现 KTh r ead.join()1.规 定 实 现 Im plem ent KThread.join()函 数。注 意:其 它 的 线 程 不 必 调 用 join函 数,但 是 假 如 它 被 调 用 的 话,也 只 能 被 调 用 一 次。对 j。i n 函 数
4、 第 二 次 调 用 的 执 行 结 果 是 不 被 定 义 的(即 使 第 二 次 调 用 的 线 程 与 第 一 次 调 用 的 线 程 不 同 I2.分 析 J o in函 数 的 作 用 即 为 等 待 某 线 程 运 营 完 毕.当 前 线 程(唯 一 一 个 正 在 运 营 的 线 程)A调 用 另 一 个 线 程(处 在 就 绪 状 态)B的 j o i n 函 数 时(A 和 B在 N ach o s中 均 为 K T h re a d类 型 对 象),A 被 挂 起,直 到 B 运 营 结 束 后,j o i n 函 数 返 回,A 才 干 继 续 运 营。3.方 案 原 K
5、Thre a d 的 join()中 的 L ib.a ssertTrue(th i s!=c u rr e ntT h read)已 经 实 现 线 程 只 能 调 用 一 次 j oin()方 法,根 据 规 定,在 调 用 j。in()方 法 时,让 当 前 运 营 线 程 休 眠,并 将 当 前 运 营 的 线 程 加 入 到 一 个 阻 塞 队 列 中。在 线 程 结 束 时,finish。函 数 循 环 唤 醒 所 有 被 阻 塞 的 线 程。4.实 现 代 码public void jo in()Lib.debug(dbgTh read,Joi n ing to th re a
6、d:+t o S tringO);L i b.a sser t Tr u e(t his!=current T h r ead);bo ole a n in t S t a t u s=Mach i ne.i nterr u p t().disa b 1 e();if(s t a t u s!=statusFinished)(wait F orJo i n.waitForA c c e s s(cu r rentThread);ooKThread.sleep();)public static v o i d fin i sh()(oLib.d e bug(d bgTh read,F inish
7、ing threa d:+cu r r entTh read.toString();Machine.i n terrupt().di s able();Ma c h in e.a u toGrader().finishingC u rre ntTh r ea d();Lib.assertTrue(to B e Dest r o y e d=n u II);toBeDe s t r oyed=currentTh rea d;o c u r rent T h r e ad.st atus=s tatusFin i s hed;KThread wa i tThr e ad;whi 1 e(wa i
8、tThread=c u r re n t Thr e a d.w a i tForJ o i n.nextThr e a d()!=nu 1 1)(w a i tThread.r ead y();0)s 1 e e p();)T a s k l.2 运 用 中 断 提 供 原 子 性,直 接 实 现 条 件 变 量 1.规 定 通 过 运 用 中 断 有 效 和 无 效 所 提 供 的 原 子 性 实 现 条 件 变 量。我 们 已 经 提 供 类 似 的 例 子 用 例 实 现 信 号 量。你 要 按 此 提 供 类 似 的 条 件 变 量 的 实 现,不 能 直 接 运 用 信 号 量 来
9、 实 现(你 可 以 使 用 Io c k,虽 然 它 间 接 地 调 用 了 信 号 量)。在 你 完 毕 时 要 提 供 条 件 变 量 的 两 种 实 现 方 法。你 的 第 二 种 条 件 变 量 实 现 要 放 在 n ach o s.th r e ads.Conditio n 2 中。2.分 析 t hread s.L o c k类 提 供 了 锁 以 保 证 互 斥.在 临 界 代 码 区 的 两 端 执 行 Loc k.ac q u i r e()和 L。c k.relea s e()即 可 保 证 同 时 只 有 一 个 线 程 访 问 临 界 代 码 区.条 件 变 量 建
10、 立 在 锁 之 上,由 th re a d s.C o n d i t io n实 现,它 是 用 来 保 证 同 步 的 工 具.每 一 个 条 件 变 量 拥 有 一 个 锁 变 量(该 锁 变 量 亦 可 被 执 行 a cq u ire和 r e le a s e 操 作,多 个 条 件 变 量 可 共 享 同 一 个 锁 变 量).当 处 在 临 界 区 内 的 拥 有 某 锁 L的 当 前 线 程 对 与 锁 L联 系 的 条 件 变 量 执 行 sleep操 作 时,该 线 程 失 去 锁 L 并 被 挂 起.下 一 个 等 待 锁 L 的 线 程 获 得 锁 L(这 个 过
11、程 由 调 度 程 序 完 毕)并 进 入 临 界 区.当 拥 有 锁 L 的 临 界 区 内 的 当 前 线 程 对 与 锁 L联 系 的 条 件 变 量 执 行 w a k e 操 作 时(通 常 调 用 w ake之 后 紧 接 着 就 是 Loc k.r e 1 e a s e),等 待 在 该 条 件 变 量 上 的 之 多 一 个 被 挂 起 的 线 程(由 调 用 s le e p引 起)被 重 新 唤 醒 并 设 立 为 就 绪 状 态.若 执 行 w a k e a ll操 作,则 等 待 在 该 条 件 变 量 上 的 所 有 被 挂 起 的 线 程 都 被 唤 醒.3.方
12、 案 cond i tion.sle e p 采 用 waiter.P()实 现 休 眠(wai t or 是 一 个 信 号 量)并 将 w aitor放 入 信 号 量 队 列,在 我 们 的 实 现 中 改 成 用 KTh read.sle ep()实 现 休 眠 并 将 当 前 线 程 放 入 线 程 队 列,并 在 slee p函 数 开 始/结 尾 处 屏 蔽/允 许 中 断 以 保 证 原 子 性。cond i t i o n.w a k e 中 从 等 待 信 号 量 队 列 中 取 出 信 号 量 并 对 其 进 行 V 操 作 实 现 唤 醒,在 我 们 的 实 现 中 改
13、 成 从 线 程 队 列 中 取 出 线 程 用 KThread.r eady()实 现 唤 醒(同 样 要 在 w a k e函 数 开 始/结 尾 处 屏 蔽;允 许 中 断)。w akeall函 数 的 实 现 依 赖 于 w a k e().只 需 不 断 地 w a k e直 到 队 列 为 空 为 止.4.实 现 代 码 p rivate T h readQueu e wai t Queue=Thre a dedK e mel.s c he d u 1 e r.newTh r e a d Queu e(false);p r ivat e bool ean hasW a i te r
14、=fal s e;pub 1 ic v oid slee p()Lib.assertT r u e(cond i t i on Lock.isHeld B y C u r ren t Thread();boolean i nt Status=M a c hine.in t e r ru p t().dis a ble();w a itQu e u e.wa i tForAc c ess(KThrea d.c u rre n t T h re a d();hasWa i t e r=tru e;c ond i t i o n L o c k.rele a se();K T h re a d.s
15、ie e p();c onditi o nLock.a c quire();Machin e.interrup t().r es t ore(intStat u s);)pu blic v o i d wa k e()(L i b.a s s e r tT ru e(co n d itionLock.isHeldByCurrentThread();0boole a n intSt a tu s=Machin e.i nter r u pt().disableQ;KTh read thread waitQu e u e.nextThrea d();i f(thread!=n u II)threa
16、d,r ea d y();e 1 seh a sWaite r=fal s e;0Ma c hine.i nterru p t().resto r e(i n t Stat u s);)publ i c void wa k e A II()(L i b.assertT rue(condition L ock.isHe 1 dByC u rrentThre a d();wh i 1 e(h asWaiter)w ake();)T askl.3 实 现 wai t Until1.规 定 通 过 实 现 wa i t U n t i l(i n t x)方 法 来 完 毕 Ala r m 类。2.分
17、 析 一 个 线 程 通 过 调 用 wai t U n til函 数 来 挂 起 它 自 己 直 到 n ow+x 后 才 被 唤 醒。在 实 时 操 作 中,对 线 程 是 非 常 有 用 的,例 如 实 现 光 标 每 秒 的 闪 烁。这 里 并 不规 定 线 程 被 唤 醒 后 立 即 执 行 它,只 是 在 它 等 待 了 指 定 期 间 后 将 它。放 入 等 待 队 列 中。不 要 通 过 产 生 任 何 附 加 的 线 程 来 实 现 wai t U n ti 1 函 数,你 仅 需 要 修 改 w aitU ntil函 数 和 时 间 中 断 解 决 程 序。w a it U
18、 n til函 数 并 不 仅 限 于 一 个 线 程 使 用 在 任 意 时 间,任 意 多 的 线 程 可 以 调 用 它 来 阻 塞 自 己。3.方 案 于 Al a r m 类 有 关 的 是 machi n e.Tim e r 类.它 在 大 约 每 500个 时 钟 滴 答 使 调 用 回 调 函 数(由 T i m e r.s e tl nterruptHand 1 e r 函 数 设 立).因 此 A 1 arm类 的 构 造 函 数 中 一 方 面 要 设 立 该 回 调 函 数 Ala r m.timerl n t errup t().为 了 实 现 w a i tUnti
19、 1,需 要 在 Al a r m类 中 实 现 一 个 内 部 类 W a ite r,保 存 等 待 的 线 程 及 其 唤 醒 时 间.在 调 用 w a itU n til(x)函 数 时,一 方 面 得 到 关 于 该 线 程 的 信 息:(线 程:当 前 线 程,唤 醒 时 间:当 前 时 间+x),然 后 构 造 新 的 Waite r 对 象,并 调 用 s le e p操 作 使 当 前 线 程 挂 起.在 时 钟 回 调 函 数 中(大 约 每 5 0 0 个 时 钟 间 隔 调 用 一 次)则 依 次 检 查 队 列 中 的 每 个 对 象。假 如 唤 醒 时 间 大 于
20、 当 前 时 间,则 将 该 对 象 移 出 队 列 并 执 行 wa k e操 作 将 相 应 线 程 唤 醒。4.实 现 代 码 class Wa i ter(Wai t er(1 ong wa k eTime,KThrea d threa d)(0 t h i s.wak e Tim e=wa k eT i me;0 t h i s.t hread=thread;)p r i v a te 1 ong wa k eTime;private KTh r ea d th r ead;)pub 1 i c void waitUntil(long x)(boole a n intSta t us
21、=Mach i ne.i n ter r u p t().d i sable();A o ng wake T i me=Ma c h i ne.time r().g etTime()+x;Waiter w a it e r=new W aite r(wake T ime,KThr e ad.c u r r e n t Thread();ow a itli s t.a dd(w a it e r);System.out.p r in 11 n(KTh r ead.cu r re n t Th read().g e tN a m e()。+线 程 休 眠,时 间 为 厂+Machine.timer
22、O.ge t Time()+,应 当 在。+wakeT i me+醒 来.);oKThread.s 1 ee p();M a chine.inte r r u p t().r e sto r e(in t Sta tus);)p u b li c vo i d t imerlnterru p t()Wa i ter wai t e r;fo r(in t i=0;iwaitlist.size();i+)wa i ter=wai 11 i s t.remov e();if(wa i t e r.wakeTime=Ma c hi n e.timer().g e t Tim e()(System.o
23、ut.pri n tln(唤 醒 线 程:+w a iter.th r e a d.g etN am e()+,时 间 为:+M a c h i ne.timer().g etTimeO);。w a ite r.t h r ead.r ead y();/线 程 进 入 就 绪 状 态)e Isewai t lis t.ad d(waiter);)KThread.c u rrentTh r ead().y i eld();)p ri v ate Li n k edList waitl i st;Ta s k l.4 用 条 件 变 量,不 使 用 信 号 量,实 现 同 步 发 送 接 受 消
24、息,s pea k,I i sten1.规 定使 用 条 件 变 量 来 实 现 一 个 字 长 信 息 的 发 送 和 接 受 同 步。使 用 v。i d s p e ak(i nt word)和 i nt liste n()函 数 来 实 现 通 讯(Commun i c a to r)类 的 通 讯 操 作。speak函 数 具 有 原 子 性,在 相 同 地 C ommunica t or类 中 档 待 listen函 数 被 调 用,然 后 将 此 字 发 生 给 listen函 数。一 旦 传 送 完 毕,两 个 函 数 都 返 回(1isten函 数 返 回 此 字“2.分 析
25、对 一 个 Commun i ca t o r类 的 对 象 c,线 程 A 先 调 用 c.spea ker(x)发 送 一 个 字 后 被 挂 起,直 到 另 一 线 程 B调 用 c.listen()收 到 这 个 字 x后,A和 B同 时 返 回.类 似 地,线 程 B先 调 用 c.1 i st e n(x)后 被 挂 起,直 到 另 一 线 程 B调 用 c.s p e a k e r(x)发 送 一 个 字 后,A 和 B同 时 返 回.同 时 需 要 注 旨 在 一 个 C。mm u nica t o r上 有 多 个 s pak e r和 lis t ener的 情 形.此
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2023 山东大学 计算机 学院 操作系统 实验 报告
限制150内