线程同步互斥的控制方法(转载)

四种进程或线程同步互斥的控制方法
    1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。
2、互斥量:为协调共同对一个共享资源的单独访问而设计的。
3、信号量:为控制一个具有有限数量用户资源而设计。
4、事 件:用来通知线程有一些事件已发生,从而启动后继任务的开始。
临界区(Critical Section)

保证在某一时刻只有一个线程能访问数据的简便办法。在任意时刻只允许一个线程对共享资源进行访问。如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式操作共享资源的目的。
临界区包含两个操作原语:
EnterCriticalSection() 进入临界区
LeaveCriticalSection() 离开临界区
EnterCriticalSection()语句执行后代码将进入临界区以后无论发生什么,必须确保与之匹配的LeaveCriticalSection()都能够被执行到。否则临界区保护的共享资源将永远不会被释放。虽然临界区同步速度很快,但却只能用来同步本进程内的线程,而不可用来同步多个进程中的线程。
MFC提供了很多功能完备的类,我用MFC实现了临界区。MFC为临界区提供有一个CCriticalSection类,使用该类进行线程同步处理是非常简单的。只需在线程函数中用CCriticalSection类成员函数Lock()和UnLock()标定出被保护代码片段即可。Lock()后代码用到的资源自动被视为临界区内的资源被保护。UnLock后别的线程才能访问这些资源。
互斥量(Mutex)
互斥量跟临界区很相似,只有拥有互斥对象的线程才具有访问资源的权限,由于互斥对象只有一个,因此就决定了任何情况下此共享资源都不会同时被多个线程所访问。当前占据资源的线程在任务处理完后应将拥有的互斥对象交出,以便其他线程在获得后得以访问资源。互斥量比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。
互斥量包含的几个操作原语:
CreateMutex() 创建一个互斥量
OpenMutex() 打开一个互斥量
ReleaseMutex() 释放互斥量
WaitForMultipleObjects() 等待互斥量对象
同样MFC为互斥量提供有一个CMutex类。使用CMutex类实现互斥量操作非常简单,但是要特别注意对CMutex的构造函数的调用
CMutex( BOOL bInitiallyOwn = FALSE, LPCTSTR lpszName = NULL, LPSECURITY_ATTRIBUTES lpsaAttribute = NULL)
不用的参数不能乱填,乱填会出现一些意想不到的运行结果。

信号量(Semaphores)

信号量对象对线程的同步方式与前面几种方法不同,信号允许多个线程同时使用共享资源,这与操作系统中的PV操作相同。它指出了同时访问共享资源的线程最大数目。它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。在用CreateSemaphore()创建信号量时即要同时指出允许的最大资源计数和当前可用资源计数。一般是将当前可用资源计数设置为最大资源计数,每增加一个线程对共享资源的访问,当前可用资源计数就会减1,只要当前可用资源计数是大于0的,就可以发出信号量信号。但是当前可用计数减小到0时则说明当前占用资源的线程数已经达到了所允许的最大数目,不能在允许其他线程的进入,此时的信号量信号将无法发出。线程在处理完共享资源后,应在离开的同时通过ReleaseSemaphore()函数将当前可用资源计数加1。在任何时候当前可用资源计数决不可能大于最大资源计数。
PV操作及信号量的概念都是由荷兰科学家E.W.Dijkstra提出的。信号量S是一个整数,S大于等于零时代表可供并发进程使用的资源实体数,但S小于零时则表示正在等待使用共享资源的进程数。
P操作 申请资源:
   (1)S减1;
   (2)若S减1后仍大于等于零,则进程继续执行;
   (3)若S减1后小于零,则该进程被阻塞后进入与该信号相对应的队列中,然后转入进程调度。
   V操作 释放资源:
   (1)S加1;
   (2)若相加结果大于零,则进程继续执行;
   (3)若相加结果小于等于零,则从该信号的等待队列中唤醒一个等待进程,然后再返回原进程继续执行或转入进程调度。
   信号量包含的几个操作原语:
   CreateSemaphore() 创建一个信号量
   OpenSemaphore() 打开一个信号量
   ReleaseSemaphore() 释放信号量
   WaitForSingleObject() 等待信号量
事件(Event)
事件对象也可以通过通知操作的方式来保持线程的同步。并且可以实现不同进程中的线程同步操作。
信号量包含的几个操作原语:
   CreateEvent() 创建一个信号量
   OpenEvent() 打开一个事件
   SetEvent() 回置事件
   WaitForSingleObject() 等待一个事件
   WaitForMultipleObjects() 等待多个事件
   WaitForMultipleObjects 函数原型:
   WaitForMultipleObjects(
   IN DWORD nCount, // 等待句柄数
   IN CONST HANDLE *lpHandles, //指向句柄数组
   IN BOOL bWaitAll, //是否完全等待标志
   IN DWORD dwMilliseconds //等待时间
   )
参数nCount指定了要等待的内核对象的数目,存放这些内核对象的数组由lpHandles来指向。fWaitAll对指定的这nCount个内核对象的两种等待方式进行了指定,为TRUE时当所有对象都被通知时函数才会返回,为FALSE则只要其中任何一个得到通知就可以返回。dwMilliseconds在这里的作用与在WaitForSingleObject()中的作用是完全一致的。如果等待超时,函数将返回WAIT_TIMEOUT。

总结:
1. 互斥量与临界区的作用非常相似,但互斥量是可以命名的,也就是说它可以跨越进程使用。所以创建互斥量需要的资源更多,所以如果只为了在进程内部是用的话使用临界区会带来速度上的优势并能够减少资源占用量。因为互斥量是跨进程的互斥量一旦被创建,就可以通过名字打开它。
2. 互斥量(Mutex),信号灯(Semaphore),事件(Event)都可以被跨越进程使用来进行同步数据操作,而其他的对象与数据同步操作无关,但对于进程和线程来讲,如果进程和线程在运行状态则为无信号状态,在退出后为有信号状态。所以可以使用WaitForSingleObject来等待进程和线程退出。
3. 通过互斥量可以指定资源被独占的方式使用,但如果有下面一种情况通过互斥量就无法处理,比如现在一位用户购买了一份三个并发访问许可的数据库系统,可以根据用户购买的访问许可数量来决定有多少个线程/进程能同时进行数据库操作,这时候如果利用互斥量就没有办法完成这个要求,信号灯对象可以说是一种资源计数器。

OCR(Optical Character Recognition/光学字符识别)

miniOCR软件免费的图像文字识别软件:http://www.xdowns.com/soft/softdown.asp?softid=28674

GNU开源OCR系统:http://www.gnu.org/software/ocrad/ocrad.html

汉王 PDF OCR  V8.1简体中文版:http://xiazai.zol.com.cn/detail/34/335364.shtml

开源社区相关:http://www.oschina.net/project/tag/262/ocr?lang=21&sort=view

OCR是英文Optical Character Recognition的缩写,意思是光学字符识别,也可简单地称为文字识别,是文字自动输入的一种方法。它通过扫描和摄像等光学输入方式获取纸张上的文字图像信息,利用各种模式识别算法分析文字形态特征,判断出汉字的标准编码,并按通用格式存储在文本文件中,所以,OCR是一种非常快捷、省力的文字输入方式,也是在文字量比较大的今天,很受人们欢迎的一种输入方式。
OCR的发展简况
OCR的概念是在1929年由德国科学家Tausheck最先提出来的,后来美国科学家Handel也提出了利用技术对文字进行识别的想法。而最早对印刷体汉字识别进行研究的是IBM公司的Casey和Nagy,1966年他们发表了第一篇关于汉字识别的文章,采用了模板匹配法识别了1000个印刷体汉字。
20世纪70年代初,日本的学者开始研究汉字识别,并做了大量的工作。我国研究汉字识别的起步比较晚,20世纪70年代末才开始进行OCR的研究工作。早期的OCR软件,由于识别率及产品化等多方面的因素,未能达到实际要求。同时,由于硬件设备成本高,运行速度慢,也没有达到实用的程度。只有个别部门,如信息部门、新闻出版单位等使用OCR软件。1986年以后我国的OCR研究有了很大进展,在汉字建模和识别方法上都有所创新,在系统研制和开发应用中都取得了丰硕的成果,不少单位相继推出了中文OCR产品。进入20世纪90年代以后,随着平台式扫描仪的广泛应用,以及我国信息自动化和办公自动化的普及,大大推动了OCR技术的进一步发展,使OCR的识别正确率、识别速度满足了广大用户的要求。
目前,比较流行的OCR软件很多,英文OCR主要有OmniPage,中文OCR主要有清华紫光OCR、清华文通OCR、汉王OCR、中晶尚书OCR、丹青OCR、蒙恬OCR等。尽管汉字字量大、字形复杂,但OCR技术已经走向成熟。许多OCR软件不仅能识别黑白印刷体汉字,还能识别灰度和彩色印刷体汉字,识别速度很快,识别正确率达到了99%以上;可识别宋体、黑体、楷体等多种字体的简、繁体;可对多种字体、不同字号的混排进行识别;有些OCR软件还能识别图像、表格。与此同时,对于手写体汉字识别的研究也取得了很大进展,正确识别率已达到了70%以上。
OCR软件的应用
在扫描仪市场上,许多类型的办公和家用扫描仪均配有OCR软件,如紫光的扫描仪配备了紫光OCR,中晶的扫描仪配备了尚书OCR,Mustek的扫描仪配备了丹青OCR等。扫描仪与OCR软件共同承担着从文稿的输入到文字识别的全过程。
文稿扫描在办公领域中经常用到,即将报纸、杂志等媒体上刊载的有关文稿通过扫描仪进行扫描,随后进行OCR识别,或存储成图像文件,留待以后进行OCR识别,将图像文件转换成文本文件或Word文件进行存储。
此外,数字化信息的存储、传输、不仅成本低、效率高,而且能够适应排版,网络传输等不断发展的需要。目前我国有很多历史遗留下来的大量图书、报刊、杂志等纸质珍品,急需将其转换成电子信息。如电子图书馆的建立,就需要将图书逐页扫描,加上OCR软件的识别,更替代了人工键入文字的工作,大大缩短了录入时间,减轻了劳动强度,节省了人力且降低了费用,提高了录入正确率、工作效率和现代办公自动化程度。
目前OCR软件与扫描仪的搭配已应用到信息化时代的多个领域,如数字化图书馆,各种报表的识别,以及银行、税务系统票据的识别等。随着网络化、信息化的发展与普及,其应用范围将越来越广泛。
OCR系统的组成
汉字识别软件OCR的功能是将各种录入汉字、印刷体或手写体中每个汉字的图形或图像通过计算机辨认出来,并标出汉字类别代码。因此,汉字识别归根结底是一个图像识别问题。由于汉字信息量很大,具有不同的字形、字体,而且结构复杂,因此汉字识别的过程极其复杂。
由于扫描仪的普及与广泛应用,OCR软件只需提供与扫描仪的接口,利用扫描仪驱动软件即可。因此,OCR软件主要是由图像处理模块、版面划分模块、文字识别模块和文字编辑模块等4部分组成。
1、图像处理模块
图像处理模块主要具有文稿扫描、图像缩放、图像旋转等功能。通过扫描仪输入后,文稿形成图像文件,图像处理模块可对图像进行放大,去除污点和划痕,如果图像放置不正,可以手工或自动旋转图像,目的是为文字识别创造更好的条件,使识别率更高。
2、版面划分模块
版面划分模块主要包括版面划分、更改划分,即对版面的理解、字切分、归一化等,可选择自动或手动两种版面划分方式。目的是告诉OCR软件将同一版面的文章、表格等分开,以便于分别处理,并按照怎样的顺序进行识别。
3、文字识别模块
文字识别模块是OCR软件的核心部分,文字识别模块主要对输入的汉字进行"阅读",但不能一目多行,必须逐行切割,对于汉字通常也是一个字一个字地辨认,即单字识别,再进行归一化。文字识别模块通过对不同样本汉字的特征进行提取,完成识别,自动查找可疑字,具有前后联想等功能。
4、文字编辑模块
文字编辑模块主要对OCR识别后的文字进行修改、编辑,如系统识别认为有误,则文字会以醒目的红色或蓝色显示,并提供相似的文字供选择,选择编辑器供输出等。
OCR软件的使用方法
OCR软件的种类虽然很多,但其使用方法大同小异。首先要对文稿进行扫描,然后进行OCR识别。OCR软件的使用方法如下:
1、文稿扫描
为了利用OCR软件进行文字识别,可直接在OCR软件中扫描文稿。运行OCR软件后,会出现OCR软件界面。
将要扫描的文稿放在扫描仪的玻璃面上,使要扫描的一面朝向扫描仪的玻璃面并让文稿的上端朝下,与标尺边缘对齐,再将扫描仪盖上,即可准备扫描。点击视窗中的"扫描"键,即可进入扫描驱动软件进行扫描,有关扫描方法这里不再赘述。但应注意的是:分辨力可设置在200~400dpi,对于文本文档,调整亮度适中很关键。扫描后的文档图像出现在OCR软件视窗中。
2、OCR识别
为了便于操作,可从菜单中选择选项,各种图标出现在视窗的左边。
为了更好使用,首先从上到下介绍画面左边的图标:
"放大"工具:用于放大图像;"缩小"工具:用于缩小图像;"设定识别区域"工具:用于设定识别区域;"设定识别顺序"工具:用于设定识别顺序;"删除识别区域"工具:用于删除识别区域;"擦除图像杂点"工具:用于擦除图像中的杂点;"擦拭图像块"工具:用于擦除图像中的某一区域;"旋转图像"工具:用于将图像旋转90°、180°或270°;"倾斜校正"工具:用于手动图像倾斜校正。
OCR识别的一般步骤:
(1)文稿扫描后,刚开始出现在视窗中的要识别的文字画面很小,首先选择"放大"工具,对画面进行适当放大,以使画面看得更清楚。必要时还可以选择"缩小"工具,将画面适当缩小。
(2)如果画面需要旋转90°,180°或270°,可使用"旋转图像"工具旋转图像。如果文字画面倾斜,可选择"倾斜校正"工具,将画面调正。
(3)识别时选择"设定识别区域"工具,在文字画面上框出要识别的区域,这时也可根据画面情况框出多个区域。如果所框区域有误,则可使用"删除识别区域"工具,删除所选识别区域。
(4)为了提高识别率,如果所选识别区有杂点或有不能识别的图像,则可选择"擦除图像杂点"工具,将杂点一点一点地擦除。如果需要成片地擦除,则可选择"擦拭图像块"工具。
(5)点击"识别"图标,则OCR显示正在进行文字切分,然后转入"正在识别"画面,将识别的文字逐步显示出来,"文稿校对"窗口。
许多OCR软件都具有文字修改功能,被识别出可能有错误的文字,用比较鲜明的颜色显示出来,并且可以进行修改。
(6)将识别后的文件存储成文本(TXT)文件或Word的RTF文件。

      在最近几年中,OCR识别技术随着扫描仪的普及得到了飞速的发展,扫描、识别软件的性能不断强大并向智能化不断升级发展。 
      OCR是英文Optical Character Recognition的缩写,意思为光学字符识别,通称为文字识别,它的工作原理为通过扫描仪或数码相机等光学输入设备获取纸张上的文字图片信息,利用各种模式识别算法分析文字形态特征,判断出汉字的标准编码,并按通用格式存储在文本文件中,由此可以看出,OCR实际上是让计算机认字,实现文字自动输入。它是一种快捷、省力、高效的文字输入方法。 
       汉王OCR 是针对机关单位、企业及有文字录入需求的个人用户,在日常的工作中,快速的对书刊、报纸、公文、宣传页等印刷稿件中内容进行录入的应用需求而推出的。本产品集成了汉王科技顶尖的文字识别技术,对印刷文稿录入的识别率高达99.5%,能够识别百余种印刷字体和各种中英繁表图混排格式的文本,。是理想的文字、表格、图像录入系统。
      这样一来,就不用再手工输入大量的资料了,只要扫进去,像那种抓英文的工具一样,让软件自动地转成WORD文档。即可将图片变成可编辑的文挡格式。这是目前破解最完美的汉王OCR软件。
http://down.x6x8.com/soft/6/64/245.html

清华紫光文通 TH-OCR 9.0 光盘完全特别版
把破解补丁放到安装目录下,运行破解补丁,确定,OK!
TH-OCR简介 
  OCR是英文Optical Character Recognition的缩写,意思为光学字符识别,通称为文字识别,它的工作原理为通过扫描仪或数码相机等光学输入设备获取纸张上的文字图片信息,利用各种模式识别算法分析文字形态特征,判断出汉字的标准编码,并按通用格式存储在文本文件中,由此可以看出,OCR实际上是让计算机认字,实现文字自动输入。它是一种快捷、省力、高效的文字输入方法。
  TH-OCR是清华大学自1985年就开始研发的,TH是TsingHua(清华)的缩写,TH-OCR代表北京清华紫光文通信息技术有限公司开发的OCR软件。在国家“863”计划支持下,持续了十多年的科研成果,从1.0版本开始已经升级到现在的9.0版本。独家真正实现了汉英混排同时识别,在国际上首次突破了OCR产品只能处理汉字或英文单一文字的局限性,新增了东方文字(简繁汉、日文、韩文)识别功能,对日文和韩文与英文混排文档的识别水平甚至超过日本和韩国对本国文字的识别水平,在国内、外产生了重大的影响,并连续3年被中国软件行业协会评为优秀软件产品,成为汉字输入技术的一座里程碑。TH-OCR9.0版本已应用到了包括电子政务、电子出版物、报社、银行、邮政、税务、图书馆等多个领域,成为国内OCR市场的先锋。
  本届两会代表的所有提案全部采用了我国自主知识产权的世界识别领域领先产品——清华紫光文通的TH-OCR9.0进行录入识别,它以准确的识别率、优异的识别速度博得了两会工作人员的交口称赞。而清华TH-OCR技术在两会上的成功应用更论证了我国也完全有实力拥有自己的卓越技术。

TH-OCR的突出特点:
◇ 汉英双语同时混排,识别率最高,居世界领先水平。  
◇ 可以识别黑白、灰度、彩色图像,可以读取多种图像格式。
◇ 首创对识别结果进行电子文档版面复原功能,所见即所得。
◇ 首创日文、韩文、日英混排、韩英混排识别功能,识别率98%以上。

TH-OCR的六大优势: 
1. 是唯一可以识别2万多汉字的多体文字识别系统,汉字识别国内最优。
2. 汉字和英文混排、日文和英文混排、韩文和英文混排同时识别。
3. 汉字识别率最高。清华紫光文通TH-OCR经过"863"智能专家组对数十万字的指标评测和中国软件评测中心对产品的严格测试,识别正确率超过99.5%,代表了目前印刷体文字识别的最高水平。
4. 支持多种环境接口。清华紫光文通TH-OCR支持WINDOWS环境和GB、BIG5、GBK、JIS、 SHIFT-JIS和KSC等多种内码,可以用于 WINDOWS NT和WINDOWS 98/2000/XP,适合全球各个地区使用。TH-OCR还具有自学习功能,不论什么生僻字,都可以通过键盘输入进行学习,大大拓宽了OCR系统的识别字符集。
5. 历次国内鉴定均被中国科学院院土和中国工程院院土等专家组成的鉴定委员会评定为“具有世界领先水平”。 

广泛的社会认可:
1、 多年来为众多著名的扫描仪厂商HP、UNISCAN、EPSON、CANON、 LENOVO等提供TH-OCR普及版作为其扫描仪的捆绑软件。
2、美国MICROSOFT公司将TH-OCR作为东方文字识别捆绑到WINXP 操作系统中。
3、美国MOTOROLA公司确定TH-OCR的部分技术使用权。
4、美国INTEL公司确定TH-OCR为最新的MMX技术支持项目。
5、《计算机世界》市场调查结果,清华紫光文通TH-OCR市场占有率达65%以上。
6、《中国计算机报》 CIWLAB组织的用户调查认为, TH-OCR是一个性能极好的系统,是一个值得用户信赖的系统(对其他品牌OCR评价为:“是值得用户选择的产品”)。
http://down.x6x8.com/soft/6/64/247.html

尚书7号OCR文字识别系统完全版 Shocr7.0
本软件系统是应用OCR(Optical Character Recognition)技术,为满足书籍、报刊杂志、报表票据、公文档案等录入需求而设计的软件系统。目前,许多信息资料需要转化成电子文档以便于各种应用及管理,但因信息数字化处理的方式落后,不但费时费力,而且资金耗费巨大,造成了大量文档资料的积压,因此急需一种快速高效的软件系统来满足这种海量录入需求。本软件系统正是适用于个人、小型图书馆、小型档案馆、小型企业进行大规模文档输入、图书翻印、大量资料电子化的软件系统。 
●识别字符 
简体字符集:国标GB2312-80的全部一、二级汉字6800多个。纯英文字符集。 
简繁字集:除了简体汉字外,还可以混识台湾繁体字5400多个以及香港繁体字和GBK汉字。 
●识别字体种类 
能识别宋体、仿宋、楷、黑、魏碑、隶书、圆体、行楷等一百多种字体,并支持多种字体混排 。 
● 识别字号 
初号 小六号字体。 
●表格识别 
可以自动判断、拆分、识别和还原各种通用型印刷体表格。 
●可支持繁体WINDOWS系统 
首先,尚书七号开始将整个OCR的过程,明确化了,通过程序的菜单,我们就能够知道整个OCR的过程,主要分为:“文件”、“编辑”、“识别”、“输出”等步骤。在文件菜单中,您可以调用扫描仪,或者选择将已经扫描好的图像文件打开。得到图像文件后,用户开始的工作,就是“编辑“菜单里面所提示的:图像页面的处理,其中包括图像页的倾斜校正(提供自动和手动实现方法),旋转等功能。处理完毕后,就可以进入“识别过程”,该过程关键的是“版面分析”,现在尚书七号的自动版面分析功能很强,面对报纸杂志等复杂情况的版面,也是分析的正确率很高。不再需要我们在尚书六号里面那样的建议手工划识别范围。也正是这点,大大降低了使用者的工作量。为了方便,“识别”菜单下,也提供了用户自己在自动版面分析后,通过修改识别范围框的属性,来决定需要识别否的功能(默认的情况下,图象属性的栏目是不用识别的。当然,如果用户还是习惯原来尚书六号那样,自己来设定识别区域,只要直接用鼠标划框就可以了。接下来,用户就可以直接选择“开始识别”的按钮了,等待识别的结果。
http://down.x6x8.com/soft/6/64/246.html

丹青中英日文OCR辩识 白金版 4.5
安装序列号:MXRD450-7DMN-MM7M-CFCB

功能简介 
原文重现 尽在瞬间
◎提供繁中、简中和日文三种操作介面
◎可辨识繁中、简中、英文及日文四种文件
◎辨识后的文件可储存成各种常用档案格式再编辑
◎超高辨识速率及辨识率再提升,快速原文重现各式文件 
产品说明 
影像扫瞄
1. 可处理彩色、灰阶或黑白的文件影像。
2. 倾斜校正:自动侦测文件影像倾斜角度,并提供旋转影像之功能。 
辨识文件
< 文件分析及辨识 >
1. 自动辨识:轻按一钮,即可自动分析、辨识、校对影像文件,图文分离,并转换成可编辑的文件档案。 
2. 设定辨识字集:不需切换语文环境,即可辨识繁中、简中、纯英文及日文四种文件。 
3. 高辨识速率:在Pentium III 667MHz个人电脑环境下,每秒钟能辨识高达150个中文字。 
4. 多种字体辨识及重现:能够辨识多种印刷字体,如明体、黑体、仿宋体、楷书、圆体、隶书等,并在辨识后还原成原稿的字体。 
5. 原文重现编辑环境:可辨识各种表格及影像,辨识结果依照原文件的图文版面格式呈现,方便您校对、编辑,节省重新排版的时间。 
< 自动校对与学习 >
1. 再辨识功能:提供合/分字、合/分行、合/分区块、变更区块属性等再辨识功能,让您能够修正错误的辨识结果。 
2. 学习新字功能:可将易辨识错误的字元输入到学习资料库中,提高下次辨识之正确率。 
3. 候选字功能:提供原文影像供辨识后图文作校对,且针对型态相近之文字及语意上前后相连的字词提供候选字轻松更正辨识错误的文字。 
4. 自动校对:利用内建的常用词库自动校对辨识出的文字,并标示出辨识时所碰到的疑问字,节省您校对的时间。 
输出档案
1. 传送至其他应用软体:可将辨识结果直接传送至您所指定的应用软体中再处理,例如可设定辨识结果自动储存成HTML档案并直接传送至网路浏览器中。 
2. 可储存多种档案格式:辨识后的结果可储存成不同之档案格式,如TXT、RTF、DOC、XLS、SLK、CSV、HTML等,方便您做不同的应用与处理。
http://down.x6x8.com/soft/6/64/248.html

学计算机的你伤不起啊(转载)

转载自:http://topic.csdn.net/u/20110326/12/636E4A4C-4F5C-4026-99A7-64BCC0DDFC13.html

学计算机的你伤不起啊!!!!!! 
老子六年前开始学计算机啊!!!!!!
于是踏上了尼玛不归路啊!!!!!!
谁特么跟老子讲计算机是王道专业啊!!!!!! 
尼玛路边乞丐都是程序员!!!!!!
会打代码的一大把啊 有木有!!!!!!!!! 
谁再跟老子讲计算机是王道专业 老子一个键盘盖死你啊,一个鼠标线勒死你啊!!!!  
尼玛一上大学就找不到女朋友!!!!!!
班上男女比例八比一,八比一啊!!!!!!
都塔玛建军节了!!!!!!
就八比一还有学长来抢有木有!!!
本科学长,研究生学长还有博士学长!!!!!!
玛德学长你们是兔子啊就这么喜欢啃嫩草!!!!
还草!!!!!!
等熬过一年去迎新,一件行李十几个人竞争!!!!!!
要打群架了有木有!!!妹子吓哭了有木有!!!!!!
学了两年还在学数学物理!!!!!!
傅里叶!!!
拉普拉斯!!!
尼玛两个法国老头死了咋还这不安神呢!!!!!!
编程作业Code得抄在纸上交!!!
汇编啊!!!!!!
随随便便就几百行啊!!!!
抄次作业都要半个小时啊!!!!!!
课设还要插电板!!!!!
一个板子插一千多根线,一千多根线!!!!!!
连起来可以绕地球三圈半啊!!!!!!
谁再说计算机好学劳资吐一口血水腥死他!!!!!!
学计算机的孩纸真是命苦啊!!!!!!!! 
电脑坏了来找你修的有没有啊!!!!!!!!!! 
还有尼玛谁说学计算机就会修电脑!!!!!!
就会买电脑!!!!!!
劳资用linux不懂windows可不可以!!!!!!
劳资用windows也不懂 windows可不可以!!!!!!
谁规定学计算机的就要会修电脑啊!!!!!!!!!!!!!! 
特么学光电的会不会发光啊!!!!!!!!!!!
特么学能源的会不会发电啊!!!!!!!!!!!!
特么学化学的会不会自爆啊!!!!!!!!!!!! 
特么学妇产的难道会怀孕啊!!!!!!!!!!!! 
你当你是冠希哥啊,是个男人就想修你电脑啊!!!!!!!!!!!!! 
重装系统也别找我!!!!!!
劳资帮隔壁系妹子重装了10几次操作系统了啊!!!
10几次啊!!!!!!10几次连手都还没牵到啊!!!!!!
你特么一句想重装,哥特么的要通宵啊,有木有啊!!!!!!!!!!!!!!! 
你们全家才是修电脑的啊!!!!!!!!!!!!!!! 
问你会不由盗QQ的有木有啊!!!!!!
还鄙视你盗个QQ都不会搞什么计算机的有么有啊!!!!!!!!!!
Word不会用的来问你的有没有啊!!!!!!!!!! 
Excel不会使的来找你的有没有啊!!!!!!!!!
电影音乐下不来找你拷的有没有啊!!!!!!!!!!!!! 
看毛片中毒了来找你的有没有啊!!!!!!!!!!!! 
老子是学计算机的,不是你妹的F1啊!!!!!!!!! 
问我也不可以!!!!!!
劳资还是买块硬盘撞死算了!!!!!!
语法书一本就是一个砖头啊!!!!!!!!!!! 
每一种都不一样啊!!!!!!!!!! 
C,C++,C#,mips,java,sql,jsp,asp,php!!!!!!!!!!! 
每一本都可以砸死你啊!!!!!!!!! 
特么编译器都一坨啊!!!!!!!!!!!!! 
学个C,指针搞死你啊!!!!!!! 
学个汇编,寄存器几十个啊,尼玛每一个都不一样啊,指令有多少你都不敢想啊!!!!!!!!!!!
你当哥是CPU啊,人生价值就是执行指令啊!!!!!!!!!! 
Sql还没学好就叫你写一个数据库的有没有啊!!!!!!!!! 
Windows还没用好就叫你编译linux内核的有没有啊!!!!!!!!!!
MeeGo有没有听说过啊!!!!!!!!!!!! 
尼玛上个学期还来学校开讲座啊!!!!!!!!!!!! 
特么还讲的头头是道前途无限啊!!!!!!!!!! 
这个学期就特么没啦!!!!!!!!!!
没啦!!!!!! 
你特么怕不怕啊!!!!!!!!! 
哥早几年毕业要是干这个现在就好跳楼了,有没有啊!!!!!!!!!!!! 
工作敢不敢找啊!!!!!!!!!!!!!!!!!!! 
面试书买了十几本有木有!!!
天天研究各个公司面经有木有!!!
都快面瘫了!!!!!!
玛德现在每个公司都学着Google考算法!!!!!!
算你妹!!!!!!
尼玛贵公司产品里只有算法啊!!!!!!
尼玛难道每个人都是搞ACM的啊!!!!!!
还不如去SM!!!!!!
NND面试官你要不是事先知道答案你做得出来吗!!!!!!
你做得出来吗!!!!!! 
公司一开口就是要你各种精通啊!!!!!!!!!!!!!!! 
精通C,精通java!!!!!!!!!!!!!!!!!!! 
还要你妹的会人际沟通啊,怕你一个学计算机的不好相处啊!!!!!!!! 
我特么现在就精通修电脑啊!!!!!!!!!!!!!!!!!!!!! 
我特么现在就会咆哮啊!!!!!!!!!!!!!! 
找到工作了也是民工!!!
是码农!!!
Robin都首富了,你都还没首付!!!!!!
羞愧吗!!!!!!
羞愧吗!!!!!!
工作了照样没有女朋友!!!
研发部门的比例连八比一都没有!!!!!!
新入职的mm上学期间都被下手了有木有!!!!!!
上学期间下手的 mm入职后都被挖了墙角有木有!!!!!!
卧槽都是程序猿,相煎那么急!!!!!!
尼玛是个搞计算机的最后都去搞单反,搞摄影!!!!!!
尼玛搞来搞去还不就是为了搞mm!!!!!
工作压力也超大!!!!!!
有没有啊!!!!!
操着卖白粉的心,挣着卖白菜的钱!!!
应用上线压力大,一分钟几十万收入有木有!!!
尼玛收入归老板,责任该你挡有木有!!!!!!
凌晨三点跑去公司解决线上故障!!!
大便便秘要带笔记本防止突发事件!!!
一天收几百条报警短信!!!有木有!!!有没有!!!有木有!!!!!!
万一哪天ML时报警短信来了,吓出病了,找谁哭去!!!!!!
找谁哭去!!!!!!
特么知不知道什么叫需求啊!!!!!!!!!!!!!!!!! 
需求特么的就跟菊爆一样爽啊,有没有啊!!!!!!!!!!!!!!!!! 
动一下你就痛的要死啊!!!!!!!!!!!!!! 
多动几下下辈子都是折翅的天使啊!!!!!!!!! 
特么知不知道什么叫文档啊!!!!!!!!!!!!!!!!
文档特么就跟自宫一样爽啊,有没有啊!!!!!!!!!!!!!!! 
还没开操写文档就写死你啊!!!!!!!!!!!!!!!!!!
坑爹啊!!!!!!!!!!!!!! 
当老子是文艺小青年啊!!!!!!!!!!!!!!!!!!!!  
计算理论有没有听说过啊!!!!!!!!!!!!!!!!!
有限状态自动机下推自动机图灵机啊!!!!!!!!!!!!!!!! 
别特么问我是什么机啊!!!!!!!!!!!!!! 
都特么是别人YY的啊,有没有啊!!!!!!!!!!!!!!! 
正则语言上下文无关语言递归可枚举语言啊!!!!!!!!!!!! 
别特么问我是什么语言啊!!!!!!!!!!!!!!!! 
学了半天停机问题搞不定啊!!!!!!!!!!!!!!!!! 
别特么问我为啥搞不定啊,特么有人证明了你搞不啊!!!!!!!!!!!!!!!!!!!!!!!! 
证明你搞不定啊,有没有啊!!!!!!!!!!!!!!!!! 
每个你用过的IT产品和应用,都是背后无数程序猿的血与泪啊!!!!!!!!!!
每个学计算机的上辈纸都是身怀绝迹的路边乞丐啊!!!!!!!!!!!!!!runtime error go **** yourself啊!!!!!!!!!!有木有!!有木有!!!
每个程序猿上辈子都是折了护翼的卫生巾!!!你伤不起!!!伤不起!!!!!!!!!!!!

vmware+linux 设置共享读写主机的文件夹

vmware虚拟机上的操作系统,希望配置共享主机的文件夹以方便文件或资料传输,方法比较多(如:组建一个主机和虚拟机的内部网络、为虚拟机分配一个独立IP 然后作为网络邻居访问等)。

本文实现利用Vmware的 vmware tool直接实现虚拟机读写主机文件夹。

一  设置共享文件夹

1、打开vmware,不要启动虚拟机上的操作系统,选择“编辑虚拟机设置”。
2、选择“选项”选项卡。
3、选中“共享文件夹”,右侧则出现设置选项。
4、点击“添加...”,设置一个名称(虚拟机上的操作系统使用),设置一个主机路径(主机操作系统愿意共享的文件夹路径)。

二  在虚拟机的linux中安装Vmware Tool

(不论虚拟机上安装的什么操作系统都要安装vmware tool后才能访问主机文件夹,如果虚拟机安装的是windows那就比较好办了,选择了安装vmware tool的话,vmware就把安装软件虚拟成一个光盘文件,供用户安装即可。其实,linux下的原理也是这样,只不过安装起来不如windows方便而已)

1、登陆linux
2、切换到 root身份: 建一个终端,输入命令:su,提示输入root的密码,输入即可。
3、从Vmware的“虚拟机”菜单点击“安装Vmware tool”,可以看到虚拟机中 linux的桌面存在了一个 VMWARE的光盘文件。
   或者,进入 /mnt 目录可以看到 cdrom文件夹。
4、光盘里存放的就是安装文件。(运行rpm文件安装有问题!安装不上)
5、使用命令安装:
    5.1 在linux终端里,用su命令切换到root用户。
    5.2 用 “cp /mnt/cdrom/vmwareXXXXXX.tar.gz  /tmp” 命令将后缀名为“tar.gz”的压缩文件复制到 /tmp 目录。
    5.3 用“ tar zxf vmwareXXXXXX.tar.gz ”解压缩该软件包,默认解压到vmwareXXXXXX目录下(与文件名同名)。
    5.4 cd vmwareXXXXXX, 进入“vmwareXXXXXX”目录。
    5.5 “./vmware-install.pl ” 运行后缀名为pl的安装文件。
6、删除安装文件。
   用 rm -fr XXXXX 删除目录或文件。
7、进入 /mnt 目录就可以看到 一个 hgft 文件夹,下面就有最开始设置的共享爱文件夹的名称。打开就可以直接访问主机文件夹。

空袭利比亚,他们打着&lsquo;人道主义&rsquo;的幌子!

来源: 人民日报海外版(北京)

连日来,美英法持续对利比亚发动空中打击。就在西方宣称空袭行动“进展顺利”的同时,空袭所造成大规模人员伤亡也引起国际社会的质疑,不满和反对声音开始增大。

据美军方介绍,从3月19日下午开始的“奥德赛黎明”军事行动已使利比亚防空力量大大削弱。20日,美军参谋长联席会议主席马伦称,多国控制利领空的第一阶段努力已“取得成功”。

不过,虽然西方称首轮空袭目标“范围有限”,但空袭规模之大、范围之广遭到诸多质疑。据利比亚国营电视台报道,西方一天的空袭即造成64人丧生,150人受伤。从目前看,空袭行动仍将持续一段时间,预计伤亡还将继续增加。空袭主要实现两大目标,一是摧毁利防空设施,为建立禁飞区,西方战机开始巡航创造条件;二是遏制卡扎菲向东进攻,并从班加西等地撤退。现在来看,这两目标都未达到,卡扎菲也未退让。

西方推动设立禁飞区,发动空袭的主要理由是防止利比亚发生人道主义灾难,阻止卡扎菲“屠杀平民”。但实际的情况是,这场军事干涉所导致的人员伤亡可能远远超出未加干涉之前。除了空袭直接导致大规模人员伤亡外,西方军事干涉还会使冲突升级、爆发持久内战,由此将造成更大的人道主义灾难。其实,西方早在上世纪90年代就开始高举“人道主义干预”大旗,并在波黑、伊拉克身上试验过,但从未成功过。从波黑、伊拉克的经验看,这种人道主义干涉往往与推翻政权相挂钩,为日后直接推翻政权做铺垫。历史经验也表明,所谓人道主义干涉往往是武力干涉他国内政的借口,名义上是出于国际道义,但实际上则是出于狭隘的政治或经济利益(如石油、不喜欢某个政权),甚至可能简单地出于对某个领导人的好恶(如西方都不喜欢萨达姆、卡扎菲)。背后绝非如其所宣扬的人道主义那么简单。

正因为此,阿拉伯国家联盟已经开始由原先支持立场转为动摇、“后悔”。为阻止卡扎菲对无辜平民的军事轰炸,阿盟3月12日决定促请安理会在利设立禁飞区,从而为英、法等国推动1973号禁飞决议提供了“合法”依据。但多国部队的空袭规模及后果大大超出阿盟预料,担忧造成大量平民死亡的责任很有可能首先由阿拉伯国家政府承担。20日阿盟转而谴责西方国家对利军事打击。阿盟秘书长穆萨表示,利比亚现在发生的情况偏离了安理会在利设立禁飞区的目的。安理会决议旨在保护利比亚平民,而不是轰炸和袭击更多平民。阿盟希望看到禁飞区而非炸弹。此外,俄罗斯强烈呼吁利所有各方以及参与军事行动的国家立即停火,采取一切措施避免殃及平民,反对“毫无选择”地使用武力。伊朗谴责西方国家空袭利比亚,并质疑西方国家空袭利比亚的目的,认为“这些国家通常以支持别国民众为借口,进入别国领土”,“实际上是为了谋求自己的利益”。委内瑞拉总统查韦斯谴责空袭行动是不正当的,说它只会造成更多的流血。作为北约成员的土耳其也反对军事干预以及设立禁飞区,敦促北约重审对利军事行动计划,称其“性质发生了变化”,警告北约此举将导致危险后果。

================ 

后记:几天了,每每看到此类的新闻,除了愤怒再也不知道用什么表达自己的感情了!国家与国家就像人与人一样,当一个远远强大于你的敌人欺负你的时候,你真的无能为力!山姆大叔,你不怕上帝看了会生气吗?你不怕报应吗?

C中static函数的作用

1、函数之外的变量就是全局变量,这个想法正确吗?
答: 在C中,完全正确。只不过按有没有加static修饰可以分为静态全局变量和一般全局变量两种。
2、 如果在全局变量的前面加上static 会有什么用?
答:在C中,静态全局变量意味着两个方面。一、在生命期方面,它与一般全局变量一样,是与整个程序共存亡的;二、在可见性方面,它只在定义它的那个编译单元中可见。比如说,你在testA.c中定义了一个静态全局变量x: static int x;则你只能在testA.c的函数中引用它,在另一个文件testB.c中如果想用它的话:extern int x;然后再某个函数中使用x,则一般编译器在连接阶段会报错说找不到x这个符号。
3、 如果在函数的前面加上static 会有什么用?
答:与静态全局变量差不多。简单地说,在testA.c中定义的静态函数:static void A(void)是不能在testB.c的函数中调用的,如果一定要这样的话编译器连接时会报错的。
static的用途:一般对那些非接口函数和确定外部不使用的全局变量加上static限制,可以保证不会被其它编译单元非法使用,同时也可以避免与别的编译单元中的同名符号冲突。在驱动程序中用的较多。

深入CACHE

Cache是我们经常关心的话题,K6-Ⅲ的推出引出了一种全新的缓存结构即Tri-level Cache设计思想。那么对于微机系统而言,Cache到底有什么作用?它的工作原理又是如何的呢?

一、使用Cache的必要性

所谓Cache即高速缓冲存储器,它位于CPU与主存即DRAM(Dynamic RAM 动态存储器)之间,是通常由SRAM(Static RAM 静态存储器)构成的规模较小但存取速度很快的存储器。

目前计算机主要使用的内存为DRAM,它具有价格低、容量大等特点,但由于使用电容存储信息,存取速度难以提高,而CPU每执行一条指令都要访问一次或多次主存,DRAM的读写速度远低于CPU速度,因此为了实现速度上的匹配,只能在CPU指令周期中插入wait状态,高速CPU处于等待状态将大大降低系统的执行效率。

SRAM由于其采用了与CPU相同的制作工艺,因此与DRAM相比,它的存取速度快,但体积大、功耗大,价格很高,不可能也不必要将所有的内存都采用SRAM。

因此为了解决速度与成本的矛盾就产生了一种分级处理的方法,即在主存和 CPU之间加装一个容量相对较小的SRAM作为高速缓冲存储器。

当采用Cache后,在Cache中保存着主存中部分内容的副本(称为存储器映象), CPU在读写数据时,首先访问Cache(由于Cache的速度与CPU相当,所以CPU可以在零等待状态下完成指令的执行),只有当Cache中无 CPU所需的数据时(这称之"未命中",否则称为"命中"),CPU才去访问主存。而目前大容量Cache能使CPU访问Cache命中率高达90%- 98%,从而大大提高了CPU访问数据的速度,提高了系统的性能。

二、使用Cache的可行性

对大量的典型程序的运行情况分析结果表明,在一个较短的时间内,由程序产生的地址往往集中在存储器逻辑地址空间的很小范围内。在多数情况下,指令是顺序执行的,因此指令地址的分布就是连续的,再加上循环程序段和子程序段要重复执行多次,因此对这些地址的访问就自然具有时间上集中分布的趋向。数据的这种集中倾向不如指令明显,但对数组的访问以及工作单元的选择都可以使存储器地址相对集中。这种对局部范围的存储器地址的频繁访问,而对此范围以外的地址则访问甚少的现象称为程序访问的局部性。根据程序的局部性原理,在主存和CPU之间设置Cache,把正在执行的指令地址附近的一部分指令或数据从主存装入 Cache中,供CPU在一段时间内使用,是完全可行的。

三、Cache的基本工作原理

传统的Socket架构下通常采用两级缓冲结构,即在CPU中集成了一级缓存(L1 Cache),在主板上装二级缓存(L2 Cache);而SlotⅠ架构下的L2 Cache则与CPU做在同一块电路板上,以内核速度或者内核速度的一半运行,速度比Socket下的以系统外频运行的L2 Cache更快,能够更大限度发挥高主频的优势,当然对Cache工艺要求也越高。CPU首先在L1 Cache中查找数据,如找不到,则在L2Cache中寻找;若数据在L2 Cache中,控制器在传输数据的同时,修改L1 Cache;若数据既不在L1 Cache中,又不在L2 Cache中,Cache控制器则从主存中获取数据,将数据提供给CPU的同时修改两级Cache。K6-Ⅲ则比较特殊,64KB L1 Cache,256KB Full Core Speed L2 Cache,原先主板上的缓存实际上就成了L3 Cache。根据有关测试表明:当512K-2MB的三级缓存发挥作用时,系统性能还可以有2%~10%的提高;Tri-level成为PC系统出现以来提出的解决高速CPU与低速内存之间瓶颈最为细致复杂的方案。而且,今后Cache的发展方向也是大容量、超高速。  

在主存-Cache存储体系中,所有的指令和数据都存在主存中,Cache只是存放主存中的一部分程序块和数据块的副本,只是一种以块为单位的存储方式。Cache和主存被分为块,每块由多个字节组成。由上述的程序局部性原理可知,Cache中的程序块和数据块会使CPU要访问的内容大多数情况下已经在Cache中,CPU的读写操作主要在CPU和Cache之间进行。CPU访问存储器时,送出访问单元的地址,由地址总线传送到Cache控制器中的主存地址寄存器MA,主存—Cache地址转换机构从MA获取地址并判断该单元内容是否已在Cache中存有副本,如果副本已存在Cache中,即命中。当命中时,立即把访问地址变换成它在Cache中的地址,然后访问Cache。

如果CPU要访问的内容不在Cache中,即不命中,则CPU转去直接访问主存,并将包含此存储单元的整个数据块(包括该块数据的地址信息)传到 Cache中,使得以后的若干次对内存的访问可转化为对Cache的访问。若Cache存储器已满,则需在替换控制部件的控制下,根据某种替换算法/策略,用此块信息替换掉Cache中的原来的某块信息。

所以,要想提高系统效率,必须提高Cache命中率,而Cache命中率的提高则取决于Cache的映象方式和Cache刷新算法等一系列因素;同时 Cache中内容应与主存中的部分保持一致,也就是说,如果主存中的内容在调入Cache之后发生了变化,那么它在Cache中的映象也应该随即改变,反之,当CPU修改了Cache中的内容后,主存中的相应内容也应作修改。

从上面的简单介绍中,我们知道了Cache也是一类存储器,它是为了解决CPU与主存之间速度匹配问题而设置的,且不能由用户直接寻址访问。下篇将就Cache映象问题、刷新问题和保持数据一致性问题作简要论述。

四、地址映像

所谓映象问题是指如何确定Cache中的内容是主存中的哪一部分的拷贝,即必须应用某种函数把主存地址映象到Cache中定位,也称地址映象。当信息按这种方式装入Cache中后,执行程序时,应将主存地址变换为Cache地址,这个变换过程叫作地址变换。地址映象方式通常采用直接映象、全相联映象、 组相联映象三种。   

1.直接映象  

每个主存地址映像到Cache中的一个指定地址的方式,称为直接映象方式。在直接映象方式下,主存中存储单元的数据只可调入Cache中的一个位置,如果主存中另一个存储单元的数据也要调入该位置则将发生冲突。地址映像的方法一般是将主存空间按Cache的尺寸分区,每区内相同的块号映像到Cache 中相同的块位置。一般地,Cache被分为2N块,主存被分为同样大小的2M块,主存与Cache中块的对应关系可用如下映像函数表示:j = i mod 2N。式中,j是Cache中的块号,i是主存中的块号。   

直接映象是一种最简单的地址映像方式,它的地址变换速度快,而且不涉及其他两种映像方式中的替换策略问题。但是这种方式的块冲突概率较高,当称序往返访问两个相互冲突的块中的数据时,Cache的命中率将急剧下降,因为这时即使Cache中有其他空闲块,也因为固定的地址映像关系而无法应用。   

2.全相联映象

主存中的每一个字块可映像到Cache任何一个字块位置上,这种方式称为全相联映像。这种方式只有当Cache中的块全部装满后才会出现块冲突,所以块冲突的概率低,可达到很高的Cache命中率;但实现很复杂。当访问一个块中的数据时,块地址要与Cache块表中的所有地址标记进行比较已确定是否命中。在数据块调入时存在着一个比较复杂的替换问题,即决定将数据块调入Cache中什么位置,将Cache中那一块数据调出主存。为了达到较高的速度,全部比较和替换都要用硬件实现。

3.组相联映象

组相联映象方式是直接映象和全相联映象的一种折衷方案。这种方法将存储空间分为若干组,各组之间是直接映像,而组内各块之间则是全相联映像。它是上述两种映像方式的一般形式,如果组的大小为1,即Cache空间分为2N组,就变为直接映像;如果组的大小为Cache整个的尺寸,就变为了全相联映像。组相联方式在判断块命中及替换算法上都要比全相联方式简单,块冲突的概率比直接映像的低,其命中率也介于直接映像和全相联映像方式之间。

五、替换策略和一致性问题的处理方法   

Cache和存储器一样具有两种基本操作,即读操作和写操作。  

当CPU发出读操作命令时,根据它产生的主存地址分为两种情形:

一种是需要的数据已在Cache中,那么只需直接访问Cache,从对应单元中读取信息到数据总线;

另一种是需要的数据尚未装入Cache,CPU需从主存中读取信息的同时,Cache替换部件把该地址所在的那块存储内容从主存拷贝到 Cache中;若Cache中相应位置已被字块占满,就必须去掉旧的字块。常见的替换策略有两种:

1.先进先出策略(FIFO) 

FIFO(First In First Out)策略总是把最先调入的Cache字块替换出去,它不需要随时记录各个字块的使用情况,较容易实现;缺点是经常使用的块,如一个包含循环程序的块也可能由于它是最早的块而被替换掉。

2.最近最少使用策略(LRU)

LRU(Least Recently Used)策略是把当前近期Cache中使用次数最少的那块信息块替换出去,这种替换算法需要随时记录Cache中字块的使用情况。LRU的平均命中率比 FIFO高,在组相联映像方式中,当分组容量加大时,LRU的命中率也会提高。

当CPU发出写操作命令时,也要根据它产生的主存地址分为两种情形:一种是不命中时,只向主存写入信息,不必同时把这个地址单元所在的整块内容调入Cache中;另一种是命中时,这时会遇到如何保持Cache与主存的一致性问题,通常有三种处理方式:   

1.直写式(write through)

    即CPU在向Cache写入数据的同时,也把数据写入主存以保证Cache和主存中相应单元数据的一致性,其特点是简单可靠,但由于CPU每次更新时都要对主存写入,速度必然受影响。
2.缓写式(post write)

    即CPU在更新Cache时不直接更新主存中的数据,而是把更新的数据送入一个缓存器暂存,在适当的时候再把缓存器中的内容写入主存。在这种方式下,CPU不必等待主存写入而造成的时延,在一定程度上提高了速度,但由于缓存器只有有限的容量,只能锁存一次写入的数据,如果是连续写入,CPU仍需要等待。
3.回写式(write back)

    即CPU只向Cache写入,并用标记加以注明,直到Cache中被写过的块要被进入的信息块取代时,才一次写入主存。这种方式考虑到写入的往往是中间结果,每次写入主存速度慢而且不必要。其特点是速度快,避免了不必要的冗余写操作,但结构上较复杂。
此外,还有一种设置不可Cache区(Non-cacheable Block)的方式,即在主存中开辟一块区域,该区域中的数据不受Cache控制器的管理,不能调入Cache,CPU只能直接读写该区域的内容。由于该区域不与Cache发生关系,也就不存在数据不一致性问题。目前微机系统的BIOS设置程序大多允许用户设置不可Cache区的首地址和大小。

一个基于ARM cotex单片机做的网络收音机和播放器项目

http://code.google.com/p/arm-webradio/

一个用两个IO驱动LCD1206显示的超牛方案

整理自:http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4301955&bbs_page_no=1&bbs_id=9999

1、完成结果展示图:

1 

2

增加了“无线馈电及传送数据”部分的电路展示:

3 

电路图如下,仔细观察可以发现实物图中有几个贴片的阻容件,秘密就在这里,利用电容的记忆效应,把串行的数据转为并行。

6

示范程序如下比较简单,不用多注释应该都能看懂。作为演示用途,其中有些长时间延时没有没有使用定时器,在多任务系统中当然要用定时中断来代替了。

//         Drive a LCD1602 with 2 wire 
//=================================================== 
//ICC-AVR application builder : 2010-10-3 19:30:02 
// Target : M16 
// Crystal: 4.0000Mhz 

#include <iom16v.h> 
#include <macros.h> 

#define Set_E PORTB|=2 
#define Clr_E PORTB&=~2 
#define Set_D PORTB|=1 
#define Clr_D PORTB&=~1 
#define Set_xy(y,x) Send(0,(y<<6)|(x&15)|0x80) 

//=================================================== 
void init_devices(void) 
{ 
  CLI(); //disable all interrupts 
  DDRB  = 0x03; 
  MCUCR = 0x00; 
  GICR  = 0x00; 
  SEI(); //re-enable interrupts 
} 

//=================================================== 
void Delay(unsigned int i) 
{ 
  while(i--); 
}	

//=================================================== 
void Send(unsigned char RS, unsigned char dat) 
{ 
  unsigned char i; 
  for (i = 2; i > 0; i--) 
  { 
    if (dat & 0x80) Set_D; else Clr_D; 
    Delay(10608);//14520us 
    if (RS) Set_E; 
    if (dat & 0x40) Set_D; else Clr_D; 
    Delay(462);  //660us 
    if (dat & 0x20) Set_D; else Clr_D; 
    Delay(18);   //30us 
    Set_E; 
    if (dat & 0x10) Set_D; else Clr_D; 
    _NOP();      //0.5us < t < 1.36us 
    Clr_E; 
    dat <<= 4; 
  }	
} 

//=================================================== 
void init_1602(void) 
{ 
  unsigned char i = 3; 
  Clr_D; 
  Clr_E; 
  Delay(10608); 
  do{ 
    Clr_D; 
    Delay(462); 
    Set_D; 
    Set_E; 
    Delay(18); 
    if (i == 0) Clr_D; 
    _NOP();_NOP();_NOP(); 
    Clr_E; 
    }while(i--); 
  Send(0,0x28); 
  Send(0,0x01); 
  Send(0,0x0f); 
} 

//=================================================== 
void Send_S(unsigned char *p) 
{ 
  while(*p) Send(1,*p++); 
}	

//=================================================== 
void main(void) 
{ 
  unsigned char i; 
  init_devices(); 
  init_1602(); 
   
  Set_xy(0,2); 
  Send_S("Hello world!"); 
  Set_xy(1,3); 
  Send_S("I'm COWBOY."); 
  for (i=0;i<255;i++) Delay(10000); 
   
  Send(0,0x01); 
  Set_xy(0,3); 
  Send_S("Welcome to"); 
  Set_xy(1,1); 
  Send_S("www.ourdev.cn"); 
  while(1); 
}   

 

后记:这个设计的突出特点部分是串并转换的思想和设计电路,虽然从运行时间上、稳定性上将不太可取,但是,这个设计方法可以在很多地方用到,还有就是这个作者敢想、敢做。要是真的需要很少的引脚来控制LCD的话,我宁肯选择一个带SPI接口的LCD,可定比这个方案稳定、快速。

发现Google在主页上宣传其自己的手机

记得,像Google这样的公司是很难在搜索主页上见到他的广告的。今天居然发现它在主页上推广自己的手机。

点击链接,发现实际链接到三星的销售平台,看来Google手机是三星代工的了。

可见,Google手机应该主要是推广它手机操作系统平台Andriod,操作系统的暗战由此可见一斑。

 

image

Google推广的Nexus S手机图片:

big-2