te')); return $arr; } /* 遍历用户所有主题 * @param $uid 用户ID * @param int $page 页数 * @param int $pagesize 每页记录条数 * @param bool $desc 排序方式 TRUE降序 FALSE升序 * @param string $key 返回的数组用那一列的值作为 key * @param array $col 查询哪些列 */ function thread_tid_find_by_uid($uid, $page = 1, $pagesize = 1000, $desc = TRUE, $key = 'tid', $col = array()) { if (empty($uid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('uid' => $uid), array('tid' => $orderby), $page, $pagesize, $key, $col); return $arr; } // 遍历栏目下tid 支持数组 $fid = array(1,2,3) function thread_tid_find_by_fid($fid, $page = 1, $pagesize = 1000, $desc = TRUE) { if (empty($fid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('fid' => $fid), array('tid' => $orderby), $page, $pagesize, 'tid', array('tid', 'verify_date')); return $arr; } function thread_tid_delete($tid) { if (empty($tid)) return FALSE; $r = thread_tid__delete(array('tid' => $tid)); return $r; } function thread_tid_count() { $n = thread_tid__count(); return $n; } // 统计用户主题数 大数量下严谨使用非主键统计 function thread_uid_count($uid) { $n = thread_tid__count(array('uid' => $uid)); return $n; } // 统计栏目主题数 大数量下严谨使用非主键统计 function thread_fid_count($fid) { $n = thread_tid__count(array('fid' => $fid)); return $n; } ?>计算机操作系统学习之哲学家进餐问题
最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

计算机操作系统学习之哲学家进餐问题

运维笔记admin3浏览0评论

一.问题描述

  • 一个圆桌上坐着5名哲学家,每两个哲学家中间放着一根筷子,桌子中间放着一碗米饭。
  • 只有当哲学家饥饿时,才会试图拿起左右两只筷子
  • 如果筷子已经在他人的手里,则需等待
  • 哲学家只有同时拿起两根筷子才能开始进餐
  • 进餐完毕后,放下筷子继续思考
  • 也就是进程需要同时持有两个临界资源才能开始工作

二.问题分析

  • 相邻的哲学家对他们中间筷子的访问是互斥

  • 进程需要同时持有两个临界资源才能开始工作,那么最核心的问题就是资源分配不当造成的死锁现象

  • 信号量设置:定义互斥信号量数组chopstick[5]={1,1,1,1,1}用于实现对五个筷子的互斥访问,并对哲学家按0~4编号,哲学家 i 左边的筷子编号为 i ,右边筷子的编号为(i+1)%5

    避免死锁的方法:

  • (1)最多允许四个哲学家同时进餐,这样可以保证至少有一个哲学家是拿到左右两只筷子的

  • (2)使各哲学家拿筷子这件事互斥的进行

  • 比如0号哲学家此时先开始吃饭,他会先对互斥信号量mutex进行P操作,再分别拿起左、右两双筷子,然后对互斥信号量执行V操作将其释放

  • 此时如果1号哲学家也想要开始吃饭,那么他会先执行P(mutex),然后当他想要拿起自己左边的筷子时,由于此时1号筷子被0号哲学家占用,那么1号哲学家进程会暂时阻塞在这里

  • 如果此时有别的哲学家也想要开始吃饭,那么将他执行到P(mutex)时,由于1号哲学家此时还没有对互斥信号量mutex执行V操作,那么他是不能进行拿筷子这个操作的

  • 也就是说即使一个哲学家只拿了一只筷子被阻塞,也不会有别的哲学家继续尝试拿筷子或者等待筷子被释放,那么就不会产生死锁现象

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论