操作系统之进程管理(3)
6、进程同步与互斥
6.1、进程同步
进程同步:在多道程序环境下,进程是并发执行的,不同进程之间存在着不同的相互制约关系。
例1:进程具有异步性的特征。异步性是指,各并发执行的进程以各自独立的、不可预知的速度向前推进。
例2:进程通信——管道进程
读进程和写进程并发地运行,由于并发必然导致异步性,因此“写数据"和“读数据”两个操作执行的先后顺序是不确定的。而实际应用中,又必须按照“写数据≥读数据”的顺序来执行的。
如何解决这种异步问题,就是“进程同步”所讨论的内容。
同步亦称直接制约关系,它是指为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调它们的工作次序而产生的制约关系。进程间的直接制约关系就是源于它们之间的相互合作。
6.2、进程互斥
进程互斥:多个进程在同一时刻只有一个进程能进入临界区。
- 资源共享:包括两种资源共享方式
进程的“并发"需要“共享”的支持。各个并发执行的进程不可避免的需要共享一些系统资源(比如内存,又比如打印机、摄像头这样的I/O设备)。
①互斥共享方式:系统中的某些资源,虽然可以提供给多个进程使用,但一个时间段内只允许一个进程访问该资源。
②同时共享方式:系统中的某些资源,允许一个时间段内由多个进程“同时”对它们进行访问。
- 临界资源
我们把一个时间段内只允许一个进程使用的资源称为临界资源。许多物理设备( 比如摄像头、打印机)都属于临界资源。此外还有许多变量、数据、内存缓冲区等都属于临界资源。
对临界资源的访问,必须互斥地进行。互斥,亦称间接制约关系。进程互斥指当一个进程访问某临界资源时,另一个想要访问该临界资源的进程必须等待。当前访问临界资源的进程访问结束,释放该资源之后,另一个进程才能去访问临界资源。
临界资源分为4个部分:包括进入区、临界区、退出区和剩余区。
- 对于临界资源的访问,需要遵循的四大原则:
①空闲让进。临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区;
②忙则等待。当已有进程进入临界区时,其他试图进入临界区的进程必须等待;
③有限等待。对请求访问的进程,应保证能在有限时间内进入临界区(保证不会饥饿);
④让权等待。当进程不能进入临界区时,应立即释放处理机,防止进程忙等待。
6.3、进程同步与互斥的总结
7、线程概念与多线程模型
7.1、关于线程
什么是线程?为什么引用线程?
进程是资源分配的最小单位,线程是CPU调度的最小单位,而线程(thread)是操作系统能够进行运算调度的最小单位。
做个简单的比喻:进程=火车,线程=车厢
- 线程在进程下行进(单纯的车厢无法运行)
- 一个进程可以包含多个线程(一辆火车可以有多个车厢)
- 不同进程间数据很难共享(一辆火车上的乘客很难换到另外一辆火车,比如站点换乘)
- 同一进程下不同线程间数据很易共享(A车厢换到B车厢很容易)
- 进程要比线程消耗更多的计算机资源(采用多列火车相比多个车厢更耗资源)
- 进程间不会相互影响,一个线程挂掉将导致整个进程挂掉(一列火车不会影响到另外一列火车,但是如果一列火车上中间的一节车厢着火了,将影响到所有车厢)
- 进程可以拓展到多机,进程最多适合多核(不同火车可以开在多个轨道上,同一火车的车厢不能在行进的不同的轨道上)
- 进程使用的内存地址可以上锁,即一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。(比如火车上的洗手间)-“互斥锁”
- 进程使用的内存地址可以限定使用量(比如火车上的餐厅,最多只允许多少人进入,如果满了需要在门口等,等有人出来了才能进去)-“信号量”
引入线程之后的变化?
同一个进程的各线程可能在多个cpu核中运行。和进程一样,线程有它的TCB和ID,也有就绪,阻塞,运行三种状态。线程几乎不拥有系统资源,系统资源是分配给进程的,同一进程内的线程共享进程的资源。
同一进程内的线程间切换,不用切换进程环境。
7.2、线程属性
7.3、线程的实现方式
线程分为 用户级线程 和 内核级线程(即守护线程)
- 用户级线程
用户级线程由应用程序通过线程库创建和管理
用户级线程间的管理工作(包括线程切换)都由应用程序负责管理(在用户态下就可以完成)
事实上,对用户来说,是有多个线程,但是对操作系统内核来说,并看不见线程的存在。
- 内核级线程
内核级线程由操作系统负责管理,内核级线程的切换需要在核心态下完成,内核级线程就是操作系统能看到的。
7.4、多线程模型
所谓多线程模型就是指几个用户级线程映射到几个内核级线程的问题。
- 多对一模型
多对一模型:多个用户线程映射到一个内核线程。
- 一对一模型
一对一模型:一个用户线程对应一个内核级线程。
- 多对多模型
多对多模型:n个用户线程映射到m个内核线程(n>=m)。
对于前面两种模型的优缺点折中。既克服了多对一模型中并发度低的缺点,又克服了一对一模型中占用太多内核级线程的缺点。
- 多线程模型之多对多模型的例子