当前位置: 首页 > news >正文

网站怎样建设wordpress目录页去掉

网站怎样建设,wordpress目录页去掉,网站开发都有,建e网室内设计网网址【MTI 6.S081 Lab】thread 前言调度Uthread: switching between threads (moderate)实验任务Hints解决方案thread_switchthread_create()thread_schedule() Using threads (moderate)实验任务解决方案 Barrier (moderate)实验任务解决方案 本实验前去看《操作系统导论》第29章基… 【MTI 6.S081 Lab】thread 前言调度Uthread: switching between threads (moderate)实验任务Hints解决方案thread_switchthread_create()thread_schedule() Using threads (moderate)实验任务解决方案 Barrier (moderate)实验任务解决方案 本实验前去看《操作系统导论》第29章基于锁的并发数据结构将会是很有帮助的。 前言 在做MIT 6.S081的实验过程中每看一些讲座(lecture)和xv6 book就来做相应的实验。这个实验是让我最爽的两个实验之一还有一个是trap因为其他大多c语言在我已经有了很多关于操作系统的知识的情况下实现并没有那么的让人惊艳但是这个实验确实让人非常惊艳。 这个实验里面的进程切换、线程切换以前我确实知道怎么做的但是像这样通过改变寄存器的值以前我是没有想到的所以以前只知道要保存状态但是对于如何保存不知道原理这次实验的过程中通过理解源码懂了这个很神奇的东西。 调度 实现多路复用multiplexing的挑战 如何从一个进程切换到另一个进程尽管上下文切换的思想很简单但它的实现是xv6中最不透明的代码之一如何以对用户进程透明的方式强制切换xv6使用标准技术通过定时器终端驱动上下文切换许多CPU可能同时在进程之间切换使用一个锁方案来避免争用是很有必要的进程退出时必须释放进程的内存以及其他资源但它不能自己完成所有这一切因为它不能在仍然使用自己内核栈的情况下释放它多核机器的每个核心都必须记住它正在执行哪个进程以便系统调用正确影响对应进程的内核状态sleep运行一个进程放弃CPUwakeup允许另一个进程唤醒第一个进程。需要小心避免唤醒通知丢失的竞争。 Uthread: switching between threads (moderate) 在本练习中您将为用户级线程系统设计上下文切换机制然后实现它。首先您的xv6有两个文件user/uthread.c和user/uthread_switch.S并且Makefile中有一个规则来构建uthread程序。uthread.c包含大部分用户级线程包以及三个简单测试线程的代码。线程程序包缺少一些用于创建线程和在线程之间切换的代码。 实验任务 您的工作是制定一个创建线程和保存/恢复寄存器以在线程之间切换的计划并实现该计划。完成后make grade应该表明您的解决方案通过了uthread测试。 完成后当您在xv6上运行uthread时您应该会看到以下输出这三个线程可能以不同的顺序启动 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KHSla5rT-1690632901891)(Images/Screenshot from 2023-07-27 18-43-03.png)] 这个输出来自三个测试线程每个线程都有一个循环打印一行然后将CPU分配给其他线程。 然而现在你将看不到输出因为咩有上下文切换代码。 你将需要在user/uthread.c中添加代码thread_create()和thread_schedule()在user/uthread_switch.S中添加thread_switch。一个目标是确保当thread_schedule第一次运行给定线程时该线程在自己的堆栈上执行传递给thread_create的函数。另一个目标是确保thread_switch保存要切换的线程的寄存器恢复要切换到的线程的注册表并返回到后一个线程指令中上次停止的点。您必须决定保存/恢复寄存器的位置修改struct thread以容纳寄存器是一个不错的计划。您需要在thread_schedule中添加对thread_switch的调用您可以向threadswitch传递所需的任何参数但目的是从threadt切换到nextthread。 Hints thread_switch仅仅需要保存被调用者保存寄存器吗为什么 答是其他调用者保存寄存器已经在调用thread_swtich时保存在当前线程的栈上。 你能在user/uthread.asm中看到uthread的汇编代码可能更方便调试 为了测试你的代码使用gdb单步调试thread_switch将是有用的你可以通过这种方式开始 (gdb) file user/_uthread Reading symbols from user/_uthread... (gdb) b uthread.c:60这将在uthread.c的第60行设置断点。断点可能也可能不在您运行uthread之前被触发。这怎么可能发生 一旦xv6shell运行键入“uthread”gdb将在第60行中断。如果您从另一个进程中遇到了断点请继续进行直到您在uthread进程中遇到断点为止。现在您可以键入以下命令来检查uthread的状态 (gdb) p/x *next_thread使用“x”您可以检查内存位置的内容 (gdb) x/x next_thread-stack您可以跳到thread_switch的开头这样 (gdb) b thread_switch (gdb) c单步执行汇编代码 (gdb) sigdb的在线文档 is here. 解决方案 thread_switch .text/** save the old threads registers,* restore the new threads registers.*/.globl thread_switch 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() 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.sp (uint64)(t-stack STACK_SIZE);t-context.ra (uint64)func; // 使得在func处返回 }thread_schedule() void thread_schedule(void) {...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(??, ??);*/// 恢复当前进程的上下文保存上一个进程t的上下文此时会自动从上一个切换的上下文位置切换// 这里会破坏a0和a1thread_switch((uint64)t-context, (uint64)current_thread-context);} elsenext_thread 0; }Using threads (moderate) 在本次作业中您将探索使用哈希表使用线程和锁进行并行编程。您应该在具有多个核心的真实Linux或MacOS计算机不是xv6不是qemu上执行此任务。最新的笔记本电脑都有多核处理器。 此作业使用UNIX pthread线程库。您可以通过man phreads从手册页中找到有关它的信息也可以在网上查看例如here, here, and here. 文件notxv6/ph.c包含一个简单的哈希表如果从单个线程使用该哈希表是正确的但如果从多个线程使用则该哈希表不正确。在您的xv6主目录可能~/xv6-labs-2021中键入以下内容 $ make ph $ ./ph 1请注意要构建phMakefile使用操作系统的gcc而不是6.S081工具。ph的参数指定对哈希表执行put和get操作的线程数。运行一段时间后ph 1将产生类似的输出 100000 puts, 3.991 seconds, 25056 puts/second 0: 0 keys missing 100000 gets, 3.981 seconds, 25118 gets/second你看到的数字可能与这个样本输出相差两倍或更多这取决于你的电脑速度有多快它是否有多个内核以及它是否忙于做其他事情。 ph运行两个基准。首先它通过调用put将大量键添加到哈希表中并以每秒puts为单位打印实现的速率。它使用get从哈希表中获取密钥。它打印由于put而应该在哈希表中但丢失的数字键在这种情况下为零并打印每秒获得的次数。 您可以告诉ph同时从多个线程使用其哈希表方法是给它一个大于1的参数。尝试ph 2 $ ./ph 2 100000 puts, 1.885 seconds, 53044 puts/second 1: 16579 keys missing 0: 16579 keys missing 200000 gets, 4.322 seconds, 46274 gets/second该ph2输出的第一行表明当两个线程同时向哈希表添加条目时它们的总插入率为每秒53044次。这大约是运行ph1的单个线程的速率的两倍。这是一个大约2倍的出色“并行加速”这是人们所希望的即每单位时间产生两倍功的两倍内核。 然而缺少16579个键的两行表示哈希表中不存在大量本应存在的键。也就是说puts本应将这些键添加到哈希表中但出现了问题。看看notxv6/ph.c特别是put和insert。 实验任务 为什么2个线程的时会缺少一些key而1个线程时没有缺少key识别能在两个线程时导致键缺失的代码片。在answers-thread.txt中提交您的序列并附上简短解释 答在put和insert函数中都可能发生错误 static void insert(int key, int value, struct entry **p, struct entry *n) {struct entry *e malloc(sizeof(struct entry));e-key key;e-value value;e-next n;*p e; }static void put(int key, int value) {int i key % NBUCKET;// is the key already present?struct entry *e 0;for (e table[i]; e ! 0; e e-next) {if (e-key key)break;}if(e){// update the existing key.e-value value;} else {// the new is new.insert(key, value, table[i], table[i]);} }假设现在有一个线程运行到第7行此时添加的key为1在执行第八行前另一个线程刚好在put中搜索key1是否存在当然此时的结果是不存在所以会被插入此时key1被重复插入了导致错误。 另一个问题是同样假设当前两个线程均运行到第7行此时会导致×p的更新只有一个更新有效导致key缺失。 为了避免这种事件序列请在notxv6/ph.c中的put和get中插入lock和unlock语句以便在两个线程中丢失的key数始终为0。相关的pthread调用包括 pthread_mutex_t lock; // declare a lock pthread_mutex_init(lock, NULL); // initialize the lock pthread_mutex_lock(lock); // acquire lock pthread_mutex_unlock(lock); // release lock当make grade表示您的代码通过了ph_safe测试时您就完成了该测试需要两个线程的零丢失键。在这一点上不通过ph_fast测试是可以的也就是说只要我们自己测试没有missing就行。 解决方案 在原始代码单线程情况下我的机器的输出如下 $ ./ph 1 100000 puts, 10.889 seconds, 9183 puts/second 0: 0 keys missing 100000 gets, 11.494 seconds, 8700 gets/second在修改后给每个table一个锁加在上面展现的代码的地16行和第28行的位置编译程序得到的双线程结果是 $ ./ph 2 100000 puts, 5.834 seconds, 17140 puts/second 0: 0 keys missing 1: 0 keys missing 200000 gets, 10.783 seconds, 18547 gets/second修改代码使一些put操作在保持正确性的同时并行运行。当make grade表示您的代码通过了ph_safe和ph_fast测试时您就完成了。ph_fast测试要求两个线程每秒的输出量至少是一个线程的1.25倍。这里我用的小粒度的锁基本达到了两倍速度所以make grade相应测试肯定通过 Barrier (moderate) 在这项任务中您将实现一个屏障应用程序中的一个点所有参与线程都必须等待直到所有其他参与线程也到达该点。您将使用pthread条件变量这是一种类似于xv6的睡眠和唤醒的序列协调技术。 您应该在真实的计算机上不是xv6也不是qemu执行此任务。 文件notxv6/barrier.c包含一个损坏的屏障。 $ make barrier $ ./barrier 2 barrier: notxv6/barrier.c:42: thread: Assertion i t failed.2指定在barrier.c中同步的线程数。每个线程执行一个循环。在每次循环迭代中线程都会调用barrier然后休眠随机微秒。assert触发因为一个线程在另一个线程到达屏障之前就离开了屏障。所需的行为是每个线程在barrier中阻塞直到所有线程都调用了barrier() 实验任务 您的目标是实现所需的障碍行为。除了您在ph赋值中看到的锁基元之外您还需要以下新的pthread基元请看这里和这里了解详细信息。 pthread_cond_waitcondmutex//在cond上进入睡眠释放锁互斥在唤醒时获取 pthread_cond_broadcastcond//唤醒每一个睡在cond上的线程确保你的解决方案通过make grade的barrier测试。 pthread_cond_wait 被调用的时候释放mutex在返回时重新获得mutex 我们已经给你barrier_init()。你的任务是执行barrier()以便于panic不发生。我们已经为你定义struct barrier他的一些字段对你有用 有两个问题使您的任务复杂化 你必须处理一系列的障碍调用每一次我们都会调用一轮。bstate.round记录本轮。每次所有线程到达屏障时都应该增加bstate.round。您必须处理这样一种情况即一个线程在其他线程退出屏障之前围绕循环进行竞争。特别是从一轮到下一轮都在重新使用bstate.nthread变量。确保在上一轮仍在使用bstate.nthread时离开障碍并在循环中奔跑的线程不会增加bstate.nhread。 使用一个、两个或两个以上的线程测试代码。 解决方案 对进入barrier的线程数计数一旦最后一个线程到达了那么不要再 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); // 在这里等待其他的进入} else { // 所有的线程都到这里了bstate.nthread 0;bstate.round;// 一定要在round、nthread更新后才能唤醒因为如果先唤醒此时别的线程执行到tbstate.round但是没有更新导致ti会assertpthread_cond_broadcast(bstate.barrier_cond);}pthread_mutex_unlock(bstate.barrier_mutex); }
文章转载自:
http://www.morning.fhkr.cn.gov.cn.fhkr.cn
http://www.morning.hcrxn.cn.gov.cn.hcrxn.cn
http://www.morning.hhxkl.cn.gov.cn.hhxkl.cn
http://www.morning.wtdyq.cn.gov.cn.wtdyq.cn
http://www.morning.prprz.cn.gov.cn.prprz.cn
http://www.morning.pkmcr.cn.gov.cn.pkmcr.cn
http://www.morning.wdskl.cn.gov.cn.wdskl.cn
http://www.morning.sthgm.cn.gov.cn.sthgm.cn
http://www.morning.zkbxx.cn.gov.cn.zkbxx.cn
http://www.morning.brkc.cn.gov.cn.brkc.cn
http://www.morning.hdrrk.cn.gov.cn.hdrrk.cn
http://www.morning.pnljy.cn.gov.cn.pnljy.cn
http://www.morning.zxybw.cn.gov.cn.zxybw.cn
http://www.morning.mumgou.com.gov.cn.mumgou.com
http://www.morning.qcnk.cn.gov.cn.qcnk.cn
http://www.morning.ltypx.cn.gov.cn.ltypx.cn
http://www.morning.mqtzd.cn.gov.cn.mqtzd.cn
http://www.morning.jrlgz.cn.gov.cn.jrlgz.cn
http://www.morning.mrxqd.cn.gov.cn.mrxqd.cn
http://www.morning.srbfp.cn.gov.cn.srbfp.cn
http://www.morning.fdrch.cn.gov.cn.fdrch.cn
http://www.morning.drywd.cn.gov.cn.drywd.cn
http://www.morning.cmzcp.cn.gov.cn.cmzcp.cn
http://www.morning.qlpq.cn.gov.cn.qlpq.cn
http://www.morning.llqky.cn.gov.cn.llqky.cn
http://www.morning.tdttz.cn.gov.cn.tdttz.cn
http://www.morning.rpth.cn.gov.cn.rpth.cn
http://www.morning.mztyh.cn.gov.cn.mztyh.cn
http://www.morning.wgtnz.cn.gov.cn.wgtnz.cn
http://www.morning.rbnnq.cn.gov.cn.rbnnq.cn
http://www.morning.ngmjn.cn.gov.cn.ngmjn.cn
http://www.morning.nknt.cn.gov.cn.nknt.cn
http://www.morning.xhklb.cn.gov.cn.xhklb.cn
http://www.morning.fsrtm.cn.gov.cn.fsrtm.cn
http://www.morning.bpmnh.cn.gov.cn.bpmnh.cn
http://www.morning.wmdlp.cn.gov.cn.wmdlp.cn
http://www.morning.yrmpz.cn.gov.cn.yrmpz.cn
http://www.morning.lpppg.cn.gov.cn.lpppg.cn
http://www.morning.psdsk.cn.gov.cn.psdsk.cn
http://www.morning.bypfj.cn.gov.cn.bypfj.cn
http://www.morning.kgqpx.cn.gov.cn.kgqpx.cn
http://www.morning.pprxs.cn.gov.cn.pprxs.cn
http://www.morning.rxzcl.cn.gov.cn.rxzcl.cn
http://www.morning.rqqct.cn.gov.cn.rqqct.cn
http://www.morning.czrcf.cn.gov.cn.czrcf.cn
http://www.morning.jwfkk.cn.gov.cn.jwfkk.cn
http://www.morning.nqdkx.cn.gov.cn.nqdkx.cn
http://www.morning.mlnby.cn.gov.cn.mlnby.cn
http://www.morning.fyzsq.cn.gov.cn.fyzsq.cn
http://www.morning.jnoegg.com.gov.cn.jnoegg.com
http://www.morning.lhxdq.cn.gov.cn.lhxdq.cn
http://www.morning.mmqhq.cn.gov.cn.mmqhq.cn
http://www.morning.zjrnq.cn.gov.cn.zjrnq.cn
http://www.morning.xkppj.cn.gov.cn.xkppj.cn
http://www.morning.spxk.cn.gov.cn.spxk.cn
http://www.morning.bsrcr.cn.gov.cn.bsrcr.cn
http://www.morning.rfrnc.cn.gov.cn.rfrnc.cn
http://www.morning.uqrphxm.cn.gov.cn.uqrphxm.cn
http://www.morning.ypfw.cn.gov.cn.ypfw.cn
http://www.morning.dhrbj.cn.gov.cn.dhrbj.cn
http://www.morning.jkzjs.cn.gov.cn.jkzjs.cn
http://www.morning.tmtrl.cn.gov.cn.tmtrl.cn
http://www.morning.rqkk.cn.gov.cn.rqkk.cn
http://www.morning.fmrd.cn.gov.cn.fmrd.cn
http://www.morning.hbywj.cn.gov.cn.hbywj.cn
http://www.morning.bpmmq.cn.gov.cn.bpmmq.cn
http://www.morning.fengnue.com.gov.cn.fengnue.com
http://www.morning.qpntn.cn.gov.cn.qpntn.cn
http://www.morning.cknsx.cn.gov.cn.cknsx.cn
http://www.morning.qfdmh.cn.gov.cn.qfdmh.cn
http://www.morning.ypfw.cn.gov.cn.ypfw.cn
http://www.morning.mdpkf.cn.gov.cn.mdpkf.cn
http://www.morning.kksjr.cn.gov.cn.kksjr.cn
http://www.morning.qtfss.cn.gov.cn.qtfss.cn
http://www.morning.hwnnh.cn.gov.cn.hwnnh.cn
http://www.morning.brld.cn.gov.cn.brld.cn
http://www.morning.kclkb.cn.gov.cn.kclkb.cn
http://www.morning.vehna.com.gov.cn.vehna.com
http://www.morning.wfspn.cn.gov.cn.wfspn.cn
http://www.morning.fchkc.cn.gov.cn.fchkc.cn
http://www.tj-hxxt.cn/news/272358.html

相关文章:

  • 网络营销跟网站推广有啥区别深圳企业网页制作
  • 济宁住房和城乡建设厅网站俄文网站推广
  • 兰州建网站的建网站的经历
  • 济南企业网站关键词推广官方网站下载水印相机
  • 怎么用织梦做自己的网站学校英文版网站建设方案
  • 旅游电子商务网站开发方案凡科可以做返利网站吗
  • 深圳华南城网站建设平湖网站建设公司
  • 杭州网站关键词青岛手机端网络推广培训
  • 网站建设案例收费吗文明网站建设总结
  • 哪个网站可以做前端项目南翔企业网站开发建设
  • 成品软件源码网站达人室内设计网官网入口
  • 专业郑州网站建设中国建筑师网官网
  • 怎么给网站做自适应东莞公司网站建设教程
  • 网站的信任度公共服务平台官网
  • 邯郸做紧固件网站wordpress写文章排版
  • 赫山区网站建设360crm客户管理系统
  • 免费注册推广网站保险官方网站
  • 举报企业网站用个人信息备案在线药店网站建设
  • 门户网站集群建设方案有域名在本机上做网站
  • 网站 托管wordpress注册修改密码
  • 视频直播网站如何做杂志网站建设方案
  • 重庆的网站设计公司价格网页设计与制作课程设计报告小结
  • 网站建设策略阿里巴巴wordpress中文免费
  • 网站板块策划北京注册公司地址新规定
  • 深圳企业网站建设专业wordpress表格源格式
  • 宁波网站网站建设网站建设中asp文件
  • 用dw做的网页怎么上传到网站网站开发公司交易流程
  • 网站开发惠州wordpress
  • 区块链做网站都有哪些内容呢珍爱网征婚免费下载
  • 自助建站平台有哪些滨州网站建设公司报价