安装linux死锁无法关机,【Linux】死锁!!!

死锁概念

在多线程程序里面多个线程因为竞争资源而产生的僵持现象。

产生死锁的四个条件

互斥条件:每个资源每次只能被一个进程使用,即在一度那时间内得某资源仅为一个进程所占有。此时若有其他的进程请求该资源,则请求进程只能等待。

请求与保持条件:进程已经保持了至少一个资源,但是又提出来新的资源请求,而该资源已经被其他的进程战友,此时请求进程被阻塞,但自己已获得的资源保持不放

不可剥夺条件:进程获得的资源在未使用完毕之前,不能被其他进程随意强行夺走,即获得的资源只能够由自己释放。

循环等待条件:若干进程间形成首尾相接循环等待资源的关系。

例如:线程A对资源加锁,但是在A释放锁之前又再次申请同一个资源。

情况1:

pthread_mutex_t lock;

void* pthread_run(void* arg){

pthread_mutex_lcok(&lock);

printf("pthread_run\n");

pthread_mutex_lcok(&lock);

printf("pthread_run\n");

pthread_mutex_unlcok(&lock);

}

int main(){

pthread_t tid;

pthread_mutex_init(&lock,NULL);

pthread_create(&tid,NULL,pthread_run,NULL);

printf("Main pthread is join!\n");

pthread_join(tid,NULL);

return 0;

}

两个线程间互相等待对方的资源,导致死锁。

情况2:

pthread_cond_t cond1,cond2;

pthread_mutex_t lock;

void* pthread_run1(void* arg){

pthread_mutex_lock(&lock);

pthread_cond_wait(&cond2,&lock);

printf("pthread_run\n");

pthread_mutex_unlock(&lock);

}

void* pthread_run2(void* arg){

pthread_mutex_lock(&lock);

pthread_cond_wait(&cond1,&lock);

printf("pthread_run\n");

pthread_mutex_unlock(&lock);

}

int main(){

pthread_t tid1,tid2;

pthread_mutex_init(&lock,NULL);

pthread_cond_init(&cond2,NULL);

pthread_cond_init(&cond1,NULL);

pthread_create(&tid1,NULL,pthread_run1,NULL);

pthread_create(&tid2,NULL,pthread_run2,NULL);

printf("Main pthread is join!\n");

pthread_join(tid1,NULL);

pthread_join(tid2,NULL);

return 0;

}

如何避免死锁

1.破坏“互斥”条件:就是在系统里取消互斥。若资源不被一个进程独占使用,那么死锁是肯定不会发生的。但一般来说在所列的四个条件中,“互斥”条件是无法破坏的。因此,在死锁预防里主要是破坏其他几个必要条件,而不去涉及破坏“互斥”条件。

2.破坏“占有并等待”条件:破坏“占有并等待”条件,就是在系统中不允许进程在已获得某种资源的情况下,申请其他资源。即要想出一个办法,阻止进程在持有资源的同时申请其他资源。

方法一:创建进程时,要求它申请所需的全部资源,系统或满足其所有要求,或什么也不给它。这是所谓的 “ 一次性分配”方案。

方法二:要求每个进程提出新的资源申请前,释放它所占有的资源。这样,一个进程在需要资源S时,须先把它先前占有的资源R释放掉,然后才能提出对S的申请,即使它可能很快又要用到资源R。

3.破坏“不可抢占”条件:破坏“不可抢占”条件就是允许对资源实行抢夺。

方法一:如果占有某些资源的一个进程进行进一步资源请求被拒绝,则该进程必须释放它最初占有的资源,如果有必要,可再次请求这些资源和另外的资源。

方法二:如果一个进程请求当前被另一个进程占有的一个资源,则操作系统可以抢占另一个进程,要求它释放资源。只有在任意两个进程的优先级都不相同的条件下,方法二才能预防死锁。

4.破坏“循环等待”条件:破坏“循环等待”条件的一种方法,是将系统中的所有资源统一编号,进程可在任何时刻提出资源申请,但所有申请必须按照资源的编号顺序(升序)提出。这样做就能保证系统不出现死锁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值