操作系統(tǒng)多線程編程讀者優(yōu)先/寫者優(yōu)先詳解

      網(wǎng)友投稿 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 Queueq1; static Queueend; static thread thread[]; static int time=0; private static void threadcreate(int n) {//創(chuàng)建線程 thread=new thread[n]; for(int i=0;i(comstart2); end=new PriorityQueue(comend); for(int i=0;i=writendtime)//沒有寫操作在前面 { if(team.starttimetimeend)//如果可以更新時間 { timeend=team.starttime+team.totaltime; } } } } } else { thread team=end.poll(); System.out.println("線程"+team.id+" 結(jié)束:"+team.type+" 結(jié)束時間"+(team.starttime+team.totaltime)); } } } private static void readerthread(int n)//讀者優(yōu)先 { q1=new PriorityQueue(comstart); end=new PriorityQueue(comend); for(int i=0;istart.starttime)//此時有寫的情況,需要等待阻塞,也就是將此隊(duì)列頭拋出修改開始時間然后再次入隊(duì) { team.starttime=writendtime; q1.add(team); end.remove(team);end.add(team); } else {//此時無寫的操作,無操作或者讀操作 //System.out.println("線程"+team.id+" 開始:"+team.type+"操作 時間:"+team.starttime+" 結(jié)束時間"+(team.starttime+team.totaltime)); if(team.type.equals("w"))//寫的情況,寫需要檢查是否阻塞自己如果有讀的情況則需要阻塞自己 { int time2=timeend; if(time2=time2)//在這個時間前沒有任何讀或者寫的操作,上鎖,等于號一定有,因?yàn)槎紥伋鏊耍膬?yōu)先級一定最高 { writendtime=team.starttime+team.totaltime; System.out.println("線程"+team.id+" 開始:"+team.type+"操作 時間:"+team.starttime+" 結(jié)束時間"+(team.starttime+team.totaltime)); } else {//狀態(tài)還有讀操作,需要阻塞 team.starttime=time2; q1.add(team); end.remove(team);end.add(team); } } else//讀的情況 { System.out.println("線程"+team.id+" 開始:"+team.type+"操作 時間:"+team.starttime+" 結(jié)束時間"+(team.starttime+team.totaltime)); if(team.starttime+team.totaltime>timeend) { timeend=team.starttime+team.totaltime; } } } } else if(!end.isEmpty()){//某個結(jié)束操作在這個時間段 thread team=end.poll(); System.out.println("線程"+team.id+" 結(jié)束:"+team.type+" 結(jié)束時間"+(team.starttime+team.totaltime)); } } } public static void main(String[] args) { System.out.println("請輸入n個線程程序"); int n=sc.nextInt(); threadcreate(n); System.out.println("請輸入數(shù)字選擇讀者優(yōu)先或者寫者優(yōu)先\n1:讀者優(yōu)先\n2:寫者優(yōu)先"); int index=sc.nextInt(); while(index<1||index>2) {System.out.println("請輸入正確的數(shù)字");index=sc.nextInt();} if(index==1)//讀者優(yōu)先 { readerthread(n); } else { writerthread(n); } } static Comparatorcomstart=new Comparator() {//讀者優(yōu)先的comparator接口,優(yōu)先時間,時間相同則先返回 public int compare(thread o1, thread o2) { // TODO 自動生成的方法存根 if(o1.starttime==o2.starttime) { return (int)(o1.type.charAt(0)-o2.type.charAt(0));// r w 先r后w } else return o1.starttime-o2.starttime;//返回小根堆 } }; static Comparatorcomstart2=new Comparator() {//寫者優(yōu)先的 public int compare(thread o1, thread o2) { // TODO 自動生成的方法存根 if(o1.starttime==o2.starttime) { return (int)(o2.type.charAt(0)-o1.type.charAt(0));// w r 先w后r } else return o1.starttime-o2.starttime;//返回小根堆 } }; static Comparatorcomend=new Comparator() { public int compare(thread o1, thread o2) { return (int)((o1.starttime+o1.totaltime)-(o2.starttime+o2.totaltime)); } }; static class thread { int id; String type; int starttime; int totaltime; public thread(int id,String type,int starttime,int totaltime) { this.id=id; this.type=type; this.starttime=starttime; this.totaltime=totaltime; } } }

      1

      2

      操作系統(tǒng)之多線程編程—讀者優(yōu)先/寫者優(yōu)先詳解

      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)容。

      上一篇:面試官讓手寫隊(duì)列,差點(diǎn)沒寫出來
      下一篇:Python高級數(shù)據(jù)類型
      相關(guān)文章
      亚洲乱码日产精品一二三| 久久久久久a亚洲欧洲aⅴ| 久久亚洲av无码精品浪潮| 亚洲国产视频久久| 亚洲乱码在线视频| 亚洲理论片中文字幕电影| 亚洲国产精品一区二区成人片国内| 亚洲美女精品视频| 亚洲理论片中文字幕电影| 78成人精品电影在线播放日韩精品电影一区亚洲 | 亚洲成av人片一区二区三区| 亚洲AV无码专区在线电影成人| 亚洲伊人久久大香线蕉AV| 亚洲性色AV日韩在线观看| 亚洲色大成网站www永久男同| 亚洲中文字幕无码av永久| 亚洲欧洲av综合色无码| 亚洲国产精品久久久久秋霞小| 亚洲欧美国产欧美色欲| 国产精品无码亚洲精品2021| 精品无码专区亚洲| 亚洲国产精品无码久久青草| 亚洲天堂在线视频| 亚洲日韩乱码中文无码蜜桃臀网站| 亚洲线精品一区二区三区影音先锋 | 亚洲高清无码在线观看| 久久精品国产精品亚洲艾草网美妙 | 亚洲国产精品99久久久久久| 337P日本欧洲亚洲大胆精品| 国产午夜亚洲精品不卡| 亚洲中文字幕视频国产| 亚洲精品~无码抽插| 亚洲三级电影网址| 91亚洲视频在线观看| 亚洲H在线播放在线观看H| 亚洲色偷偷综合亚洲AV伊人蜜桃 | 亚洲国产精品成人精品无码区| 亚洲国产精品第一区二区| 亚洲精品欧洲精品| 亚洲а∨天堂久久精品9966| 亚洲av综合日韩|