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

建设一个网站需要的空间有哪些方法源码开发网站建设

建设一个网站需要的空间有哪些方法,源码开发网站建设,墙内千兆网站怎么做,wordpress自动保存图片一、概述 进程经常需要与其他进程通信。例如#xff0c;在一个shell管道中#xff0c;第一个进程的输出必须传送给第二个进程#xff0c;这样沿着管道传递下去。因此在进程之间需要通信#xff0c;而且最好使用一种结构良好的方式#xff0c;不要使用中断。在下面几节中在一个shell管道中第一个进程的输出必须传送给第二个进程这样沿着管道传递下去。因此在进程之间需要通信而且最好使用一种结构良好的方式不要使用中断。在下面几节中我们就来讨论一些有关进程间通信Inter Process CommunicationIPC的问题。 简要地说有三个问题。第一个问题与上面的叙述有关即一个进程如何把信息传递给另一个。第二个要处理的问题是确保两个或更多的进程在关键活动中不会出现交叉例如在飞机订票系统中的两个进程为不同的客户试图争夺飞机上的最后一个座位。第三个问题与正确的顺序有关如果该顺序是有关联的话比如如果进程A产生数据而进程B打印数据那么B在打印之前必须等待直到A已经产生一些数据。我们将从下一节开始考察所有这三个问题。 二、竞争条件 在一些操作系统中协作的进程可能共享一些彼此都能读写的公用存储区。这个公用存储区可能在内存中可能是在内核数据结构中也可能是一个共享文件。这里共享存储区的位置并不影响通信的本质及其带来的问题。为了理解实际中进程间通信如何工作我们考虑一个简单但很普遍的例子一个假脱机打印程序。当一个进程需要打印一个文件时它将文件名放在一个特殊的假脱机目录spooler directory下。另一个进程打印机守护进程则周期性地检查是否有文件需要打印若有就打印并将该文件名从目录下删掉。 设想假脱机目录中有许多槽位编号依次为012…每个槽位存放一个文件名。同时假设有两个共享变量out指向下一个要打印的文件in指向目录中下一个空闲槽位。可以把这两个变量保存在一个所有进程都能访问的文件中该文件的长度为两个字。在某一时刻0号至3号槽位空其中的文件已经打印完毕4号至6号槽位被占用其中存有排好队列的要打印的文件名。几乎在同一时刻进程A和进程B都决定将一个文件排队打印这种情况如图所示。 在Murphy法则任何可能出错的地方终将出错生效时可能发生以下的情况。进程A读到in的值为7将7存在一个局部变量next_free_slot中。此时发生一次时钟中断CPU认为进程A已运行了足够长的时间决定切换到进程B。进程B也读取in同样得到值为7于是将7存在B的局部变量next_free_slot中。在这一时刻两个进程都认为下一个可用槽位是7。 进程B现在继续运行它将其文件名存在槽位7中并将in的值更新为8。然后它离开继续执行其他操作。 最后进程A接着从上次中断的地方再次运行。它检查变量next_free_slot发现其值为7于是将打印文件名存入7号槽位这样就把进程B存在那里的文件名覆盖掉。然后它将next_free_slot加1得到值为8就将8存到in中。此时假脱机目录内部是一致的所以打印机守护进程发现不了任何错误但进程B却永远得不到任何打印输出。类似这样的情况即两个或多个进程读写某些共享数据而最后的结果取决于进程运行的精确时序称为竞争条件race condition。调试包含有竞争条件的程序是一件很头痛的事。大多数的测试运行结果都很好但在极少数情况下会发生一些无法解释的奇怪现象。 三、临界区 怎样避免竞争条件实际上凡涉及共享内存、共享文件以及共享任何资源的情况都会引发与前面类似的错误要避免这种错误关键是要找出某种途径来阻止多个进程同时读写共享的数据。换言之我们需要的是互斥mutual exclusion。我们把对共享内存进行访问的程序片段称作临界区域critical region或临界区critical section。如果我们能够适当地安排使得两个进程不可能同时处于临界区中就能够避免竞争条件。 尽管这样的要求避免了竞争条件但它还不能保证使用共享数据的并发进程能够正确和高效地进行协作。对于一个好的解决方案需要满足以下4个条件 1)任何两个进程不能同时处于其临界区。 2)不应对CPU的速度和数量做任何假设。 3)临界区外运行的进程不得阻塞其他进程。 4)不得使进程无限期等待进入临界区。 四、忙等待的互斥 1、屏蔽中断 在单处理器系统中最简单的方法是使每个进程在刚刚进入临界区后立即屏蔽所有中断并在就要离开之前再打开中断。屏蔽中断后时钟中断也被屏蔽。CPU只有发生时钟中断或其他中断时才会进行进程切换这样在屏蔽中断之后CPU将不会被切换到其他进程。于是一旦某个进程屏蔽中断之后它就可以检查和修改共享内存而不必担心其他进程介入。 2、锁变量 设想有一个共享锁变量其初始值为0。当一个进程想进入其临界区时它首先测试这把锁。如果该锁的值为0则该进程将其设置为1并进入临界区。若这把锁的值已经为1则该进程将等待直到其值变为0。于是0就表示临界区内没有进程1表示已经有某个进程进入临界区。 3、严格轮换法 在上图中整型变量turn初始值为0用于记录轮到哪个进程进入临界区并检查或更新共享内存。开始时进程0检查turn发现其值为0于是进入临界区。进程1也发现其值为0所以在一个等待循环中不停地测试turn看其值何时变为1。连续测试一个变量直到某个值出现为止称为忙等待busy waiting。由于这种方式浪费CPU时间所以通常应该避免。 只有在有理由认为等待时间是非常短的情形下才使用忙等待。用于忙等待的锁称为自旋锁spin lock。 4、Peterson解法 在使用共享变量即进入其临界区之前各个进程使用其进程号0或1作为参数来调用enter_region。该调用在需要时将使进程等待直到能安全地进入临界区。在完成对共享变量的操作之后进程将调用leave_region表示操作已完成若其他的进程希望进入临界区则现在就可以进入。 现在来看看这个方案是如何工作的。一开始没有任何进程处于临界区中现在进程0调用enter_region。它通过设置其数组元素和将turn置为0来标识它希望进入临界区。由于进程1并不想进入临界区所以enter_region很快便返回。如果进程1现在调用enter_region进程1将在此处挂起直到interested[0]变成FALSE该事件只有在进程0调用leave_region退出临界区时才会发生。 现在考虑两个进程几乎同时调用enter_region的情况。它们都将自己的进程号存入turn但只有后被保存进去的进程号才有效前一个因被重写而丢失。假设进程1是后存入的则turn为1。当两个进程都运行到while语句时进程0将循环0次并进入临界区而进程1则将不停地循环且不能进入临界区直到进程0退出临界区为止。 5、TSL指令 现在来看需要硬件支持的一种方案。某些计算机中特别是那些设计为多处理器的计算机都有下面一条指令 TSL RXLOCK 称为测试并加锁Test and Set Lock它将一个内存字lock读到寄存器RX中然后在该内存地址上存一个非零值。读字和写字操作保证是不可分割的即该指令结束之前其他处理器均不允许访问该内存字。执行TSL指令的CPU将锁住内存总线以禁止其他CPU在本指令结束之前访问内存。 五、睡眠与唤醒 Peterson解法和TSL或XCHG解法都是正确的但它们都有忙等待的缺点。这些解法在本质上是这样的当一个进程想进入临界区时先检查是否允许进入若不允许则该进程将原地等待直到允许为止。 这种方法不仅浪费了CPU时间而且还可能引起预想不到的结果。考虑一台计算机有两个进程H优先级较高L优先级较低。调度规则规定只要H处于就绪态它就可以运行。在某一时刻L处于临界区中此时H变到就绪态准备运行例如一条I/O操作结束。现在H开始忙等待但由于当H就绪时L不会被调度也就无法离开临界区所以H将永远忙等待下去。这种情况有时被称作优先级反转问题priority inversion problem。 现在来考察几条进程间通信原语它们在无法进入临界区时将阻塞而不是忙等待。最简单的是sleep和wakeup。sleep是一个将引起调用进程阻塞的系统调用即被挂起直到另外一个进程将其唤醒。wakeup调用有一个参数即要被唤醒的进程。另一种方法是让sleep和wakeup各有一个参数即有一个用于匹配sleep和wakeup的内存地址。 生产者-消费者问题 作为使用这些原语的一个例子我们考虑生产者-消费者producer-consumer问题也称作有界缓冲区bounded-buffer问题。两个进程共享一个公共的固定大小的缓冲区。其中一个是生产者将信息放入缓冲区另一个是消费者从缓冲区中取出信息。 问题在于当缓冲区已满而此时生产者还想向其中放入一个新的数据项的情况。其解决办法是让生产者睡眠待消费者从缓冲区中取出一个或多个数据项时再唤醒它。同样地当消费者试图从缓冲区中取数据而发现缓冲区为空时消费者就睡眠直到生产者向其中放入一些数据时再将其唤醒。 这个方法听起来很简单但它包含与前边假脱机目录问题一样的竞争条件。为了跟踪缓冲区中的数据项数我们需要一个变量count。如果缓冲区最多存放N个数据项则生产者代码将首先检查count是否达到N若是则生产者睡眠否则生产者向缓冲区中放入一个数据项并增量count的值。 消费者的代码与此类似首先测试count是否为0若是则睡眠否则从中取走一个数据项并递减count的值。每个进程同时也检测另一个进程是否应被唤醒若是则唤醒之。生产者和消费者的代码如上图所示。 六、信号量 信号量是E.W.Dijkstra在1965年提出的一种方法它使用一个整型变量来累计唤醒次数供以后使用。在他的建议中引入了一个新的变量类型称作信号量semaphore。一个信号量的取值可以为0表示没有保存下来的唤醒操作或者为正值表示有一个或多个唤醒操作。 Dijkstra建议设立两种操作down和up分别为一般化后的sleep和wakeup。对一信号量执行down操作则是检查其值是否大于0。若该值大于0则将其值减1即用掉一个保存的唤醒信号并继续若该值为0则进程将睡眠而且此时down操作并未结束。检查数值、修改变量值以及可能发生的睡眠操作均作为一个单一的、不可分割的原子操作完成。保证一旦一个信号量操作开始则在该操作完成或阻塞之前其他进程均不允许访问该信号量。这种原子性对于解决同步问题和避免竞争条件是绝对必要的。所谓原子操作是指一组相关联的操作要么都不间断地执行要么都不执行。原子操作在计算机科学的其他领域也是非常重要的。 up操作对信号量的值增1。如果一个或多个进程在该信号量上睡眠无法完成一个先前的down操作则由系统选择其中的一个如随机挑选并允许该进程完成它的down操作。于是对一个有进程在其上睡眠的信号量执行一次up操作之后该信号量的值仍旧是0但在其上睡眠的进程却少了一个。信号量的值增1和唤醒一个进程同样也是不可分割的。不会有某个进程因执行up而阻塞正如在前面的模型中不会有进程因执行wakeup而阻塞一样。 用信号量解决生产者-消费者问题 该解决方案使用了三个信号量一个称为full用来记录充满的缓冲槽数目一个称为empty记录空的缓冲槽总数一个称为mutex用来确保生产者和消费者不会同时访问缓冲区。full的初值为0empty的初值为缓冲区中槽的数目mutex初值为1。供两个或多个进程使用的信号量其初值为1保证同时只有一个进程可以进入临界区称作二元信号量binary semaphore。如果每个进程在进入临界区前都执行一个down操作并在刚刚退出时执行一个up操作就能够实现互斥。 信号量的另一种用途是用于实现同步synchronization。信号量full和empty用来保证某种事件的顺序发生或不发生。在本例中它们保证当缓冲区缓冲区满的时候生产者停止运行以及当缓冲区空的时候消费者停止运行。这种用法与互斥是不同的。
http://wiki.neutronadmin.com/news/163555/

相关文章:

  • 建站公司怎么备案北京sem网站
  • 胖咯科技 网站建设大学网站模板html
  • 360网站收录提交设计坞
  • 团购网站开发需要多久唐山网站建设400多少钱
  • 深圳做网站优化报价什么推广平台好
  • 电力建设工程质量监督总网站付网站建设费如果做账
  • 作品展示网站 源码it网站建设干嘛的
  • 怎么添加网站备案号php网站开发如何赚钱
  • 网站建设 上wordpress媒体播放器
  • html网站中文模板下载模板网站建站
  • 网站建立不安全怎么设置通过dedecms网站的下载
  • php 网站开发工程师网站建设免费建站源代码
  • 深圳网站建设推进wordpress免签约微信支付宝
  • 微网站菜单做文员的网站知乎
  • 太原市建设厅官方网站有域名 空间如何建网站
  • 网页建设技术和网站策划书网页游戏排行榜前十名评论
  • 上海闸北网站建设wordpress内页显示副标题
  • 手把手做网站龙岗坪地网站建设
  • 松江网站建设推广个人网站样式
  • 唐山滦县网站建设三亚网站建设方案
  • 贷款网站建设方案中智软件开发有限公司
  • 高端模板建站报价wordpress管理网站
  • 网站制作新手烟台网站制作厂家电话
  • 企业网站属于哪种网站类型游戏网站网页模板html
  • 旅游网站策划书西安公司团建活动好去处
  • 医院网站 行风建设合肥做网站的的公司
  • 家教网站建设模板湘潭网站建设 磐石网络最好
  • 深圳专业建站公司技术好百度大数据中心
  • 网站建设技术概述淮安网站建设公司
  • 绵阳网站建设价格企业策划书范文