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

舟山市网站建设_网站建设公司_漏洞修复_seo优化

网站开发者工具的网络选项,建筑设计网上课程,深圳网站设计 公司价格,wordpress缩小模块间距多线程编程 ​ 一个进程可以包含多个线程#xff0c;这些线程运行的一定是同一个程序#xff08;进程程序#xff09;#xff0c;且都由当前进程中已经存在的线程通过系统调用的方式创建出来。进程是资源分配的基本单位#xff0c;线程是调度运行的基本单位#xff0c;线…多线程编程 ​ 一个进程可以包含多个线程这些线程运行的一定是同一个程序进程程序且都由当前进程中已经存在的线程通过系统调用的方式创建出来。进程是资源分配的基本单位线程是调度运行的基本单位线程不可独立于进程存在。 ​ 所有线程都有自己的线程栈以此存放自己的私有数据包含在进程的虚拟内存地址中。一个进程中的很多资源也会被线程所共享包括在当前进程虚拟内存地址中存放的代码段、数据段、堆、信号处理函数、文件描述符非负整数。正因如此创建一个线程时不会像创建一个进程时那样耗费资源因为其大多数资源都因共享而无需被复制。 一线程简介 一、线程状态 ​ 与进程这种家族式的树状结构不同线程之间的关系都是平等的。他们可以互相进行如下四种操作。 操作作用pthread_create创建线程——除主线程随着进程一同创建其他线程都通过线程传入代码段与参数来创建并会返回TID。pthread_cancel(TID)终止线程——取消给定TID代表的线程目标线程总是会接受该请求并在某取消点响应该请求。pthread_join(TID)连接已终止线程——一直等待到该TID代表的线程终止并将其返回值告知调用线程。pthread_detach(TID)分离线程——将目标线程变为不可被连接。内核会在其终止时自动进行清理和销毁工作。注意 1线程默认都是一个可连接线程。如果在其终止时未被连接则会变成一个僵尸线程当有其他进程连接该僵尸进程则会被回收。 2分离操作是不可逆的操作。 3创建新城需要调用系统调用并给定执行函数和参数线程可以有返回值。 4return、系统调用exit会终止当前、所有线程。显示调用pthread_exit也会终止线程。二者的区别是主线程调用前者会终止进程内所有线程后者只会终止主线程。 二、线程调度 ​ 线程的执行总是趋向于CPU受限或IO受限。而调度器会为IO受限的线程提供更高的动态优先级。调度器会尽量使一个线程在一个特定的CPU上运行这样可以提高cache命中率以及高效使用内存当一个CPU过于繁忙时调度器也将线程迁移至空闲CPU运行。 名称说明作用动态优先级可以被调度器实时调整在静态优先级的基础上得到决定线程的运行顺序静态优先级只可以由应用程序指定默认为0决定CPU时间片的大小 ​ 线程会按照动态优先级的大小排列在激活的优先级阵列中。当一个线程已经占用了较长的CPU时间T时间片大小那么该线程就会被排入过期的优先级阵列在其后的线程则会被放在CPU上运行。当激活的阵列已经没有等待线程时会将激活阵列与过期阵列进行身份互换继续运行新激活阵列上的线程。 ​ 线程会因为等待某个事件或条件的发生而加入到对应的等待队列中并随即进入睡眠状态。当事件发生时内核会通知对应的等待队列中的所有线程这些线程会被唤醒并被转移到适当的运行队列中。 状态名描述可中断的睡眠状态睡眠直到某个条件变为真如产生一个硬件中断、释放正在等待的系统资源或是传递一个信号。不可中断的睡眠状态只能被如硬件中断、正在等待的系统资源被释放等唤醒对其他进程传递的信号不响应。三、线程实现模型 用户级线程模型 ​ 线程由用户级别的线程库全程管理。这些线程存储在进程的用户空间内核无法感知。线程的创建、终止、切换全部在用户态下完成。然而由于线程无法被内核调度所以该进程被调度器视为一个无法分割的整体单元无法实现多线程并发以及CPU负载均衡。它实现的实际上是一个多用户级线程对应一个内核调度实体M:1。 内核级线程模型——Linux ​ 线程由内核负责管理。应用程序对线程的创建、终止、同步都必须通过内核提供的系统调用完成所以操作系统无需在线程库级别管理线程。然而内核创建大量调度实体与线程对应会用到更多的内核资源同时内核的线程管理成本要比用户级线程管理高很多线程创建、切换、同步耗费的时间也更高给内核调度器带来巨大负担。它实现的实际上是每一个用户级线程对应一个内核调度实体1:1。 两级线程模型——Go ​ 线程由内核与线程库共同管理。一个进程可以关联多个内核调度实体而进程中的线程却不与其一一对应这些线程可以映射到同一个已关联的内核调度实体上。即先通过操作系统内核创建多个内核级线程通过这些内核级线程对用户级线程进行调度。它实现的实际上是多个用户级线程对应多个内核调度实体M:N。Go中称用户级线程为goroutine。 四、线程同步 ​ 由于一个进程所拥有的相当一部分虚拟内存地址都可以被该进程中的所有线程共享为保障共享数据的一致性引入临界区概念。即只能被串行化访问或执行的某个资源或代码段。通过采用互斥量、原子操作这类同步工具保证临界区有效。 互斥量 ​ 在同一时刻只允许一个线程出于临界区内的约束称为互斥。每个线程在进入临界区之前都必须先锁定某个对象只有成功锁定该对象的线程才可以进入临界区否则阻塞。这个对象就称为互斥量。 ​ 互斥量分为初始化—(未锁定状态)—锁定—(已锁定状态)—解锁—(未锁定状态)。每个互斥量保护的临界区应该在合理范围内并且尽可能的大但如果多个线程频繁出入较大临界区并且发生冲突则应考虑切分该临界区并使用不同互斥量加以保护。注意在不同互斥量保护的临界区不应该包含对同一个资源的同种不同操作。这将导致多个进程可以通过不同的互斥量进入同一临界区。 ​ 互斥量的出现导致的唯一问题就是死锁。一般通过“试锁定-回退”或者“固定顺序锁定”解决。前者在锁定多个锁失败时会解锁之前的互斥量并重新尝试加锁后者规定所有线程上锁的顺序永远是锁定了1才可以锁定2。 条件变量 ​ 条件变量与互斥量组合使用。当对应的共享数据状态发生变化时通知其他因此而被阻塞的进程。 操作作用等待通知wait阻塞当前线程直至收到该条件变量发来的通知单发通知signal该条件变量向至少一个正在等待它通知的线程发送通知广播通知broadcast该条件变量给正在等待它通知的所有线程发送通知 ​ 注意1等待通知操作在临界区内进行即线程获取到互斥量后发现临界区的值不符合条件所以解锁互斥量并阻塞该线程。 ​ 2等待通知解锁互斥量阻塞当前线程是个原子操作。阻塞之后该线程会一直等待条件变量通知并尝试再次锁定。 五、线程安全 ​ 线程安全一个代码块可以被多个线程并发执行并且总能达到预期效果则认为是线程安全。 ​ 可重入函数一个函数如果多个线程并发的调用的结果和它们以任意顺序依次调用的结果总是相同的则认为是可重入函数。如果一个函数把共享数据作为它返回的结果或者包含在它返回的结果中它一定不是一个可重入函数。 ​ 程序性能指标响应时间和吞吐量。 ​ 程序的正确性和可伸缩性后者是指增加CPU核心数的情况下其运行速度不会受到负面影响在多CPU并行的条件下实现互斥量之类的串行操作需要内核、CPU共同协调CPU核心越多协调工作越复杂。如何在平衡二者的关系 控制临界区纯度临界区代码只包含操作共享数据的代码控制临界区粒度粒度过细会增加底层协调工作的次数所以将几段操作同一共享数据的临界区合并。减少临界区代码执行耗时对一个包含操作不同共享数据的临界区应将其分为多个临界区同时改进算法。避免长时间持有互斥量在临界区中代码会等待某个共享数据的情况引入条件变量来适时对该互斥量进行解锁与锁定。优先使用原子操作而不是互斥量
http://www.ihoyoo.com/news/62480.html

相关文章:

  • 建立网站的第一步室内装修设计怎么学
  • 到国外做网站网站是怎么回事哪里有网站开发
  • 国内做服装趋势的网站人与畜禽狗croproation
  • 网站logo例子做外贸如何浏览国外网站
  • 潍坊在线制作网站哈尔滨营销网站建设公司
  • 福建省建设注册执业资格管理中心网站公司网站建设的费用
  • 网站空间购买官方做肝病科网站
  • 网站重新搭建程序要多少钱邢台seo网站制作
  • 那个网站做苗木建设局局长
  • 文化传媒主播公司 东莞网站建设鼎诚网站建设
  • 淄博做企业网站哪家好重庆网站建站系统哪家好
  • 建设网站广州市电脑网站 发展移动端
  • 镇江营销型建站公叿广州网站建设定制设计
  • 找别人做网站一般注意什么图片制作视频的软件
  • 郑州企业的网站建设济南seo推广效果好
  • 延边州住房和城乡建设局网站如何做个网站做cpa
  • 本地门户网站怎么自己找外贸订单
  • 福田做网站优化乐云seo做ip资讯的网站
  • 营销型网站的整体规划wordpress media调用
  • 苏州园区网站建设公司网站建设厘金手指下拉15
  • 南京建设网站维护运城建设网站
  • 邢台专业网站建设大连网站制作最好的公司
  • 超炫网站模板免费域名cn
  • 云南旅游网站开发公司怎样建立自己的网站
  • 福州自助建站网站一份完整的商业计划书
  • 柳市网页设计seo服务 收费
  • 网站自己做需要多少钱用.net编写网站
  • 上海网站备案人工服务器关键字挖掘机爱站网
  • 乌海做网站村级网站建设
  • 中小企业平台南京网站排名优化费用