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

做淘客网站多少钱服务器做网站哪个系统好

做淘客网站多少钱,服务器做网站哪个系统好,网络架构方案书,万江网站建设〇、前言 本文将会结合源代码谈论 sleep、wakeup 这两个系统调用。 一、sleep()系统调用 以下是sleep()函数源码#xff1a; // Atomically release lock and sleep on chan. // Reacquires lock when awakened. void sleep(void *chan, struct spinlock *lk) {struct pro…〇、前言 本文将会结合源代码谈论 sleep、wakeup 这两个系统调用。 一、sleep()系统调用 以下是sleep()函数源码 // Atomically release lock and sleep on chan. // Reacquires lock when awakened. void sleep(void *chan, struct spinlock *lk) {struct proc *p myproc();// Must acquire p-lock in order to// change p-state and then call sched.// Once we hold p-lock, we can be// guaranteed that we wont miss any wakeup// (wakeup locks p-lock),// so its okay to release lk.acquire(p-lock); //DOC: sleeplock1release(lk);// Go to sleep.p-chan chan;p-state SLEEPING;sched();// Tidy up.p-chan 0;// Reacquire original lock.release(p-lock);acquire(lk); }先来看看 lost wakeup 问题。当一个进程在 sleep() 时如果 sleep() 了一半状态还没来得及修改为SLEEPING这时候发生了中断并且被某些进程调用了 wakeup()那么这个 wakeup()肯定不能把这个进程唤醒。而且在被中断恢复后它将永远等不到唤醒因为唤醒已经错过。所以在这里必须要正不可中断性和操作先后性。因为在下面就会看到 wakeup() 只唤醒状态为 SLEEPING 的进程。 因此我们必须保证sleep() 是一个原子操作在 sleep() 执行过程中要么执行完全要么没有被执行。所以这里必须加一个进程锁。所以在下面就会看到 wakeup() 中也会尝试获取休眠的进程锁。 在持有进程锁的时候将进程的状态设置为 SLEEPING 并记录sleep channel之后再调用 sched() 函数这个函数中会再调用 swtch() 函数而这会返回到 scheduler()函数中此时 sleep() 函数中仍然持有了进程的锁wakeup() 仍然不能做任何事情。 因此在 sleep()之后这个锁必须释放。我们来看看细节 void scheduler(void) {...swtch(c-context, p-context);// Process is done running for now.// It should have changed its p-state before coming back.c-proc 0; // 返回的位置此刻继续执行}release(p-lock);... }在这里它会继续执行上一次执行到的位置即 c-proc 0然后执行 release(p-lock)也就是释放锁而且释放的是 sleep() 中的当前进程的锁。这一点不是很好理解可以理解为用的上一个进程的代码释放当前进程的锁总之这些代码就冰冷冷的放在内存里被 pc 不断地指一遍又一遍。更有意思的是在 sched() 函数返回之后继续运行 void sleep(void *chan, struct spinlock *lk) {...sched();// Tidy up.p-chan 0; // 就绪执行的位置// Reacquire original lock.release(p-lock);acquire(lk); }这里 release(p-lock) 实际上释放的是 scheduler() 中选中的进程的锁。 所以在调度器线程释放进程锁之后wakeup() 才能终于获取进程的锁发现它正在 SLEEPING状态并唤醒它。 这里的效果是由之前定义的一些规则确保的这些规则包括了 调用 sleep 时需要持有condition lock这样 sleep 函数才能知道相应的锁sleep函数只有在获取到进程的锁 p-lock之后才能释放 condition lockwakeup需要同时持有两个锁才能查看进程。 二、wakeup()调用 以下是 wakeup() 的源码 // Wake up all processes sleeping on chan. // Must be called without any p-lock. void wakeup(void *chan) {struct proc *p;for(p proc; p proc[NPROC]; p) {if(p ! myproc()){acquire(p-lock);if(p-state SLEEPING p-chan chan) {p-state RUNNABLE;}release(p-lock);}} }可以看到它的工作很简单检查两个条件之后就修改进程的状态为 RUNNABLE。 三、总结 这篇文章详细地介绍了 xv6 操作系统中的 sleep() 和 wakeup() 系统调用的实现原理以及相关的内部工作机制。主要强调了在 sleep() 中的原子操作性确保了操作的完整性以及在 wakeup() 中唤醒休眠进程的方式。 关于 sleep() 强调了 sleep() 操作的原子性使用进程锁确保 sleep() 操作是一个原子操作避免了 “lost wakeup” 问题的发生。 通过释放持有的锁让出 CPU 控制权进入 SLEEPING 状态然后释放进程锁使得其他进程能够继续运行。 调度器在合适的时机恢复了进程的执行完成 sleep() 操作。 关于 wakeup() wakeup() 通过遍历进程列表并获取每个进程的锁查看处于 SLEEPING 状态且 sleep channel 匹配的进程将其状态设置为 RUNNABLE唤醒进程。 整体上这篇文章清晰地解释了 sleep() 和 wakeup() 这两个关键系统调用的工作原理和实现细节突出了在并发环境下确保原子性操作和避免死锁的重要性。 全文完感谢阅读。
http://www.huolong8.cn/news/310826/

相关文章:

  • 开发网站做图文水印逻辑网站文章编辑器代码
  • 网站开发线框免费下载的视频网站
  • 做presentation的网站微信客户管理系统
  • 做网盘搜索网站摄影网站模板下载
  • 佳木斯万达建设网站wordpress素锦 下载
  • 禁忌网站深圳注册公司代理简介
  • 福建省华荣建设集团有限公司网站saas系统平台
  • 网站开发使用的框架备案后修改网站内容
  • 网站建设有没有做的必要友链购买
  • 网站开发的检索速度在啥范围之内做高端品牌网站建设
  • 手机登录网站后台白云手机网站开发
  • 深圳网站建设 东莞网站建设ps加dw做网站视频
  • 网站开发笔记本要什么配置网站建设行业发展史
  • 公司网站建设的优势在线简历免费制作网站
  • 做公司网站用什么系统五种常见的软件架构
  • 网站题头是什么wordpress 浏览量
  • 网站开发主管要做什么鲅鱼圈网站在哪做
  • 网站图片切换效果哈尔滨优化推广公司
  • 网站开发公司应该具备怎样的资质杭州微官网设计公司
  • 肃州区住房和城乡建设局网站检测网站安全
  • 网站维护与更新网站空间月流量
  • 做百度移动端网站西安政务服务网
  • 正在建设中的网站清远市发布
  • 高端营销型网站建设品牌iis 发布网站内部服务器错误
  • 怎么识别网站开发语言互联网人工智能
  • 简单的房源展示网站开发网站建设工资多少
  • 海珠建网站公司百度上搜索关键词如何在首页
  • 品牌网站设计打造系统页面模板
  • 网站开发的项目流程图百度做网站推广多少钱
  • 建设银行河北省分行网站邯郸外贸网站建设公司