3.4并发:时间是一个本质问题

计算机程序的构造和解释(笔记)

3.4并发:时间是一个本质问题

这一节说的是并发,出现在程序性语言中的多进程多线程问题

这里说一下进程、线程、协程的区别吧

  • 进程:指的是一个计算活动的进展情况,计算机中已运行程序的实体wiki进程词条url
  • 线程:操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。wiki线程词条url
  • 协程:这个见得少一点,python中有出现。相对子例程而言,协程更为一般和灵活,但在实践中使用没有子例程那样广泛。协程由程序员在协程的代码里显示调度。wiki协程词条url

它们之间区别可以查看这里一篇博客http://blog.csdn.net/hairetz/article/details/16119911

3.4.1 并发系统中时间的本质

这里说的是并发程序,cpu时间片争夺资源造成的不可知危害,在数据库课上也有说,例如常见的幻读等:

  • 丢失修改(lost update)幻读:
    指事务1与事务2从数据库中读入同一数据并修改事务2的提交结果破坏了事务1提交的结果,导致事务1的修改被丢失。

幻读.png

  • 不可重复读(non-repeatable read)
    指事务1读取数据后,事务2执行更新操作,使事务1无法再现前一次读取结果。

    不可重复读.png

  • 读“脏”数据(dirty read)脏读
    事务1修改某一数据,并将其写回磁盘事务2读取同一数据后
    事务1由于某种原因被撤消,这时事务1已修改过的数据恢复原值
    事务2读到的数据就与数据库中的数据不一致,是不正确的数据,又称为“脏”数据。

    脏读.png

    这里书上举了幻读的例子

    使用的是一个银行提款
    银行幻读例子.png

    并发程序的正确行为

    为保证并发程序的正确行为:

    • 一个限制方式是加一个规定:修改任意共享状态的两个操作都不允许同时发生。这个要求是十分严厉的。

    • 不那么严厉的方式:保证并发系统产生的结果与各个进程按照某个方式顺序运行产生的结果完全一样即可。

    3.4.2 控制并发的机制

    这节说的是并发程序的正确行为的许多方法中的一种:串行化组(serializer)

  • 对共享变量的串行访问

串行化:使进程可以并发地执行,但其中也有一些过程不能并发地执行;也就是说,串行化就是创建一些不同的过程集合,并且保证在每个时刻,在任何一个串行化集合里至多只有一个过程的一个执行。

  • 使用多重共享资源的复杂性

  • 串行化的实现
    这里说的是使用互斥元(mutex)的同步机制来实现串行化。

说具体一点,

互斥元是一种对象, 假定其提供了两种操作: - 被获取(acquired ); - 被释放(released )

特性为:一但某个互斥元被获取后,对于这一其他获取操作都必须等到该互斥元被释放之后。
互斥元是一个变动对象,可以保存为真或假;在假的时候可以被获取,在真时该互斥元是不可用的,任何其他进程都必须等待。

另外对于lock,Monitor,Mutex的区别,可以自己去博客看看。这里不展开。

  • 死锁:当两个以上的运算单元,双方都在等待对方停止执行,以取得系统资源,但是没有一方提前退出时,无穷无尽等下去。

其发生的条件:

    • 禁止抢占:no preemption
    • 持有和等待:hold and wait
    • 互斥:mutual exclusion
    • 循环等待:circular waiting

如何避免和消除,可以查看死锁wiki

  • 并发性,时间和通信

这里做的是一个总结

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值