磁力驱动循环泵泵便宜又好用的牌子有吗?

linux线程调度策略
&&对于一个嵌入式多任务、多线程操作系统,所启动的应用进程至少拥有一个线程或多个线程,线程在进程中执行代码。一个进程能够“同时”运行多个线程,“同时”加上引号,因为实际上,在单处理CPU平台上,任何时刻,只有一个线程在执行。操作系统通过任务调度算法快速切换线程来模拟多线程并行,交替地停止一个线程,然后切换到另外一个上运行。支持任务优先级,高优先级线程比低优先级线程更先执行,也就是说低优先线程必须等到高优先级线程被阻塞挂起后才可能被调度。对于优先级别相等的线程使用轮换算法来调度。
无论是WinCE还是Linux操作系统,应用线程的运行总是涉及到两个基本的参数:一个是系统分配给线程的时间片,一个是系统调度的时间间隔。Linux和WinCE下这两个参数有所不同,如下表所示:
嵌入式Linux
线程的运行时间片
系统调度间隔
这里需要注意的是,线程不一定需要将时间片完全用完,事实上,在嵌入式系统中,线程的运行处理时间通常都远小于所分的时间片,这时线程应当调用相关系统函数将自己挂起,系统将立即进行线程重调度。这时的重调度实际是加快了各个线程的轮片,提高了多线程并行运行的程度,客观上保证了嵌入式设备的实时响应能力。
如果线程运行处理的时间超过了系统分配的时间片,在到达时间片后系统将强制挂起该线程,进行任务调度,以保证其他线程的运行。所以在多任务的程序设计中,特别忌讳线程中出现长时间查询代码,如:
while( bFlag == FALSE )&
&&&&&&&&//
Polling Flag…&
这种代码总是占完了时间片,大大地浪费CPU资源,使得整个进程的线程调度变得很慢,比如对于WinCE来说,就会出现100ms才调度一次,如果有10个这样的线程,意味着每个线程需要1s才能轮询一次,在嵌入式应用中,就很容易出现数据丢失等错误,从而无法实现正常的功能。对于Linux也是存在同样的问题。
在实际应用中,常用的挂起线程的方法是调用延时函数。对于WinCE,调用Sleep( ms )函数;对Linux,可以调用select(
)函数来挂起当前线程。由于系统的调度间隔不一样,对相同的挂起时间,系统会有不同的处理。比如,设置挂起时间为2ms,在WinCE中,将在挂起2ms之后的1ms后,被系统重新调度;在Linux中,由于调度间隔大于挂起的时间,所以系统将在线程挂起10ms之后才被重新调度,也就是说在Linux下,无论程序中设置的挂起时间2ms还是9ms,该线程实际被挂起的时间总是10ms。
线程的调度策略分为3个:SCHED_OTHER,SCHED_FIFO,SCHED_RR。
SCHED_OTHER是非实时分时调度策略,线程优先级为0;
试验结果(linux2.6 Montavista
5.0):每个线程都不能强占其它线程,但是线程都受到时间片的限制,并不是线程不主动退出(包括被阻塞),就会一直占用。
但是在sun公司的 《多线程编程手册》中,其说这种情况
线程会一直占用。
SCHED_FIFO是实时先进先出调度策略,即一当占用CPU,除非自己阻塞或结束或有更高优先级线程,否则会一直运行,线程优先级为1-99;
线程会按不同的优先级来分为不同的队列,同优先级的线程是按FIFO来调度的。
SCHED_RR是实时分时调度策略,其不会一直占用CPU,运行一个时间片后会让出CPU给自己同优先级的线程;其实SCHED_RR与SCHED_FIFO基本是相似的,只是前者会受到时间片的限制,相同优先级的线程,用时间片来调度。而FIFO的话,正在运行的线程,是不会被其他同优先级线程强占的,除非自己主动退出或被阻塞。所以在采用FIFO策略时,千万别使用一直占用的线程(不主动退出,也没有挂起的条件),否则其他同优先级线程永远不会运行了。这种情况最好使用RR策略。
指出:SCHED_OTHER是不支持优先级使用的,而SCHED_FIFO和SCHED_RR支持优先级的使用,他们分别为1和99,数值越大优先级越高。实时调度策略会抢占非实时调度策略,即只要有SCHED_FIFO或SCHED_RR这两个实时调度策略的线程,像SCHED_OTHER的非实时调度策略的线程就不会得到运行,除非所有的实时调度策略的线程阻塞或结束。
Linux线程优先级设置
  首先,可以通过以下两个函数来获得线程可以设置的最高和最低优先级,函数中的策略即上述三种策略的宏定义:
int&sched_get_priority_max(int&policy);&
int&sched_get_priority_min(int&policy);
  SCHED_OTHER是不支持优先级使用的,而SCHED_FIFO和SCHED_RR支持优先级的使用,他们分别为1和99,数值越大优先级越高。
  设置和获取优先级通过以下两个函数:
int&pthread_attr_setschedparam(pthread_attr_t&*attr,&const&struct&sched_param&*param);&
int&pthread_attr_getschedparam(const&pthread_attr_t&*attr,&struct&sched_param&*param);
  例如以下代码创建了一个优先级为10的线程:
struct&sched_param&
int&__sched_&//所要设定的线程优先级&
  例:创建优先级为10的线程
pthread_attr_t&&
struct&sched_param&&
pthread_attr_init(&attr);&
pthread_attr_setschedpolicy(&attr,&SCHED_RR);&
param.sched_priority&=&10;&
pthread_attr_setschedparam(&attr,&&m);&
pthread_create(xxx&,&&attr&,&xxx&,&xxx);&
pthread_attr_destroy(&attr);
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。1188人阅读
本文档用于自学之总结,资料来源见参见资料,另外有一些来源于网络和作者的理解,不能保证百分之百正确。
本文的目的主要是说明linux操作系统的任务调度方案,关于windows的调度形成独立一章。主要是为了让使用windows的大众有个基本的认识。
进程:资源管理和调度对象的总体。进程是一个独立的实体,拥有完整的地址空间,包括文本区域(textregion)、数据区域(dataregion)和堆栈(stackregion)。
进程组:每个进程都属于一个进程组。每个进程组有一个领头进程。进程组是一个或多个进程的集合,通常它们与一组作业相关联,可以接受来自同一终端的各种信号。每个进程组都有唯一的进程组ID(整数,也可以存放在pid_t类型中)。进程组由进程组ID来唯一标识。除了进程号外(PID)之外,进程组ID也是一个进程的必备属性之一。进程组是用户空间的概念,和Linux内核无关。
2.2 进程状态
Figure1 linux进程状态图
准备执行(Ready):等待被挑选为执行的进程
实际执行(executing):正在执行的进程
可中断休眠(interruptible):可被事件或信号唤醒的进程
不可中断休眠(uninterruptible):只能被事件唤醒的进程
停止(stopped):挂起,只能被其他进程唤醒的进程。例如被调试程序中止的进程
僵死(Zombie):进程已终止运行,但父进程尚未查询其状态,因为还有些许资源未释放
线程:进程的执行单位。每个进程至少有一个线程。一个进程有多个线程时,线程之间共享进程的地址空间和资源。每个线程有独立的线程栈。
3.1 内核进程
Linux系统内核不明确区分进程和线程。本文中,将Linux内核中的进程称为内核进程。因此,有下述四个概念:
用户进程:用户层面的进程的概念,即传统意义上的进程
用户线程:用户层面的线程概念,即传统意义上的线程
内核进程:内核中的执行实体,作用相当于线程
内核进程组:内核中执行实体集合,用于标识内核进程是否归属于相同的用户进程。
3.2 映射关系
Figure2 linux用户进程内核进程映射
如图,用户空间有2个用户进程,第1个用户进程有3个用户线程,第2个用户进程有1个用户线程。内核空间有3个内核进程,第1和第2个内核进程映射到第1个用户进程,第3个内核进程映射到第4个用户线程。因此,内核进程1和内核进程2归属于同一个内核进程组,第3个内核进程独自组成一个内核进程组。
Linux系统使用Clone() 函数创建内核进程。
内核进程切换时,Linux检查源进程和目标进程的页目录地址(进程使用的内存地址)是否相同,如果相同,则认为是同一个内核进程组的不同进程。
相同内核进程组的进程共享资源,如文件、内存等,相互切换时,不进行上下文切换,只会更换栈空间。
内核进程相当于用户线程;内核进程组相当于用户进程。用户线程是通过映射获取内核进程提供服务的。
1) 从大到小的概念有:进程组à用户进程及内核进程组à线程(内核进程)
2) 内核进程经常被称作任务(TASK),本文后面使用“任务”来表述内核进程。
4 任务调度
4.1 任务的分类
4.1.1 实时任务
SCHED_FIFO: 先进先出。任务一直执行,除非:1)被更高优先级的任务抢占;2)自行出让CPU;3)阻塞。
SCHED_RR: 时间片轮转。和SCHED_FIFO相同,增加退出执行:时间片耗尽,重新分配时间片,并放到同优先级任务队列尾部。
4.1.2 普通任务
SCHED_OTHER: 分时调度。任务执行,除非:1)被抢占;2)自行出让CPU;3)阻塞;4)时间片耗尽。静态优先级决定时间片长度;动态优先级决定是否调度。
4.2 任务的优先级
Figure3 任务优先级
如上图所示,所有任务优先级范围是[1, 139],其中[1,99]为实时任务的优先级(实时优先级),[100,139]为普通任务的优先级(静态优先级;动态优先级)。优先级越高,其值越小。
4.3 重要概念
SCHED_RR实时任务的时间片长度是一个固定的值(2.6.36内核代码中使用DEF_TIMESLICE=100ms,《深入理解LINUX内核》中的说法是,由实时优先级计算而来。)
实时优先级:实时任务创建时的优先级(实际为创建时的优先级+1000,这里简单处理便于理解)。
静态优先级:普通任务创建时的优先级。
普通任务--基本时间片长度= (140 – 静态优先级)×M。静态优先级&120时,M=20,静态优先级&=120时,M=5。可见,静态优先级越高(值越小),基本时间片长度越大。
普通任务--动态优先级= max(100, min (静态优先级 – bonus + 5, 139))。其中,bonus&5表示惩罚,&5表示奖赏。任务的睡眠时间越长,静态优先级越高(值越小),动态优先级越高(越小)。动态优先级和静态优先级的范围都是[100,139] 。任务执行将降低bonus,从而降低任务的优先级。
活动任务队列和过期任务队列:处于就绪状态的任务分为两个队列:活动任务队列和过期任务队列。时间片耗光的任务将会被放到过期任务队列中。当活动队列中没有可执行任务时,活动任务和过期任务队列互换。
1) 实时任务没有过期任务队列,它们就绪后,一直处于活动任务中
2) 任务调度的设计原则是,执行少的任务优先调度;优先级高的任务优先调度
3) 每个优先级对应一个优先级队列,因此,一共有140个队列
4) 0号优先级为保留优先级
4.4 调度策略
1) 活动任务队列中没有任务,才倒换过期任务队列
2) 没有实时任务,才执行普通任务
3) 永远执行高优先级任务[实时任务的实时优先级、普通任务的动态优先级]
Figure4 调度策略基本流程
1) 实际的调度可能更为复杂,例如,交互式任务可能会在时间片耗光之后,重新赋值,留在活动任务列表中。
4.5 任务切换策略
1) SCHED_FIFO:如果因为阻塞切换出去,则进入阻塞态,不再继续态列表中,因此不涉及到调度的问题;如果是因为出让CPU或被抢占切换出去,则直接回到队列头中,后面可继续执行。
2) SCHED_RR:阻塞和被抢占时的情形与SCHED_FIFO相同;如果是因为时间片耗尽造成的切换,则任务回到队列尾部。
3) SCHED_OTHER:阻塞和上述相同;被抢占后,其动态优先级会被重新计算,并安排到新的队列尾部;时间片耗尽后,任务不再存在于活动任务队列中,而是被放到过期任务队列中。必须等到过期任务队列切换为活动任务队列,才可能被重新调度。
5 多CPU负载均衡
每个CPU拥有独立的队列,存在专用的负载均衡算法,可实现多CPU之间的进程调配。本文从略。
实时操作系统一般使用类似Deadline Scheduling等方法保证实时任务能够按时间完成。但linux中并未见到类似处理。虽然Linux中的实时进程调度算法能够起到优先执行的目的,但是,并不能保证满足实时性要求。因此,一般认为Linux操作系统不是实时操作系统。
7 Windows的调度方法
一般不能详细描述windows系统的调度算法,因为MS认为这种算法对于程序而言越模糊越好。MS不保证未来的调度算法不发生重大变化,因而不希望任何应用利用该调度算法的特性。
Windows针对线程进行调度,进程仅是一个容器。
7.1 优先级
一般不能详细描述windows系统的调度算法,因为MS认为这种算法对于程序而言越模糊越好。MS不保证未来的调度算法不发生重大变化,因而不希望任何应用利用该调度算法的特性。
Windows针对线程进行调度,进程仅是一个容器。
Figure5 进程优先级的分类
Figure6 线程优先级的分类
优先级范围0~31。和linux相反,优先级越高,其值越大。
7.1.1 实时优先级
16~31为实时优先级。这里的实时优先级和普通意义上的实时是不同的,它并不能保证线程的执行时间,只是说它的优先级很高,执行时,可以忽略I/O设备、网络设备、UI界面的事件。
7.1.2 普通优先级
1~15为普通优先级。普通线程的优先级是动态的,但它有一个初始优先级。
进程基本优先级范围为1~15。进程内的线程,其优先级按上表,有表示最高、高于正常、正常、低于正常、最低,其线程基本优先级对应为2、1、0、-1、-2,可认为是对进程优先级的加权处理。
线程初始优先级 = 进程基本优先级 + 线程基本优先级。
线程执行过程中,其优先级会动态调整,但不会低于线程优先级,也不会高于15。如图:
Figure7 线程优先级实例
7.1.3 保留优先级
0为保留优先级,用途为zero page thread,即Idle进程。它将系统所有的空闲RAM页面置0。
7.1.4 线程的实际优先级范围
实际中,进程/线程的优先级并非所有级别都可以使用。如下图表:
Figure8 进程-线程可能的优先级1
Figure9 进程-线程可能的优先级2
1)进程的基本优先级,只有4、6、8、10、13、24可用。
2)线程的优先级,可能的值的范围均在上述范围之内。
3)优先级1和优先级31是特殊的优先级。
4)17、18、19、20、21、27、28、29、30等优先级是用户不可用的,只有内核方式执行的设备驱动程序才可能使用这些优先级。
抢占式:只要存在高优先级线程,低优先级线程就会被抢占。但不用担心饥饿的发生,因为windows中的绝大部分线程是不能调度的。
调度的触发:抢占、时间片用完。
动态优先级提升:
oI/O操作完成
o信号量或事件等待结束
o前台进程中的线程完成一个等待操作
o由于窗口活动而唤醒图形用户接口线程
o线程处于就绪状态超过一定时间,但没能进入运行状态(处理机饥饿)
8 参考资料
《深入理解LINUX内核》
《OperatingSystem – Internals and Design Principle》
《windows核心编程(windowsvia C/C++)》
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1318次
排名:千里之外帐号:密码:下次自动登录{url:/nForum/slist.json?uid=guest&root=list-section}{url:/nForum/nlist.json?uid=guest&root=list-section}
贴数:7&分页:lucn发信人: lucn (lucn), 信区: LinuxDev
标&&题: 线程调度器最小执行单位是什么?
发信站: 水木社区 (Sun Jan&&6 14:36:29 2013), 站内 && 如果一个内存写指令要两个总线周期,但执行完第一个时,时间片到了,那再调度其他线程时会不会把这个内存写指令执行完?还是留个尾巴,等下个时间片到来时再执行?
人是群军动物,离群索居就是找死 &&&& ※ 来源:·水木社区 newsmth.net·[FROM: 58.249.24.*]
2012-阳光照进半夜里发信人: divfor (2012-阳光照进半夜里), 信区: LinuxDev
标&&题: Re: 线程调度器最小执行单位是什么?
发信站: 水木社区 (Sun Jan&&6 18:22:21 2013), 站内 && i++都会打断 && 或许有,但操作系统不做任何保证,以免大家用了以后,它将来的版本难以维护兼容性
。 && 举个著名的例子吧,就是操作系统进入64位时代之后,指针也变成64位了,但目前只用
了48位作为地址,高16位必须为1(操作系统专用地址区域)或者为0(应用程序地址区
域)。很多应用想把这12位挪为他用,但操作系统可以认为是非法指针不予认可,就是
为了保证将来扩容的兼容性。 &&&&&& 【 在 lucn (lucn) 的大作中提到: 】
如果一个内存写指令要两个总线周期,但执行完第一个时,时间片到了,那再调度其他线程时会不会把这个内存写指令执行完?还是留个尾巴,等下个时间片到来时再执行?
人是群军动物,离群索居就是找死 &&&&&&&& -- && ※ 来源:·水木社区 newsmth.net·[FROM: 123.114.56.*]
我的月份又来了发信人: JulyClyde (我的月份过去了), 信区: LinuxDev
标&&题: Re: 线程调度器最小执行单位是什么?
发信站: 水木社区 (Mon Jan&&7 09:10:40 2013), 站内 && 操作系统调度是用 时钟中断 来处理的吧?
如果是原子操作,会先关闭中断,然后进入处理,最后再恢复中断处理程序的
【 在 lucn (lucn) 的大作中提到: 】
: 如果一个内存写指令要两个总线周期,但执行完第一个时,时间片到了,那再调度其他线程时会不会把这个内存写指令执行完?还是留个尾巴,等下个时间片到来时再执行?
自由即奴役
战争即和平
无知即力量
谁掌握过去谁就掌握现在
谁掌握现在谁就掌握未来 &&&& ※ 来源:·水木社区 newsmth.net·[FROM: 119.254.241.*]
猫王发信人: stid (猫王), 信区: LinuxDev
标&&题: Re: 线程调度器最小执行单位是什么?
发信站: 水木社区 (Mon Jan&&7 09:18:06 2013), 站内 && 原子操作跟中断没关系 && 【 在 JulyClyde (我的月份过去了) 的大作中提到: 】
: 操作系统调度是用 时钟中断 来处理的吧?
: 如果是原子操作,会先关闭中断,然后进入处理,最后再恢复中断处理程序的
&&&& -- && ※ 来源:·水木社区 newsmth.net·[FROM: 125.35.62.*]
2012-阳光照进半夜里发信人: divfor (2012-阳光照进半夜里), 信区: LinuxDev
标&&题: Re: 线程调度器最小执行单位是什么?
发信站: 水木社区 (Mon Jan&&7 12:07:51 2013), 站内 && 原子操作远比中断粒度小
关闭中断主要是为了不响应同等或者低优先级中断 &&&& 【 在 stid (猫王) 的大作中提到: 】
原子操作跟中断没关系 && 【 在 JulyClyde (我的月份过去了) 的大作中提到: 】
: 操作系统调度是用 时钟中断 来处理的吧?
: 如果是原子操作,会先关闭中断,然后进入处理,最后再恢复中断处理程序的
&&&& -- &&&&&& -- && ※ 修改:·divfor 于 Jan&&7 12:08:06 2013 修改本文·[FROM: 114.251.188.*]
※ 来源:·水木社区 newsmth.net·[FROM: 114.251.188.*]
lucn发信人: lucn (lucn), 信区: LinuxDev
标&&题: Re: 线程调度器最小执行单位是什么?
发信站: 水木社区 (Mon Jan&&7 12:30:05 2013), 站内 && 那写内存指令算原子操作吗?
【 在 JulyClyde (我的月份过去了) 的大作中提到: 】
: 操作系统调度是用 时钟中断 来处理的吧?
: 如果是原子操作,会先关闭中断,然后进入处理,最后再恢复中断处理程序的
人是群军动物,离群索居就是找死 &&&& ※ 来源:·水木社区 newsmth.net·[FROM: 120.85.245.*]
卡梅隆发信人: ComeAlong (卡梅隆), 信区: LinuxDev
标&&题: Re: 线程调度器最小执行单位是什么?
发信站: 水木社区 (Mon Jan&&7 13:29:42 2013), 站内 && 如果连单条指令都能打断,那硬件和os得复杂成啥样啊 && 【 在 lucn (lucn) 的大作中提到: 】
: 标&&题: 线程调度器最小执行单位是什么?
: 发信站: 水木社区 (Sun Jan&&6 14:36:29 2013), 站内
: 如果一个内存写指令要两个总线周期,但执行完第一个时,时间片到了,那再调度其他线程时会不会把这个内存写指令执行完?还是留个尾巴,等下个时间片到来时再执行?
: 人是群军动物,离群索居就是找死
※ 修改:·ComeAlong 于 Jan&&7 13:39:52 2013 修改本文·[FROM: 101.95.17.*]
: ※ 来源:·水木社区 newsmth.net·[FROM: 58.249.24.*]
┄┅┈╭︿╭ ┈┄┅ 只有仰望是真实的, &&&&&&((@ノ( && ┄╰ヘ(&&丿┅┈&& 它使一颗卑微的灵魂有了飞跃的的光泽, &&&&&&╰﹀い╭┐ &&&& ┅┈&&\&&╯ ┈&&那是我在暗夜里怀念的道路有了更远的前方 &&&& ※ 来源:·水木社区 newsmth.net·[FROM: 101.95.17.*]
文章数:7&分页:2643人阅读
操作系统(1)
线程概念性问答题
第一题:线程的基本概念、线程的基本状态及状态之间的关系?
线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身线程是程序中一个单一的顺序控制流程。在单个程序中同时运行多个线程完成不同的工作,称为多线程。
状态:就绪,运行,synchronize阻塞,wait和sleep挂起,结束。wait必须在synchronized内部调用。
调用线程的start方法后线程进入就绪状态,线程调度系统将就绪状态的线程转为运行状态,遇到synchronized语句时,由运行状态转为阻塞,当synchronized获得锁后,由阻塞转为运行,在这种情况可以调用wait方法转为挂起状态,当线程关联的代码执行完后,线程变为结束状态。
在多线程OS中,通常是在一个进程中包括多个线程,每个线程都是作为利用CPU的基本单位,是花费最小开销的实体。线程具有以下属性。
1)轻型实体
线程中的实体基本上不拥有系统资源,只是有一点必不可少的、能保证独立运行的资源,比如,在每个线程中都应具有一个用于控制线程运行的线程控制块TCB,用于指示被执行指令序列的程序计数器、保留局部变量、少数状态参数和返回地址等的一组寄存器和堆栈。
2)独立调度和分派的基本单位。
在多线程OS中,线程是能独立运行的基本单位,因而也是独立调度和分派的基本单位。由于线程很“轻”,故线程的切换非常迅速且开销小。
3)可并发执行。
在一个进程中的多个线程之间,可以并发执行,甚至允许在一个进程中所有线程都能并发执行;同样,不同进程中的线程也能并发执行。
4)共享进程资源。
在同一进程中的各个线程,都可以共享该进程所拥有的资源,这首先表现在:所有线程都具有相同的地址空间(进程的地址空间),这意味着,线程可以访问该地址空间的每一个虚地址;此外,还可以访问进程所拥有的已打开文件、定时器、信号量机构等。
第二题:线程与进程的区别?
线程和进程的区别在于,子进程和父进程有相同的代码段,不同的数据段,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文。多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定。线程的运行中需要使用计算机的内存资源和CPU。通常在一个进程中可以包含若干个线程,它们可以利用进程所拥有的资源。在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度,从而显著提高系统资源的利用率和吞吐量。
线程与进程的区别可以归纳为以下4点:
1)地址空间和其它资源(如打开文件):进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。
2)通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。
3)调度和切换:线程上下文切换比进程上下文切换要快得多。
4)在多线程OS中,进程不是一个可执行的实体。
同时系统引入线程的好处:
1)创建一个新线程花费的时间少。
2)两个线程(在同一进程中的)的切换时间少。
3)由于同一个进程内的线程共享内存和文件,所以线程之间互相通信不必调用内核。
4)线程能独立执行,能充分利用和发挥处理机与外围设备并行工作的能力。
第三题:多线程有几种实现方法,都是什么?
&&& 1. 继承 Thread 类
&&& 2. 实现 Runnable 接口再 new Thread(YourRunnableOjbect)
&&& 1. 用 synchronized 修饰需要同步的方法&
&&& 2. 用 synchronized 块包围需要同步的语句&
&&& 3. 使用 java.util.concurrent 包中的各种同步锁
第四题:多线程同步和互斥有几种实现方法,都是什么?
线程间的同步方法大体可分为两类:用户模式和内核模式。顾名思义,内核模式就是指利用系统内核对象的单一性来进行同步,使用时需要切换内核态与用户态,而用户模式就是不需要切换到内核态,只在用户态完成操作。
用户模式下的方法有:原子操作(例如一个单一的全局变量),临界区。内核模式下的方法有:事件,信号量,互斥量。
详解各个线程同步和互斥方法:
临界区(Critical Section)&
保证在某一时刻只有一个线程能访问数据的简便办法。在任意时刻只允许一个线程对共享资源进行访问。如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式操作共享资源的目的。
临界区包含两个操作原语:
EnterCriticalSection()进入临界区&
LeaveCriticalSection()离开临界区&
EnterCriticalSection()语句执行后代码将进入临界区以后无论发生什么,必须确保与之匹配的LeaveCriticalSection()都能够被执行到。否则临界区保护的共享资源将永远不会被释放。虽然临界区同步速度很快,但却只能用来同步本进程内的线程,而不可用来同步多个进程中的线程。
事件(Event)&
事件对象也可以通过通知操作的方式来保持线程的同步。并且可以实现不同进程中的线程同步操作。
互斥量(Mutex)&
互斥量跟临界区很相似,只有拥有互斥对象的线程才具有访问资源的权限,由于互斥对象只有一个,因此就决定了任何情况下此共享资源都不会同时被多个线程所访问。当前占据资源的线程在任务处理完后应将拥有的互斥对象交出,以便其他线程在获得后得以访问资源。互斥量比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。
信号量(Semaphores)&
信号量对象对线程的同步方式与前面几种方法不同,信号允许多个线程同时使用共享资源,这与操作系统中的PV操作相同。它指出了同时访问共享资源的线程最大数目。它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。
第五题:多线程同步和互斥有何异同,在什么情况下分别使用他们?举例说明。
线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。
线程互斥是指对于共享的进程系统资源,在各单个线程访问时的排它性。当有若干个线程都要使用某一共享资源时,任何时刻最多只允许一个线程去使用,其它要使用该资源的线程必须等待,直到占用资源者释放该资源。线程互斥可以看成是一种特殊的线程同步(下文统称为同步)。
线程同步一般是当多个线程相互协作,存在相互依赖的关系;线程互斥是包括临界资源等的访问,相互线程之间是互斥访问。
转载地址:http://blog.csdn.net/zhoulv2000/article/details/
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:353565次
积分:3640
积分:3640
排名:第7497名
原创:56篇
转载:120篇
评论:73条
(1)(1)(1)(1)(2)(2)(1)(1)(8)(9)(7)(1)(8)(4)(3)(1)(1)(6)(17)(35)(1)(2)(1)(6)(2)(4)(2)(16)(8)(4)(5)(1)(1)(6)(9)

我要回帖

更多关于 磁力驱动循环泵 的文章

 

随机推荐