操作系统Operating Systems信号量的代码实现Coding Semaphore &死锁处理Deadlock

可以操刀了—从纸上到实际

从Linux 0.11 那里学点东西…

读磁盘块

bread(int dev,int block){

struct buffer_head * bh;

ll_rw_block(READ,bh);

wait_on_buffer(bh);

启动磁盘读以后睡眠,等待磁盘读完由磁盘中断将其唤醒,也是一种同步

lock_buffer(buffer_head*bh)

{cli();

while(bh->b_lock)???

sleep_on(&bh->b_wait);

bh->b_lock = 1;

sti(); }

void sleep_on(struct task_struct **p){

struct task_struct *tmp;

tmp = *p;

*p = current;

current->state = TASK_UNINTERRUPTIBLE;

schedule();

if (tmp)

tmp->state=0;}

Linux 0.11 sleep_on形成的队列

sleep_on(struct task_struct **p) p 是一个指向task_struct 结构体的指针的指针

如何从Linux 0.11 的这个队列中唤醒?

static void read_intr(void){

... 磁盘中断

end_request(1);

end_request(int uptodate){

...

unlock_buffer(CURRENT->bh);

unlock_buffer(struct buffer_head * bh){

bh->b_lock=0;

wake_up(&bh->b_wait);}

schedule();

if (tmp)

tmp->state=0; 这是sleep_on 的最后三句

wake_up(struct task_struct **p){

if (p && *p) {

(**p).state=0; *p=NULL;}}

死锁处理Deadlock

死锁的成因

资源 互斥使用,一旦占有别人无法使用

进程 占有 了一些资源,又不释放,再去 申请 其他资源

各自占有的资源和互相申请的资源形成了环路等待

死锁的4个必要条件

互斥使用(Mutual exclusion)

资源的固有特性, 如道口

不可抢占(No preemption)

资源只能自愿放弃, 如车开走以后

请求和保持(Hold and wait)

进程必须占有资源,再去申请

循环等待(Circular wait)

在资源分配图中存在一个环路

死锁处理方法概述

死锁预防 "no smoking" ,预防火灾

破坏死锁出现的条件

死锁避免 检测到煤气超标时,自动切断电源

检测每个资源请求,如果造成死锁就拒绝

死锁检测+ 恢复 发现火灾时,立刻拿起灭火器

检测到死锁出现时,让一些进程回滚,让出资源

死锁忽略 在太阳上可以对火灾全然不顾

就好像没有出现死锁一样

死锁预防的方法例子

在进程执行前, 一次性申请所有需要的资源, 不会占有资源再去申请其它资源

缺点1: 需要预知未来,编程困难

缺点2: 许多资源分配后很长时间后才使用,资源利用率低

对资源类型进行排序, 资源申请必须按序进行 ,不会出现环路等待

缺点: 仍然造成资源浪费

死锁避免: 判断此次请求是否引起死锁?

如果系统中的所有进程存在一个可完成的执行序列P 1 ,…P n ,则称系统处于安全状态

都能执行完成当然就不死锁

找安全序列的银行家算法(Dijkstra 提出)

int Available[1..m]; // 每种资源剩余数量

int Allocation[1..n,1..m]; // 已分配资源数量

int Need[1..n,1..m];// 进程还需的各种资源数量

int Work[1..m]; // 工作向量

bool Finish [1..n]; // 进程是否结束

Work = Available; Finish[1..n] = false;

while(true){

for(i=1; i<=n; i++){

if(Finish[i]==false && Need[i]≤Work){

Work = Work + Allocation[i];

Finish[i] = true; break;} //T(n)=O(mn 2 )

else {goto end;}

}

}

End: for(i=1;i<=n;i++)

if(Finish[i]==false) return "deadlock";

死锁避免之银行家算法实例

请求出现时:首先假装分配,然后调用银行家算法

P 0 申请(0,2,0)

进程P 0 , P 1 , P 2 , P 3 , P 4 一个也没法执行,死锁进程组

此次申请被拒绝

死锁检测+ 恢复: 发现问题再处理

基本原因: 每次申请都执行O(mn 2 ) ,效率低。 发现问题再处理

定时检测或者是发现资源利用率低时检测

Finish[1..n] = false;

if(Allocation[i] == 0) Finish[i]=true;

...// 和Banker 算法完全一样

for(i=1;i<=n;i++)

if(Finish[i]==false)

deadlock = deadlock + {i};

选择哪些进程回滚? 优先级? 占用资源多的? …

如何实现回滚? 那些已经修改的文件怎么办?

到此:提供以前所有操作系统 doc下载

文件名 大小
[No00003D]操作系统Operating_Systems信号量的代码实现Coding_Semaphore_&死锁处理Deadlock.rar 358KB
[No00003C]操作系统Operating_Systems进程同步与信号量Processes_Synchronization_and_Semaphore.rar 297KB
[No00003A]操作系统Operating_Systems_内核级线程Kernel_Threads内核级线程实现Create_KernelThreads.rar 977KB
[No000039]操作系统Operating_Systems用户级线程User_Threads.rar 449KB
[No000038]操作系统Operating_Systems_-CPU.rar 717KB
[No000037]操作系统Operating_Systems操作系统历史与硬件概况History_of_OS_&_Summaries!.rar 287KB
[No000036]操作系统Operating_Systems系统调用的实现System_Call.rar 253KB
[No000035]操作系统Operating_System之OS_Interface操作系统接口.rar 422KB
[No000031]操作系统_Operating_Systems之Open_the_OS!.rar 308KB

[No00003D]操作系统Operating Systems信号量的代码实现Coding Semaphore &死锁处理Deadlock的更多相关文章

  1. [No00003C]操作系统Operating Systems进程同步与信号量Processes Synchronization and Semaphore

    操作系统Operating Systems进程同步与信号量Processes Synchronization and Semaphore 进程合作:多进程共同完成一个任务 从纸上到实际:生产者− − ...

  2. [No00003A]操作系统Operating Systems 内核级线程Kernel Threads内核级线程实现Create KernelThreads

    开始核心级线程 内核级线程对多核的支持怎么样? 和用户级相比,核心级线程有什么不同? ThreadCreate 是系统调用,内核管理TCB ,内核负责切换线程 如何让切换成型? − − 内核栈,TCB ...

  3. [No000036]操作系统Operating Systems系统调用的实现System_Call

    实现一个whoami 系统调用 系统调用的直观实现 问题+直观想法… 用户程序调用whoami, 一个字符串"systemcall "放在操作系统中(系统引导时载入) ,取出来打印 ...

  4. [No000037]操作系统Operating Systems操作系统历史与硬件概况History of OS & Summaries!

    培根:读史使人明智 操作系统的简史 (1955-1965) 计算机非常昂贵,上古神机IBM7094 ,造价在250万美元以上 计算机使用原则:只专注于计算 批处理操作系统(Batch system) ...

  5. [No000031]操作系统 Operating Systems 之Open the OS!

    从打开电源开始… 这神秘的黑色背后发生着什么?… 打开电源,计算机执行的第一句指令什么? 计算模型(图灵机) ⇒ 我们要 关注 指针IP 及其 指向的内容 看看x86 PC (1) 刚开机时CPU 处 ...

  6. [No000038]操作系统Operating Systems -CPU

    管理CPU ,先要使用CPU… CPU 的工作原理 CPU上电以后发生了什么? 自动的取指 — 执行 CPU 怎么工作? CPU怎么管理? 管理CPU 的最直观方法 设好PC 初值就完事! 看看这样做 ...

  7. [No000039]操作系统Operating Systems用户级线程User Threads

    多进程是操作系统的基本图像 是否可以资源不动而切换指令序列? 进程 = 资源 + 指令执行序列 线程: 保留了并发的优点,避免了进程切换代价 实质就是映射表不变而PC 指针变 多个执行序列+ 一个地址 ...

  8. Modern Operating Systems(Ⅰ)——2014.12.15

    进程   进程模型     进程就是一个正在执行的程序的实例  值得注意的是,若一个程序运行了两遍,则算作两个进程 创建进程 在通用系统中,有四种主要事件导致进程的创建 ①系统的初始化 ②执行了 正在 ...

  9. Operating Systems (COMP2006)

    Operating Systems (COMP2006) 1st Semester 2019Page 1, CRICOS Number: 00301JOperating Systems (COMP20 ...

随机推荐

  1. VS无法启动 IISExpress web 服务器

    VS无法启动 IISExpress web 服务器     今天把原来的VS卸载重装了,重装之后启动一个web项目时发现启动不起来,提示如下:     在网上查找资料之后发现是由于WebMatrix也 ...

  2. 高性能JS笔记3——DOM编程

    一.访问与修改DOM DOM和JS 相当于两个岛屿,访问操作的次数越多,要交的过路费越多,对性能产生很大影响. 减少访问DOM的次数,把运算尽量留在JS端操作. 二.innerHTML 对比 DOM ...

  3. [Android]使用Gradle提交自己开源Android库到Maven中心库

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4388175.html 此文针对开源爱好者. 如果你想让别人使用 ...

  4. 安卓开发_慕课网_Fragment实现Tab(App主界面)

    学习内容来自“慕课网” 这里用Fragment来实现APP主界面 思路: 底部横向排列4个LinearLayout,每个LinearLayout包含一个图片按钮和一个文字 1.默认显示第一个功能(微信 ...

  5. iOS 音乐

    iOS 音乐 这篇博客介绍的是较长的音频播放-音乐... 有关音效的介绍可以点击下面的连接进入... iOS 音效 首先导入框架:AVFoundation.framework 导入框架后我们在需要使用 ...

  6. iOS 学习 - 11.圆角(小于等于四个)类似气泡和计算字符高度

    使用贝塞尔曲线, // 小于四个角 圆角 -(void)setbor{ NSString *str = @" couldn't fit this all in a comment to @l ...

  7. forward内部跳转 和redirect重定向跳转的区别

    1.从地址栏显示来说 forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地 ...

  8. js DOM Document类型

    JavaScript通过Document类型访问文档.在浏览器中,document对象是HTMLDocument(继承自 Document类型)的一个实例,表示整个HTML页面.document对象是 ...

  9. MVC模式与三层架构和表示层

    1.MVC模式     - Model-View-Controller     - 模型-视图-控制器     - Model(模型)         > 模型分为业务模型,和数据模型     ...

  10. IT软件开发常用英语词汇

    Aabstract 抽象的abstract base class (ABC)抽象基类abstract class 抽象类abstraction 抽象.抽象物.抽象性access 存取.访问access ...