进程间通信——信号量

一,信号量
信号量又称为信号灯,它是用来协调不同进程间的数据对象的,而最主要的应用是共享内存方式的进程间通信。本质上,信号量是一个计数器,它用来记录对某个资源(如共享内存)的存取状况。一般说来,为了获得共享资源,进程需要执行下列操作:
   (1) 测试控制该资源的信号量。
   (2) 若此信号量的值为正,则允许进行使用该资源。进程将信号量减1。
   (3) 若此信号量为0,则该资源目前不可用,进程进入睡眠状态,直至信号量值大于0,进程被唤醒,转入步骤(1)。
   (4) 当进程不再使用一个信号量控制的资源时,信号量值加1。如果此时有进程正在睡眠等待此信号量,则唤醒此进程。
   信号量是一个数据集合,用户可以单独使用这一集合的每个元素。要调用的第一个函数是semget,用以获得一个信号量ID。Linux下定义的信号量结构体:

struct semaphore {
        spinlock_t     lock;
        unsigned int   count;
        struct list_head   wait_list;
};

对信号量的操作只能是原子性的操作

二 ,工作原理
信号量只能进行两种操作等待和发送信号,即P(sv)和V(sv),他们的行为是这样的:
P(sv):如果sv的值大于零,就给它减1;如果它的值为零,就挂起该进程的执行 。
V(sv):如果有其他进程因等待sv而被挂起,就让它恢复运行,如果没有进程因等待sv而挂起,就给它加1.

1.semget()函数

int semget(key_t key,int nsems,int semflg); 
功能描述
获取关联的信号量集标识。信号量集被建立的情况有两种:
1.如果值是IPC_PRIVATE。
2.或者值不是IPC_PRIVATE,并且所对应的信号量集不存在,同时标志中指定IPC_CREAT。
当调用semget创建一个信号量时,他的相应的semid_ds结构被初始化。ipc_perm中各个量被设置为相应值

2.semctl()函数

int semctl(int sem_id, int sem_num, int command, ...)

3.semop()函数

int semop(int sem_id, struct sembuf *sem_opa, size_t num_sem_ops)
sembuf结构的定义如下:
struct sembuf{  
short sem_num;//除非使用一组信号量,否则它为0
short sem_op;//信号量在一次操作中需要改变的数据,通常是两个数,一个是-1,即P(等待)操作,一个是+1,即V(发送信号)操作。
short sem_flg;//通常为SEM_UNDO,使操作系统跟踪信号,并在进程没有释放该信号量而终止时,操作系统释放信号量
}; 

测试代码
这里写图片描述

结果如下:
这里写图片描述

三,回滚(ROLLBACK)和撤销(UNDO)

回滚和前滚是保证Oracle数据库中的数据处于一致性状态的重要手段。

在9i版本以前
Oracle使用数据库中的回滚段来实现未提交数据或因系统故障导致实例崩溃时进行回滚操作
每一个表空间需要创建回滚段,各个表空间对回滚段实现各自的管理
在9i及后续版本
提供了一种新的回滚数据的管理方式,即使用Oracle自动管理的撤销(Undo)表空间
自动撤销管理表空间统一管理所有DML的回滚操作,简化了对于回滚工作的管理
在9i,10g中的回滚段仅仅用作保留向后兼容
撤销段代替了原有版本中的回滚段,因此本文所有描述均使用撤销

撤销的实质意味着将所作的修改退回到修改前的状态,即倒退所有DML语句

对于任何DML操作而言,必须同时处理数据块和撤销块,并且还会生成重做信息
在ACID中,A、C、I要求生成撤销,D则要求生成重做
INSERT:
撤销段记录插入记录的rowid,如果需要撤销,则根据rowid将该记录删除即可
UPDATE:
撤销段记录被更新字段的原始值,撤销时将原始值覆盖新值即可
DELETE:
撤销段记录整行的数据,撤销时执行反向操作将该记录插入原表
UNDO段中的内容如下:
数据为修改之前的副本
从每个改变数据的事务中获得
在事务结束前一直被保留

UNDO段中数据的作用:
用于回滚操作
读一致性和闪回查询
用于事务失败时的恢复

UNDO段与事务:
一个事物的启动,Oracle将为其分配仅仅一个UNDO段,若该段用完,则Oracle会自动为该UNDO段添加另一个区间(extent)
一个UNDO段能够同时为多个事务服务

UNDO段与UNDO表空间:
UNDO段中的内容存储在UNDO表空间
任意给定时刻只能使用一个UDNO表空间
UNDO表空间必须被创建为持久的、本地管理、可自动扩展的表空间
正在使用的UNDO表空间不能撤销或删除
UNDO表空间使用循环写的方式,与联机日志文件写相似,不同的是UNDO中可以设置了undo_retention 保留时间

UNDO段的两种管理方式:
AUTO 自动管理(推荐)
MANUAL 手动管理(仅保留)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值