上下文切换详解
译者: 董明鑫,校对:郑旭东
上下文切换(有时也称做进程切换或任务切换)是指 CPU 从一个进程或线程切换到另一个进程或线程。
进程(有时候也称做任务)是指一个程序运行的实例。在 Linux 系统中,线程就是能并行运行并且与他们的父进程(创建他们的进程)共享同一地址空间(一段内存区域)和其他资源的轻量级的进程。
上下文是指某一时间点 CPU 寄存器和程序计数器的内容。寄存器是 CPU 内部的数量较少但是速度很快的内存(与之对应的是 CPU 外部相对较慢的 RAM 主内存)。寄存器通过对常用值(通常是运算的中间值)的快速访问来提高计算机程序运行的速度。程序计数器是一个专用的寄存器,用于表明指令序列中 CPU 正在执行的位置,存的值为正在执行的指令的位置或者下一个将要被执行的指令的位置,具体依赖于特定的系统。
稍微详细描述一下,上下文切换可以认为是内核(操作系统的核心)在 CPU 上对于进程(包括线程)进行以下的活动:(1)挂起一个进程,将这个进程在 CPU 中的状态(上下文)存储于内存中的某处,(2)在内存中检索下一个进程的上下文并将其在 CPU 的寄存器中恢复,(3)跳转到程序计数器所指向的位置(即跳转到进程被中断时的代码行),以恢复该进程。
上下文切换有时被描述为内核挂起 CPU 当前执行的进程,然后继续执行之前挂起的众多进程中的某一个。尽管这么说对于澄清概念有所帮助,但是这句话本身可能有一点令人困惑。因为通过定义可以知道,进程是指一个程序运行的实例。所以说成挂起一个进程的运行可能更适合一些。
上下文切换与模式切换
上下文切换只能发生在内核态中。内核态是 CPU 的一种有特权的模式,在这种模式下只有内核运行并且可以访问所有内存和其他系统资源。其他的程序,如应用程序,在最开始都是运行在用户态,但是他们能通过系统调用来运行部分内核的代码。系统调用在类 Unix 系统中是指活跃的进程(正在运行在 CPU 上的进程)对于内核所提供的服务的请求,例如输入/输出(I/O)和进程创建(创建一个新的进程)。I/O 可以被定义为任何信息流入或流出 CPU 与主内存(RAM)。也就是说,一台电脑的 CPU和内存与该电脑的用户(通过键盘或鼠标)、存储设备(硬盘或磁盘驱动)还有其他电脑的任何交流都是 I/O。
这两种模式(用户态和内核态)在类 Unix 系统中共存意味着当系统调用发生时 CPU 切换到内核态是必要的。这应该叫做模式切换而不是上下文切换,因为没有改变当前的进程。
上下文切换在多任务操作系统中是一个必须的特性。多任务操作系统是指多个进程运行在一个 CPU 中互不打扰,看起来像同时运行一样。这个并行的错觉是由于上下文在高速的切换(每秒几十上百次)。当某一进程自愿放弃它的 CPU 时间或者系统分配的时间片用完时,就会发生上下文切换。
上下文切换有时也因硬件中断而触发。硬件中断是指硬件设备(如键盘、鼠标、调试解调器、系统时钟)给内核发送的一个信号,该信号表示一个事件(如按键、鼠标移动、从网络连接接收到数据)发生了。
英特尔的 80386 和更高级的 CPU 都支持硬件上下文切换。然而,大多数现代的操作系统通过软件实现上下文切换,而非使用硬件上下文切换,这样能够运行在任何 CPU 上。同时,使用软件上下文切换可以尝试获得更好的性能。软件的上下文切换最先在 Linux 2.4 中实现。
软件上下文切换号称的一个主要优点是,硬件的机制保存了几乎所有 CPU 的状态,软件能够有选择性的保存需要被保存的部分并重新加载。然而这个行为对于提升上下文切换的性能到底有多重要,还有一点疑问。其拥护者还宣称,软件上下文切换有提高切换代码的可能性,它有助于提高正在加载的数据的有效性,从而进一步提高性能。
上下文切换的消耗
上下文切换通常是计算密集型的。也就是说,它需要相当可观的处理器时间,在每秒几十上百次的切换中,每次切换都需要纳秒量级的时间。所以,上下文切换对系统来说意味着消耗大量的 CPU 时间,事实上,可能是操作系统中时间消耗最大的操作。
Linux相比与其他操作系统(包括其他类 Unix 系统)有很多的优点,其中有一项就是,其上下文切换和模式切换的时间消耗非常少。
物理存储器和页交换文件
http://blog.sina.com.cn/s/blog_66d835040100uy3x.html
《Windows核心编程(第5版)》第13章Windows内存体系结构,本章将深入探讨Microsoft Windows所使用的内存体系结构。本节为大家介绍的是物理存储器和页交换文件。
AD:
13.5 物理存储器和页交换文件
在老式的操作系统中,物理存储器被认为是机器中内存的总量。换句话说,如果一台机器装有16 MB内存,那么应用程序最多可以使用16 MB内存。当今的操作系统能让磁盘空间看起来像内存一样。磁盘上的文件一般被称为页交换文件(paging file),其中包含虚拟内存,可供任何进程使用。
当然,为了能够使用虚拟内存,操作系统需要CPU的大力协助。当线程试图访问存储器中的一个字节时,CPU必须知道该字节是在内存中还是在磁盘上。
从应用程序的角度来说,页交换文件以一种透明的方式增大了应用程序可用内存(或存储器)的总量。如果一台机器装备了1 GB的内存,硬盘上还有1 GB的页交换文件,那么应用程序会认为可用内存的总量为2 GB。
当然,这台机器实际上并没有装备2 GB的内存。实际上,是操作系统与CPU分工协作,把内存中的一部分保存到页交换文件中,并在应用程序需要的时候再将页交换文件中的对应部分载入内存。因此,使用页交换文件可以增大应用程序可用内存的总量。另一方面,页交换文件的使用并不是必须的。如果一台机器没有页交换文件,那么对系统来说,它只是认为可供应用程序使用的内存总量减少了。但是,我们强烈建议用户使用页交换文件,这样就可以运行更多的应用程序,而应用程序也可以操作更多的数据。最好是把物理存储器看成是保存在磁盘(通常是硬盘)上的页交换文件中的数据。当应用程序调用VirtualAlloc函数来把物理存储器调拨给地址空间区域时,该空间实际上是从硬盘上的页交换文件分配得到的。系统中页交换文件的大小是决定应用程序可用内存总量的最重要因素,机器实际装备的内存总量对它的影响相对较小。
当一个线程试图访问所属进程的地址空间中的一块数据(位于第17章介绍的内存映射文件之外)时,有可能会出现两种情况。图13-2显示了经简化后的 流程图。(更多细节请参阅Mark Russinovich和David Solomon所著的Microsoft Windows Internals,由微软出版社出版。)
第一种情况是,线程要访问的数据就在内存中。在这种情况下,CPU会先把数据的虚拟内存地址映射到内存的物理地址,接下来就可以访问内存中的数据了。
第二种情况是,线程要访问的数据不在内存中,而是位于页交换文件中的某处。在这种情况下,这次不成功的访问被称为页面错误。发生页面错误时,CPU 会通知操作系统。操作系统随即在内存中找到一个闲置的页面,如果找不到,操作系统必须先释放一个已分配的页面。如果待释放的页面没有修改过,那么操作系统 可以直接释放该页面。但如果系统需要释放一个修改过的页面,那么它必须先把页面从内存复制到页交换文件。接下来,系统会在页交换文件中对所需访问的数据块 进行定位,并把数据载入到内存中闲置的页面。然后,操作系统对它内部的表项进行更新,以反映该块数据的虚拟内存地址现在已经被映射到了内存中对应的物理内 存地址。这时CPU会再次运行那条引发页面错误的指令,但和前一次不同的是,这一次CPU能够将虚拟内存地址映射到物理内存地址并成功访问所需的数据。
|
图13-2 把虚拟地址转换为物理存储器地址 |
系统需要在内存和页交换文件之间复制页面的频率越高,硬盘颠簸(thrash)得越厉害,系统运行得也越慢。(颠簸是指操作系统把所有的时间都花在 在页面文件和内存之间交换数据上,导致没有时间运行程序。)通过给计算机添加更多的内存,我们可以减少应用程序运行时可能产生颠簸的次数,从而极大地提高 应用程序的性能。这里有一条经验法则:要让计算机跑得更快,最好是增加内存。实际上,和换个更快的CPU相比,添加内存在大多数情况下都会得到更好的性能 提升。
不在页交换文件中维护的物理存储器
在读过上一节之后,读者可能会想,如果有许多程序同时运行,页交换文件可能会变得相当大--尤其是每次运行一个程序时,系统都必须为该进程的代码和 数据预订地址空间区域,为这些区域调拨物理存储器,然后把硬盘上的程序文件中的代码和数据复制到页交换文件中已调拨的物理存储器中去。
事实上,系统并不会执行刚才所说的这些操作。如果系统确实这么做的话,那么载入一个程序并让它运行起来会花费很长的时间。当用户要求执行一个应用程 序时,系统会打开该应用程序对应的.exe文件并计算出应用程序的代码和数据的大小。然后系统会预订一块地址空间,并注明与该区域相关联的物理存储器就 是.exe文件本身。是的,系统并没有从页交换文件中分配空间,而是将.exe文件的实际内容(或文件映像,即file image)用作程序预订的地址空间区域。这样一来,不但载入程序非常快,而且页交换文件也可以保持一个合理的大小。
当把一个程序位于硬盘上的文件映像(即一个.exe或DLL文件)用作地址空间区域对应的物理存储器时,我们称这个文件映像为内存映射文件 (memory mapped file)。当载入一个.exe或DLL时,系统会自动预订地址空间区域并把文件映像映射到该区域。但是,系统也提供了一组函数,可以让开发人员把数据文 件映射到地址空间。我们会在第17章详细讨论内存映射文件。
Windows可以使用多个页交换文件。如果多个页交换文件位于不同的物理硬盘上,那么系统就可以运行得更快,这是因为系统能同时写入多个硬盘。在控制面板里,我们可以通过以下步骤来添加和删除页交换文件。
(1)选择Performance Information And Tools(性能信息和工具)。
(2)单击Advanced Tools(高级工具)链接。
(3)单击Adjust The Apperance And Performance Of Windows(调整Windows的外观和性能)链接。
(4)选择Advanced(高级)选项卡,并在虚拟内存部分单击Change(更改)按钮。
下图显示了弹出的对话框。
|
说明 当Windows从软盘载入.exe或DLL文件时,系统会把整个文件从软盘复制到内存中。此外,系统还会从页交换文件中分配足够的存储空间来存放文件映 像。只有当系统需要把一个页面换出内存,而页面又包含该文件映像的一部分时,系统才会写入页交换文件。如果系统的内存负载很轻,那么文件总是从内存中直接 运行。
Microsoft必须让在软盘上执行的文件以这种方式运行,因为只有这样安装程序才能正常运行。通常,安装程序从第一张软盘开始运行,在安装过程 中用户会取出该软盘并插入其他软盘。如果系统需要再从第一张软盘去加载.exe或DLL的一部分代码,那么很显然,第一张软盘可能已经不在软驱内了。但 是,由于系统已经把文件复制到了内存中(并以页交换文件为后备存储器),因此系统可以随时访问安装程序而且不会遇到任何问题。
除非映像文件是用/SWAPRUN:CD或/SWAPRUN:NET开关链接的,否则系统不会把位于其他可移动媒介(比如,光盘或网络驱动器)上的映像文件复制到内存中的。
你的网卡真有千兆么?——千兆网卡传输速度解析
转自: R9IT技术网
随着PS3it技术的破解和可以利用电脑FTP向PS3传送文件,千兆网卡成为了不少玩家必备的工具。要知道PS3it技术本身自带千兆网卡,如果利用FTP软件以及电脑上的千兆网卡进行文件传输,其速度远比采用USB 2.0的外置硬盘来传输要快。但是在使用的过程中,玩家却发现,无论是采用电脑主板上自带的千兆网卡还是采用独立的千兆网卡,传输速度最多也只有40MB/s,远远达不到千兆网卡的速度,这到底是怎么回事?此外,在一些日常应用中,即使在千兆局域网中,传输速度也无法达到1Gbps,甚至一半都没有,难道千兆网卡只是虚有其表?下面就让我们一起来仔细解读目前的千兆网卡。
此“兆”不同于彼“兆”
在正式解析千兆网卡之前,先谈谈很多人容易搞混淆的概念。不少用户都曾经有这样的疑惑,自己是百兆网卡,但是在局域网内最多也就不到10MB/s的传输速度;办个“4M宽带”,下载速度也只有400KB/s……
其实,这是大家搞错了MB和Mb的概念。一般我们所说的千兆和百兆,它的单位都是Mbps,而传输速度我们一般则用MB/s来作为单位。实际上和硬盘的容量概念一样,B是指Byte,而b则是指bit,1B=8b。那么替换到网络中也是一样,普通的百兆网卡理论传输速度为100Mbps,实际上只有12.5MB/s,而千兆网卡的理论传输速度则为125MB/s。明白了这点,相信就没人真的以为千兆网卡传输能达到1GB/s的速度了。事实上,就目前的应用环境而言,在大多数情况下,百兆网卡已经足够了,而各位的宽带带宽只要按照运营商给出的数字再除以8,也基本上就是自己宽带能下载的极限速度了。
PCI带宽限制“千兆”
相信不少朋友就会产生疑问了:既然千兆网卡理论传输速度可以达到128MB/s,那为什么在千兆局域网中,传输的速度还不到这个数值的一半呢?实际上,抛开主板自带的千兆网卡不谈(下面会提及),大多数用户所使用的千兆网卡都是采用的PCI接口,在很多人看来,无论是声卡、显卡还是网卡,独立的设备总是比主板集成的设备性能要好,但是在网卡方面,独立的PCI千兆网卡还真没有主板自带的千兆网卡性能好!
众所周知,我们普通主板上的PCI总线频率为33MHz,总线位宽为32bit,PCI总线的具体带宽为127MB/s,换算下来即为1016Mbps,理论上这是符合千兆网卡的带宽的。但实际上呢?要知道所有的PCI设备都是共享一个总线带宽,包括IDE总线、集成的声卡都是通过PCI总线工作的,这样分配给PCI千兆网卡的带宽自然也就不够了。而且要真正达到千兆网卡的速度要求,那么无论是输入还是输出的数据都必须达到1Gbps的速度,也就是我们常说的“双工”,这样我们要求的带宽就达到了2Gbps,这是目前PCI总线万万达不到的,因此PCI千兆网卡实际上也无法真正达到千兆网卡的速度。从实际的数据测试来看,普通的PCI千兆网卡的极限传输速度在38MB/s左右,这已经超出百兆网卡的速度三倍之多,应付普通民用的确绰绰有余。
从以上的论述可以看出,如果要在理论上达到千兆网卡的传输速度,那么最需要改善的就是千兆网卡接口的带宽。如果有条件,用户可以使用PCI-X(一般是64位总线位宽的PCI 2.1)的千兆网卡,PCI 2.1的总线带宽达到了4068Mbps,这个带宽完全可以满足千兆网卡的需求,只不过PCI 2.1的接口在普通主板上比较少见,通常都是使用在服务器主板上,尽管普通的PCI接口也可以兼容PCI 2.1的设备,但实际带宽就只有PCI总线的水准了,所以使用PCI-X接口以及千兆网卡对很多人来说不是很现实,那么我们就要把眼光投向PCI-E设备了。
对于PCI-E接口而言,带宽根本不是问题,PCI-E ×1的带宽就达到了476MB/s,所以用于网络设备是绰绰有余,实际上也正是因为主板上PCI-E千兆网卡的引入,才让目前千兆网卡成为了普通用户的标配。目前大多数主板上自带的千兆网卡,都是通过南桥芯片中的PCI-E通道工作,考虑到南桥芯片的数据传输本身有一定的信号衰减和数据丢失,板载的千兆网卡往往在性能上要略逊于独立的PCI-E网卡,达不到1Gbps的传输速度,不过也远远超过PCI千兆网卡的速度。从可行性上来考虑,购买板载千兆网卡的主板是实现千兆网络传输的最好办法。
小贴士:什么是PCI-X?
PCI-X是PCI总线的一种扩展架构,它与PCI总线不同的是,PCI总线必须频繁地在目标设备和总线之间交换数据,而PCI-X则允许目标设备仅与单个PCI-X设备进行交换,同时,如果PCI-X设备没有任何数据传送,总线会自动将PCI-X设备移除,以减少PCI设备间的等待周期。所以,在相同的频率下,PCI-X将能提供比PCI高14%~35%的性能。此外,更可贵的一点是,PCI-X接口的频率是不固定的,可以跟随设备而变化。
硬盘的速度影响“千兆”
除了PCI带宽使得网卡无法达到千兆的传输速度外,硬盘的传输速度是影响千兆网卡性能的另外一个主要因素。以PS3的硬盘为例,实际上就是一个5400rpm的笔记本硬盘,试想一下5400rpm的笔记本硬盘最大的实际写入速度不过60MB/s,它又如何能让每秒高达100MB的数据写入呢?即使是现在最强的3.5英寸硬盘,在异盘拷贝的前提下,传输速度都无法能保证达到90MB/s,这也自然影响了用户使用千兆网卡的印象。实际上,在使用千兆网卡的环境中,很大部分是用于服务器,服务器的存储环境往往都是采用硬盘RAID(冗余磁盘阵列)的方式,所以在硬盘性能方面是不存在瓶颈的。而到了家用环境,很少有用户采用RAID来搭建自己的存储系统,所以性能上也无法满足千兆网卡了。
对于想要搭建千兆网络的用户而言,RAID磁盘阵列是最好的突破硬盘性能瓶颈的方式,特别是RAID0应该是目前最经济同时也最能提升性能的办法。如果单个系统中的硬盘不考虑RAID模式的话,那么建议购买一些在写入速度上比较强悍的硬盘产品,比如希捷的混合硬盘、单碟突破500GB的桌面硬盘或者高端固态硬盘。
兼容性问题扰乱“千兆”
在专业服务器中,使用千兆网卡,通常都是采用相同的千兆网卡匹配,极少出现不同千兆网卡混合搭配的情况,这主要是考虑到不同网卡的配置、驱动、芯片不同,有可能出现兼容性问题影响网络传输的速度。以PS3为例,PS3本身是采用MARVELL的千兆网卡,所有驱动信息以及设置都是固定无法更改的,如果PC端的千兆网卡设置不对,那么很可能会影响传输速度。PC上每一款网卡在驱动中都包含了设置,如工作方式、数据吞吐量、巨型帧等等,如果设置不一样,显然会对整个网络产生影响。所以如果用户想搭建一个大型的千兆局域网,最好是购买相同的设备,特别是网卡。
此外,很多普通用户在设置千兆局域网的时候,都购买了普通的千兆交换机,实际上普通交换机虽然便宜(很多4口产品的售价不到200元),但是无论是做工还是功能,相比高档货还是要逊色很多,包括吞吐量、错误帧过滤等性能都不足以承载真正的千兆网络,再加上信号的损失,所以达不到千兆网卡的速度,有时甚至不到理论速度的2/3。如果个人用户只是考虑两台主机之间的传输,那么不妨用一根网线直连,这样即使不是采用相同的网卡,往往也能获得不错的网络传输性能。如果用户一定要购买交换机,那么推荐最好购买500元以上的千兆交换机。
写在最后
现在大多数用户的网络环境都还是百兆,但令人颇为尴尬的是,不少主板都搭载了千兆网卡,可以说目前主流网络环境实际上限制了我们系统的发挥。所幸的是,随着千兆网卡的普及,越来越多的人认识到千兆网络环境的好处,更快的传输速度就代表着更高的工作效率以及节约更多的时间。此外,现在不少多媒体设备也搭载了网卡,百兆网卡显然还不足以满足全高清的需求,千兆网络的环境可以为家庭、网吧带来更好的娱乐效果。就未来发展的情况来看,千兆网络肯定会取代目前的百兆网络,而在这个时代来临之际,大家应该对如何更好发挥千兆网卡的性能有一个充分的了解。
值得一提的是,就目前的设备和硬件条件而言,虽然理论上千兆网卡可以达到125MB/s的传输速度,但是通常在80MB/s以上就足以满足个人以及企业的需求,性能上少许损失基本是无法避免的。在最后还要提醒大家,千兆网络需要超五类以上的网线才可以实现,可千万不要以为普通网线就能达到这么高的传输速度。
千兆网卡和普通网卡有什么区别?如何判断?
说到网卡,大家都不陌生,我们在配置电脑时就会接触到。目前我们的个人电脑基本是普通网卡,也即是百兆网卡。你可能知道千兆网卡,但感到比较陌生,并且不知道能否买来用到个人电脑上。本文将为你介绍千兆网卡和普通网卡有什么区别。
千兆网卡和普通网卡有什么区别
顾名思义,千兆网卡的传输速率是1000Mbps(千兆),而百兆网卡(普通网卡)的传输速率是100Mbps(百兆),千兆网卡和一般网卡的最大区别就是在于它网口的传输速率是1000Mbps(千兆)的,它是百兆网卡传输速率的十倍。
千兆网卡
百兆网卡
另外,千兆网卡的USB接口是3.0的,而一般的网卡,它的USB接口是2.0的。区别在于3.0的接口是2.0 的接口传输速率的10倍。
此外,丢包率(Loss ...)的不同。丢包率与数据包长度以及包发送频率相关。通常,千兆网卡在流量大于200Mbps时,丢包率小于万分之五;百兆网卡在流量大于60Mbps时,丢包率小于万分之一。
对于它们的区别,可以用通俗的解释为:
主要是支持的最大带宽不同。千兆网卡支持最大为千兆带宽,百兆网卡支持最大为百兆带宽。
它们应用领域不同,无法简单说好与不好。因为性价比得跟适用性结合。
一般家庭使用宽带上网选择百兆网卡。
网卡是计算机与网络连接的桥梁。计算机数据通过网卡翻译后经过网络传送到其他目的地。
千兆网卡网速一定比百兆网卡快吗?
百兆网卡的峰值传送速度是100Mb/s=12.5MB/s 它们的不同之处在于最大理论传输速度不通,不过具体网速还得看你连接的上级速度,如果在100M以内,用这两个网卡是没有任何区别的。 假如只是你一个人用的话就基本上没有区别,因为这和你和上级连接的传输速度有关,但和多人一起使用的话,你用千兆的网卡就比其他人的快了。
家庭2兆带宽,用千兆网卡和百兆网卡有什么区别
如果是自己家里或者网吧用,没什么区别。千兆一般用在服务器上,不过现在一些家用的新主板,也集成千兆网卡了。家用百兆够了。水管子就那么粗,你按再大的水龙头,水流还是那个速度。
如何判断千兆网卡和百兆网卡?
◆外表不同
若为独立网卡,可见网卡插口面板一般带有工作指示灯。百兆网卡上一般带有两个指示灯而千兆网卡上一般带有四个指示灯,分别是10、100、1000及工作指示灯。
千兆网卡是一款32-bit PCI总线接口标准的10/100/1000Mb/s千兆网卡,符合10Base-T,100Base-TX,1000Base-T网络标准。支持32位PCI数据总线,传输数据无需占用CPU时间,可以不通过CPU直接与内存进行数据交换,从而减轻主机负载。采用RJ-45接口,使用双绞线接入,实现方便、快捷、简单、可靠的连接。由于千兆以太网物理层的实现与10M/100M不同,使用的双绞线需要将四对线都连接上。制作电缆时需要使用超五类线。
◆软件判断
其实判断千兆网卡和百兆网卡很简单,可以用软件来进行检测,例如鲁大师。
◆从本地连接的速度判断
此外,还可以从本地连接的速度进行判断。如下图所示:
速度为1Gbps的是千兆网卡
速度为100Mbps的是百兆网卡
整理自网络,如有侵权,请联系删除。
声明:如有侵权,请联系删除。
============================= 升职加薪 ==========================