操作系统之多线程(二)

同步与锁:
同步:多线程中,一个线程访问数据未结束时,其他线程不得访问同一数据,数据的访问被原子化。最常见的方法是使用锁(Lock)。线程在访问数据或资源前获取锁,访问结束后释放锁,在锁被占用时线程获取锁会等待至锁可用。
二元信号量:
只有占用、非占用两种状态。只能被唯一线程独占访问的资源。
多元信号量(Semaphores):
简称信号量,允许多个线程并发访问的资源,初始值为N的信号量允许N个线程并发访问。可以被任意线程获取与释放,即一个线程获取,可以由另一个线程释放。
P操作 申请资源:
(1)S减1;
(2)若S减1后仍大于等于零,则进程继续执行;
(3)若S减1后小于零,则该进程被阻塞后进入与该信号相对应的队列中,然后转入进程调度。
V操作 释放资源:
(1)S加1;
(2)若相加结果大于零,则进程继续执行;
(3)若相加结果小于等于零,则从该信号的等待队列中唤醒一个等待进程,然后再返回原进程继续执行或转入进程调度。
互斥量(Mutex):
与二元信号量类似,但只能被获取互斥量的线程释放该锁。互斥不仅能够在同一应用程序不同线程中实现资源的安全共享,还可以用在不同进程的线程之间。可命名,可跨进程使用。
临界区(Critical Section):
在任意时刻只允许一个线程对共享资源进行访问。互斥量与信号量在系统中任何进程里可见,临界区仅用于本进程。
读写锁(Read-Write Lock):
对于读取频繁,偶尔写入的情况,信号量互斥量等可以实现同步,但是会比较低效,读写锁可以避免这种情况。读写锁有共享,独占两种获取锁的方式,获取后将锁置于对应状态。

线程安全:
volatile关键字:volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据,读取的数据立刻被保存,可以防止优化编译器把变量从内存装入CPU寄存器中。
CPU动态调度:CPU乱序执行指令,用barrier阻隔换序。
线程模型:用户线程—内核线程:一对一,多对一,多对多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值