当前位置: 首页 > news >正文

网站开发设计合同范本一般做网站是用什么程序做的

网站开发设计合同范本,一般做网站是用什么程序做的,织梦网站后台空白,免费国外服务器租用并发问题的根源在哪首先#xff0c;我们要知道并发要解决的是什么问题#xff1f;并发要解决的是单进程情况下硬件资源无法充分利用的问题。而造成这一问题的主要原因是CPU-内存-磁盘三者之间速度差异实在太大。如果将CPU的速度比作火箭的速度#xff0c;那么内存的速度就像…并发问题的根源在哪首先我们要知道并发要解决的是什么问题并发要解决的是单进程情况下硬件资源无法充分利用的问题。而造成这一问题的主要原因是CPU-内存-磁盘三者之间速度差异实在太大。如果将CPU的速度比作火箭的速度那么内存的速度就像火车而最惨的磁盘基本上就相当于人双腿走路。这样造成的一个问题就是CPU快速执行完它的任务的时候很长时间都会在等待磁盘或是内存的读写。计算机的发展有一部分就是如何重复利用资源解决硬件资源之间效率的不平衡而后就有了多进程多线程的发展。并且演化出了各种为多进程线程服务的东西CPU增加缓存机制平衡与内存的速度差异增加了多个概念CPU时间片程序计数器线程切换等用以更好得服务并发场景编译器的指令优化希望在内部充分利用硬件资源但是这样一来也会带来新的并发问题归结起来主要有三个。由于缓存导致的可见性问题线程切换带来的原子性问题编译器优化带来的有序性问题我们分别介绍这几个缓存导致的可见性CPU为了平衡与内存之间的性能差异引入了CPU缓存这样CPU执行指令修改数据的时候就可以批量直接读写CPU缓存的内存一个阶段后再将数据写回到内存。但由于现在多核CPU技术的发展各个线程可能运行在不同CPU核上面每个CPU核各有各自的CPU缓存。前面说到对变量的修改通常都会先写入CPU缓存再写回内存。这就会出现这样一种情况线程1修改了变量A但此时修改后的变量A只存储在CPU缓存中。这时候线程B去内存中读取变量A依旧只读取到旧的值这就是可见性问题。线程切换带来的原子性为了更充分得利用CPU引入了CPU时间片时间片的概念。进程或线程通过争用CPU时间片让CPU可以更加充分得利用。比如在进行读写磁盘等耗时高的任务时就可以将宝贵的CPU资源让出来让其他线程去获取CPU并执行任务。但这样的切换也会导致问题那就是会破坏线程某些任务的原子性。比如java中简单的一条语句count 1。映射到CPU指令有三条读取count变量指令变量加1指令变量写回指令。虽然在高级语言java看来它就是一条指令但实际上确是三条CPU指令并且这三条指令的原子性无法保证。也就是说可能在执行到任意一条指令的时候被打断CPU被其他线程抢占了。而这个期间变量值可能会被修改这里就会引发数据不一致的情况了。所以高并发场景下很多时候都会通过锁实现原子性。而这个问题也是很多并发问题的源头。编译器优化带来的有序性因为现在程序员编写的都是高级语言编译器需要将用户的代码转成CPU可以执行的指令。同时由于计算机领域的不断发展编译器也越来越智能它会自动对程序员编写的代码进行优化而优化中就有可能出现实际执行代码顺序和编写的代码顺序不一样的情况。而这种破坏程序有序性的行为在有些时候会出现一些非常微妙且难以察觉的并发编程bug。举个简单的例子我们常见的单例模式是这样的public class Singleton {private Singleton() {}private static Singleton sInstance;public static Singleton getInstance() {if (sInstance null) { //第一次验证是否为nullsynchronized (Singleton.class) { //加锁if (sInstance null) { //第二次验证是否为nullsInstance new Singleton(); //创建对象}}}return sInstance;}}即通过两段判断加锁来保证单例的成功生成但在极小的概率下可能会出现异常情况。原因就出现在sInstance new Singleton();这一行代码上。这行代码我们理解的执行顺序应该是这样为Singleton象分配一个内存空间。在分配的内存空间实例化对象。把Instance 引用地址指向内存空间。但在实际编译的过程中编译器有可能会帮我们进行优化优化完它的顺序可能变成如下为Singleton对象分配一个内存空间。把instance 引用地址指向内存空间。在分配的内存空间实例化对象。按照优化完的顺序当并发访问的时候可能会出现这样的情况A线程进入方法进行第1次instance null判断。此时A线程发现instance 为null 所以对Singleton.class加锁。然后A线程进入方法进行第2次instance null判断。然后A线程发现instance 为null开始进行对象实例化。为对象分配一个内存空间。6.把Instance 引用地址指向内存空间而就在这个指令完成后线程B进入了方法。B线程首先进入方法进行第1次instance null判断。B线程此时发现instance 不为null 所以它会直接返回instance (而此时返回的instance 是A线程还没有初始化完成的对象)最终线程B拿到的instance 是一个没有实例化对象的空内存地址所以导致instance使用的过程中造成程序错误。解决办法很简单可以给sInstance对象加上一个关键字volatile这样编译器就不会乱优化有关volatile的具体内容后续再细说。主要解决办法通过上面的介绍其实可以归纳无论是CPU缓存线程切换还是编译器优化乱序出现问题的核心都是因为多个线程要并发读写某个变量或并发执行某段代码。那么我们可以控制一次只让一个线程执行变量读写就可以了这就是互斥。而在某些时候互斥还不够还需要一定的条件。比如一个生产者一个消费者并发生产者向队列存东西消费者向队列拿东西。那么生产者写的时候要保证存的时候队列不是满的消费者要保证拿的时候队列非空。这种线程与线程间需要通信协作的情况称为同步同步可以说是更复杂的互斥。既然知道了并发编程的根源以及同步和互斥那我们来看看有哪些解决的思路。其实一共也就三种避免共享Immutability不变性管程及其他工具下面我们分别说说这三种方案的优缺点避免共享我们先来说说避免共享其实避免共享说是线程本地存储技术在java中指的一般就是Threadlocal。ThreadLocal会为每个线程提供一个本地副本每个线程都只会修改自己的ThreadLocal变量。这样一来就不会出现共享变量也就不会出现冲突了。其实现原理是在ThreadLocal内部维护一个ThreadLocalMap每次有线程要获取对应变量的时候先获取当前线程然后根据不同线程取不同的值典型的以空间换时间。所以ThreadLocal还是比较适用于需要共享资源且资源占用空间不大的情况。比如一些连接的session啊等等。但是这种模式应用场景也较为有限比如需要同步情况就难以胜任。Immutability不变性Immutability在函数式中用得比较多函数式编程的一个主要目的是要写出无副作用的代码有关什么是无副作用可以参考我以前的文章Scala函数式编程指南一 函数式思想介绍。而无副作用的一个主要特点就是变量都是Immutability即不可变的即创建对象后不会再修改对象比如scala默认的变量和数据结构都是不可变的。而在java中不变性变量即通过final修饰的变量如StringLongDouble等类型都是Immutability的它们的内部实现都是基于final关键字的。那这又和并发编程有什么关系呢其实啊并发问题很大部分原因就是因为线程切换破坏了原子性这又导致线程随意对变量的读写破坏了数据的一致性。而不变性就不必担心这个问题因为变量都是不变不可写只能读的。在这种编程模式下你要修改一个变量那么只能新生成一个。这样做的好处很明显但坏处也是显而易见那就是引入了额外的编程复杂度丧失了代码的可读性和易用性。因为如此不变性的并发解决方案其实相对而已没那么广泛其中比较有代表性的算是Actor并发编程模型我以前也有讨论过有兴趣可以看看Actor模型浅析 一致性和隔离性这种编程模型和常规并发解决方案有很显著的差异。按我的了解Acctor模式多用在分布式系统的一些协调功能比如维持集群中多个机器的心跳通信等等。如果在单机并发环境下还是下面要介绍的管程类工具才是利器。管程及其他工具其实最早的操作系统中解决并发问题用的是信号量信号量通过两个原子操作wait(S)和signal(S)俗称PV操作来实现访问资源互斥和同步。比如下面这个小例子//整型信号量定义 int S;//P操作 wait(S){while(S0);S--; }//V操作 signal(S){S; }虽然信号量方便有效但信号量要对每个共享资源都实现对应的P和V操作这使得并发编程中可能要出现大量的PV操作并且这部分内容难以抽象出来。为了更好地实现同步互斥于是就产生了管程即Monitor也有翻译为监视器值得一提的是管程也有几种模型分别是Hasen模型Hoare模型和MESA模型。其中MESA模型应用最广泛java也是参考自MESA模型。这里简单介绍下管程的理论知识这部分内容参考自进程同步机制-----为进程并发执行保驾护航希望了解更多管程理论知识的童鞋可以看看。我们来通过一个经典的生产-消费队列来解释如下图我们先解释下图中右半部分的内容右上角有一个等待调用的线程队列管程中每次只能有一个线程在执行任务所以多个任务需要等待。然后是各个名词的意思生产-消费需要往队列写入和取出东西这里的队列就是共享变量对共享资源进行操作称之为过程入队和出队两个过程。而向队列写入和取出是有条件的写入的时候队列必须是非满的取出的时候队列必须是非空的这两个条件被称为条件变量。然后再来看看左半部分的内容假设线程T1读取共享变量即队列此时发现队列为空条件变量之一那么T1此时需要等待去哪里等呢去条件变量队列不能为空对应的队列中去等待。此时另一个线程T2向共享变量队列写数据通过了条件变量队列不能满那么写完后就会通知线程T1。但因为管程的限制管程中只能有一个线程在执行所以T1线程不能立即执行它会回到右上角的线程等待队列等待不同的管程模型在这里是有分歧的比如Hasen模型是立即中断T2线程让队列中下一个线程执行。解释完这个图管程的概念也就呼之欲出了hansen对管程的定义如下一个管程定义了一个数据结构和能力为并发进程所执行在该数据结构上的一组操作这组操作能同步进程和改变管程中的数据。本质上管程是对共享资源以及对共享资源的操作抽象成变量和方法要操作共享变量仅能通过管程提供的方法比如上面的入队和出队间接访问。所以你会发现管程其实和面向对象的理念是十分相近的在java中主要提供了低层次了synchronized关键字和wait()notify()等方法。同时还提供了高层次的ReenTrantLock和Condition来实现管程模型。以上~
http://wiki.neutronadmin.com/news/349823/

相关文章:

  • 网站建设和系统集成wordpress手机编辑器插件
  • 医疗 企业 网站制作泰安房产网
  • 网站建设公司怎么做的中铁三局招聘事件
  • 如何做彩票网站信息奉化市住房和城乡建设局网站
  • 钓鱼网站在线下载网站服务器出错了怎么办
  • 上海专业做网站较好的公司有哪些wordpress商品列表
  • 衣服定制的app有哪些seo外包杭州
  • 深圳旅游公司网站wordpress主题安装不
  • 手表网站建设规划书东道设计公司待遇如何
  • 网站发布 图片看不到开发公司解除前期物业服务合同
  • 做个人网站要多少钱如何把图片做网站背景
  • 哈尔滨做网站搭建的腾讯云服务器搭建网站
  • wordpress程序网站深圳网站建设的客户在哪里
  • 方特网站是谁做的flask网站开发源码
  • 大公司做网站网站logo上传
  • 营销策划推广公司seo优化排名平台
  • 扬州市建设工程造价管理站网站深圳市建工建设集团有限公司官网
  • 重庆汽车网站建设wordpress做付费下载站
  • vs 2017网站开发php淘宝网首页
  • 阿里云网站建设 部署与发布成都网站建设 seo
  • 北京网站建设公司华网制作作杭州外贸网站多少钱
  • 提供网站建设和制作百度软件下载
  • 网站建设工程师职责说明建站网站哪个最好
  • 深圳网站建设力荐上榜网络wordpress 如何重启
  • 张裕网站建设的目标中国企发网
  • 网站主页与导航栏的设计网站建设的资料的准备
  • 地产公司做网站维护写代码么深圳高端网站定制公
  • 建设工程信息服务平台新网站东莞网站建设 钢结构
  • 陕西省建设厅网站ca验证失败网站设计的公司报价
  • 商城网站建设预算要多少钱视频拍摄教程