现代操作系统day6:线程的实现方法;进程间通信

实现线程包的方法:

线程放在用户空间:

运行时系统:
一种介乎编译(Compile)和解释(Interpret)的运行方式,由编译器(Compiler)首先将源代码编译为一种中间码,在执行时由运行时(Runtime)充当解释器(Interpreter)对其解释。

具体方法:
用户空间的线程库函数管理线程:线程在一个运行时系统的顶部运行,这个运行时系统是一个【管理线程的过程】的集合。在用户空间管理线程时,每个进程需要有专门的线程表(TCB),由运行时系统管理,用来追踪该进程中的所有线程。

if(线程引起本地阻塞){
   
	/*调用一个运行时系统的过程*/
	检查该线程是否必须进入阻塞状态
	if(必须进入阻塞状态){
   
		保存该线程的寄存器
		查看表中可运行的就绪线程
		将新线程的保存值重新装入机器的寄存器
		/*只要堆栈指针和程序计数器一被切换,就运行新的线程*/
		}
}

N个用户线程对应M个内核线程

优点:
1)这样的线程切换比陷入内核快一个数量级(不需要陷阱,不需要上下文切换,不需要对高速缓存进行刷新)
2)用户级线程包可以在不支持线程的操作系统上实现
3)允许每个进程有自己定制的调度线程算法(每个进程各自实现自己的线程在什么时候停止什么时候运行)
缺点:
1)如果进程里的某个线程进行了阻塞型系统调用(例如读文件),那么进程里的其他线程都会等待
2)一个线程如果不主动放弃CPU的使用权,其他线程将无法运行
3)由于时间片是分配给进程的,进程内的线程数目增多,执行的比较慢

线程放在内核

CPU的调度单位是线程而不是进程,由内核进行线程,进程主要完成资源的管理
缺点:
1)开销比起上一种方法会更大

轻量级进程

常见于linux,更简洁

进程间通信

进程间通信要解决的问题是多个相互协作的进程间,如何让他们正确地操作共享资源
进程调度要解决的问题是安排进程工作先后顺序,来使得系统开销和公平性之间取得平衡

进程间通信(IPC)不是中断

进程间通信要解决的问题:
1.如何传递信息
2.如何确保进程间在关键活动中不会出现交叉
3.正确的顺序
同样的问题和解决方法也适用于线程

竞争与互斥

竞争条件:两个或多个进程读写某些共享数据,而最后的结果取决于进程运行的精确时序
例如:两个进程都去修改原有数字,一个加,一个减,得到的结果却可能是只加或只减,而并非想象中的既加又减。
在这里插入图片描述
问题:如果需要,就有人去买面包;最多有一个人去买面包
解决方法:在冰箱上设置锁和钥匙,去买面包之前要锁上并带走钥匙
死锁:A拿到锁1,B拿到锁2,A想要拿锁2,B想要拿锁1,但双方都要求对方先放弃锁,自己才肯给锁,结果大家都拿不到锁

问题的症结在于,在进程A对共享变量的使用未结束之前,系统发生中断,进程B就使用该共享变量。而B结束恢复到A时,A使用的依然是中断前一刻保存的变量的值,没有更新变量的值

为解决该问题,就要实现互斥,要求
1)互斥:两个进程不能同时处于临界区
2)不应该对CPU的速度和数量做任何假设
3)无忙等待:等待着的进程可以去睡眠
4)有限等待:不得使进程无限期等待进入临界区

临界区:对共享内存进行访问的程序片段

在这里插入图片描述
当一个进程在临界区中更新共享内存时,其他进程将不会进去其临界区,也不会带来任何麻烦

实现互斥

基于硬件的解决方法(仅适用于单处理器)

1.屏蔽中断
在每个进程刚刚进入临界区后立刻屏蔽所有中断(包括时钟中断),并在将要离开之前再打开中断
缺点:
1)对于多处理器的系统,其它CPU仍可以访问该共享内存
2)整个系统都会因此为你而停下来,影响了系统其他本应执行而且当前进程无关的操作
3)只能用于临界区很小的情况

2.锁变量(不可行)
缺点:
同样可能出现恰好在进程A锁变量之前,进程B被调度并提前锁了进程,无法解决竞争
3.严格轮换法(不可行)
缺点:
违反了“临界区外运行的进程不得阻塞其他进程”的原则

基于软件的解决方法(复杂)

4.Peterson解法(两个线程)

#define FALSE 	0
#define TRUE 	1
#define N 		2   /*进程数量*/

int turn;			/*现在轮到谁?*/
int interested[N];	/*所有值初始化为0*/

void enter_region(int process);/*进程号是0或1*/
{
   
	int other;						/*其他进程号*/
	
	other = 1-process;				/*另一方进程*/
	interested[process] = TRUE;		/*表明所感兴趣的*/
	turn = process;					/*设置标志*/
	while (turn == process && interested[other] == TRUE);<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值