精华内容
下载资源
问答
  • 一、已知磁盘分区容量、以及所需簇的个数,求磁盘分区簇的大小,或者三者知二求一 设磁盘分区簇的大小为x,先把容量的单位转换为kb...设进程个数为n,每个进程需要的某个资源数为m,则一定不发生死锁时,公式为:n * m

    一、已知磁盘分区容量、以及所需簇的个数,求磁盘分区簇的大小,或者三者知二求一
    在这里插入图片描述
    设磁盘分区簇的大小为x,先把容量的单位转换为kb,用容量除以磁盘分区簇的大小,再除以(磁盘分区簇换算成位,也就是x * 1024 * 8),得到的大小就是所需簇的个数。

    具体算法: 20* 1024 * 1024Kb / x Kb / (x * 1024 * 8) = 160 解得x=4K

    二、为使进程一定不发生死锁,并发进程最多为多少?

    在这里插入图片描述
    设进程个数为n,每个进程需要的某个资源数为m,则一定不发生死锁时,公式为:n * m + 1 - n = 共同竞争的资源总数。

    例如这里,n * 5 + 1 - n = 39 ,解得n = 9.5 ,一定不发生死锁时,取整,也就是n = 9

    跟他相类似的是可能发生死锁时,求进程数最少为多少。这时的公式变为了 n * (m - 1) = 共同竞争的资源总数。 也就是 n * (5 - 1) = 39 ,解得 n = 9.75 ,这个时候不是取整了,而是取整数位的大一位,也就是 n取 10 才对。

    展开全文
  • 自己需要把数据库表结构神马的upgrade一致。 没有想到。 yeelone@yeelone-ThinkPad-Edge:~/project$ alembic upgrade head INFO [alembic.migration] Context impl MySQLImpl. INFO [alembic.migration] Wil.....

    周末回到家里,在自己笔记本上准备继续编码。自己需要把数据库表结构神马的upgrade一致。

    没有想到。

    yeelone@yeelone-ThinkPad-Edge:~/project$ alembic upgrade  head
    INFO  [alembic.migration] Context impl MySQLImpl.
    INFO  [alembic.migration] Will assume non-transactional DDL.
    INFO  [alembic.migration] Running upgrade 96274508199 -> 4562778272fd

    卡住超久。重启了数据库还是一样,真气人。

    打开数据库一看当前 所运行所有纯种:

    mysql> show processlist; 
    +----+------+-----------+--------+---------+------+---------------------------------+------------------------------------------------------------------------------------------------------+
    | Id | User | Host      | db     | Command | Time | State                           | Info                                                                                                 |
    +----+------+-----------+--------+---------+------+---------------------------------+------------------------------------------------------------------------------------------------------+
    | 45 | root | localhost | project | Sleep   |  888 |                                 | NULL                                                                                                 |
    | 48 | root | localhost | project | Sleep   |  858 |                                 | NULL                                                                                                 |
    | 49 | root | localhost | project | Query   |  834 | Waiting for table metadata lock | ALTER TABLE users ADD COLUMN created DATETIME NOT NULL                                               |
    | 50 | root | localhost | project | Query   |  828 | Waiting for table metadata lock | SELECT users.id AS users_id, users.useremail AS users_useremail, users.username AS users_username, u |
    | 51 | root | localhost | project | Query   |  170 | Waiting for table metadata lock | ALTER TABLE users ADD COLUMN created DATETIME NOT NULL                                               |
    | 54 | root | localhost | project | Query   |  127 | Waiting for table metadata lock | ALTER TABLE users ADD COLUMN created DATETIME NOT NULL 

    都在waiting~~~

     Waiting for table metadata lock ,

    看来是被死锁了。

    我不是什么mysql专家,只好杀掉所有进程来解决这个问题了:

    mysql> kill 46;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> kill 47;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> kill 48;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> kill 49;
    Query OK, 0 rows affected (0.00 sec)
    yeelone@yeelone-ThinkPad-Edge:~/project$ alembic upgrade head
    INFO  [alembic.migration] Context impl MySQLImpl.
    INFO  [alembic.migration] Will assume non-transactional DDL.
    INFO  [alembic.migration] Running upgrade 96274508199 -> 4562778272fd
    INFO  [alembic.migration] Running upgrade 4562778272fd -> 477f4e47bd07

     

    转载于:https://www.cnblogs.com/yeelone/archive/2012/12/08/2808288.html

    展开全文
  • 死锁产生的四个必要条件互斥条件:资源是独占的且排他使用,进程互斥使用资源,即任意时刻一个资源只能给一个进程使用,其他进程若申请一个资源,而该资源被另一进程占有,则申请者等待直到资源被占有者释放。...

    死锁产生的四个必要条件

    248850cb560157b5f51eac2b1e872f21.png

    互斥条件:资源是独占的且排他使用,进程互斥使用资源,即任意时刻一个资源只能给一个进程使用,其他进程若申请一个资源,而该资源被另一进程占有时,则申请者等待直到资源被占有者释放。(推荐学习:MySQL视频教程)

    不可剥夺条件:进程所获得的资源在未使用完毕之前,不被其他进程强行剥夺,而只能由获得该资源的进程资源释放。

    请求和保持条件:进程每次申请它所需要的一部分资源,在申请新的资源的同时,继续占用已分配到的资源。

    循环等待条件:在发生死锁时必然存在一个进程等待队列{P1,P2,…,Pn},其中P1等待P2占有的资源,P2等待P3占有的资源,…,Pn等待P1占有的资源,形成一个进程等待环路,环路中每一个进程所占有的资源同时被另一个申请,也就是前一个进程占有后一个进程所深情地资源。

    以上给出了导致死锁的四个必要条件,只要系统发生死锁则以上四个条件至少有一个成立。事实上循环等待的成立蕴含了前三个条件的成立,似乎没有必要列出然而考虑这些条件对死锁的预防是有利的,因为可以通过破坏四个条件中的任何一个来预防死锁的发生。

    死锁预防

    我们可以通过破坏死锁产生的4个必要条件来 预防死锁,由于资源互斥是资源使用的固有特性是无法改变的。

    破坏“不可剥夺”条件:一个进程不能获得所需要的全部资源时便处于等待状态,等待期间他占有的资源将被隐式的释放重新加入到 系统的资源列表中,可以被其他的进程使用,而等待的进程只有重新获得自己原有的资源以及新申请的资源才可以重新启动,执行。

    破坏”请求与保持条件“:第一种方法静态分配即每个进程在开始执行时就申请他所需要的全部资源。第二种是动态分配即每个进程在申请所需要的资源时他本身不占用系统资源。

    破坏“循环等待”条件:采用资源有序分配其基本思想是将系统中的所有资源顺序编号,将紧缺的,稀少的采用较大的编号,在申请资源时必须按照编号的顺序进行,一个进程只有获得较小编号的进程才能申请较大编号的进程。

    更多MySQL相关技术文章,请访问MySQL教程栏目进行学习!

    展开全文
  • 这是因为如果每个人都可以拿到想要的资源,那就不需要等待,所以是不可能发生死锁的 第 2 个是请求与保持条件,它是指当一个线程因请求资源而阻塞,则需对已获得的资源保持不放。如果在请求资源阻塞了,并且会...

    要想发生死锁有 4 个缺一不可的必要条件

    • 第 1 个叫互斥条件,它的意思是每个资源每次只能被一个线程(或进程,下同)使用,为什么资源不能同时被多个线程或进程使用呢?这是因为如果每个人都可以拿到想要的资源,那就不需要等待,所以是不可能发生死锁的

     

    • 第 2 个是请求与保持条件,它是指当一个线程因请求资源而阻塞时,则需对已获得的资源保持不放。如果在请求资源时阻塞了,并且会自动释放手中资源(例如锁)的话,那别人自然就能拿到我刚才释放的资源,也就不会形成死锁

     

    • 第 3 个是不剥夺条件,它是指线程已获得的资源,在未使用完之前,不会被强行剥夺。比如我们数据库,它就有可能去强行剥夺某一个事务所持有的资源,这样就不会发生死锁了。所以要想发生死锁,必须满足不剥夺条件,也就是说当现在的线程获得了某一个资源后,别人就不能来剥夺这个资源,这才有可能形成死锁

     

    • 第 4 个是循环等待条件,只有若干线程之间形成一种头尾相接的循环等待资源关系时,才有可能形成死锁,比如在两个线程之间,这种“循环等待”就意味着它们互相持有对方所需的资源、互相等待;而在三个或更多线程中,则需要形成环路,例如依次请求下一个线程已持有的资源等

     

    案例解析

    /**
     * 描述:必定死锁的情况
     */
    public class MustDeadLock implements Runnable {
    
        public int flag;
        static Object o1 = new Object();
        static Object o2 = new Object();
    
        public void run() {
            System.out.println("线程"+Thread.currentThread().getName() + "的flag为" + flag);
            if (flag == 1) {
                synchronized (o1) {
                    try {
                        Thread.sleep(500);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    synchronized (o2) {
                        System.out.println("线程1获得了两把锁");
                    }
                }
            }
            if (flag == 2) {
                synchronized (o2) {
                    try {
                        Thread.sleep(500);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    synchronized (o1) {
                        System.out.println("线程2获得了两把锁");
                    }
                }
            }
        }
    
        public static void main(String[] argv) {
            MustDeadLock r1 = new MustDeadLock();
            MustDeadLock r2 = new MustDeadLock();
            r1.flag = 1;
            r2.flag = 2;
            Thread t1 = new Thread(r1, "t1");
            Thread t2 = new Thread(r2, "t2");
            t1.start();
            t2.start();
        }
     }
    

    先来看一下第 1 个互斥条件,很显然,我们使用的是 synchronized 互斥锁,它的锁对象 o1、o2 只能同时被一个线程所获得,所以是满足互斥条件的

    第 2 个是请求与保持条件,可以看到,同样是满足的。比如,线程 1 在获得 o1 这把锁之后想去尝试获取 o2 这把锁 ,这时它被阻塞了,但是它并不会自动去释放 o1 这把锁,而是对已获得的资源保持不放

    第 3 个是不剥夺条件,在我们这个代码程序中,JVM 并不会主动把某一个线程所持有的锁剥夺,所以也满足不剥夺条件

    第 4 个是循环等待条件,可以看到在我们的例子中,这两个线程都想获取对方已持有的资源,也就是说线程 1 持有 o1 去等待 o2,而线程 2 则是持有 o2 去等待 o1,这是一个环路,此时就形成了一个循环等待

    展开全文
  • 这是因为如果每个人都可以拿到想要的资源,那就不需要等待,所以是不可能发生死锁的。 第 2 个是请求与保持条件,它是指当一个线程因请求资源而阻塞,则需对已获得的资源保持不放。如果在请求资源阻塞了,并且...
  • 根据不少同学的面试反馈,最近阿里和字节跳动面试都对多线程相关的问题进行了重点考察,并且面试官都问到了死锁问题。如字节跳动考察的问题是:什么是线程死锁死锁如何产生?如何避免线程死锁?本文便就此问题...
  • 死锁

    2021-04-17 14:42:26
    因竞争资源发生死锁现象:系统中供多个进程共享的资源的数目不足以满足全部进程的需要时,就会引起对诸资源的竞争而发生死锁现象。 进程推进顺序不当发生死锁。 3、如何解决死锁问题? 3.1 预防死锁 资源一次性...
  •   背景:SipPhone终端与多个其他设备的用户视频互通,由于Sip终端只能显示一路视频,所以模块A采用轮询方式将多个用户视频发送到sip终端上...用户视频采用H264编码,Sip终端接收H263编码视频,所以用户视频需要经过H
  • 有m个资源,每个进程最多需要x个资源,则最多允许几个进程参与竞争,确保不会发生死锁? 进程数使用n表示 当n(x-1)+1<=m,此时不会发生死锁 变换形式即n<=m-1/x-1 ...
  • 当系统中供多个进程共享的资源如打印机,公用队列等,其数目不足以满足诸进程的需要时,会引起诸进程对资源的竞争而产生死锁。 (3)进程推进顺序不当。 进程在运行过程中,请求和释放资源的顺序不当,也同样会导致...
  • 线上某服务不时报出如下异常(大约一天二十多次):“Deadlock found when trying to get lock;”。Oh, My God! 是死锁问题。尽管报错不多,对性能目前看来也无太大影响,但还是需要解决,保不齐哪天成为性能瓶颈。...
  • 这种死锁异常一般要在特定时间特定数据和特定业务操作才会复现,并且分析解决需要了解 MySQL 锁冲突相关知识,所以一般遇到这些偶尔出现的死锁异常,往往一没有头绪,不好处理。本篇文章会讲解一下如果线上...
  • InnoDB死锁原理:死锁的情况发在不同的的事务相互之间拥有对需要的锁,导致相互直限等待死锁可能发在不同的事务都会对多个相同的表和相同的上施加锁,但事务对表的操作顺序不相同为了减少死锁的发,要避免使lock ...
  • 是操作系统层面的一个错误,是进程死锁的简称,最早在 1965 年由 Dijkstra 在研究银行家算法提出的,它是计算机操作系统乃至整个并发程序设计领域最难处理的问题之一。 事实上,计算机世界有很多事情需要多线程...
  • 这种死锁异常一般要在特定时间特定数据和特定业务操作才会复现,并且分析解决需要了解 MySQL 锁冲突相关知识,所以一般遇到这些偶尔出现的死锁异常,往往一没有头绪,不好处理。 本篇文章会讲解一下如果线上...
  • 关于死锁

    2020-09-26 18:32:12
    一、什么是死锁? 死锁是由于两个或以上的线程互相持有对方需要的资源,导致这些线程处于等待状态,无法执行。...循环等待:发生死锁时,线程进入死循环,永久阻塞。 三.产生死锁的原因  1.竞争不可抢占性资...
  • 二、innodb隔离级别、索引与锁三、死锁成因四、如何尽可能避免死锁五、如何定位死锁成前言线上某服务不时报出如下异常(大约一天二十多次):“Deadlock found when trying to get lock;”。Oh, My God! 是死锁问题...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 651
精华内容 260
关键字:

发生死锁时需要