操作系统 第六章 进程同步

【操作系统】第六章 进程同步 6.1 背景 1)竞争条件:多个进程并发访问和操作同一数据且执行结果与访问发生的特定顺序有关。6.2 临界区问题 1)临界区:在该区中进程可能改变共享变量、更新一个表、写一个文件等; 2)引入临界区之后典型进程Pi通用结构如图; 3)临界区特征:当一个进程进入临界区,没有其他进程可被允许在临界区内执行; 4)临界区问题:设计一个以便进程协作的协议; 5)临界区问题满足要求: 阅读详情

同步与互斥

同步-进程之间需要协作

  • 程序定义了每个线程中所有的操作的顺序,符合偏序关系
  • 线程间的操作顺序有线程调度决定

同步定义

  • 并发执行环境下,保持操作系统间偏序关系的行为,称为同步
  • 由应用程序来实现,不是操作系统

互斥-进程之间需要共享资源

临界资源

  • 系统中某些资源可以提供给多个进程使用,但是在一段时间内,只允许一个进程访问资源
  • 当一个进程在访问该资源的时候,其他想访问该资源的进程必须等待,仅当该进程访问玩并释放资源的时候才允许另一进程对该资源进行访问
  • 临济资源:子一段时间内置只允许一个进程访问的资源

互斥:

  • 临界资源不能同时访问
  • 互斥是操作间并发执行的约束
  • 单处理机中,存在并发并不能自动满足互斥的条件

交叉执行处理过程中的问题 - 生产者消费者问题

共享变量处理不好会造成数据不一致

两人同时购票,余票还有一百张

tickets = 100;
R1 = tickets,R1 = R1-1,tickets = R1
R2 = tickets,R2 = R2-1,tickets = R2

交叉执行,则购票后,tckets = 99

Producer-Consumer Problem描述
  • 多个生产者和多个消费者进程共享一个缓冲区
  • 生产者将生产的产品依次取出放入缓冲区中
  • 消费者一次从缓冲区中取出产品消费

The Critical-Section Problem临界区域

  • 原子操作:操作中的所有动作要么都做,要么都不做,不可被分割
  • 原语:一段程序,要么全执行,要么全不执行
  • 临界资源
  • 临界区:在程序中访问临界资源的那段代码;进程对临界区必须互斥进行访问
  • 对临界资源的访问转化成为对临界区的互斥访问
do{
	Entry section
	cirtical section
	Exit section
	remainder section
}while(1);

临界区解决方案

  • 忙则等待(互斥):当一个进程正处在某临界区内,任何试图进入其临界区的进程都必须进入代码连续循环,陷入忙等状态。连续测试一个变量直到某个值出现为止,称为忙等。
  • 有空让进(前进):无程序在临界区执行时,有程序进入应允许;否则会出现饥饿
  • 有限等待:但一个程序进入临界区,应限制其他进程进入临界区的次数,以便申请的进程有机会进入临界区
  • 有权让进:等待的时候释放CPU的执行权,受惠其他进程

Peterson 算法

Process Pi
do{
	flag[i] = true;
	turn = j;
	while(flag[j] && trun == j );
	critical section;
	flag[i] = false;
	remainder section;
}while(1);
Process Pj
do{
	flag[j] = true;
	turn = i;
	while(flag[i] && trun == i );
	critical section;
	flag[j] = false;
	remainder section;
}while(1);
  • 登记加令牌
  • 在门口等级,并把令牌交给另一个进程
  • 退出时,消除登记信息
  • 如果上方都已经登记,拥有令牌的进程会进入
  • 双方尚未登记,拥有令牌,自己会进入
    能保证进程互斥进入临界区,不会发生“饥饿”现象

硬件同步机制

在落锁和检测所的时候,关闭中断,可以达到互斥和防止饥饿

关中断

  • 单处理机中,当操作一个共享的变量时,可以关中断。
  • 对于多处理机来说,时间耗费太多,不高效,不能大规模使用

原子操作和锁机制

原语是将多个指令合并成一个指令,在原语的执行过程中也是不响应中断的,使之成为原子操作,
这个期间,等于是屏蔽中断,也就等价于我们讲的第一种硬件方式----- 关中断

do{
	acquire lock;
	cirtical section;
	release lock;
	remainder section;
}while(1);

acquire lock :

  • 测试当前锁的状态
  • 如果处于开锁状态,关锁,并访问
  • 如果处于关锁状态,则等待,直到锁被打开,然后关锁并继续执行

release lock :
开锁

TestAndSet 指令
bool TestAndSet(boolean *target){
	boolean rv = *target;//取回锁的状态
	*target = True; //加锁
	return rv;
}

Process:
while(1){
	while(TestAndSet(&lock));
	//返回lock的值,并将lock置为True
	//如果原来已经上锁,自己也上锁并等待
	critical section;
	lock = False;//开锁
	remainder section;
}
Swap 指令
void Swap(boolean *a,boolean *b){
	boolean tmep = *a;
	*a = *b;
	*b = temp; 
}

Process:
while(1){
	key = True;//自己加锁
	while(k == True)
		Swap(&lock,&key);
	//key 和 lock值互换,lock为true
	//如果lock原先为false,key现在是false
	critical section;
	lock = False;
	remainder section;
}

信号量Semaphore

信号量是一个受保护的量,只能对其进行初始化,wait()及signal()操作 (P、V操作)

整型信号量

只有一个表示资源数量的整型量

semaphore s=1;
wait(s){
	while(s <= 0);//test
	s -- ;//set
}
signal(s){
	s++;//unlock
}
P1:
do{
	wait(s);
	citical section;
	signal(s);
	remainder section;
}while(1);
P2:
do{
	wait(s);
	citical section;
	signal(s);
	remainder section;
}while(1);

wait和signal操作都是原子的,在执行过程中,不可中断
s可表示为可以使用的资源的数量

自旋锁

当一个线程获取锁的时候,如果所已经被其他线程获取,那么该线程将循环的等待,然后不断的判断锁是否能被成功后获取,直到获取到锁才会退出循环。
优点:自旋锁不会发生进程切换,一直处于用户态,不会使线程进入阻塞态,减少了不必要的上下文切换
缺点:循环等待,占用CPU的时间过长
在单处理机中,一个进程等待一个时间,该事件需要其他进程产生,而其他进程无法执行,也就无法产生该事件。
一般用在多处理器系统中。

记录型信号量

一个信号量是一个结构体。
为了解决整形信号量存在忙等问题,因采取让权等待原则。
在信号量中添加链表指针,用于连接上面描述的多个等待访问临界的进程。

typedef struct{
	int value;
	struct process *L;//PCB队列
}semaphore;

wait(S){
	value--;
	if(value <0 ){
	add this process to waiting queue
	block();
	}
signal(S){
	value++;
	if(value <= 0){
	remove a process P from the waiting queue
	wakeup(P);
}
}
}

信号量及两个操作的物理含义:

  • S.value的处置代表系统中某种资源的数目,故信号量又被称为资源信号量
  • S.value < 0,其绝对值代表信号量链表队列的长度,等待的进程数
  • wait操作意味着申请一个单位的资源
  • signal操作,意味着释放一个单位的资源
    注:信号量 只能用于初始化和,wait signal 不能用if判断
信号量的应用——互斥

初始信号量设为1,使得资源在同一时间只能有一个进程访问,达到互斥的效果。

信号量的应用——同步

信号量初值设为别的进程都不执行的情况下,本进程最大的执行次数。(可用资源数)

信号量的应用——前驱关系
a
b
S1
S3
S2
  • 对每一个边设置一个信号量
  • 对某个节点,有入边则在需要协调的操作前加一个wait操作
  • 有出边,则在需要协调的操作后加一个signal操作,信号量要保证对应
semaphore a,b;
//initial
a,b = 0;
P1:
do{
	...S1;
	singnal(a)
}while(1);
P2:
do{
	...S2;
	singnal(b)
}while(1);
P3:
do{
	wait(a);
	wait(b);
	...S3;
}while(1);

进程同步五大经典问题

三要素:

  • 信函量设置
  • 信号量初值
  • 算法描述

生产者消费者问题

一个生产者进程,一个消费者进程,共享一个缓冲区

一个输入进程向缓冲区中输入数据,另一个进程从缓冲区中取出数据,缓冲区只能存放一个数,开始时缓冲区为空。

semaphore empty,full;//分别代表空缓冲区,与满缓冲区的个数
//initially
full = 0;
empty = 1;
//生产者
do{
	生产一件产品
	wait(empty);
	放入一件产品
	signal(full);
	
}while(1);
//消费者
do {
	wait(full);
	取出一件产品
	signal(empty);
	消费产品
}whlie(1);

一个生产者,一个消费者进程,共享N个缓冲区

缓冲区编号0-N-1,假定开始的时候缓冲区都为空

  • 设下表in跟踪生产者松鼠的过程,初始为0,每送一个数据,in = (int+ 1)%N;
  • 设下标out跟踪消费者取数过程,初始为0,每取出一个数据,out = (out+1)%N;
int in,out;
semaphore empty ,full;//空满缓冲区的个数
in=0,out = 0;
empty = N,full = 0;
P:
do{
	wait(empty);
	add data to buffer(in);
	in = (in + 1)%N;
	signal(full);
}while(1);

C:
do{
	wait(full);
	remove data to buffer(out);
	out = (out + 1)%N;
	signal(empty);
}while(1);

多个生产者和多个消费者共享N个缓冲区

  • 生产者进程需要互斥访问共享变量in,需要设定一个互斥信号量。实现多个生产者之间互斥访问共享变量in
  • 消费者进程,需要互斥访问共享变量out;
Semaphero mutex1 = 1,mutex2 = 1,empty = N,full = 0;

P:producer process
while(1){
	wait(empty);
	wait(mutex1);
	//add thet item into the buffer
	in = (in+1)%N;
	signal(mutex1);
	signal(full);
}

C:consumer process
while(1){
	wait(full);
	wait(mutex2);
	//remove an item from buffer
	out = (out+1)%N;
	signal(mutex2);
	signal(empty);
	//consume tehh removed item
}

为简化P-C模型的实现,将缓冲池视为临界资源,生产者消费者均互斥访问缓冲池

Semaphero mutex = 1,empty = N,full = 0;
producer process:
while(1){
	wait(empty);
	wait(mutex);
	//add thet item into the buffer
	buffer[in] = item;
	in = (in+1)%N;
	signal(mutex);
	signal(full);
}

Consumer process:
while(1){
	wait(full);
	wait(mutex);
	//add thet item into the buffer
	item = buffer[out];
	out = (out+1)%N;
	signal(mutex);
	signal(empty);
	//consume the removed item
}
  • 互斥信号量:在同一个进程中成对出现,mutex
  • 同步信号量(资源信号量):出现在不同进程中
  • 同步在前,互斥在后
    为什么同步在前,互斥在后?
    若互斥在前,同步在后,考虑一种情况,消费者进程执行wait(mutex),但是full = 0,阻塞,等待生产者进程执行,但是mutex = 0,生产者阻塞,产生死锁!!!

读者写者问题

  • 读者:只读,允许多的多个读者同时访问,但必须与写者互斥,在读者访问期间,允许其他读者访问,拒绝其他写者访问,所有读者都完成访问,释放对象

  • 写者:可以同时读写,要互斥访问,写操作完成前,拒绝所有其他对象访问
    实现:

  • 写者:简单互斥

  • 读者:第一个计入的读者,拒绝写者,不拒绝读者,最后离开的读者,释放资源。

int readercount = 0;//计数器
Semaphero mutex = 1;//计数器时临界资源互斥
Sempaphero wrt = 1;//读者写者互斥


writer process:
while(1){
	wait(wrt);
	//wirte
	signal(wrt);
}


reader process:
while(1){
	wait(mutex);
	readercount++;
	if(readercount == 1) wait(wrt);//是第一个读者,申请资源,隔离写者
	signal(mutex);
	//reader is performed
	wait(mutex)
	readercount--;
	if(readercount == 0)
	signal(wrt);
	wait(mutex);
	
}

该方案存在的问题:

  • 该方案读者优先,导致写者饥饿
  • 解决:当有写者到来,该写者阻止后续的读者访问该对象(写着者优先)

哲学家就餐问题

五个哲学家就餐

中间有一盘饭,桌上五个哲学家,有5根筷子,必须有两支筷子才能就餐。

Semaphero chopstick[5]  initialized to 1

对每个哲学家i:
while(1){
	wait(chopstick[i]);
	wait(chopstick[(i+1)%5]);
	//eat
	signal(chopstick[i]);
	signal(chopstick[(i+1)%5]);
	//think
}

考虑,当每个人都拿起左手边的筷子时,就会死锁
解决方案有很多:

  • 最多只能有四个人同时坐下
  • 只有两支筷子都能拿的时候才拿筷子
  • 奇数先拿右边筷子,再拿左边,偶数相反
  • 只有最后一个人先左后右,其他人先拿右边再拿左边
Semaphero chopstick[5]  initialized to 1
Semaphero seats = 4;
对每个哲学家i:
while(1){
	wait(seats);
	wait(chopstick[i]);
	wait(chopstick[(i+1)%5]);
	//eat
	signal(chopstick[i]);
	signal(chopstick[(i+1)%5]);
	signal(seats);
	//think
}

后面解决策略不再写出代码,自行思考。

瞌睡理发师问题

某理发店有一个接待室和一个理发室,理发室有一把椅子,接待室有N把,没有顾客理发师睡眠,接待室满顾客离开。

int waiting = 0;
const int CHARIS = N;
semaphore customers = 0,barberReady = 0,mutex = 1;

customer:
while(1){
	wait(mutex);
	if(waitng < CHARIS){
	waiting++;
	signal(mutex);
	signal(customer);
	wait(barberReady);
	}
	else{
	siganl(mutex);
	leaving;
	}
}
barber process:
while(1){
	wait(customer);
	wait(mutex);
	waiting = waiting-1;
	signal(mutex);
	signal(barberReady);
	//理发
}

吸烟者问题

  • 假设一个系统中有三个抽烟者进程,每个抽烟者进程不断的卷烟并抽烟。
  • 吸烟要三种材料:烟草,火柴,纸
  • 抽烟者一个有烟草,一个有纸,一个有火柴
  • 一个供应商无限提共材料,只有两种材料被相应的吸烟者取走之后,才能供应新的两种材料
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    供应商随即供应其中的一种材料

拓展

两产品入库问题

在这里插入图片描述
两种产品的数量的差存在制约关系
-N < A产品数量 - B产品的数量 <M

分解:

  • A - B <= M-1
  • B-A <= N-1

围棋拣子

Semaphore mutex = 1,s1 = M-1,sb = N-1;
Process_inputA:
while(1){
	Get a product A;
	wait(sa);
	wait(mutex);
	A 入库
	signal(mutex);
	signal(sb);//A放一个 B可以多放一个
}
Process_inputB
while(1){
	Get a product B;
	wait(sb);
	wait(mutex);
	B 入库
	signal(mutex);
	signal(sa);//B放一个 A可以多放一个
}

管程 Monitors

信号量 wait() signal()操作不当容易引发死锁。比如顺序问题,漏掉操作
解决方法:
提供更高层的方便用户同步机制,系统将其映射到底层信号量及wait signal 操作

在这里插入图片描述

  • 可以把管程认为一个类,与一般的类的不同是管程有条件变量,用于控制进程之间的同步
  • 并发的进程,要互斥访问管程。在同一时刻只能有一个继承访问管程
  • 当进程申请资源而为得到满足时,管程调用wait原语使该进程等待,并将他排到等待队列上
  • 在某一时刻,管程会调用signal原语唤醒某一进程

条件变量

进程等待的原因有多个,为了区分这些原因,引入条件变量。
管程中对每个条件变量都予以声明

Condition xy,y;
x.wait;
x.signal;
moinitor monitor-name
{
	//shared variable declarations
	procedure P1(){}
	procedure P2(){}
	...
	procedure Pn(){}
	Initialize code () {}
}

管程解决PC问题

monitor pc{
	int in,out,count;
	item buffer[n];
	
	condition empty ,full;//条件变量
	
	void put(item i){
		//因为管程本身就是互斥访问的,因此对于count就不需要再进行互斥了
		if(count >= m) empty.wait;
		buffer[in] = i;
		in = (in+1)%n;
		count++;
		if(full.queue) full.signal;//由消费者等待将它唤醒
	}
	void get(item i){
		if(count <= 0) full.wait;
		i = buffer[out];
		out = (out + 1)%n;
		count --;
		if(empty.queue) empty.signal;
	}

	void init(){
		in = 0;
		out = 0;
		count = 0;
	}
}


//生产者
do{
	...
	produce an item 
	pc.put(nextp);
}while(1);


//消费者
do{
	...
	pc.geti(nextc);
	consumer the item
	...
}while(1);

管程互斥机制的实现:

  • 如果操作系统支持管程,则又操作系统实现管程的互斥
  • 如果系统不支持,则管程由用户自己定义,,设置互斥信号量或者锁机制
操作系统第六章进程同步mooc测试 都是自己做完的,保证正确率 1 单选(2分) 若一个信号量的初值为3,经过多次PV操作以后当前值为-1,此表示等待进入临界区的进程数是(A)。 得分/总分 A. 1 2.00/2.00 B. 2 C. 4 D. 3 2 单选(2分) 设与某资源关联的信号量(K)初值为3,当前值为1。若M表示该资源的可用个数,N表示等待该资源的进程数,则M、N分别是(B)。 得分/总分 A. 2、0 ... 阅读详情

相关推荐

操作系统概念(第六章) 进程同步(一)

进程同步背景互相协作的进程之间有共享的数据,于是这里就有一个并发情况下,如何确保有序操作这些数据、维护一致性的问题,即进程同步。从底层到高级应用,同步机制依次有临界区、信号量、管程、原子事务。多个进程并发访问和操作同一数据且执行结果与访问发生的特定顺序有关,称之为竞争条件(race condition)。临界区(critical section)每个进程有一个代码段(code segment)称为临

Mr.Phoebe的专栏 4427

操作系统-进程互斥的硬件实现方法与锁( 中断屏蔽方法 TestAndSet指令 Swap指令 互斥锁)

这样相比等待代价很低。而如果是忙等待期间就让其下处理机并切换进程,那么如果此时正好临界区解锁了,那么又得切换回到原来要访问临界区资源处于忙等待得进程才可以使用临界区(当然,这样得前提是有进程上锁后使用临界区和解锁的总共时间较短,如此其他进程忙等待时间就比较短)最后,虽然TestAndSet指令在某些情况下可能不适用于用户进程,但在多处理机系统的内核进程中,它仍然是一个非常有价值的工具,用于实现对临界资源的互斥访问。如果返回的旧值为0(表示锁未被占用),则进程进入临界区,并将锁设置为1,防止其他进程进入。

llovewuzhengzi的博客 1956

进程同步实验报告

(1)了解操作系统进程同步的基本概念和准则。 (2)理解信号量机制及P、V操作含义。 (3)了解经典进程同步问题,掌握信号量方法解决进程同步问题的方法。 包括实验目的,截图,心得体会,代码

操作系统概念-6.4章节-硬件同步-采用指令test_and_set()的互斥实现原理解析

操作系统概念 6.4章节 硬件同步之采用指令test_and_set()的互斥实现原理解析 1、技术背景 书中原文: 通过加锁的方式来解决临界区的问题,许多现代系统提供特殊的硬件指令,用于检测和修改字的内容,或者用于原子地交换两个字(作为不可中断地指令)。我们可以采用这些特殊的指令,相对简单地解决临界区问题,在这里通过指令test_and_set()和compare_and_swap()抽象了这些指令背后地主要概念。 2、问题分析 2.1 指令test_and_set()可以按照如下代码来定义: 这一指令的

fan1570285527的博客 6981

操作系统课设用多进程同步方法演示“生产者-消费者”问题

1、设计目的:通过研究Linux的进程同步机制和信号量,实现生产者消费者问题的并发控制。 2、说明:有界缓冲区内设有20个存储单元,放入取出的产品设定为20个100以内的随机整数。 3、设计要求: 1) 生产者与消费者均有二个以上 2) 生产者和消费者进程的数目在程序界面上可调,在运行时可随时单个增加与减少生产者与消费者 3) 生产者的生产速度与消费者的消费速度均可在程序界面调节,在运行中,该值调整后立即生效 4) 生产者生产的产品由随机函数决定 5) 多个生产者或多个消费者之间必须有共享对缓冲区进行操作的函数代码 6) 每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容、当前生产者与消费者的指针位置,以及生产者和消费者线程标识符 7) 采用可视化界面,可在运行过程中随时暂停,查看当前生产者、消费者以及有界缓冲区的状态

薛定谔 | 先导化合物优化与相互作用可视化

当获得针对某个靶点的先导分子后,想要在此基础上进行化学结构修饰。为了提升化学改造的成功率可以采用本教程方法进行结构虚拟改造/优化。每用薛定谔处理一个新任务,第一步必须创建新的project以方便日后管理。选项卡中修改工作路径(可以方便地找到输出文件)

药研猿的博客 2144

TestAndSet原理解析

定义和伪代码 TestAndSet(TS指令和TSL指令)用硬件来实现,booleanTestAndSet()的过程一起呵成,属于原子操作。 booleanTestAndSet (boolean *lock){ boolean old = *lock; *lock= TRUE; return old; } while(TestAndSet(&lock)); criticalsection;//临界区 lock= FALSE; remaindersection;//剩余区 原理解析 TS指令

qq_39875265的博客 5984

S32K344开发环境搭建全攻略:S32DS 3.5.12与RTD 3.0.0实战指南

在嵌入式开发中,集成开发环境(IDE)与实时驱动(RTD)的协同配置是项目启动的关键。S32DS作为NXP官方IDE,结合RTD包,为S32K3系列提供底层驱动支持。正确安装与路径配置能确保编译、调试与烧录流程顺畅,避免常见错误。该环境适用于汽车电子、工业控制等场景,如车身域控、BMS。本文基于S32K344芯片,详细记录从软件下载到调试的完整过程,帮助开发者快速搭建稳定开发环境。

weixin_42713608的博客 211

硬件同步机制中test-and-set指令和swap指令实现的详解

1 test-and-set详解 //注意 test-and-set是原语操作,3条指令必须一次执行完毕 boolean test-and-set(*lock) { boolean old=*lock; *lock=true; return old; } do{ while(test-and-set(*lock)) { //你没有看错,里面啥也没有...

老男孩的粉丝团 1万+

大疆sdkV4以及V5webrtc推流

webrtcSDK中要用它的VideoCapturer来初始化推流 ViewdoCapturer是一个接口我们继承它 然后重建创建文件CapturerAircraft.java文件。CameraUtil.java这个是我们用来创建CapturerAircraft的一个工具。除了CapturerAircraft这个文件不一样外其他都是一样的。PlayBodyBean.java这个是我们的配置文件。下面的有个代码块第一个是v4的 第二个是v5的。接着我们来创建几个推流用到的webrtc工具。

weixin_41624865的博客 1188

解决Keil uVision许可证管理中Unknown Product错误

嵌入式开发中,IDE工具的许可证管理是确保开发环境正常运行的关键环节。Keil uVision作为ARM架构的主流开发工具,其许可证系统采用加密验证机制,通过产品版本识别实现授权控制。当出现Unknown Product错误时,通常源于版本兼容性问题或区域发行版差异,这直接影响开发工具链的可用性。特别是在维护历史项目或使用中国特供版时,开发者常会遇到此类问题。通过分析许可证类型、调整安装配置或建立虚拟化开发环境等工程实践方案,可以有效解决这类授权验证故障,保障嵌入式项目的持续集成与交付效率。

weixin_33743248的博客 363

硬件同步机制-Test-and-Set指令实现互斥的基本讲解

接下来每一部分都会对应的用生活化进出房间的例子来解释。

全局可见 736

IEEE Transactions on Industrial Informatics(TII)投稿全流程解析:从准备到成功提交

本文详细解析了向IEEE Transactions on Industrial Informatics(TII)投稿的全流程,涵盖从投稿前的格式准备、内容结构优化到在线提交系统实操等关键环节。重点强调了遵守TII严格的格式规范、双盲评审要求以及如何构建有说服力的学术叙述,旨在帮助研究者提升稿件质量,顺利通过评审。

weixin_28396629的博客 1864

操作系统概念第六章——进程同步

操作系统概念第六章——进程同步 操作系统概念学习笔记 11 进程同步(一) 操作系统概念学习笔记 12 进程同步(二)管程

种花家的奋斗兔的博客 779

实战指南:R语言多组倾向评分逆概率加权(IPTW)建模与结果解读

本文详细介绍了如何使用R语言实现多组倾向评分逆概率加权(IPTW)建模,包括数据预处理、倾向评分估计、权重计算及结果解读。通过实战案例演示,帮助研究者掌握这一统计方法,有效平衡多组混杂因素,模拟随机对照试验效果,适用于医学、社会科学等领域的数据分析。

weixin_42528534的博客 396

Ubuntu22.04安装搜狗输入法踩坑实录:从依赖报错到完美解决的完整指南

本文详细解析了在Ubuntu 22.04系统上安装搜狗拼音输入法的完整流程,从解决依赖报错到配置fcitx框架,再到最终优化使用体验。针对常见的dpkg安装错误和fcitx冲突问题,提供了实用的解决方案和命令,帮助用户顺利完成安装并享受流畅的中文输入体验。

palm99的专栏 974

操作系统第六章之进程同步

信号量,进程同步等内容

qq_62904883的博客 371

基于深度学习的推荐系统设计与实现

基于深度学习的推荐系统设计与实现 作者:禅与计算机程序设计艺术 / Zen and the Art of Computer Programming / TextGenWebUILLM 基于深度学习的推荐系统设计与实现 关键词:深度学习, 推荐系统, 用

AI天才研究院 1079

操作系统概念第六章 进程同步

进程同步背景临界区问题Peterson算法 背景 动机:同一程序顺序执行时是正确的,但并发执行却会发生错误的结果. 共享数据的并发访问可能导致数据的不一致 维护数据的一致性需要能够保证协作进程顺序执 行的机制 并发执行的程序会出现很多问题,一个简单的例子是生产者-消费者问题。 生产者生产资源(执行count++)的同时消费者消耗(count- -),count的初值是5,理想结果是count=5,但如果同时执行两条语句,对于生产者和消费者,他们的count都是5,那么最后根据恢复的情况不同(生产者后执行

人间烟火的博客 885

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

操作系统原理第六章 进程同步

本科生操作系统原理学习记录 学习记录全家桶 第六章 进程同步6.1 竞争条件和临界区6.1.1 竞争条件6.1.2 临界区6.1.3 临界区使用准则6.2 信号量(重要)6.2.1 信号量的物理含义6.2.2 整型信号量6.2.3 记录型信号量6.2.4 互斥信号量6.2.5 同步信号量6.2.6 小例子6.3 经典同步问题6.3.1 生产者-消费者问题问题描述问题分析过程解决方法6.3.2 读者写者问题问题描述解决方法6.3.3 哲学家就餐问题问题描述防止死锁的措施方法一方法二慕课单元作业进程管理习题 6

weixin_45788387的博客 1001

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

操作系统原理_第六章进程同步

下列对临界区的论述中,正确的是( A)。 A.临界区是指进程中用于访问共享资源的那段代码 B.临界区是指进程中用于实现进程互斥的那段代码 C.临界区是指进程中用于实现进程同步的那段代码 D.临界区是指进程中用于实现进程通信的那段代码

共同学习,心怀感激。 4356

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

操作系统原理第六章:进程同步

1 进程同步背景 对于之前所提到的生产者消费者问题,采用共享内存解决生产者消费者问题时,N个缓冲区最多只能用N-1个,那么为什么有一个是用不了的呢?这是因为在判断缓冲区空或满时,用取余计算实现的,之所以牺牲一个位置是为了让缓冲区空和缓冲区满两种状态有两种不同的表达式,若是换一种方法,设置一个计数变量 count ,count 的值表示当前缓冲区已经使用的容量,count=0表示缓冲区空,count...

syzdev的博客 2489

操作系统笔记 第六章进程同步

第六章 进程同步

多思易掉发 199

操作系统概念笔记——第六章:进程同步

文章目录第六章:进程同步6.1 背景6.2 临界区问题6.3 Peterson算法6.4 硬件同步6.5 信号量6.5.1 用法6.5.2 实现6.5.3 死锁与饥饿6.6 经典同步问题6.7 管程 第六章:进程同步 6.1 背景 在多进程状态下,共享数据的并发访问可能会产生数据的不一致。这章会讨论各种机制,以确保共享同一逻辑地址空间的协作进程可以有序地执行 之前提到了生产者-----消费者问题,采用了共享内存的方法 虽然生产者和消费者程序各自都正确,但是在并发运行时,可能会产生不正确的结果 比如count

叶卡捷琳堡的博客 2058

《操作系统概念》-第六章-进程同步

文章目录进程同步背景临界区问题`What's called '临界区'?`临界区条件软件同步:`Peterson`算法`Peterson`算法:共享数据`Peterson`算法:进程代码结构`Peterson`算法:正确性证明硬件同步:锁`TestAndSet实现互斥``Swap实现互斥``TestAndSet实现有限等待&互斥`信号量用法实现`Futher thinking...`死锁与饥饿经典同步问题有限缓冲问题读者-写者问题(多任务同步问题)哲学家就餐问题管程 进程同步 背景 有限缓冲区解决生

nappingman的博客 592

操作系统概念_第六章_进程同步

概述 临界区问题 Peterson算法 硬件同步 经典同步问题 生产者-消费者问题 读者-写者问题 哲学家进餐问题 信号量 信号量的使用 解决互斥问题 解决资源申请问题 解决同步问题 信号量的实现 死锁和饥饿 找个茬 经典问题的信号量解决方案 生产者-消费者问题 读者-写者问题 哲学家就餐问题 管程*** 使用 管程入口处的等待队列 资源等待队列和条件变量 紧急等待队列 ...

sailist的记录站 992
上一篇: 机器学习(二)逻辑回归
下一篇: 计算机图形学 第二章光栅图形学
黄昏贩卖机
博客等级 码龄6年 252粉丝 178原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值