UML
用例图:从用户角度描述系统功能。
类图:描述系统中类的静态结构。
对象图:系统中的多个对象在某一时刻的状态。
状态图:是描述状态到状态控制流,常用于动态特性建模
活动图:描述了业务实现用例的工作流程
顺序图:对象之间的动态合作关系,强调对象发送消息的顺序,同时显示对象之间的交互
协作图:描述对象之间的协助关系
构件图:一种特殊的UML图来描述系统的静态实现视图
部署图:定义系统中软硬件的物理体系结构
包图:对构成系统的模型元素进行分组整理的图
组合结构图:表示类或者构建内部结构的图
交互概览图:用活动图来表示多个交互之间的控制关系的图
类图
关系: 泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation),组合(Composition),依赖(Dependency)。
各种关系的强弱顺序: 泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖
【泛化关系】:实线空心。是一种继承关系,表示一般与特殊的关系,它指定了子类如何继承父类的所有特征和行为。例如:老虎是动物的一种,即有老虎的特性也有动物的共性。
【实现关系】:虚线空心。是一种类与接口的关系,表示类是接口所有特征和行为的实现。
【关联关系】:直线w/o箭头,双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。是一种拥有的关系,它使一个类知道另一个类的属性和方法;如:老师与学生,丈夫与妻子关联可以是双向的,也可以是单向的。
【聚合关系】:带空心菱形的实线,菱形指向整体。是整体与部分的关系,且部分可以离开整体而单独存在。如车和轮胎是整体和部分的关系,轮胎离开车仍然可以存在。聚合关系是关联关系的一种,是强的关联关系。
【组合关系】:带实心菱形的实线,菱形指向整体。是整体与部分的关系,但部分不能离开整体而单独存在。如公司和部门是整体和部分的关系,没有公司就不存在部门。组合关系是关联关系的一种,是比聚合关系还要强的关系,它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期。eg.公司
【依赖关系】:带箭头的虚线,指向被使用者。是一种使用的关系,即一个类的实现需要另一个类的协助,所以要尽量不使用双向的互相依赖。eg.现代人—>计算机
并行
互斥量属性
PTHREAD_MUTEX_DEFAULT:
这种类型的互斥锁不会自动检测死锁。
如果一个线程试图对一个互斥锁重复锁定,将会引起不可预料的结果。
如果试图解锁一个由别的线程锁定的互斥锁会引发不可预料的结果。
如果一个线程试图解锁已经被解锁的互斥锁也会引发不可预料的结果。
PTHREAD_MUTEX_NORMAL:
这种类型的互斥锁不会自动检测死锁。
如果一个线程试图对一个互斥锁重复锁定,将会引起这个线程的死锁。
如果试图解锁一个由别的线程锁定的互斥锁会引发不可预料的结果。
如果一个线程试图解锁已经被解锁的互斥锁也会引发不可预料的结果。
PTHREAD_MUTEX_ERRORCHECK:
这种类型的互斥锁会自动检测死锁。
如果一个线程试图对一个互斥锁重复锁定,将会返回一个错误代码。
如果试图解锁一个由别的线程锁定的互斥锁将会返回一个错误代码。
如果一个线程试图解锁已经被解锁的互斥锁也将会返回一个错误代码。
PTHREAD_MUTEX_RECURSIVE:
如果一个线程对这种类型的互斥锁重复上锁,不会引起死锁。
一个线程对这类互斥锁的多次重复上锁必须由这个线程来重复相同数量的解锁,这样才能解开这个互斥锁,别的线程才能得到这个互斥锁。
如果试图解锁一个由别的线程锁定的互斥锁将会返回一个错误代码。
如果一个线程试图解锁已经被解锁的互斥锁也将会返回一个错误代码。
这种类型的互斥锁只能是进程私有的(作用域属性为PTHREAD_PROCESS_PRIVATE)。
银行家算法:解决多线程死锁问题
死锁的定义
一个线程集合中的每个线程都在等待这个集合中另一个线程的执行结果才能继续执行下去,若无其他外力,它们都无法推进,这就形成了死锁。
死锁的4个必要条件
1、互斥条件:一个资源在某时刻内只能允许一个线程进行访问;
2、占有且等待:一个线程A占有一部分资源,此时去申请另外的资源,但申请的资源被线程B占有,此时线程A的请求阻塞,但是也不对自己本来的资源进行释放。
3、 不可剥夺条件:线程对已获得的资源,在未完成使用之前,不可剥夺,只能使用完成后才释放。
4、 循环等待:若干个线程之间形成了一种头尾相连的循环等待资源关系。
死锁的避免方式
死锁主要有三种避免方法:
1、 预防死锁发生:通过对死锁产生的四个必要条件进行限制;
2、 检测与拆除死锁:这种方式使允许死锁发生,检测死锁产生,然后解除死锁;
检测的具体实施可以维护两个资源矩阵,对可用资源和需要资源进行比较;
解除死锁的方式主要可以实施抢占剥夺;kill掉进程;回滚系统等;
3、 动态避免:在资源分配过程中,确保资源请求批准后系统不会进入死锁或潜在的死锁状态。如银行家算法。
银行家算法
银行家算法是仿照银行发放贷款时采用的控制方式而设计的一种死锁避免算法
银行家算法的基本思想是:分配资源之前,判断系统是否安全,如果安全才会进行资源分配。
我们把操作系统看做是银行家,操作系统管理的资源相当于银行家的资金,线程向操作系统请求分配资源就是用户向银行家要贷款。
算法在每次分配资源前需要要求: request < available && request < needing;