国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【MIT 6.S081】Lab7: Multithreading

這篇具有很好參考價值的文章主要介紹了【MIT 6.S081】Lab7: Multithreading。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

本Lab比較簡單,就是為xv6添加一個用戶級的多線程功能,然后熟悉一下Linux下多線程編程。
筆者用時約2h

Uthread: switching between threads

這一部分的代碼不涉及內(nèi)核代碼,所以也比較簡單,根據(jù)提示修改user/uthread.c中的代碼即可。仿照內(nèi)核中進程轉(zhuǎn)換函數(shù)swtch的實現(xiàn)即可。首先,添加一個context上下文結(jié)構(gòu)體用于保存被調(diào)用者保存寄存器(從kernel/proc.h中復(fù)制過來就行啦)。

struct context {
  uint64 ra;
  uint64 sp;

  // callee-saved
  uint64 s0;
  uint64 s1;
  uint64 s2;
  uint64 s3;
  uint64 s4;
  uint64 s5;
  uint64 s6;
  uint64 s7;
  uint64 s8;
  uint64 s9;
  uint64 s10;
  uint64 s11;
};

并且為thread添加一個context字段

struct thread {
  char       stack[STACK_SIZE]; /* the thread's stack */
  int        state;             /* FREE, RUNNING, RUNNABLE */
  struct context context;
};

然后需要仿照swtch函數(shù)(定義在kernel/swtch.S中)實現(xiàn)一個thread_switch函數(shù)(定義在user/uthread_switch.S中),其實也就是復(fù)制過來就好啦

thread_switch:
	/* YOUR CODE HERE */
	
	sd ra, 0(a0)
	sd sp, 8(a0)
	sd s0, 16(a0)
	sd s1, 24(a0)
	sd s2, 32(a0)
	sd s3, 40(a0)
	sd s4, 48(a0)
	sd s5, 56(a0)
	sd s6, 64(a0)
	sd s7, 72(a0)
	sd s8, 80(a0)
	sd s9, 88(a0)
	sd s10, 96(a0)
	sd s11, 104(a0)

	ld ra, 0(a1)
	ld sp, 8(a1)
	ld s0, 16(a1)
	ld s1, 24(a1)
	ld s2, 32(a1)
	ld s3, 40(a1)
	ld s4, 48(a1)
	ld s5, 56(a1)
	ld s6, 64(a1)
	ld s7, 72(a1)
	ld s8, 80(a1)
	ld s9, 88(a1)
	ld s10, 96(a1)
	ld s11, 104(a1)
	
	ret    /* return to ra */

然后為thread_create函數(shù)添加代碼,為線程初始化上下文字段,最重要的兩個寄存器是rasp,其中ra寄存器需要指向傳進來的線程函數(shù),在thread_switch函數(shù)中將被替換到CPU的ra,作為返回地址,即起到了一個跳板的作用,跳到了線程函數(shù)中;sp寄存器則需要指向線程的棧

void 
thread_create(void (*func)())
{
  struct thread *t;

  for (t = all_thread; t < all_thread + MAX_THREAD; t++) {
    if (t->state == FREE) break;
  }
  t->state = RUNNABLE;
  // YOUR CODE HERE
  t->context.ra = (uint64) func;
  t->context.sp = (uint64) (t->stack + STACK_SIZE);
}

thread_schedule函數(shù)中,增加一句代碼調(diào)用thread_switch函數(shù)進行線程轉(zhuǎn)換即可。

if (current_thread != next_thread) {         /* switch threads?  */
    next_thread->state = RUNNING;
    t = current_thread;
    current_thread = next_thread;
    /* YOUR CODE HERE
     * Invoke thread_switch to switch from t to next_thread:
     * thread_switch(??, ??);
     */
    thread_switch((uint64)&t->context, (uint64)&current_thread->context);
  }

Using threads

首先回答一個問題:
Q: 為什么兩個線程都丟失了鍵,而不是一個線程?確定可能導(dǎo)致鍵丟失的具有2個線程的事件序列。
A: 當(dāng)兩個線程同時調(diào)用put且插入的哈希bucket是同一個時,涉及到鏈表插入的并發(fā)性問題,
其實在xv6-book中第六章有講到過。由于這里是頭插法,修改頭指針指向當(dāng)前新插入的節(jié)點時,
如果兩個線程的操作交叉運行,則后運行的一個會被前運行的一個覆蓋,使得插入的節(jié)點少了一個,
這種行為是不可預(yù)測的,所以兩個線程都有可能丟失。

然后需要為代碼加鎖以修復(fù)并發(fā)put的問題,考慮如果兩個線程并發(fā)put到兩個不同的bucket中,不會引發(fā)問題,于是為每一個bucket設(shè)置一個鎖即可。

pthread_mutex_t lock[NBUCKET];

然后在put函數(shù)中加上鎖即可。

if(e){
    pthread_mutex_lock(&lock[i]);
    // update the existing key.
    e->value = value;
    pthread_mutex_unlock(&lock[i]);
} else {
    // the new is new.
    pthread_mutex_lock(&lock[i]);
    insert(key, value, &table[i], table[i]);
    pthread_mutex_unlock(&lock[i]);
}

Barrier

這一部分據(jù)文檔描述就是加上一層屏障,進行線程同步,需要使用條件變量的知識,這里就不細說了,簡單來說就是,讓一些快的線程等一會,讓最后一個到達的線程通知大家說可以繼續(xù)走了,實現(xiàn)起來也很簡單。文章來源地址http://www.zghlxwxcb.cn/news/detail-406444.html

static void 
barrier()
{
  // YOUR CODE HERE
  //
  // Block until all threads have called barrier() and
  // then increment bstate.round.
  //
  pthread_mutex_lock(&bstate.barrier_mutex);
  bstate.nthread ++;
  if (bstate.nthread < nthread) {
    pthread_cond_wait(&bstate.barrier_cond, &bstate.barrier_mutex);
    pthread_mutex_unlock(&bstate.barrier_mutex);
    return;
  }
  bstate.nthread = 0;
  bstate.round ++;
  pthread_mutex_unlock(&bstate.barrier_mutex);
  pthread_cond_broadcast(&bstate.barrier_cond);
}

到了這里,關(guān)于【MIT 6.S081】Lab7: Multithreading的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • MIT 6s081 lab1:Xv6 and Unix utilities

    MIT 6s081 lab1:Xv6 and Unix utilities

    作業(yè)網(wǎng)址:https://pdos.csail.mit.edu/6.828/2020/labs/util.html 下載,啟動xv6系統(tǒng) 使用system call sleep .函數(shù)(在user/user.h中被聲明)來完成 使用系統(tǒng)調(diào)用在一對管道上的兩個進程之間“乒乓”一個字節(jié),每個方向一個。父進程應(yīng)該向子進程發(fā)送一個字節(jié);子進程應(yīng)打印“<pid>:received

    2024年01月17日
    瀏覽(13)
  • MIT 6.S081學(xué)習(xí)筆記(第〇章)

    MIT 6.S081學(xué)習(xí)筆記(第〇章)

    本文涉及 xv6 《第零章 操作系統(tǒng)接口》相關(guān),主要對涉及的進程、I/O、文件描述符、管道、文件等內(nèi)容產(chǎn)生個人理解,不具有官方權(quán)威解釋; 文章的目錄與書中的目錄沒有嚴(yán)格的相關(guān)性; 文中會有問題 (Question) 字段,這來源于對 xv6 book 的擴展; 文中涉及的代碼均能在macOS

    2024年02月09日
    瀏覽(33)
  • MIT6.S081學(xué)習(xí)筆記--lec 1

    MIT6.S081學(xué)習(xí)筆記--lec 1

    abstract H/W 抽象化硬件 multiplex 多路復(fù)用 isolation 隔離性 sharing 共享(進程通信,數(shù)據(jù)共享) security / access control 安全性/權(quán)限控制 performance 性能/內(nèi)核開銷 range of applications 多應(yīng)用場景 操作系統(tǒng)應(yīng)該提供的功能:1. 多進程支持 2. 進程間隔離 3. 受控制的進程間通信 xv6 :一種在本

    2024年02月16日
    瀏覽(20)
  • MIT 6.S081 教材第八章內(nèi)容 -- 文件系統(tǒng) -- 02

    MIT 6.S081 教材第八章內(nèi)容 -- 文件系統(tǒng) -- 02

    MIT 6.S081 2020 操作系統(tǒng) 本文為MIT 6.S081課程第八章教材內(nèi)容翻譯加整理。 本課程前置知識主要涉及: C語言(建議閱讀C程序語言設(shè)計—第二版) RISC-V匯編 推薦閱讀: 程序員的自我修養(yǎng)-裝載,鏈接與庫 術(shù)語inode(即索引結(jié)點)可以具有兩種相關(guān)含義之一。它可能是指包含文件大小和

    2024年02月13日
    瀏覽(18)
  • 【MTI 6.S081 Lab】traps

    【MTI 6.S081 Lab】traps

    本實驗閱讀《深入理解計算機系統(tǒng)》第八章異??刂屏鞑⒆鰏hell實驗將會是很有幫助的 本實驗探討了如何使用陷阱實現(xiàn)系統(tǒng)調(diào)用。您將首先使用堆棧進行熱身練習(xí),然后實現(xiàn)用戶級陷阱處理的示例。 了解一下您在6.1910(6.004)中接觸到的RISC-V程序集非常重要。在您的xv6 repo中

    2024年02月15日
    瀏覽(46)
  • MIT6.S081 - Lecture1: Introduction and Examples

    MIT6.S081 - Lecture1: Introduction and Examples

    理解操作系統(tǒng)的設(shè)計和實現(xiàn) 通過 XV6 操作系統(tǒng)動手實驗,可以擴展或改進操作系統(tǒng) Abstraction: 對硬件進行抽象 Multiplex: 在多個應(yīng)用程序之間共用硬件資源 Isolation: 隔離性,程序出現(xiàn)故障時,不同程序之間不能相互干擾 Sharing: 實現(xiàn)共享,如數(shù)據(jù)交互或協(xié)同完成任務(wù) Securi

    2024年04月15日
    瀏覽(21)
  • MIT6.S081 - Lecture3: OS Organization and System Calls

    使用操作系統(tǒng)的主要原因是為了實現(xiàn) CPU 多進程分時復(fù)用以及內(nèi)存隔離 如果沒有操作系統(tǒng),應(yīng)用程序會直接與硬件進行交互,這時應(yīng)用程序會直接使用 CPU,比如假設(shè)只有一個 CPU 核,一個應(yīng)用程序在這個 CPU 核上運行,但是同時其他程序也需要運行,因為沒有操作系統(tǒng)來幫助

    2024年04月22日
    瀏覽(46)
  • MIT6.828/6.S081 Mac OS下搭建xv6和risc-v

    MIT6.828/6.S081 Mac OS下搭建xv6和risc-v

    題外話: 其實我是一名非計算機專業(yè)的在校生,因為對軟件開發(fā)和服務(wù)器開發(fā)很感興趣,并且這方面的就業(yè)相對我來說資源比較充沛,所以就學(xué)習(xí)了mit6.828的實驗 課程的學(xué)習(xí)直接跟著官網(wǎng)的schedule走就行,先看Lecture下提供的講義和手冊,然后完成相應(yīng)的Lab,Lab共計10個,主要

    2024年03月09日
    瀏覽(23)
  • 6.s081/6.1810(Fall 2022)Lab2: System calls

    6.s081/6.1810(Fall 2022)Lab2: System calls

    這個lab主要介紹了用戶態(tài)到內(nèi)核態(tài)的系統(tǒng)調(diào)用做了什么,并讓我們照貓畫虎完成了兩個系統(tǒng)調(diào)用的實現(xiàn)。 環(huán)境搭建 Lab1: Utilities Lab2: System calls Lab3: Page tables Lab4: Traps Lab5: Copy-on-Write Fork for xv6 官網(wǎng)鏈接 xv6手冊鏈接,這個挺重要的,建議做lab之前最好讀一讀。 xv6手冊中文版,這

    2024年02月13日
    瀏覽(50)
  • mit 6.824 lab1分析

    mit 6.824 lab1分析

    略 map階段每個worker應(yīng)該把中間文件分成nReduce份,nReduce是reduce任務(wù)的數(shù)量 worker完成reduce任務(wù)后生成文件名 mr-out-X mr-out-X 文件每行應(yīng)該是 \\\"%v %v\\\" 格式,參考 main/mrsequential.go worker處理完map任務(wù),應(yīng)該把生成的中間文件放到當(dāng)前目錄中,便于worker執(zhí)行reduce任務(wù)時讀取中間文件 當(dāng)所

    2023年04月10日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包