62--进程和线程(8)
该说说我们在windows编程中经常遇到的一个问题了,就是同步问题。同步的概念其实是源于并发的一种现象。并非在OS中实际上就是多个线程在同时进行,其实实际上并不是真正的并行执行,但也是分时有序的进行。而同步就是这并发中的让各个线程有序的进行或者控制着它们。多线程并发最容易出问题地方就莫过于对资源偶的共享或者是互斥了。前面也讲了多线程的调度,所以OS在调度这些线程时肯定是依据优先级别来分配资源的,所以那些线程们总是能够在适当的时候完成该完成的任务。反正优先级高肯定会比那些优先级低的先获得系统的资源。线程的调度,原理实在是简单,然而在实际中复杂的情况远远多于那些简短的理论。因为OS的线程因各自的优先级及状态,让各种情况都会出现。然而线程之间还有一种依赖关系。尤其是多个线程对一个全局变量进行操作或者利用变量进行通信,那么极有可能会出现问题。造成多线程并发出现的问题又有许多复杂的情况,像什么多核、处理器外部中断、内部中断等,这里面情况很多就不一一枚举出来了。
要把同步问题描述清楚,那自然而然的就要用到了这些熟悉的原语了。这些我们应该是熟悉的术语了。临界区,这在调试程序时经常看到的提示。criical section,我们写代码时是不是对这个的运用就是enter critial section 和 leave critial section。这个想必大家都很好理解,就是当一个线程进入了临界区,其它线程如果想进入就必须得等等了。而且是在进入点上等待,临界区的代码可以分布在各个代码段中去。还有一个就是锁LOCK,锁的用途就是实现互斥访问。锁的对象本质实际上就是一个只有2个值的对象,一个0,一个1。反正就是一个线程如果想获得锁,但这是另一个线程就必须被阻塞,直到使用其它锁被释放掉。锁的操作基本就是lock和unlock。当很多线程都在抢同一把锁时,则会出现锁竞争的现象。锁还可以在更广阔的范围内使用,这就分为全局锁和局部锁。全局锁往往用于控制一个较大范围的数据,而局部锁则是管理相对小范围的数据。还有一个就是信号量了,信号量的使用一个计数器来控制程序对一个共享资源的访问,信号量有两个操作就是我们常说道额P和V操作了。实际上就是一个减、一个加。号,量对象肯定有一个数据结构来维护的,这个数据结构就是队列。这个队列来记录正在阻的线程。还有一个我比较熟悉的就是消息了,消息传递可以在进程之间、线程之间、系统之间传递操作。一个发送、一个接收。这两个操作可以同步工作直到操作后才返回,当然也可以采取异步的方式。在消息的处理上,同步问题是我们最为熟悉的问题了。当然说到同步的还有一些更为复杂的了,像自旋锁,这些我都未深入了解过,就不在这里多多描述了。
(未完待续..............)