进程、线程、生产者消费者问题
2014-11-20 10:28
148 查看
一周没有更新博客了,最近公司的事情有点忙,而且前面的知识感觉又开始生疏了所以复习了一下前面的只是。这周开始学习操作系统的内容。
进程和线程,要了解这两个概念先要理解并发和并行的关系:所谓并行性:两个或两个以上的事件在同一时刻发生。
并发性:两个或两个以上的时间在同一时间间隔 发生。
引入进程的目的是为了使多个程序能并发执行,提高cpu的利用率。具体的说就是有些程序在执行终端操作的时候(如IO)去执行另一个程序,这样就会提高cpu的利用率不会出现空等的现象。进程是在操作系统中能独立运作并作为资源分配的基本单位。
引入线程的目的为了减少进程调度的大开销,在进程切换的时候由于要保存现场(保存寄存器里的各种数据和状态量)开销会非常的大,所以引入了比进程更小的调度单位线程。线程是独立运行和独立调度的基本单位。
描述进程的数据结构:PCB(process control block)进程控制块,主要包括进程标示符,处理机状态,进程调度信息,进程控制信息。
多个进程并发执行会产生数据不同步的情况,所以在多到任务的操作系统中进程同步机制非常的重要,同步机制应遵循的规则:
1.空闲让进2忙则等待3有限等待4让权等待
关于如何解决进程同步的问题最经典的就是臭名昭著的生产者和消费者的问题:
首先还是名词的解释:pv操作的含义:
p(s):将信号量s的值减一,如果s>=0则继续执行,否则该进程要进入等待状态,并排入等待序列中。
v(s):将信号量s的值加一,若s>0则该进程继续执行,否则释放等待序列中第一个等待的进程。
用信号量及PV操作来实现进程的同步和互斥,pv操作属于进程的低级通信。
信号量:semaphore,信号量的数据结构式一个值和一个指针,指针指向等待该信号量的下一个进程。信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量。当它的值小于0时,其绝对值表示等待使用该资源的进程数。信号量只能用pv操作来改变。
总结一下这个信号量s代表的含义:
对于PV操作的信号量s都是先执行+-操作再判断的,以前老是没注意这一点,好多都想不明白。
那现在处理一下生产者和消费者的问题:
(一个生产者,一个消费者,公用一个缓冲区。
两个同步信号量:
empty——表示缓冲区是否为空,初值为1。
full——表示缓冲区中是否为满,初值为0。
生产者进程
while(TRUE){
produce();
P(empty);
产品送往Buffer;
V(full);
}
消费者进程
while(True){
P(full);
从Buffer取出一个产品;
V(empty);
消费该产品;
}
进程和线程,要了解这两个概念先要理解并发和并行的关系:所谓并行性:两个或两个以上的事件在同一时刻发生。
并发性:两个或两个以上的时间在同一时间间隔 发生。
引入进程的目的是为了使多个程序能并发执行,提高cpu的利用率。具体的说就是有些程序在执行终端操作的时候(如IO)去执行另一个程序,这样就会提高cpu的利用率不会出现空等的现象。进程是在操作系统中能独立运作并作为资源分配的基本单位。
引入线程的目的为了减少进程调度的大开销,在进程切换的时候由于要保存现场(保存寄存器里的各种数据和状态量)开销会非常的大,所以引入了比进程更小的调度单位线程。线程是独立运行和独立调度的基本单位。
描述进程的数据结构:PCB(process control block)进程控制块,主要包括进程标示符,处理机状态,进程调度信息,进程控制信息。
多个进程并发执行会产生数据不同步的情况,所以在多到任务的操作系统中进程同步机制非常的重要,同步机制应遵循的规则:
1.空闲让进2忙则等待3有限等待4让权等待
关于如何解决进程同步的问题最经典的就是臭名昭著的生产者和消费者的问题:
首先还是名词的解释:pv操作的含义:
p(s):将信号量s的值减一,如果s>=0则继续执行,否则该进程要进入等待状态,并排入等待序列中。
v(s):将信号量s的值加一,若s>0则该进程继续执行,否则释放等待序列中第一个等待的进程。
用信号量及PV操作来实现进程的同步和互斥,pv操作属于进程的低级通信。
信号量:semaphore,信号量的数据结构式一个值和一个指针,指针指向等待该信号量的下一个进程。信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量。当它的值小于0时,其绝对值表示等待使用该资源的进程数。信号量只能用pv操作来改变。
总结一下这个信号量s代表的含义:
对于PV操作的信号量s都是先执行+-操作再判断的,以前老是没注意这一点,好多都想不明白。
那现在处理一下生产者和消费者的问题:
(一个生产者,一个消费者,公用一个缓冲区。
两个同步信号量:
empty——表示缓冲区是否为空,初值为1。
full——表示缓冲区中是否为满,初值为0。
生产者进程
while(TRUE){
produce();
P(empty);
产品送往Buffer;
V(full);
}
消费者进程
while(True){
P(full);
从Buffer取出一个产品;
V(empty);
消费该产品;
}
相关文章推荐
- Operating System-进程/线程内部通信-信号量、PV操作的实现和应用(解决哲学家进餐和生产者消费者问题)
- 进程、线程知识点总结和同步(消费者生产者,读者写者三类问题)、互斥、异步、并发、并行、死锁、活锁的总结
- 进程线程的生产者和消费者的问题
- 进程与线程之生产者和消费者问题
- 进程、线程知识点总结和同步(消费者生产者,读者写者三类问题)、互斥、异步、并发、并行、死锁、活锁的总结
- 进程线程的生产者和消费者问题
- Operating System-进程/线程内部通信-信号量、PV操作的实现和应用(解决哲学家进餐和生产者消费者问题)
- 用C#线程技术模拟“生产者-消费者”经典进程同步问题
- 经典进程问题:生产者与消费者
- Linux下用fork()派生的子进程通过pipe管道通讯的实例详解("生产者-消费者"问题)
- 哲学家问题、内存管理及生产者消费者线程
- Java 线程实现生产者和消费者问题
- 线程通信,生产者消费者问题(Java)
- Java 线程的基本概念(模仿生产者与消费者的问题)
- 用信号量做进程同步解决生产者和消费者遇到的奇怪问题
- 再谈java线程以及经典的生产者,消费者问题
- Java基础_线程_多线程_生产者消费者问题
- java生产者消费者问题(线程同步与线程等待的应用)
- Java线程(三):线程协作-生产者/消费者问题
- 生产者消费者问题之Java线程实现