互斥锁

实验二

泪湿孤枕 提交于 2019-11-27 19:40:52
北京电子科技学院(BESTI) 实验报告 课程:信息安全系统设计基础 班级:1353 姓名:王维臻 武西垚 学号:20135336 20135332 成绩: 指导教师:娄家鹏 实验日期:2015.11.10 实验密级: 预习程度: 实验时间:15:30~18:00 仪器组次: 必修/选修: 实验序号:2 实验名称:固件设计 实验目的与要求: 1掌握程序的烧写方法 2能够实现Bootloader 3实现密码学中常见算法的固化。 内容: 1读懂 pthread.c 的源代码,熟悉几个重要的PTHREAD库函数的使用。 2掌握共享锁和信号量的使用方法。 3进入/arm2410cl/exp/basic/02_pthread 目录,运行make 产生pthread程序,使用NFS方式连接开发主机进行运行实验。 实验仪器: 名 称 型 号 数 量 PC Lenovo 1 Laptop Sony 1 虚拟Linux环境 Redhat 9.0 1 ARM开发板 UP-NETARM2410-CL 1 实验内容、步骤与体会: 开发环境的配置同实验一,将实验代码拷贝到共享文件夹中。在虚拟机中编译代码,对于多线程相关的代码,编译时需要加-lpthread 的库。下载调试,在超级终端中运行可执行文件pthread,运行可执行文件term。将实验代码拷贝到共享文件夹中 实验原理及代码解析 原理背景

基于数组的无锁队列(译)

与世无争的帅哥 提交于 2019-11-27 14:39:35
原文 1 引言 最近对于注重性能的应用程序,我们有了一种能显著提高程序性能的选择:多线程.线程的概念实际上已经存在了很长时间.在过去,多数计算机只有一个处理器,线程主要用于将一个大的任务拆分成一系列更小的执行单元.以使得当其中某些执行单元因为等待资源而被阻塞的时候剩余的执行单元能继续执行。举个示例,一个网络应用程序,它监听一个TCP端口,当有外部请求到达时,处理请求.对于一个单线程的应用程序来说,只能在处理完一个请求之后再处理另外的请求,显然这个应用程序对用户非常不友好,它为一个用户服务的时候别的用户就只能干等.而对于多线程解决方案,我们可以让另外的线程来处理接收到的请求,主线程继续等待在服务端口上接受新的请求. 在只有一个处理器的机器上,一个多线程应用程序可能无法达到我们对它的预期.因为所有的线程都要争抢处理器以获得执行机会.而它的性能说不定比一个用单线程方式去解决同样问题的程序还要差,因为线程之间的通讯和数据共享也有不小的开销. 而在一个对称多处理器机器上(SMP),一个多线程应用可以真正的实现多任务并行执行.每个线程都可以拥有单独的处理器以获得执行的机会,不需要再像单处理器一样,必须要等到处理器空闲才能获得执行机会.对一个有N个处理器的SMP系统来说,理论上一个N线程的应用程序只需要它的单线程版本的1/N的时间就可以完成相同的任务(实际上这个理论值是无法达到的

mysql的锁机制详解

不羁的心 提交于 2019-11-27 10:35:27
这段时间一直在学习 mysql 数据库。项目组一直用的是 oracle ,所以对 mysql 的了解也不深。本文主要是对 mysql 锁的总结。 Mysql 的锁主要分为 3 大类: 表级锁:存储引擎为 Myisam 。锁住整个表,特点是开销小,加锁快,锁定力度大,发生锁冲突的概率最高,并发度最低。 页级锁:存储引擎为 BDB 。锁住某一页的数据( 16kb 左右),特点:开销和枷锁时间介于表级和行级之间;会出现死锁,锁定力度介于表锁和行锁之间,并发度一般。 行级锁:存储引擎为 innodb 。锁住某一行的数据,特点:锁的实现更加复杂,开销大,加锁速度慢。 根据以上特点,仅从锁的角度来说:表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如 Web 应用;而行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如一些在线事务处理( OLTP )系统。 接下来进行行级锁的详解,行级锁主要分为以下 7 类:共享 / 排他锁、意向锁、记录锁、间隙锁、临建锁、插入意向锁、自增锁。 共享 / 排他锁: 共享锁:又称读锁,可以允许读,但不能写。共享锁可以与共享锁一起使用。 语句: select ... lock in share mode 排他锁:又称写锁,不能允许读,也不能允许写,排他锁不能与其他所一起使用。 语句: select ... for

Redis缓存之穿透、雪崩、热key

生来就可爱ヽ(ⅴ<●) 提交于 2019-11-27 08:52:50
高并发的情况会给系统带来很高的访问流量,这就给存储这些热点信息的Redis数据造成了一些压力。 热key问题及解决方案 产生原因 用户消费的数据远大于生产的数据 (热卖商品、热点新闻、热点评论、明星直播)等。 在日常工作生活中一些突发的的事件,例如某明星突然宣布恋情,导致某新闻点击量瞬间变大,请求远超过对数据的写入。就会造成热数据问题。 我们 一般采用缓存 + 过期时间的策略来帮助我们加速接口的访问速度,减少了后端负载,同时保证功能的更新,一般情况下这种模式已经基本满足要求了。 但是有两个问题如果同时出现,可能就会对系统造成致命的危害: 1、访问的数据是一个热点key 2、构建缓存需要时间 以上两个问题如果同时出现,就可能会造成缓存失效问题,有大量线程来构建缓存,造成后端负载过大,严重还会导致系统崩溃。 上图简单描述了访问热点key及构建缓存的一个过程。 解决方案 解决热点key问题,可以有以下几种方案, 1、互斥锁 在上图查询数据库的过程,只让一个线程独占,这个线程构建缓存的过程,其他线程都要等待,直到第一个线程构建完成可以从中读取数据。 2、提前使用互斥锁 提前使用互斥锁,和互斥锁差不多,都是让一个线程独占构建缓存,不一样的是,在构建缓存的时候。 在value内部设置一个超时值timeout1,这个过期时间比实际的缓存过期时间短。 当从缓存中读到timeout1已经过期的时候

python进程/线程/协成

风格不统一 提交于 2019-11-27 08:50:32
1.谈谈对多进程多线程以及协成的理解 进程:一个运行的程序(代码)就是一个进程,没有运行的代码叫做程序,进程是系统资源分配的最小单位,进程拥有自己独立的内存空间,所以进程间数据不共享,开销大 线程:调度执行的最小单位,也叫执行路径,不能独立存在,必须依赖进程存在,一个进程至少有一个线程,叫主线程,而多个线程共享内存(数据共享,共享全局变量),从而极大地提高了程序的运行效率. 协成:是一种用户太的轻量级线程,协成的调度完全由用户控制,协成拥有自己的寄存器上下文和栈.协成调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快2.什么是多线程竞争? 线程是独立的,同一进程里数据共享的,当各个线程访问数据资源时会出现竞争状态即:数据几乎被多个线程占用,造成数据混乱,即所谓线程不安全 如何解决多线程竞争问题?锁 锁的好处? 确保了某段关键代码(共享数据资源)只能由一个线程从头到 尾完整弟执行能够解决多线程资源竞争下的原子操作问题 锁的坏处? 阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程 模式执行,效率就大大地下降了3.什么是锁?有哪几种锁? 锁(Lock)是python提供的队线程控制的对象, 互斥锁 可重入锁 死锁4.什么是死锁? 若干子线程在资源竞争时

python多线程同步实例分析

房东的猫 提交于 2019-11-26 22:51:29
进程之间通信与线程同步是一个历久弥新的话题,对编程稍有了解应该都知道,但是细说又说不清。一方面除了工作中可能用的比较少,另一方面就是这些概念牵涉到的东西比较多,而且相对较深。网络编程,服务端编程,并发应用等都会涉及到。其开发和调试过程都不直观。由于同步通信机制的原理都是想通的,本文希通过望借助python实例来将抽象概念具体化。 阅读之前可以参考之前的一篇文章: python多线程与多进程及其区别 ,了解一下线程和进程的创建。 python多线程同步 python中提供两个标准库thread和threading用于对线程的支持,python3中已放弃对前者的支持,后者是一种更高层次封装的线程库,接下来均以后者为例。 同步与互斥 相信多数学过操作系统的人,都被这两个概念弄混过,什么互斥是特殊的同步,同步是多线程或多进程协同完成某一任务过程中在一些关键节点上进行的协同的关系等等。 其实这两个概念都是围绕着一个协同关系来进行的,可以通过一个具体的例子来清晰的表达这两个概念: 有两个线程,分别叫做线程A和线程B,其中线程A用来写一个变量,线程B读取线程A写的变量,而且线程A先写变量,然后线程B才能读这个变量,那么线程A和B之间就是一种 同步关系 ; ===== 同步关系 =====Thread A: write(share_data) V(S) # 释放资源 Thread B: P(S)

Day30 网络编程(一)

会有一股神秘感。 提交于 2019-11-26 17:44:14
1.操作系统基础知识 一.操作系统的作用 1.隐藏丑陋复杂的硬件接口,提供良好的抽象接口 2.管理、调度进程,并且将多个进程对硬件的竞争变得有序 二.多道技术 1.空间上的复用   多个程序共用一套计算机硬件 2.时间上的复用   切换+保存状态   1.当一个程序遇到I/O操作时,操作系统会剥夺该程序的cpu执行权限(提高cpu的利用率,也不会影响程序执行效率)   2.当一个程序长时间占用cpu,操作系统会剥夺该程序的cpu执行权限(降低了程序的执行效率) 2.进程基本概念 什么是进程   程序就是一串代码,进程就是正在运行的程序,它是资源分配和调度的基本单位,是操作系统结构的基础. 进程调度的算法   1.先来先服务调度算法   2.短作业优先调度算法   3.时间片轮转法   4.多级反馈队列   第一种和第二种算法都有明显的缺点,第一种对短作业不友好,第二种对长作业不友好,所以现代计算机进程都是基于第三种和第四种方法实现进程,如下图所示 进程的并行和并发   并发:看起来像同时运行   并行:真正意义上的同时执行   注意:单核计算机不能实现并行,但可以实现并发,所以要实现并行必须有多个处理器 进程的三种状态   1.就绪态:     当进程已经做好了所有准备,就等cpu执行了,此时的状态就是就绪态   2.运行态     当进程正在被cpu执行的时候

并发编程

99封情书 提交于 2019-11-26 17:39:06
今日内容: 1.计算机发展史(理论) 2.进程(理论) 3.创建进程的俩种方式 4.进程join方法 5.进程对象及其他方法 6.进程间数据是相互隔离的 7.守护进程 8.互斥锁 一.计算机发展史 1.操作系统发展史 1.第一带计算机 真空管和穿孔卡片 没有进程 没有操作系统 2.第二代计算机 7094 1401 晶体管 批处理系统 输入输出 以及计算设备 不能互联 需要人参与 一批一批的处理 开发效率慢 并且串行执行 3.第三代计算机 集成电路 与多道技术 多终端联机 spooling 同一台机器既能进行科学计算 又能做字符处理 通用计算机 多道技术 解决串行导致的效率低下问题 多用户终端 可以同时为多个用户提供服务 每个用户以为自己独享一台计算机 4.第四代 个人电脑 大规模使用了集成电路,大多都提供了GUI界面 2.多道技术 1.空间上的复用 多个程序共用一套计算机硬件 2.时间上的复用 切换+保存状态 1.当一个程序遇到IO操作 操作系统会剥夺该程序的cpu执行权限(提高了cpu的利用率 并且也不影响程序的执行效率) 2.当一个程序长时间占用cpu 操作系统也会剥夺该程序的cpu执行权限(降低了程序的执行效率) 并发:看起来像同时运行的就可以 并行:真正意义上的同时执行 单核的计算机能不能实现并行,但是可以实现并发 二.进程(理论) 什么是进程:   

Python 计算机发展史 多道技术 进程 守护进程 孤儿和僵尸进程 互斥锁

a 夏天 提交于 2019-11-26 17:35:58
一 计算机发展史 操作系统本质上是一个软件 主要功能:   1、控制硬件,隐藏丑陋复杂的硬件细节   2、将无序的硬件竞争变得有序 第一代计算机(1940~1955):真空管和穿孔卡片 第二代计算机(1955~1965):晶体管和批处理系统 第三代计算机(1965~1980):集成电路芯片和多道程序设计 第三代计算机的操作系统仍然是批处理 第四代计算机(1980~至今):个人计算机 二 多道技术(第三代计算机出现) 1.产生背景:针对单核,实现并发 ps: 现在的主机一般是多核,那么每个核都会利用多道技术 有4个cpu,运行于cpu1的某个程序遇到io阻塞,会等到io结束再重新调度,会被调度到4个 cpu中的任意一个,具体由操作系统调度算法决定。 2.空间上的复用:如内存中同时有多道程序 3.时间上的复用:复用一个cpu的时间片 强调:遇到io切,占用cpu时间过长也切,核心在于切之前将进程的状态保存下来,这样 才能保证下次切换回来时,能基于上次切走的位置继续运行 View Code 空间复用: 多个程序共用一套计算机硬件 ,每个程序间的内存都是相互隔离的(物理隔离) 时间复用(切换+保存):当一个程序执行IO操作时,切换到另一个程序来执行,光切换还不行 必须在切换前保存当前的状态 以便与恢复执行。 注意:并不是多道就一定提高了效率 如果多个任务都是纯计算 那么切换反而降低了效率

关于【缓存穿透、缓存击穿、缓存雪崩、热点数据失效】问题的解决方案

自闭症网瘾萝莉.ら 提交于 2019-11-26 16:20:03
本文转载自公众号:乔二爷,知识星球内成员、Java 极客技术作者团队成员。 这篇文章,是这位同学对自己阿里一面的总结,大家可以参考一下,同时也感谢乔二爷同学的分享。 1 前言 昨天晚上接到阿里的电面电话,过程中就问到了关于缓存相关的问题。 虽然以前接触过,多多少少了解了一些。但是之前自己并没有好好记录这些内容,在真正面试的时候,并没有回答得出来。今天记录一下,长长记性。 在我们的平常的项目中多多少少都会使用到缓存,因为一些数据我们没有必要每次查询的时候都去查询到数据库。 特别是高 QPS 的系统,每次都去查询数据库,对于你的数据库来说将是灾难。 今天我们不牵涉多级缓存的知识,就把系统使用到的缓存方案,不管是一级还是多级的都统称为缓存,主要是为了讲述使用缓存的时候可能会遇到的一些问题以及一些解决办法。 我们使用缓存时,我们的业务系统大概的调用流程如下图: 当我们查询一条数据时,先去查询缓存,如果缓存有就直接返回,如果没有就去查询数据库,然后返回。这种情况下就可能会出现一些现象。 2 缓存穿透 2.1 什么是缓存穿透 正常情况下,我们去查询数据都是存在。 那么请求去查询一条压根儿数据库中根本就不存在的数据,也就是缓存和数据库都查询不到这条数据,但是请求每次都会打到数据库上面去。 这种查询不存在数据的现象我们称为 缓存穿透 。 2.2 穿透带来的问题 试想一下