30、深入理解计算机系统笔记,并发编程(concurrent)(2)

1、共享变量

1)线程存储模型

线程由内核自动调度,每个线程都有它自己的线程上下文(thread context),包括一个惟一的整数线程IDThread ID,TID),栈,栈指针,程序计数器,通用目的寄存器和条件码。每个线程和其他线程一起共享进程上下文的剩余部分,包括整个用户的虚拟地址空间,它是由只读文本(代码),读/写数据,堆以及所有的共享库代码和数据区域组成的,还有,线程也共享同样的打开文件的集合。[1]

寄存器从不共享,而虚拟存储器总是共享。

The memory model for the separate thread stacks is not as clean(整齐清楚的). These stacks are contained in the stack area of the virtual address space, and are usually accessed independently by their respective threads. We say usually rather than always, because different thread stacks are not protected from other threads. So if a thread somehow manages to acquire a pointer to another threads stack, then it can read and write any part of that stack. 示例29行中, where the peer threads reference the contents of the main threads stack indirectly through the global ptr variable.

2)将变量映射到存储器

    和全局变量一样,虚拟存储器的/写区域只包含在程序中声明的每个本地静态变量的一个实例。每个线程的栈都包含它自己的所有本地自动变量的实例。

3)我们说变量v是共享的,当且仅当它的一个实例被一个以上的线程引用。

示例代码

/* $begin sharing */
#include "csapp.h"
#define N 2
void *thread(void *vargp);char **ptr;  /* global variable */int main() 
{int i;  pthread_t tid;char *msgs[N] = {"Hello from foo",  "Hello from bar"   };ptr = msgs; for (i = 0; i < N; i++)  Pthread_create(&tid, NULL, thread, (void *)i); Pthread_exit(NULL); 
}void *thread(void *vargp) 
{int myid = (int)vargp; //cnt是共享的,而myid不是共享的static int cnt = 0;printf("[%d]: %s (cnt=%d)\n", myid, ptr[myid], ++cnt);
}
/* $end sharing */

2、用信号量同步

当对同一共享变量,有多个线程进行更新时,由于每一次更新,对该变量来说,都有“加载到寄存器,更新之,存储写回到存储器”这个过程,多个线程操作时,便会产生错位,混乱的情况,有必要对共享变量作一保护,使这个更新操作具有原子性。

信号量s是具有非页整数值的全局变量,只能由两种特殊的操作来处理,称为PV操作。

P(s):

  while (s <= 0); s--;

     V (s): s++;

    The P operation waits for the semaphore s to become nonzero, and then decrements it.The V operation increments s.

1)基本思想是,将每个共享变量(或者相关共享变量集合)与一个信号量s(初始值1)联系起来,然后用P(s),V(s)操作将相应的临界区(一段代码)包围起来。以这种方法来保护共享变量的信号量叫做二进制信号量(binary semaphore),因为值总是10

The definitions of P and V ensure that a running program can never enter a state where a properly initialized semaphore has a negative value.

11.4.4有posix信号量的简介。

2)二进制信号量通常叫做互斥锁,在互斥锁上执行一个P操作叫做加锁,V操作叫做解锁;一个已经对一个互斥锁加锁而还没有解锁的线程被称为占用互斥锁。

3、用信号量来调度共享资源

这种情况下,一个线程用信号量来通知另一个线程,程序状态中的某个条件已经为真了。如生产者-消费者问题。

示例代码

#ifndef __SBUF_H__
#define __SBUF_H__#include "csapp.h"/* $begin sbuft */
typedef struct {int *buf;          /* Buffer array */         int n;             /* Maximum number of slots */int front;         /* buf[(front+1)%n] is first item */int rear;          /* buf[rear%n] is last item */sem_t mutex;       /* Protects accesses to buf */sem_t slots;       /* Counts available slots */sem_t items;       /* Counts available items */
} sbuf_t;
/* $end sbuft */void sbuf_init(sbuf_t *sp, int n);
void sbuf_deinit(sbuf_t *sp);
void sbuf_insert(sbuf_t *sp, int item);
int sbuf_remove(sbuf_t *sp);#endif /* __SBUF_H__ */
//source code
/* $begin sbufc */
#include "csapp.h"
#include "sbuf.h"/* Create an empty, bounded, shared FIFO buffer with n slots */
/* $begin sbuf_init */
void sbuf_init(sbuf_t *sp, int n)
{sp->buf = Calloc(n, sizeof(int)); sp->n = n;                       /* Buffer holds max of n items */sp->front = sp->rear = 0;        /* Empty buffer iff front == rear */Sem_init(&sp->mutex, 0, 1);      /* Binary semaphore for locking */Sem_init(&sp->slots, 0, n);      /* Initially, buf has n empty slots */Sem_init(&sp->items, 0, 0);      /* Initially, buf has zero data items */
}
/* $end sbuf_init *//* Clean up buffer sp */
/* $begin sbuf_deinit */
void sbuf_deinit(sbuf_t *sp)
{Free(sp->buf);
}
/* $end sbuf_deinit *//* Insert item onto the rear of shared buffer sp */
/* $begin sbuf_insert */
void sbuf_insert(sbuf_t *sp, int item)
{P(&sp->slots);                          /* Wait for available slot */P(&sp->mutex);                          /* Lock the buffer */sp->buf[(++sp->rear)%(sp->n)] = item;   /* Insert the item */V(&sp->mutex);                          /* Unlock the buffer */V(&sp->items);                          /* Announce available item */
}
/* $end sbuf_insert *//* Remove and return the first item from buffer sp */
/* $begin sbuf_remove */
int sbuf_remove(sbuf_t *sp)
{int item;P(&sp->items);                          /* Wait for available item */P(&sp->mutex);                          /* Lock the buffer */item = sp->buf[(++sp->front)%(sp->n)];  /* Remove the item */V(&sp->mutex);                          /* Unlock the buffer */V(&sp->slots);                          /* Announce available slot */return item;
}
/* $end sbuf_remove */
/* $end sbufc */

参考

[1] http://www.cnblogs.com/mydomain/archive/2011/07/10/2102147.html

转载于:https://www.cnblogs.com/mydomain/archive/2011/07/10/2102169.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378341.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PostgreSQL在何处处理 sql查询之十三

继续&#xff1a; /*--------------------* grouping_planner* Perform planning steps related to grouping, aggregation, etc.* This primarily means adding top-level processing to the basic* query plan produced by query_planner.** tuple_fraction i…

【视觉项目】基于梯度的NCC模板匹配代码以及效果

文章目录流程分析工程代码【1】NCC代码【Ⅰ】sttPxGrdnt结构体【Ⅱ】sttTemplateModel模板结构体【Ⅲ】calcAccNCC计算ncc系数函数【Ⅳ】searchNcc NCC模板匹配函数【Ⅴ】searchSecondNcc 二级搜索&#xff1a;在某一特定点周围再以步进为1搜索【2】测试图转外轮廓【Ⅰ】孔洞填…

第七章 再谈抽象

第七章 再谈抽象 对象魔法 多态&#xff1a;可对不同类型的对象执行相同的操作&#xff0c;而这些操作就像“被施了魔法”一样能够正常运行。(即&#xff1a;无需知道对象的内部细节就可使用它)&#xff08;无需知道对象所属的类&#xff08;对象的类型&#xff09;就能调用其…

c语言math乘法,JavaScript用Math.imul()方法进行整数相乘

1. 基本概念Math.imul()方法用于计算两个32位整数的乘积&#xff0c;它的结果也是32位的整数。JavaScript的Number类型同时包含了整数和浮点数&#xff0c;它没有专门的整型和浮点型。因此&#xff0c;Math.imul()方法能提供类似C语言的整数相乘的功能。我们将Math.imul()方法的…

java scanner_Java Scanner nextLong()方法与示例

java scanner扫描器类的nextLong()方法 (Scanner Class nextLong() method) Syntax: 句法&#xff1a; public long nextLong();public long nextLong(int rad);nextLong() method is available in java.util package. nextLong()方法在java.util包中可用。 nextLong() method…

技术总监和CTO的区别 浅谈CTO的作用----软件公司如何开源节流(一)

我一直在思考软件公司如何开源节流。当然&#xff0c;老板也在思考开源节流。当然&#xff0c;老板思考的开源节流在公司运营层面上&#xff0c;而我作为CTO&#xff0c;我考虑的则是在产品运营角度上来思考这个问题。否则&#xff0c;一个软件公司&#xff0c;它的生存与发展就…

梯度下降法预测波士顿房价以及简单的模型评估

目录原理代码关于归一化的思考原理 观察数据可知属性之间差距很大&#xff0c;为了平衡所有的属性对模型参数的影响&#xff0c;首先进行归一化处理。 每一行是一个记录&#xff0c;每一列是个属性&#xff0c;所以对每一列进行归一化。 二维数组归一化&#xff1a;1、循环方式…

Windows Phone 内容滑动切换实现

在新闻类的APP中&#xff0c;有一个经常使用的场景&#xff1a;左右滑动屏幕来切换上一条或下一条新闻。 那么通常我们该使用哪种方式去实现呢&#xff1f;可以参考一下Demo的实现步骤。 1&#xff0c;添加Windows Phone用户自定义控件。例如&#xff1a; 这里我为了演示的方便…

c语言interrupt函数,中断处理函数数组interrupt[]初始化

在系统初始化期间&#xff0c;trap_init()函数将对中断描述符表IDT进行第二次初始化(第一次只是建一张IDT表&#xff0c;让其指向ignore_intr函数)&#xff0c;而在这次初始化期间&#xff0c;系统的0~19号中断(用于分NMI和异常的中断向量)均被设置好。与此同时&#xff0c;用于…

bytevalue_Java Number byteValue()方法与示例

bytevalueNumber类byteValue()方法 (Number Class byteValue() method) byteValue() method is available in java.lang package. byteValue()方法在java.lang包中可用。 byteValue() method is used to return the value denoted by this Number object converted to type byt…

第二章 染色热力学理论单元测验

1,()测定是染色热力学性能研究的基础 吸附等温线。 2,吸附是放热反应,温度升高,亲和力() 减小 3,染色系统中包括() 染料。 染深色介质。 染色助剂。 纤维。 4,下列对状态函数特点叙述正确的为() 状态函数只有在平衡状态的系统中才有确定值。 在非平衡状态的系统…

使用鸢尾花数据集实现一元逻辑回归、多分类问题

目录鸢尾花数据集逻辑回归原理【1】从线性回归到广义线性回归【2】逻辑回归【3】损失函数【4】总结TensorFlow实现一元逻辑回归多分类问题原理独热编码多分类的模型参数损失函数CCETensorFlow实现多分类问题独热编码计算准确率计算交叉熵损失函数使用花瓣长度、花瓣宽度将三种鸢…

开源HTML5应用开发框架 - iio Engine

随着HTML5的发展&#xff0c;越来越多的基于HTML5技术的网页开发框架出现&#xff0c;在今天的这篇文章中&#xff0c;我们将介绍iio Engine&#xff0c;它是一款开源的创建HTML5应用的web框架。整个框架非常的轻量级&#xff0c;只有45kb大小&#xff0c;并且整合了debug系统&…

c语言double root,C语言修仙

root(1)(2/2)AD1AD4林浔合理推测&#xff0c;青城山剑宗&#xff0c;也就是祁云所在的剑修一脉&#xff0c;掌握着一些道修并不知道的传承。譬如——怎样找到赤霄龙雀剑&#xff0c;又或者&#xff0c;怎样使用它。这样一来&#xff0c;青城的守卫阵法没有反应也能解释了&#…

【转】Black Box

Introduction BlackBox是FPGA设计中一个重要的技巧&#xff0c;不过觉得Xilinx的文档没有很好地将它讲清楚。 BlackBox的主要想法就是把设计的某一个子模块单独综合&#xff0c;综合的结果作为一个黑盒子子模块&#xff0c;上层设计不再对这个模块进行优化&#xff0c;只能看到…

Java Compiler disable()方法与示例

编译器类disable()方法 (Compiler Class disable() method) disable() method is available in java.lang package. disable()方法在java.lang包中可用。 disable() method is used to cause the compiler to stop operation. disable()方法用于使编译器停止操作。 disable() m…

【神经网络计算】——神经网络实现鸢尾花分类

本blog为观看MOOC视频与网易云课堂所做的笔记 课堂链接&#xff1a; 人工智能实践:TensorFlow笔记 吴恩达机器学习 疑问与思考 为什么按照batch喂入数据 之前看的视频里面处理数据都是一次性将所有数据喂入&#xff0c;现在看的这个视频对数据进行了分组投入。这是为何&#…

第三章 染色动力学理论单元测试

1,准二级动力学模型认为,染色速率与()的二次方成正比 纤维上未被占满的位置(空位)数量 2,研究染色动力学的意义有() 了解染料走向平衡的速率。 初染速率。 匀染性。 3,求出染料的扩散系数的意义有() 了解各因素对扩散系数的影响。 求出不同温度下的扩散系数,计算…

CDOJ--1668

原题链接&#xff1a;http://acm.uestc.edu.cn/problem.php?pid1668 由于题目意思指的是将分数拆分成不同的单位分数之和&#xff0c;所以就不用考虑将2/3拆成1/31/3这种情况了&#xff1b;又由于好的拆分要求项数即len要少&#xff0c;最小的项要大&#xff0c;故可以采用迭代…

c# xaml语言教程,c#学习之30分钟学会XAML

1.狂妄的WPF相对传统的Windows图形编程&#xff0c;需要做很多复杂的工作&#xff0c;引用许多不同的API。例如&#xff1a;WinForm(带控件表单)、GDI(2D图形)、DirectXAPI(3D图形)以及流媒体和流文档等&#xff0c;都需要不同的API来构建应用程序。WPF就是看着上面的操作复杂和…