微吼云上線多路互動直播服務(wù) 加速多場景互動直播落地
1187
2022-05-29
操作系統(tǒng)之進(jìn)程調(diào)度——優(yōu)先權(quán)法和輪轉(zhuǎn)法(附上樣例講解)
操作系統(tǒng)之銀行家算法—詳解流程及案例數(shù)據(jù)
操作系統(tǒng)之多線程編程—讀者優(yōu)先/寫者優(yōu)先詳解
操作系統(tǒng)之存儲管理——FIFO算法和LRU算法
操作系統(tǒng)之磁盤調(diào)度——SCAN實(shí)例講解
要求
一、實(shí)驗(yàn)?zāi)康?/p>
1、熟悉多線程編程
2、熟悉使用信號量機(jī)制解決進(jìn)程同步問題
二、實(shí)驗(yàn)內(nèi)容
創(chuàng)建一個包含n 個線程的控制臺進(jìn)程。用這n 個線程來表示n個讀者或?qū)懻摺C總€線程按相應(yīng)測試數(shù)據(jù)文件的要求,進(jìn)行讀寫操作。請用信號量機(jī)制分別實(shí)現(xiàn)讀者優(yōu)先和寫者優(yōu)先的讀者-寫者問題。
讀者優(yōu)先:如果一個讀者申請進(jìn)行讀操作時已有另一讀者正在進(jìn)行讀操作,則該讀者可直接開始讀操作。
寫者優(yōu)先:如果一個讀者申請進(jìn)行讀操作時已有另一寫者在等待訪問共享資源,則該讀者必須等到?jīng)]有寫者處于等待狀態(tài)后才能開始讀操作。
三、實(shí)驗(yàn)條件
1、為每個學(xué)生提供一臺具有WINDOWS 2000/NT/XP操作系統(tǒng)的計(jì)算機(jī);
2、實(shí)驗(yàn)機(jī)器要求安裝Visual C 6.0編程平臺;
3、實(shí)驗(yàn)要求一人一機(jī)。
四、 運(yùn)行結(jié)果顯示要求
1、要求在每個線程創(chuàng)建、發(fā)出讀寫操作申請、開始讀寫操作和結(jié)束讀寫操作時分別顯示一行提示信息,以確信所有處理都遵守相應(yīng)的讀寫操作限制。
2、測試數(shù)據(jù)文件格式:測試數(shù)據(jù)文件包括n 行測試數(shù)據(jù),分別描述創(chuàng)建的n 個線程是讀者還是寫者,以及讀寫操作的開始時間和持續(xù)時間。每行測試數(shù)據(jù)包括四個字段,各字段間用空格分隔。第一字段為一個正整數(shù),表示線程序號。第二字段表示相應(yīng)線程角色,R 表示讀者是,W 表示寫者。第三字段為一個正數(shù),表示讀寫操作的開始時間。線程創(chuàng)建后,延時相應(yīng)時間(單位為秒)后發(fā)出對共享資源的讀寫申請。第四字段為一個正數(shù),表示讀寫操作的持續(xù)時間。當(dāng)線程讀寫申請成功后,開始對共享資源的讀寫操作,該操作持續(xù)相應(yīng)時間后結(jié)束,并釋放共享資源。下面是一個測試數(shù)據(jù)文件的例子:
1 R 3 5
2 W 4 5
3 R 5 2
4 R 6 5
理解
上面是實(shí)驗(yàn)要求。下面講講自己的體會:
首先要明白在多線程編程中的互斥關(guān)系——讀寫互斥,寫寫互斥。兩個優(yōu)先方式都遵從這個出發(fā)點(diǎn)。
在滿足以上的條件下,進(jìn)來的線程都好像是在排隊(duì),然后看當(dāng)前誰優(yōu)先。
自己如果是優(yōu)先的,那么可以直接插隊(duì)。再考慮正在執(zhí)行的是否和自己阻塞,如果正在執(zhí)行的和自己阻塞,那自己也得排隊(duì),只不過排在前面。(類似寫者優(yōu)先的寫寫線程)如果正在執(zhí)行的和自己不是阻塞的,那么自己就可以直接進(jìn)去執(zhí)行(讀者優(yōu)先的讀讀進(jìn)程)。
如果自己不是優(yōu)先的,那么自己只能老老實(shí)實(shí)的排隊(duì),就算自己前面有和自己不互斥的線程執(zhí)行也不行。類似寫者優(yōu)先的(讀線程在執(zhí)行,新的寫進(jìn)程等待資源,更新的讀線程只能等寫進(jìn)程釋放,如果有新的寫進(jìn)程進(jìn)來,還可以插隊(duì),——他只能等待隊(duì)列中所有在等待的寫進(jìn)程釋放完畢再執(zhí)行自己。)
對于讀者優(yōu)先 :
讀者就是優(yōu)先的。假設(shè)a,b都是同時請求,但是a是讀者那么a優(yōu)先使用資源,還有一點(diǎn)很重要的就是讀者優(yōu)先的讀者可以并行執(zhí)行。而寫著只能單線程執(zhí)行。在執(zhí)行過程中,只要阻塞的寫者在等待過程中有新的讀者進(jìn)來那么他要等待所有讀者完成才能自己釋放自己。
對于寫者優(yōu)先:
無疑所有寫的操作是優(yōu)先的,這個過程可能會產(chǎn)生大量阻塞,因?yàn)橄鄬^快(本來可以并行的讀者被大量阻塞)。如果資源中沒有寫者那么讀者依然可以并行,但是一旦出現(xiàn)寫者在等待讀者資源,那么新的讀者就不能在并行執(zhí)行,要等待所有寫者執(zhí)行完畢才可執(zhí)行讀者。
對于多線程編程的注意點(diǎn)有:
讀者優(yōu)先和寫者優(yōu)先是兩個不同的策略方法,方法有相似之處但是也有很大不同,函數(shù)需要分開完成。
最主要的排序方式基于時間排序,次要的排序以讀者還是寫者誰優(yōu)先為準(zhǔn)則
讀者優(yōu)先或者寫者優(yōu)先的阻塞會導(dǎo)致線程開始時間的變化。而不過采用雙隊(duì)列一個存進(jìn)入時間的排序,一個存結(jié)束時間的排序,修改其中的一個會影響另一個隊(duì)列中元素值不錯,但是如果不對另一個隊(duì)列進(jìn)行增/刪是不會觸發(fā)堆排序的功能(挺重要的)。
可能有些阻塞時候的等待時間和開始時間改變處理比較復(fù)雜,要考慮當(dāng)前是讀致使阻塞,還是寫致使阻塞,還是前面有寫的資源再等待致使阻塞。要用多個變量維系系統(tǒng)使得正確的更改線程的阻塞時間。
我的大體思路(水平有限,不一定很準(zhǔn)確):
代碼
下面附上我的ac代碼
package 實(shí)驗(yàn); import java.util.Comparator; import java.util.PriorityQueue; import java.util.Queue; import java.util.Scanner; public class morethread { static Scanner sc=new Scanner(System.in); static Queue
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
測試用例:
讀者優(yōu)先:
寫者優(yōu)先:
本人水平有限,?,如果有大佬發(fā)現(xiàn)錯了,請指正。
如果對后端、爬蟲、數(shù)據(jù)結(jié)構(gòu)算法等感性趣歡迎關(guān)注我的個人公眾號交流:bigsai
任務(wù)調(diào)度 多線程
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。