-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
600 lines (399 loc) · 64.7 KB
/
index.html
File metadata and controls
600 lines (399 loc) · 64.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Hexo</title>
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta property="og:type" content="website">
<meta property="og:title" content="Hexo">
<meta property="og:url" content="http://example.com/index.html">
<meta property="og:site_name" content="Hexo">
<meta property="og:locale" content="en_US">
<meta property="article:author" content="John Doe">
<meta name="twitter:card" content="summary">
<link rel="alternate" href="/atom.xml" title="Hexo" type="application/atom+xml">
<link rel="shortcut icon" href="/favicon.png">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/typeface-source-code-pro@0.0.71/index.min.css">
<link rel="stylesheet" href="/css/style.css">
<link rel="stylesheet" href="/fancybox/jquery.fancybox.min.css">
<meta name="generator" content="Hexo 6.1.0"></head>
<body>
<div id="container">
<div id="wrap">
<header id="header">
<div id="banner"></div>
<div id="header-outer" class="outer">
<div id="header-title" class="inner">
<h1 id="logo-wrap">
<a href="/" id="logo">Hexo</a>
</h1>
</div>
<div id="header-inner" class="inner">
<nav id="main-nav">
<a id="main-nav-toggle" class="nav-icon"></a>
<a class="main-nav-link" href="/">Home</a>
<a class="main-nav-link" href="/archives">Archives</a>
</nav>
<nav id="sub-nav">
<a id="nav-rss-link" class="nav-icon" href="/atom.xml" title="RSS Feed"></a>
<a id="nav-search-btn" class="nav-icon" title="Search"></a>
</nav>
<div id="search-form-wrap">
<form action="//google.com/search" method="get" accept-charset="UTF-8" class="search-form"><input type="search" name="q" class="search-form-input" placeholder="Search"><button type="submit" class="search-form-submit"></button><input type="hidden" name="sitesearch" value="http://example.com"></form>
</div>
</div>
</div>
</header>
<div class="outer">
<section id="main">
<article id="post-myreport" class="h-entry article article-type-post" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting">
<div class="article-meta">
<a href="/2023/05/10/myreport/" class="article-date">
<time class="dt-published" datetime="2023-05-09T16:01:57.000Z" itemprop="datePublished">2023-05-10</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="p-name article-title" href="/2023/05/10/myreport/">myreport</a>
</h1>
</header>
<div class="e-content article-entry" itemprop="articleBody">
<p>hexo部署一篇操作系统实验报告:</p>
<p></p>
<p>插入图片路径存在问题,导致图片无法显示,故此篇尝试解决,成功。</p>
<p></p>
<p>要添加图片,先npm install 一个hexo-asset-image的依赖:</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install https://github.com/CodeFalling/hexo-asset-image --save</span><br></pre></td></tr></table></figure>
<p>然后把_config.yml中的post_asset_folder设为true,这个配置的意思是每次new post一个博客,会增加一个和博客同名的文件夹。</p>
<p>这次再尝试,通过。</p>
</div>
<footer class="article-footer">
<a data-url="http://example.com/2023/05/10/myreport/" data-id="clhggyb500000mc8f9feh29ry" data-title="myreport" class="article-share-link">Share</a>
<ul class="article-tag-list" itemprop="keywords"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/" rel="tag">实验报告</a></li></ul>
</footer>
</div>
</article>
<article id="post-myhomework" class="h-entry article article-type-post" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting">
<div class="article-meta">
<a href="/2023/05/08/myhomework/" class="article-date">
<time class="dt-published" datetime="2023-05-08T01:17:00.000Z" itemprop="datePublished">2023-05-08</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="p-name article-title" href="/2023/05/08/myhomework/">myhomework</a>
</h1>
</header>
<div class="e-content article-entry" itemprop="articleBody">
<table>
<thead>
<tr>
<th><strong>课程名称</strong>:操作系统</th>
<th><strong>年级</strong>:2020级</th>
<th><strong>上机实践成绩</strong>:</th>
</tr>
</thead>
<tbody><tr>
<td><strong>指导教师</strong>:翁楚良</td>
<td><strong>姓名</strong>:陈柏延</td>
<td><strong>学号</strong>:10205501441</td>
</tr>
<tr>
<td><strong>上机实践名称</strong>:Minix3-进程管理</td>
<td><strong>上机实践日期</strong>:2022.3.25</td>
<td></td>
</tr>
<tr>
<td><strong>上机实践编号</strong>:02</td>
<td><strong>组号</strong>:</td>
<td><strong>上机实践时间</strong>:2022.3.25</td>
</tr>
</tbody></table>
<h1 id="OS-Project2"><a href="#OS-Project2" class="headerlink" title="OS-Project2"></a>OS-Project2</h1><h2 id="一、实验目的"><a href="#一、实验目的" class="headerlink" title="一、实验目的"></a>一、实验目的</h2><ol>
<li><p>巩固操作系统的进程调度机制和策略</p>
</li>
<li><p>熟悉 MINIX 系统调用和 MINIX 调度器的实现</p>
</li>
<li><p>熟悉安装和调试MINIX3.3.0操作系统 </p>
</li>
<li><p>巩固操作系统通过串口输出信息</p>
</li>
</ol>
<h2 id="二、实验环境"><a href="#二、实验环境" class="headerlink" title="二、实验环境"></a>二、实验环境</h2><ul>
<li>物理机:MacOS 11.6</li>
<li>虚拟机:Minix 3</li>
<li>虚拟机软件:Vmware</li>
<li>物理机通过ssh远程连接虚拟机</li>
<li>代码搜索与编辑:vscode</li>
<li>物理机与虚拟机间文件传输:FileZilla</li>
</ul>
<h2 id="三、实验要求"><a href="#三、实验要求" class="headerlink" title="三、实验要求"></a>三、实验要求</h2><p><strong>在MINIX3中实现Earliest-Deadline-First近似实时调度功能</strong></p>
<ol>
<li>提供设置进程执行期限的系统调==chrt(long deadline)==,用于将调用该系统调用的进程设为实时进程,其执行的期限为:从调用处开始deadline秒。</li>
</ol>
<p> 实现时示例:</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><unistd.h></span></span></span><br><span class="line">......</span><br><span class="line">chrt(<span class="number">10</span>);<span class="comment">/* 该程序将可以运行的最长时间为10秒,若没有运行结束,则 强制结束*/</span></span><br><span class="line">......</span><br></pre></td></tr></table></figure>
<p> chrt的定义: int chrt(long deadline);</p>
<p> /*deadline 是最后期限值(秒),返回值1表示成功,返回值0表示该调用出错 */</p>
<ol start="2">
<li>在内核进程表中需要增加一个条目,用于表示进程的实时属性; 修改相关代码,新增一个系统调用chrt,用于设置其进程表中的 实时属性。</li>
<li>修改proc.c和proc.h中相关的调度代码,<font color="red">实现最早deadline的用户进程相对于其它用户进程具有更高的优先级,从而被优先调度运行。</font></li>
<li>在用户程序中,可以在不同位置调用多次chrt系统调用,在未到 deadline之前,调用chrt将会改变该程序的deadline。</li>
<li>未调用chrt的程序将以普通的用户进程(非实时进程)在系统中运行。</li>
</ol>
<h2 id="四、实现过程"><a href="#四、实现过程" class="headerlink" title="四、实现过程"></a>四、实现过程</h2><blockquote>
<p>实现过程可分为==增加系统调用chrt部分==与==更改与deadline相关的进程调度部分。==</p>
</blockquote>
<p>准备过程:先在虚拟机中下载minix3.3.0源码,编译生成新的kernel后重启虚拟机。为了便于修改代码及观察代码各层之间的关系,将关键文件通过FileZilla上传至物理机,通过vscode观察调用关系、全局搜索。</p>
<p>如图:<img src="/Users/chenboyan/Library/Application Support/typora-user-images/截屏2022-04-16 上午10.10.30.png" alt="截屏2022-04-16 上午10.10.30" style="zoom:40%;">接下来按照应用层、服务层、内核层、进程调度的顺序依次更改源代码。</p>
<h3 id="增加系统调用chrt"><a href="#增加系统调用chrt" class="headerlink" title="增加系统调用chrt"></a>增加系统调用chrt</h3><blockquote>
<p>MINIX3中的系统调用结构分成三个层次:<font color="red">应用层、服务层、内核层</font>。在这三层中分别进行代码修改,实现系统调用chrt的信息传递。从应用层用_syscall将信息传递到服务层,在服务层用 _kernel_call将信息传递到内核层,在内核层对进程结构体增加 deadline成员。</p>
</blockquote>
<h4 id="应用层"><a href="#应用层" class="headerlink" title="应用层"></a>应用层</h4><p>从应用层用_syscall将信息传递到服务层,用户调用 chrt 系统调用,将 deadline 传入到服务层。需要添加的系统调用chrt可以定义在unistd头文件中, 并在libc中添加chrt函数体实现 。</p>
<ol>
<li>在<font color="brown"><code>/usr/src/include/unistd.h</code> </font>中添加chrt函数定义(直接添加函数定义即可)。</li>
</ol>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> <span class="title function_">chrt</span><span class="params">(<span class="type">long</span> )</span>;</span><br></pre></td></tr></table></figure>
<ol start="2">
<li>在<font color="brown"><code>/usr/src/minix/lib/libc/sys/chrt.c</code></font>中添加chrt函数实现,用alarm函数实现超时强制终止。参照该文件夹下fork.c文件,在实现中通过<code>_syscall</code>(调用号)传递到服务层。</li>
</ol>
<p>**<code>_syscall(PM_PROC_NR,PM_CHRT,&m)</code>**中调用的服务为将 deadline 放入消息结构体,由于deadline存的数据类型为long,所以在message消息结构体中寻找long型,利用vscode寻找得到message结构体定义在<font color="brown"><code>/usr/src/minix/include/minix/ipc.h</code></font>中,m2l1为结构体中的long类型,且查找到<font color="brown"><code>#define m2_l1 m_m2.m2l1</code></font>宏定义,因此将deadline存入m2_l1。</p>
<p> <img src="/Users/chenboyan/Library/Application Support/typora-user-images/截屏2022-04-16 上午10.46.37.png" alt="截屏2022-04-16 上午10.46.37" style="zoom:50%;"></p>
<p><font color="red"><strong>注</strong>:加上当前时间是要记录进程终止时间赋值给 deadline,保证每次调用的进程是当前剩余运行时间最少的。</font></p>
<p>chrt函数实现如下</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><sys/cdefs.h></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"namespace.h"</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><lib.h></span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><string.h></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><unistd.h></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><stdio.h></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><time.h></span></span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="title function_">chrt</span><span class="params">(<span class="type">long</span> deadline)</span>{</span><br><span class="line"> <span class="class"><span class="keyword">struct</span> <span class="title">timeval</span> <span class="title">tv</span>;</span><span class="comment">//使用来获得时间</span></span><br><span class="line"> <span class="class"><span class="keyword">struct</span> <span class="title">timezone</span> <span class="title">tz</span>;</span><span class="comment">//是用来获得时区</span></span><br><span class="line"> message m;</span><br><span class="line"> <span class="built_in">memset</span>(&m,<span class="number">0</span>,<span class="keyword">sizeof</span>(m));</span><br><span class="line"> <span class="comment">//设置alarm</span></span><br><span class="line"> alarm((<span class="type">unsigned</span> <span class="type">int</span>)deadline);</span><br><span class="line"> <span class="keyword">if</span>(deadline><span class="number">0</span>){</span><br><span class="line"> gettimeofday(&tv,&tz);<span class="comment">//用来获取当前的时间的函数</span></span><br><span class="line"> deadline = tv.tv_sec + deadline; </span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//存deadline</span></span><br><span class="line"> m.m2_l1=deadline;</span><br><span class="line"> <span class="comment">//把m传到服务层当中去</span></span><br><span class="line"> <span class="keyword">return</span>(_syscall(PM_PROC_NR,PM_CHRT,&m));</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<ol start="3">
<li>在<font color="brown"><code>/usr/src/minix/lib/libc/sys</code></font>中 <code>Makefile.inc</code>文件添加chrt.c条目</li>
</ol>
<img src="/Users/chenboyan/Library/Application Support/typora-user-images/截屏2022-04-16 上午10.30.01.png" alt="截屏2022-04-16 上午10.30.01" style="zoom:50%;">
<p>每一次添加C文件后,要在同目录下Makefile.inc中添加条目。</p>
<h4 id="服务层"><a href="#服务层" class="headerlink" title="服务层"></a>服务层</h4><p>需要向MINIX系统的进程管理服务中注册chrt,使得 chrt服务可以向应用层提供deadline 。</p>
<ol>
<li>在<font color="brown"><code>/usr/src/minix/servers/pm/proto.h</code></font>中添加do_chrt函数定义。</li>
</ol>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> <span class="title function_">do_chrt</span><span class="params">(<span class="type">void</span>)</span>;</span><br></pre></td></tr></table></figure>
<ol start="2">
<li>在<font color="brown"><code>/usr/src/minix/servers/pm/chrt.c</code></font>中添加do_chrt函数,<code>do_chrt</code> 的功能是调用 <code>sys_chrt()</code>函数,属于内核调用,who_p 是传递进程号,消息结构体传递 deadline 内容。</li>
</ol>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">"pm.h"</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string"><minix/syslib.h></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string"><minix/callnr.h></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string"><sys/wait.h></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string"><minix/com.h></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><minix/vm.h></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"mproc.h"</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><sys/ptrace.h></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><sys/resource.h></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><signal.h></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><stdio.h></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string"><minix/sched.h></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><assert.h></span></span></span><br><span class="line"><span class="type">int</span> <span class="title function_">do_chrt</span><span class="params">()</span></span><br><span class="line">{</span><br><span class="line"> <span class="comment">// who_p 是用来获取进程信息的,类型是endpoint_t;m_in.m2_l1就是deadline</span></span><br><span class="line"> sys_chrt(who_p, m_in.m2_l1); </span><br><span class="line"> <span class="keyword">return</span> (OK); <span class="comment">//OK宏定义为0</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<ol start="3">
<li>在<font color="brown"><code>/usr/src/minix/include/minix/callnr.h</code></font>中定义PM_CHRT编号,用来帮助应用层的系统调用能找到。</li>
</ol>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* Message type 0 is traditionally reserved. */</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_EXIT (PM_BASE + 1)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_FORK (PM_BASE + 2)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_WAITPID (PM_BASE + 3)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_GETPID (PM_BASE + 4)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_SETUID (PM_BASE + 5)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_GETUID (PM_BASE + 6)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_STIME (PM_BASE + 7)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_PTRACE (PM_BASE + 8)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_SETGROUPS (PM_BASE + 9)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_GETGROUPS (PM_BASE + 10)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_KILL (PM_BASE + 11)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_SETGID (PM_BASE + 12)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_GETGID (PM_BASE + 13)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_EXEC (PM_BASE + 14)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_SETSID (PM_BASE + 15)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_GETPGRP (PM_BASE + 16)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_ITIMER (PM_BASE + 17)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_GETMCONTEXT (PM_BASE + 18)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_SETMCONTEXT (PM_BASE + 19)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_SIGACTION (PM_BASE + 20)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_SIGSUSPEND (PM_BASE + 21)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_SIGPENDING (PM_BASE + 22)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_SIGPROCMASK (PM_BASE + 23)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_SIGRETURN (PM_BASE + 24)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_SYSUNAME (PM_BASE + 25)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_GETPRIORITY (PM_BASE + 26)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_SETPRIORITY (PM_BASE + 27)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_GETTIMEOFDAY (PM_BASE + 28)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_SETEUID (PM_BASE + 29)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_SETEGID (PM_BASE + 30)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_ISSETUGID (PM_BASE + 31)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_GETSID (PM_BASE + 32)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_CLOCK_GETRES (PM_BASE + 33)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_CLOCK_GETTIME (PM_BASE + 34)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_CLOCK_SETTIME (PM_BASE + 35)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_GETRUSAGE (PM_BASE + 36)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_REBOOT (PM_BASE + 37)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_SVRCTL (PM_BASE + 38)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_SPROF (PM_BASE + 39)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_CPROF (PM_BASE + 40)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_SRV_FORK (PM_BASE + 41)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_SRV_KILL (PM_BASE + 42)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_EXEC_NEW (PM_BASE + 43)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_EXEC_RESTART (PM_BASE + 44)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_GETEPINFO (PM_BASE + 45)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_GETPROCNR (PM_BASE + 46)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_GETSYSINFO (PM_BASE + 47)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PM_CHRT (PM_BASE + 48)</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> NR_PM_CALLS 49 <span class="comment">/* highest number from base plus one */</span></span></span><br></pre></td></tr></table></figure>
<ol start="4">
<li>在<font color="brown"><code>/usr/src/minix/servers/pm/Makefile</code></font>中添加chrt.c条目。</li>
</ol>
<img src="/Users/chenboyan/Library/Application Support/typora-user-images/截屏2022-04-16 上午11.11.04.png" alt="截屏2022-04-16 上午11.11.04" style="zoom:50%;">
<ol start="5">
<li>在<font color="brown"><code>/usr/src/minix/servers/pm/table.c </code></font>中调用映射表。</li>
</ol>
<img src="/Users/chenboyan/Library/Application Support/typora-user-images/截屏2022-04-16 上午11.14.54.png" alt="截屏2022-04-16 上午11.14.54" style="zoom:50%;">
<ol start="6">
<li>在<font color="brown"><code>/usr/src/minix/include/minix/syslib.h</code></font> 中添加sys_ chrt () 定义。</li>
</ol>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> <span class="title function_">sys_chrt</span><span class="params">(<span class="type">endpoint_t</span> proc_ep,<span class="type">long</span> deadline)</span>;</span><br></pre></td></tr></table></figure>
<ol start="7">
<li><p>在<font color="brown"><code>/usr/src/minix/lib/libsys/sys_chrt.c</code></font> 中添加sys_chrt () 实现。</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"syslib.h"</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="title function_">sys_chrt</span><span class="params">(proc_ep,deadline)</span></span><br><span class="line"><span class="type">endpoint_t</span> proc_ep; <span class="comment">/* process doing the chrt */</span></span><br><span class="line"><span class="type">long</span> deadline; <span class="comment">/*set the deadline*/</span></span><br><span class="line">{</span><br><span class="line"><span class="comment">/* A process got the deadline. Tell the kernel. */</span></span><br><span class="line"> message m;</span><br><span class="line"> <span class="type">int</span> r;</span><br><span class="line"> m.m2_i1 = proc_ep;<span class="comment">//int</span></span><br><span class="line"> m.m2_l1 = deadline;<span class="comment">//long</span></span><br><span class="line"></span><br><span class="line"> r = _kernel_call(SYS_CHRT, &m);</span><br><span class="line"> <span class="comment">//和syscall一样,通过SYS_CHRT和do_chrt的映射,把message传入内核层并调用do_chrt修改进程信息</span></span><br><span class="line"> <span class="keyword">return</span> r;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
</li>
<li><p>在<font color="brown"><code>/usr/src/minix/lib/libsys</code></font> 中的Makefile中添加sys_chrt.c条目。</p>
</li>
</ol>
<img src="/Users/chenboyan/Library/Application Support/typora-user-images/截屏2022-04-16 上午11.19.42.png" alt="截屏2022-04-16 上午11.19.42" style="zoom:50%;">
<h4 id="内核层"><a href="#内核层" class="headerlink" title="内核层"></a>内核层</h4><p>在MINIX内核中实现进程调度功能,此处可以<font color="red">直接修改内核信息</font>,例如进程的截至时间。</p>
<ol>
<li>在<font color="brown"><code>/usr/src/minix/kernel/system.h</code></font>中添加do_chrt函数定义。</li>
</ol>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> <span class="title function_">do_chrt</span><span class="params">(<span class="keyword">struct</span> proc * caller, message *m_ptr)</span>;</span><br><span class="line"><span class="meta">#<span class="keyword">if</span> ! USE_CHRT</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> do_chrt NULL</span></span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br></pre></td></tr></table></figure>
<ol start="2">
<li>在<font color="brown"><code>/usr/src/minix/kernel/system/do_chrt.c</code></font>中添加do_chrt函数实现。参考该文件下的do_fork文件,修改调用者进程信息。</li>
</ol>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">pid_t</span> <span class="title function_">fork</span><span class="params">(<span class="type">void</span>)</span> {</span><br><span class="line"> <span class="keyword">return</span>(_syscall(PM_PROC_NR, PM_FORK, &m)); }</span><br></pre></td></tr></table></figure>
<p>用消息结构体中的进程号,通过 proc_addr 定位内核中进程地址,然后 将消息结构体中的 deadline 赋值给该进程的deadline(这里已经在 proc 头文件中添加了该成员变量)。</p>
<ol start="3">
<li>在<font color="brown"><code>/usr/src/minix/kernel/system/</code></font> 中Makefile.inc文件添加do_chrt.c条目。</li>
</ol>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"kernel/system.h"</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"kernel/vm.h"</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><signal.h></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><string.h></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><assert.h></span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><minix/endpoint.h></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><minix/u64.h></span></span></span><br><span class="line"><span class="type">int</span> <span class="title function_">do_chrt</span><span class="params">(<span class="keyword">struct</span> proc *caller, message *m_ptr)</span></span><br><span class="line">{</span><br><span class="line"> <span class="class"><span class="keyword">struct</span> <span class="title">proc</span> *<span class="title">rp</span>;</span></span><br><span class="line"> <span class="type">long</span> exp_time;</span><br><span class="line"> exp_time = m_ptr->m2_l1;</span><br><span class="line"> <span class="comment">//通过 proc_addr 定位内核中进程地址</span></span><br><span class="line"> rp = proc_addr(m_ptr->m2_i1);</span><br><span class="line"> <span class="comment">//将消息结构体中的deadline 赋值给该进程的deadline(结构体中的)</span></span><br><span class="line"> rp->deadline = exp_time;</span><br><span class="line"> <span class="keyword">return</span> (OK);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<ol start="4">
<li>在<font color="brown"><code>/usr/src/minix/include/minix/com.h</code></font>中定义SYS_CHRT编号。</li>
</ol>
<img src="/Users/chenboyan/Library/Application Support/typora-user-images/截屏2022-04-16 下午5.01.51.png" alt="截屏2022-04-16 下午5.01.51" style="zoom:50%;">
<ol start="5">
<li>在<font color="brown"><code>/usr/src/minix/kernel/system.c</code></font> 中添加SYS_CHRT编号到do_chrt的映射。</li>
</ol>
<img src="/Users/chenboyan/Library/Application Support/typora-user-images/截屏2022-04-10 上午9.40.00.png" alt="截屏2022-04-10 上午9.40.00" style="zoom:50%;">
<ol start="6">
<li>在<font color="brown"><code>/usr/src/minix/commands/service/parse.c</code></font>的system_tab中添加名称编号对。</li>
</ol>
<img src="/Users/chenboyan/Library/Application Support/typora-user-images/截屏2022-04-16 下午5.05.49.png" alt="截屏2022-04-16 下午5.05.49" style="zoom:50%;">
<ol start="7">
<li>在<font color="brown"><code> /usr/src/minix/kernel/config.h</code></font>中添加 <code>USE_CHRT</code></li>
</ol>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">define</span> USE_CHRT 1</span></span><br><span class="line"><span class="comment">/* It allows to set sizes of some</span></span><br><span class="line"><span class="comment"> * kernel buffers and to enable or disable debugging code, timing features, </span></span><br><span class="line"><span class="comment"> * and individual kernel calls.*/</span></span><br></pre></td></tr></table></figure>
<h3 id="进程调度"><a href="#进程调度" class="headerlink" title="进程调度"></a>进程调度</h3><blockquote>
<p>MINIX3使用一种多级调度算法。进程优先级数字越小,优先级越高, 根据优先级不同分成了16个可运行进程队列。每个队列内部采用时间片轮转调度,找到最高非空优先级队列,选取队列首部可运行的进程, 当用完了时间片,则移到当前队列的队尾(详见教材P124)。</p>
<p>将EDF添加到多级调度算法中,可控制入队实现实时调度。<font color="red">入队是将当前剩余时间(终止时间-运行 时间)大于0的进程添加到某个优先级队列,即设置进程优先级(需要选择合适的优先级,否则执行效果不理想)。</font></p>
<p>在该队列内部将时间片轮转调度改成==剩余时间最少优先调度==,即将剩余时间最小的进程移到队列首部。</p>
</blockquote>
<p>进程调度模块位于/usr/src/minix/kernel/下的proc.h和proc.c,修改影响进程调度顺序的部分。</p>
<ol>
<li>structproc维护每个进程的信息,用于调度决策。添加deadline成员。( 其实按照minix3的代码风格,这里应该将ddl定义为p_deadline,实验更改的时候疏忽了,就直接定义为deadline了。)<img src="/Users/chenboyan/Library/Application Support/typora-user-images/截屏2022-04-16 下午5.14.32.png" alt="截屏2022-04-16 下午5.14.32" style="zoom:50%;"></li>
<li>enqueue_head()按优先级将进程加入列队首。实验中需要将实时进程的优先级设置成合适的优先级。enqueue()按优先级将进程加入列队尾,同上。</li>
</ol>
<p> 经过尝试,将设置过deadline的进程优先级设置为5、6均可获得理想的执行结果。其中原因为:minix3中默认优先级为0-4的进程大多为系统进程,非用户进程。故设置优先级为5、6时已经可以得到理想的执行结果。</p>
<img src="/Users/chenboyan/Library/Application Support/typora-user-images/截屏2022-04-16 下午5.20.32.png" alt="截屏2022-04-16 下午5.20.32" style="zoom:50%;">
<img src="/Users/chenboyan/Library/Application Support/typora-user-images/截屏2022-04-16 下午5.21.01.png" alt="截屏2022-04-16 下午5.21.01" style="zoom:50%;">
<p><font color="red">注:由于在这个地方踩坑,编译可成功,可执行文件却无法运行,我debug了两天才找到真正的错误。由于deadline大于0时要指定rp的优先级为5,而初始代码将p_priority定义为了const常量,将优先级设置放在其后会出现错误,一定要在其之前设置优先级。</font></p>
<ol start="3">
<li>pick_proc()从队列中返回一个可调度的进程。遍历设置的优先级队列,返回剩余时间最小并可运行的进程。</li>
</ol>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*===========================================================================</span></span><br><span class="line"><span class="comment"> * pick_proc * </span></span><br><span class="line"><span class="comment"> *=========================================================================*/</span></span><br><span class="line"><span class="type">static</span> <span class="keyword">struct</span> proc * <span class="title function_">pick_proc</span><span class="params">(<span class="type">void</span>)</span></span><br><span class="line">{</span><br><span class="line"><span class="comment">/* Decide who to run now. A new process is selected an returned.</span></span><br><span class="line"><span class="comment"> * When a billable process is selected, record it in 'bill_ptr', so that the </span></span><br><span class="line"><span class="comment"> * clock task can tell who to bill for system time.</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * This function always uses the run queues of the local cpu!</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">register</span> <span class="class"><span class="keyword">struct</span> <span class="title">proc</span> *<span class="title">rp</span>;</span> <span class="comment">/* process to run */</span></span><br><span class="line"> <span class="class"><span class="keyword">struct</span> <span class="title">proc</span> **<span class="title">rdy_head</span>;</span></span><br><span class="line"> <span class="type">int</span> q; <span class="comment">/* iterate over queues */</span></span><br><span class="line"> <span class="keyword">register</span> <span class="class"><span class="keyword">struct</span> <span class="title">proc</span> *<span class="title">next</span>;</span> <span class="comment">// 中间变量,用来指代下一个进程</span></span><br><span class="line"> <span class="comment">/* Check each of the scheduling queues for ready processes. The number of</span></span><br><span class="line"><span class="comment"> * queues is defined in proc.h, and priorities are set in the task table.</span></span><br><span class="line"><span class="comment"> * If there are no processes ready to run, return NULL.</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> rdy_head = get_cpulocal_var(run_q_head);</span><br><span class="line"> <span class="keyword">for</span> (q=<span class="number">0</span>; q < NR_SCHED_QUEUES; q++) { </span><br><span class="line"> <span class="keyword">if</span>(!(rp = rdy_head[q])) {</span><br><span class="line"> TRACE(VF_PICKPROC, <span class="built_in">printf</span>(<span class="string">"cpu %d queue %d empty\n"</span>, cpuid, q););</span><br><span class="line"> <span class="keyword">continue</span>;</span><br><span class="line"> }</span><br><span class="line"> rp = rdy_head[q];</span><br><span class="line"> next = rp->p_nextready;<span class="comment">/* pointer to next ready process */</span></span><br><span class="line"> <span class="keyword">if</span> (q == <span class="number">5</span>) </span><br><span class="line"> { <span class="comment">/* 如果优先级等于5,说明可能是设置deadline的进程,找剩余时间最小的进程*/</span></span><br><span class="line"> <span class="keyword">while</span> (next != <span class="literal">NULL</span>) </span><br><span class="line"> {<span class="comment">//遍历进程</span></span><br><span class="line"> <span class="keyword">if</span> (next->deadline > <span class="number">0</span>) </span><br><span class="line"> { </span><br><span class="line"> <span class="comment">/* 交换这两个进程,得到剩余时间最短的进程。*/</span></span><br><span class="line"> <span class="keyword">if</span> (rp->deadline == <span class="number">0</span> || (rp->deadline > next->deadline))</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> (proc_is_runnable(next)) <span class="comment">//判断是否在运行</span></span><br><span class="line"> rp = next;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">/* 比下一个 */</span></span><br><span class="line"> next = next->p_nextready;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> assert(proc_is_runnable(rp));</span><br><span class="line"> <span class="keyword">if</span> (priv(rp)->s_flags & BILLABLE) </span><br><span class="line"> get_cpulocal_var(bill_ptr) = rp; <span class="comment">/* bill for system time */</span></span><br><span class="line"> <span class="keyword">return</span> rp;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">NULL</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h2 id="实验结果"><a href="#实验结果" class="headerlink" title="实验结果"></a>实验结果</h2><p>测试用例如下</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><stdio.h></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><stdlib.h></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><unistd.h></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><string.h></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><signal.h></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><sys/wait.h></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><sys/types.h></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><lib.h></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><time.h></span></span></span><br><span class="line"></span><br><span class="line"><span class="type">void</span> <span class="title function_">proc</span><span class="params">(<span class="type">int</span> id)</span>;</span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">(<span class="type">void</span>)</span></span><br><span class="line">{</span><br><span class="line"> <span class="comment">//创建三个子进程,并赋予子进程id</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">1</span>; i < <span class="number">4</span>; i++)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> (fork() == <span class="number">0</span>)</span><br><span class="line"> {</span><br><span class="line"> proc(i);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br><span class="line"><span class="type">void</span> <span class="title function_">proc</span><span class="params">(<span class="type">int</span> id)</span></span><br><span class="line">{</span><br><span class="line"> <span class="type">int</span> loop;</span><br><span class="line"> <span class="keyword">switch</span> (id)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">case</span> <span class="number">1</span>: <span class="comment">//子进程1,设置deadline=25</span></span><br><span class="line"> chrt(<span class="number">25</span>);</span><br><span class="line"> <span class="built_in">printf</span>(<span class="string">"proc1 set success\n"</span>);</span><br><span class="line"> sleep(<span class="number">1</span>);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="number">2</span>: <span class="comment">//子进程2,设置deadline=15</span></span><br><span class="line"> chrt(<span class="number">15</span>);</span><br><span class="line"> <span class="built_in">printf</span>(<span class="string">"proc2 set success\n"</span>);</span><br><span class="line"> sleep(<span class="number">1</span>);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="number">3</span>: <span class="comment">//子进程3,普通进程</span></span><br><span class="line"> chrt(<span class="number">0</span>);</span><br><span class="line"> <span class="built_in">printf</span>(<span class="string">"proc3 set success\n"</span>);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span> (loop = <span class="number">1</span>; loop < <span class="number">40</span>; loop++)</span><br><span class="line"> {</span><br><span class="line"> <span class="comment">//子进程1在5s后设置deadline=5</span></span><br><span class="line"> <span class="keyword">if</span> (id == <span class="number">1</span> && loop == <span class="number">5</span>)</span><br><span class="line"> {</span><br><span class="line"> chrt(<span class="number">5</span>);</span><br><span class="line"> <span class="built_in">printf</span>(<span class="string">"Change proc1 deadline to 5s\n"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//子进程3在10s后设置deadline=3</span></span><br><span class="line"> <span class="keyword">if</span> (id == <span class="number">3</span> && loop == <span class="number">10</span>)</span><br><span class="line"> {</span><br><span class="line"> chrt(<span class="number">3</span>);</span><br><span class="line"> <span class="built_in">printf</span>(<span class="string">"Change proc3 deadline to 3s\n"</span>);</span><br><span class="line"> }</span><br><span class="line"> sleep(<span class="number">1</span>); <span class="comment">//睡眠,否则会打印很多信息</span></span><br><span class="line"> <span class="built_in">printf</span>(<span class="string">"prc%d heart beat %d\n"</span>, id, loop);</span><br><span class="line"> }</span><br><span class="line"> <span class="built_in">exit</span>(<span class="number">0</span>);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>运行结果:<code>P1</code>和<code>P2</code>为实时进程,<code>deadline</code>分别设为25s和15s。<strong>第0秒</strong>,优先级P2>P1>P3;<strong>第5秒</strong>,P1剩5s,P2剩10s,优先级P1>P2>P3;<strong>第10s</strong>,P2剩5s,P3剩3s,优先级P1>P2>P3。</p>
<img src="/Users/chenboyan/Library/Application Support/typora-user-images/截屏2022-04-16 下午6.54.44.png" alt="截屏2022-04-16 下午6.54.44" style="zoom:50%;">
<h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p> 由于minix 的不同服务模块和内核运行在不同进程中,我在这个实验中熟悉了基于消息的进程间系统调用,在实践中对minix操作系统内部的调度算法理解得更为深入,也看到了操作系统各层之间、文件之间定义等关系。整个实验的实现过程还是需要很多耐心和理解的,稍微不慎就会使耗时很久的编译失败,我也用了很长时间在查找错误、修改错误。所以,在这个过程中更体会到了及时备份保存,利用好<code>git diff</code>工具检查代码修改等的重要性,学习到了很多。感谢助教们的解答和同学们的帮助。</p>
</div>
<footer class="article-footer">
<a data-url="http://example.com/2023/05/08/myhomework/" data-id="clhe655nf0000bg8f5bfkh06p" data-title="myhomework" class="article-share-link">Share</a>
<ul class="article-tag-list" itemprop="keywords"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/" rel="tag">实验报告</a></li></ul>
</footer>
</div>
</article>
<article id="post-first-report" class="h-entry article article-type-post" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting">
<div class="article-meta">
<a href="/2022/04/06/first-report/" class="article-date">
<time class="dt-published" datetime="2022-04-06T07:47:20.000Z" itemprop="datePublished">2022-04-06</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="p-name article-title" href="/2022/04/06/first-report/">first-report</a>
</h1>
</header>
<div class="e-content article-entry" itemprop="articleBody">
<h2 id="图片可以显示吗"><a href="#图片可以显示吗" class="headerlink" title="图片可以显示吗"></a>图片可以显示吗</h2><p><img src="/oasis.jpg"></p>
<ul>
<li>一张普通图片</li>
</ul>
</div>
<footer class="article-footer">
<a data-url="http://example.com/2022/04/06/first-report/" data-id="clhe60pj100019q8f4b8h9wa1" data-title="first-report" class="article-share-link">Share</a>
<ul class="article-tag-list" itemprop="keywords"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/%E6%9D%82%E7%89%A9%E9%97%B4/" rel="tag">杂物间</a></li></ul>
</footer>
</div>
</article>
<article id="post-Hello" class="h-entry article article-type-post" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting">
<div class="article-meta">
<a href="/2022/03/21/Hello/" class="article-date">
<time class="dt-published" datetime="2022-03-21T05:43:59.000Z" itemprop="datePublished">2022-03-21</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="p-name article-title" href="/2022/03/21/Hello/">Hello</a>
</h1>
</header>
<div class="e-content article-entry" itemprop="articleBody">
<p>Hi this is a test</p>
</div>
<footer class="article-footer">
<a data-url="http://example.com/2022/03/21/Hello/" data-id="clhe60piw00009q8farcogl5i" data-title="Hello" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="post-hello-world" class="h-entry article article-type-post" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting">
<div class="article-meta">
<a href="/2022/03/21/hello-world/" class="article-date">
<time class="dt-published" datetime="2022-03-21T05:37:23.797Z" itemprop="datePublished">2022-03-21</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="p-name article-title" href="/2022/03/21/hello-world/">Hello World</a>
</h1>
</header>
<div class="e-content article-entry" itemprop="articleBody">
<p>Welcome to <a target="_blank" rel="noopener" href="https://hexo.io/">Hexo</a>! This is your very first post. Check <a target="_blank" rel="noopener" href="https://hexo.io/docs/">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a target="_blank" rel="noopener" href="https://hexo.io/docs/troubleshooting.html">troubleshooting</a> or you can ask me on <a target="_blank" rel="noopener" href="https://github.com/hexojs/hexo/issues">GitHub</a>.</p>
<h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo new <span class="string">"My New Post"</span></span><br></pre></td></tr></table></figure>
<p>More info: <a target="_blank" rel="noopener" href="https://hexo.io/docs/writing.html">Writing</a></p>
<h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo server</span><br></pre></td></tr></table></figure>
<p>More info: <a target="_blank" rel="noopener" href="https://hexo.io/docs/server.html">Server</a></p>
<h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo generate</span><br></pre></td></tr></table></figure>
<p>More info: <a target="_blank" rel="noopener" href="https://hexo.io/docs/generating.html">Generating</a></p>
<h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo deploy</span><br></pre></td></tr></table></figure>
<p>More info: <a target="_blank" rel="noopener" href="https://hexo.io/docs/one-command-deployment.html">Deployment</a></p>
</div>
<footer class="article-footer">
<a data-url="http://example.com/2022/03/21/hello-world/" data-id="clhe60pj300029q8f0ybc7zyg" data-title="Hello World" class="article-share-link">Share</a>
</footer>
</div>
</article>
</section>
<aside id="sidebar">
<div class="widget-wrap">
<h3 class="widget-title">Tags</h3>
<div class="widget">
<ul class="tag-list" itemprop="keywords"><li class="tag-list-item"><a class="tag-list-link" href="/tags/%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/" rel="tag">实验报告</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/%E6%9D%82%E7%89%A9%E9%97%B4/" rel="tag">杂物间</a></li></ul>
</div>
</div>
<div class="widget-wrap">
<h3 class="widget-title">Tag Cloud</h3>
<div class="widget tagcloud">
<a href="/tags/%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/" style="font-size: 20px;">实验报告</a> <a href="/tags/%E6%9D%82%E7%89%A9%E9%97%B4/" style="font-size: 10px;">杂物间</a>
</div>
</div>
<div class="widget-wrap">
<h3 class="widget-title">Archives</h3>
<div class="widget">
<ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/archives/2023/05/">May 2023</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2022/04/">April 2022</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2022/03/">March 2022</a></li></ul>
</div>
</div>
<div class="widget-wrap">
<h3 class="widget-title">Recent Posts</h3>
<div class="widget">
<ul>
<li>
<a href="/2023/05/10/myreport/">myreport</a>
</li>
<li>
<a href="/2023/05/08/myhomework/">myhomework</a>
</li>
<li>
<a href="/2022/04/06/first-report/">first-report</a>
</li>
<li>
<a href="/2022/03/21/Hello/">Hello</a>
</li>
<li>
<a href="/2022/03/21/hello-world/">Hello World</a>
</li>
</ul>
</div>
</div>
</aside>
</div>
<footer id="footer">
<div class="outer">
<div id="footer-info" class="inner">
© 2023 John Doe<br>
Powered by <a href="https://hexo.io/" target="_blank">Hexo</a>
</div>
</div>
</footer>
</div>
<nav id="mobile-nav">
<a href="/" class="mobile-nav-link">Home</a>
<a href="/archives" class="mobile-nav-link">Archives</a>
</nav>
<script src="/js/jquery-3.4.1.min.js"></script>
<script src="/fancybox/jquery.fancybox.min.js"></script>
<script src="/js/script.js"></script>
</div>
</body>
</html>