1. 什么时候需要使用线程锁
消息是由系统给你放在队列中的(PostMessage方式),或者由你直接发送到窗口处理过程(SendMessage方式),顺序处理到,不需要考虑同步问题.
2. 为什么会有“线程是为不懂状态机的程序员准备的”这种说法
这句话主要是针对服务器端领域的编程说的。主要是异步回调与多线程模型之争。擅长使用异步回调的人,认为使用多线程是不懂状态机。
这句话在理论上是没错,但现实中还是会不可避免的要使用多线程。主要是异步回调(状态机)模型的代码往往支离破碎,很难维护。
3. 程序员需要部署远程服务器吗
不需要。项目要部署到远程的服务器,项目上线也就是将项目部署到远程服务器。
4. 企业为什么要使用服务器,应该使用什么样的服务器
现在的企业只要是有互联网需求的,一般都会用到服务器或者是网站空间,在选择服务器的时候,一些中小型企业会很纠结,不知道该选择服务器托管还是选择服务器租用,因为两者是不同的服务器需求,需要的成本也有差别。很多企业想要选择一个性价比更高的服务,其实,选择一个适合自己的性价比就高。现在的企业只要是有互联网需求的,一般都会用到服务器或者是网站空间,在选择服务器的时候,一些中小型企业会很纠结,不知道该选择服务器托管还是选择服务器租用,因为两者是不同的服务器需求,需要的成本也有差别。很多企业想要选择一个性价比更高的服务,其实,选择一个适合自己的性价比就高。在选择服务器之前,我们需要先了解一下服务器托管和服务器租用,了解两者有哪些不同,之后再结合自己的实际需求,选择一个最适合自己的方案,这样,在一定程度上也可以减少成本的浪费。
服务器托管
服务器托管就是客户自己购买服务器硬件,然后将自己购买的服务器放到IDC机房,由机房这边提供稳定的网络环境和日常的维护,一般日常维护包括重启、重做系统、安装一些常用的应用软件等等。服务器托管的费用只要是带宽的大小和服务器的规格来决定的。其中,带宽的大小占了很大的比重;服务器规格也就是厚度,厚度大的机器不光要多耗费一些电力,更重要的是要多占用一个机位,因此,这多出来的一个机位也是要收取一定的机位费用的,所以建议大家在购买机器来托管的时候,尽量选择机架式的机器,这样托管起来比较节省一些。
服务器租用
服务器租用是自己不需要单独购买机器,只需要将你对硬件和带宽方面的要求告诉IDC商,他们会准备硬件,然后配置机器。对于不懂服务器硬件的用户,一般会选择这个业务,这样可以预防后期在托管期间出现硬件问题无法处理的情况。当然,在租用期间,一旦硬件出现问题,IDC商也需要承担一定的风险。另外,这种租用业务,机器是不属于客户的,租用到期之后,客户可以选择继续租用,也可以选择不再使用。
服务器租用的优劣势分析
向IDC运营商租用服务器的好处是便捷和低价,我们知道,大部分服务器买来以后都需要安装系统和软件,再经过调试通过最终放到 IDC 机房的,那因此直接租用IDC机房的服务器就相对要更加省事一点。但是,租用机房的服务器也有其劣势,主要是用户大部分情况下都看不到自己租用的服务器什么样子,一些运营商倒是会如实的告诉客户他们所租用的服务器品牌和型号。不过也会有极少数IDC采用自行组装的服务器作为租用业务使用以便降低成本,这种情况,要想看机器的配置型号就需要远程服务器。
自己购买服务器的优劣势分析
自己购买服务器遇到的最大障碍恐怕就是价格。但是现在随着服务器成本的降低,大部分专业客户和大客户都已经改为采用自行采购设备然后拿去托管的方式,因为自行采购的优势比较明显。自己组装一台服务器,可能是一半新配件一半二手配件组装而成,这种价格其实也不会太高;要想机器有高性能,还是需要有足够的成本去支撑的,一些注重品牌和稳定的用户也可以直接购买 IBM、HP之流的一线大厂产品。另外,有些用户可能要使用比较特殊的操作系统和软件,又或者是事先需要大量的资料到服务器硬盘上,这些操作远程控制机房的服务器都不是很方便,一般是先调试或者复制好再拿去机房托管。
通过对以上两种服务器业务的比较,可以得出结论:对于离机房较远的地方,可以选择租用服务器。如果离机房不很远的话,可以选择自行购买服务器再放机房托管,即使价格会比租用来得贵。如果是自己做OA系统,或者企业内部数据等,可以考虑自己买服务器。如果自己不知道买哪种服务器,可以先咨询一些IDC商,给他们说一下自己的要求,然后看看用哪种服务器比较合适,然后再自行购买。
如果有帮到你,请采纳,谢谢。
5. Windows NT采用了怎样内核结构
Windows NT 内核基本结构和特征
尽管大部分人每天在Windows系统上工作学习娱乐,但是对于其内核结构很多人仍然是不了解的。一方面是由于其内核源代码不开源,另一方面则是由于相关资料的奇缺。我大二基本上花了一学期来学习和探究NT内核。虽然不敢说自己对其有很深入的了解,但至少其基本结构还算是清楚的。但是我毕竟才学有限,肯定会有不完善的地方,还请各位不吝赐教。
目前微软所有的主流操作系统均是基于NT内核,比如:
Windows 2000/XP/Server 2003(基于NT5)
Windows Vista (基于NT6)
Windows 7(基于NT6.1, 我没装过Win7,不过据说是这样的)
尽管很多人责备Windows在一些方面存在很多问题,但是这并不是内核的错,总的来说,NT的是一个成熟稳定且先进的内核,我认为在今后相当长的一段时期内,NT内核仍将是主流,且不会有很大变化(当然,局部的升级是完全毫无疑问的)
微软早期希望把NT做成一个纯微内核结构,关于微内核和单一内核的区别,各位如有不清楚的,可以去网上搜索一下。后来为了提高图形子系统的性能,避免大量的内核态和用户态切换,微软便将其移入内核之中,使其成为内核一部分(类似的还有后来的DirectX技术)。由此可见,NT并不是一个完全的微内核,它也具有单一内核的某些特征。
NT内核具有以下几个特征(摘自Undocumented Windows NT)
Portability (可移植性)
如你所知,Windows NT 可以运行在多种平台上,即 Intel、MIPS、Power PC 和 DEC Alpha。众多厂商都为 Windows NT 的可移植性做出了贡献。 其中最为重要的因素可能是其实现所使用的语言。Windows NT 大部分是用 C 语言编写的,也有一部分用的是 C++。 平台相关的汇编语言只在必需的地方才用到。Windows NT 团队还将操作系统中硬件相关的部分与其它部分隔离开,单独放进了 HAL.DLL。 如此一来,Windows NT 中与硬件无关的部分的代码就可以用 C 之类的高级语言来编写,也因此可以很容易地移植到各种平台。
Extensibility(可扩展性)
Windows NT 具有很高的可扩展性,但因为缺少文档,其可扩展的特性却极少得到发掘。未公开的特性的名单中,子系统首当其冲。子系统在操作系统中提供了多种操作系统接口。只需添加新的子系统程序就可以为 Windows NT 扩展新的操作系统接口,但是对于公开添加新子系统过程的要求微软却一直打马虎眼。
Windows NT 的内核是高可扩展的,因为可以将内核模块作为驱动程序动态加载。对于 Windows NT,微软提供了足够的文档来编写硬件设备驱动——即硬盘驱动、网卡驱动、磁带机驱动等等。在 Windows NT 下还可以编写不控制设备的驱动程序。甚至连文件系统也是作为驱动程序加载的。
Windows NT 的可扩展性的另一个例子就是系统调用接口的实现。 开发者要修改操作系统行为,一般都需要钩挂或添加系统调用。 Windows NT 的开发团队实际了良好的系统调用接口以方便钩挂和添加系统调用。但是微软还是没有公开这些机制。
Compatibility(兼容性)
长久以来,向下兼容性都是 Intel 处理器和微软操作系统的一大特征,也是这两位巨人成功的关键。Windows NT 必须能运行 DOS、Win16 和 OS/2 的程序。兼容性是 Windows NT 开发团队使用子系统概念的另一个原因。除二进制兼容之外(执行不同格式的可执行文件),Windows NT 还为符合 POSIX 的程序提供了源代码级的兼容。增强兼容性的其他方面还表现在除自己本身的 NTFS 外,Windows NT 支持其它的文件系统,如 DOS 的 FAT 和 OS/2 的 HPFS。
Maintainability(可维护性)
Windows NT 的代码量很大,维护着些代码的工作量也相当大。NT 的开发团队通过使用面向对象的设计实现了高可维护性。再有,将操作系统的功能分成各个层也提高了可维护性。最上面的一层,也就是用户见到的操作系统层面,是子系统层。子系统提供系统调用接口来为外界提供应用程序编程接口。在系统调用接口层之下的是 NT 的 executive,executive 又建立在内核之上,而内核又依赖于硬件抽象层(HAL),硬件抽象层与硬件直接通讯。
NT 的开发团队所选的编程语言也与 Windows NT 的可维护性有关。正如我们前面提到的,整个操作系统都是用 C 和 C++ 来编写的,只有极少数不用不行的地方用了汇编语言。
Security(安全性)
Windows NT 是一个安全的操作系统,是因为它有以下几点特征:用户在使用系统之前必须先登陆。 系统中的资源都被视为对象,而每一个对象都相应由一个安全描述符。安全描述符有一个安全列表来指示那些用户可以访问该对象。
尽管有这些,要是没有一个安全的文件系统,操作系统也不能说是安全的。 DOS 时的 FAT 文件系统没有预见到任何的安全问题,其作为一个单用户的系统,也不用防范安全问题。
为了克服此缺陷,Windows NT 团队推出了一种新的文件系统,这种文件系统基于 OS/2 的文件系统 HPFS。这种新的 Windows NT 的自有文件系统叫 NTFS。它支持访问控制,用户可以为 NTFS 下创建的文件或目录指定访问权限,NTFS 只允许有访问权限的进程访问该文件或目录。
Multiprocessing(多进程)
Windows NT 支持对称多处理,Windows NT 的工作站版本可以支持两个处理器,服务器版可以支持到4个。为支持多处理,操作系统需要特殊的同步机制。在单处理器系统中,通过禁用中断,临界区中的代码执行时不会被打断。这对于维护内核数据结构的完整性来说是必需的。在多处理器环境下,就不可能在所有的处理器上都禁用中断。在多处理环境中,Windows NT 使用自旋锁来保护内核数据结构。
注:多处理可分为对称的和非对称的。在非对称多处理中,有一个处理器为主处理器,其它的处理器都为从处理器。只有主处理器运行在内核模式,其它从处理器都只运行在用户线程。只要运行在用户线程的从处理器一调用系统服务,主处理器就接管此线程并执行所需的内核服务。调度程序,一个内核程序,之运行在主处理器上。因此,主处理扮演者调度员的角色,将用户模式线程分派给从处理器。很自然,与所有处理器都可在内核或用户模式运行的对称多处理相比,主处理器负担很重,系统不均衡。
International Language Support(国际化语言支持)
如今众多的 PC 用户都使用英语之外的其它语言。与这些用户能很好交互的关键就是使操作系统能支持用户们的语言。Windows NT 通过使用 Unicode 标准的字符集实现了这一目标。Unicode 标准规定了一个16位的字符集,而ASCII 使用的是8位字符集。 Unicode 的前256个字符的编码与 ASCII 的相同。这就为非拉丁语的语言留出了充足的空间。Win32 API 能接受 Unicode 和 ASCII 两种字符集,而 Windows NT 的内核则只能使用 Unicode。尽管应用程序程序员可以不去了解 Unicode,但驱动程序的开发者必须熟悉 Unicode,因为内核接口函数只接受 Unicode 字符串而且驱动的入口点都用的是 Unicode。
Windows NT 从 MACH 操作系统那里借用了核心体系,MACH 操作系统是在卡耐基梅隆大学开发的。MACH 操作系统的基本理念就是通过将复杂的操作系统功能交给用户级进程而将内核减至最小。这种客户机-服务器的操作系统体系还有另外一个目的:允许在同一操作系统上使用多种 APIs。通过在服务器进程中实现 APIs 就可以做到。
MACH 操作系统的内核提供了非常简单的一组接口函数。服务器进程使用这组接口函数实现出某种 API 来提供一组更复杂的接口函数。Windows NT 从 MACH 那里借用了这个理念。Windows NT 中的服务器进程被称作子系统。模块化和结构化的程序设计都是优秀软件管理的原则,NT 选择使用客户机-服务器的体系结构显示了它对这种原则的服从。Windows NT 本可以将所需的 APIs 在内核实现,也可以在内核上加上不同的层来实现不同的 APIs。出于维护性和扩展性的目的,NT 团队选择了子系统的办法。
Windows NT 中有两种子系统: integral subsystems 和 environment subsystems。Integral subsystems,如安全管理子系统,完成基本的操作系统任务。 Environment subsystems 则使得一台 Windows NT 机器能使用不同种类的 APIs。Windows NT 的子系统能支持以下的 APIs:
Win32 子系统。Win32 子系统提供 Win32 API。使用 Win32 API 的应用程序可以运行在微软 提供的所有平台上—
WOW 子系统。Windows on Windows (WOW) 子系统提供了对 16-bit Windows 应用程序的兼容,使得 Win16 的应用程序可以在 Windows NT 上运行。只要没有使用 Windows NT 不支持的未公开函数,这些应用程序都可以运行。
NTVDM 子系统。NT Virtual DOS Machine (NTVDM) 提供了一个基于文本的环境,DOS 程序可以在这个环境中运行。
OS/2 子系统。OS/2 子系统能运行 OS/2 应用程序。WOW、NTVDM 和 OS/2 都只能用在 Intel 平台上,因为他们都对应用程序提供二进制兼容性。而用于一种处理器的可执行文件或二进制文件就不能用在另一种处理器上,因为处理器间的机器指令格式不同。
POSIX 子系统。POSIX 子系统提供符合 POSIX 1003.1 标准的 API。
应用程序并不知道所调用的 API 是由相应的子系统处理的。这种隐藏是通过每种子系统各自的客户端 DLL 来实现的。这种 DLL 将 API 调用转换为本地过程调用(local procere call,LPC)。本地过程调用类似于联网的 UNIX 上的远程过程调用(RPC)。使用 RPC,客户应用程序可以调用运行在网络上另一台机器上的服务器进程。 LPC 对运行在同一台计算机上的客户机与服务器进行了优化。
NT内核主要包含以下几个重要文件:
Ntoskrnl.exe(或者Ntkrnlpa.exe)
HAL.Dll
NTDll.Dll
Win32k.Sys
NT内核的核心是NT EXECUTIVE。对应的文件是Ntoskrnl.exe。如果是机器是多处理器的,则是Ntkrnlpa.exe。非常可笑的是,这个文件可以直接删除,其后果就是重启后Windows无法启动,甚至连滚动条都看不到。该文件只有2MB左右的大小,但可谓是麻雀虽小五脏俱全,它作为整个Windows中最核心的部分,向外界提供了复杂的接口。
与之相辅相成的是HAL.Dll文件,即Hardware Abstraction Layer 硬件抽象层 。它直接与机器的硬件打交道,将硬件的差异对其之上的层隐藏起来。Windows NT 是一个有高可移植性的操作系统,运行在多种平台上。HAL.DLL 包含的代码向核心的其它部分隐藏了处理器和机器相关的细节。因此平台之间只有 HAL.DLL 不同,剩下的使用 HAL 接口的核心代码都有很高的可移植性。
NTDll.Dll模块。导出了大部分的Native API函数,提供了由用户态至内核态的切换的功能。做过Windows平台开发的人都知道,Windows API主要由Kernel32.Dll, User32.Dll, GDI32.Dll构成。其实对WindowsAPI的调用最终会被转接到NTDll。即所谓Native API,命名上基本上就是在原API前面加上Nt或者Zw(比如CreateFile就变成了NtCreateFile)。而Kernel32.Dll, User32.Dll, GDI32.Dll三个文件则组成了Win32子系统,它们本身不实现API,它导出的函数被称为stub 函数(尽管名称上看起来很迷惑人)
Win32K.sys模块。实现了Windows的图形处理部分。USER32 和 GDI32 使用系统调用接口来调用 WIN32K.SYS 中的服务。由于其工作与内核态,所以具有很高的性能,这也成就了Windows系统的强大的图形处理能力。
6. 锁死服务器的程序员燕飞宏是个什么样人
说真的我不信这个事,再蠢的人也应该清楚恶意给公司造成损失的,要赔偿其造成的全部经济损失,而且还可能触犯刑法来个牢狱之灾。一个程序员肯定是有文化有智伤的人,很难想象会做出这么蠢的事!再说了这事要是真的为啥不立即报警或者去法院起诉燕飞宏,而要等一年以后爆出来呢!总感觉很蹊跷
7. java 锁管什么 cpu控制权又管什么
JavaCardAPI的产生与发展
1996年10月29日,Sun公司宣布完成了JavaCardAPI(Java卡应用程序接口)的规范化工
作。
1997年7月,Sun又推出JavaCardAPI的更新版本。
JavaCardAPI是一个规范化的Java语言大型应用程序接口,它充分利用了智能卡技术使
电子商业、网络存取、分布式程序、游戏程序以及认证等网络功能的实现成为可能。
JavaSoft公司的总裁AlanBaratz对此评价说:“Java卡应用程序不仅可以在任何智能卡
上运行,而且Java程序员还能运用相同的工具开发针对智能卡、页面管理程序、网络计算机
、个人计算机及容错服务器的大型应用程序。
”JavaCardAPI为智能卡开发人员提供关键的
Java功能,它是一个工业标准语言,并为智能卡开放了应用程序接口,允许大型应用程序运行
在所有符合ISO7816标准的智能卡上。
Java语言的可扩展性以及平台的独立性为生成智能卡
大型应用程序提供了一个理想的环境。
到目前为止,智能卡操作人员还一直在编写不具有互
操作性及可移植性的专用应用程序,Java的引入将会改变这一格局。
智能卡开发人员可以利
用日益增多的Java开发工具,通过JavaCardAPI编译大型应用程序。
JavaSoft公司正在与智
能卡工业的主要公司合作开发一种易于使用的工具,使这些大型应用程序能够在智能卡环境
中运行。
8. 并发控制为什么要使用意向锁
给你个最详细的吧可能有你要的内容锁的概述一.为什么要引入锁多个用户同时对数据库的并发操作时会带来以下数据不一致的问题:丢失更新A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统脏读A用户修改了数据,随后B用户又读出该数据,但A用户因为某些原因取消了对数据的修改,数据恢复原值,此时B得到的数据就与数据库内的数据产生了不一致不可重复读A用户读取数据,随后B用户读出该数据并修改,此时A用户再读取数据时发现前后两次的值不一致并发控制的主要方法是封锁,锁就是在一段时间内禁止用户做某些操作以避免产生数据不一致二锁的分类锁的类别有两种分法:1.从数据库系统的角度来看:分为独占锁(即排它锁),共享锁和更新锁MS-SQLServer使用以下资源锁模式。锁模式描述共享(S)用于不更改或不更新数据的操作(只读操作),如SELECT语句。更新(U)用于可更新的资源中。防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。排它(X)用于数据修改操作,例如INSERT、UPDATE或DELETE。确保不会同时同一资源进行多重更新。意向锁用于建立锁的层次结构。意向锁的类型为:意向共享(IS)、意向排它(IX)以及与意向排它共享(SIX)。架构锁在执行依赖于表架构的操作时使用。架构锁的类型为:架构修改(Sch-M)和架构稳定性(Sch-S)。大容量更新(BU)向表中大容量复制数据并指定了TABLOCK提示时使用。共享锁共享(S)锁允许并发事务读取(SELECT)一个资源。资源上存在共享(S)锁时,任何其它事务都不能修改数据。一旦已经读取数据,便立即释放资源上的共享(S)锁,除非将事务隔离级别设置为可重复读或更高级别,或者在事务生存周期内用锁定提示保留共享(S)锁。更新锁更新(U)锁可以防止通常形式的死锁。一般更新模式由一个事务组成,此事务读取记录,获取资源(页或行)的共享(S)锁,然后修改行,此操作要求锁转换为排它(X)锁。如果两个事务获得了资源上的共享模式锁,然后试图同时更新数据,则一个事务尝试将锁转换为排它(X)锁。共享模式到排它锁的转换必须等待一段时间,因为一个事务的排它锁与其它事务的共享模式锁不兼容;发生锁等待。第二个事务试图获取排它(X)锁以进行更新。由于两个事务都要转换为排它(X)锁,并且每个事务都等待另一个事务释放共享模式锁,因此发生死锁。若要避免这种潜在的死锁问题,请使用更新(U)锁。一次只有一个事务可以获得资源的更新(U)锁。如果事务修改资源,则更新(U)锁转换为排它(X)锁。否则,锁转换为共享锁。排它锁排它(X)锁可以防止并发事务对资源进行访问。其它事务不能读取或修改排它(X)锁锁定的数据。意向锁意向锁表示SQLServer需要在层次结构中的某些底层资源上获取共享(S)锁或排它(X)锁。例如,放置在表级的共享意向锁表示事务打算在表中的页或行上放置共享(S)锁。在表级设置意向锁可防止另一个事务随后在包含那一页的表上获取排它(X)锁。意向锁可以提高性能,因为SQLServer仅在表级检查意向锁来确定事务是否可以安全地获取该表上的锁。而无须检查表中的每行或每页上的锁以确定事务是否可以锁定整个表。意向锁包括意向共享(IS)、意向排它(IX)以及与意向排它共享(SIX)。锁模式描述意向共享(IS)通过在各资源上放置S锁,表明事务的意向是读取层次结构中的部分(而不是全部)底层资源。意向排它(IX)通过在各资源上放置X锁,表明事务的意向是修改层次结构中的部分(而不是全部)底层资源。IX是IS的超集。与意向排它共享(SIX)通过在各资源上放置IX锁,表明事务的意向是读取层次结构中的全部底层资源并修改部分(而不是全部)底层资源。允许顶层资源上的并发IS锁。例如,表的SIX锁在表上放置一个SIX锁(允许并发IS锁),在当前所修改页上放置IX锁(在已修改行上放置X锁)。虽然每个资源在一段时间内只能有一个SIX锁,以防止其它事务对资源进行更新,但是其它事务可以通过获取表级的IS锁来读取层次结构中的底层资源。独占锁:只允许进行锁定操作的程序使用,其他任何对他的操作均不会被接受。执行数据更新命令时,SQLServer会自动使用独占锁。当对象上有其他锁存在时,无法对其加独占锁。共享锁:共享锁锁定的资源可以被其他用户读取,但其他用户无法修改它,在执行Select时,SQLServer会对对象加共享锁。更新锁:当SQLServer准备更新数据时,它首先对数据对象作更新锁锁定,这样数据将不能被修改,但可以读取。等到SQLServer确定要进行更新数据操作时,他会自动将更新锁换为独占锁,当对象上有其他锁存在时,无法对其加更新锁。2.从程序员的角度看:分为乐观锁和悲观锁。乐观锁:完全依靠数据库来管理锁的工作。悲观锁:程序员自己管理数据或对象上的锁处理。MS-SQLSERVER使用锁在多个同时在数据库内执行修改的用户间实现悲观并发控制三锁的粒度锁粒度是被封锁目标的大小,封锁粒度小则并发性高,但开销大,封锁粒度大则并发性低但开销小SQLServer支持的锁粒度可以分为为行、页、键、键范围、索引、表或数据库获取锁资源描述RID行标识符。用于单独锁定表中的一行。键索引中的行锁。用于保护可串行事务中的键范围。页8千字节(KB)的数据页或索引页。扩展盘区相邻的八个数据页或索引页构成的一组。表包括所有数据和索引在内的整个表。DB数据库。四锁定时间的长短锁保持的时间长度为保护所请求级别上的资源所需的时间长度。用于保护读取操作的共享锁的保持时间取决于事务隔离级别。采用READCOMMITTED的默认事务隔离级别时,只在读取页的期间内控制共享锁。在扫描中,直到在扫描内的下一页上获取锁时才释放锁。如果指定HOLDLOCK提示或者将事务隔离级别设置为REPEATABLEREAD或SERIALIZABLE,则直到事务结束才释放锁。根据为游标设置的并发选项,游标可以获取共享模式的滚动锁以保护提取。当需要滚动锁时,直到下一次提取或关闭游标(以先发生者为准)时才释放滚动锁。但是,如果指定HOLDLOCK,则直到事务结束才释放滚动锁。用于保护更新的排它锁将直到事务结束才释放。如果一个连接试图获取一个锁,而该锁与另一个连接所控制的锁冲突,则试图获取锁的连接将一直阻塞到:将冲突锁释放而且连接获取了所请求的锁。连接的超时间隔已到期。默认情况下没有超时间隔,但是一些应用程序设置超时间隔以防止无限期等待五SQLServer中锁的自定义1处理死锁和设置死锁优先级死锁就是多个用户申请不同封锁,由于申请者均拥有一部分封锁权而又等待其他用户拥有的部分封锁而引起的无休止的等待可以使用SETDEADLOCK_PRIORITY控制在发生死锁情况时会话的反应方式。如果两个进程都锁定数据,并且直到其它进程释放自己的锁时,每个进程才能释放自己的锁,即发生死锁情况。2处理超时和设置锁超时持续时间。@@LOCK_TIMEOUT返回当前会话的当前锁超时设置,单位为毫秒SETLOCK_TIMEOUT设置允许应用程序设置语句等待阻塞资源的最长时间。当语句等待的时间大于LOCK_TIMEOUT设置时,系统将自动取消阻塞的语句,并给应用程序返回"已超过了锁请求超时时段"的1222号错误信息示例下例将锁超时期限设置为1,800毫秒。SETLOCK_TIMEOUT18003)设置事务隔离级别。4)对SELECT、INSERT、UPDATE和DELETE语句使用表级锁定提示。5)配置索引的锁定粒度可以使用sp_indexoption系统存储过程来设置用于索引的锁定粒度六查看锁的信息1执行EXECSP_LOCK报告有关锁的信息2查询分析器中按Ctrl+2可以看到锁的信息七使用注意事项如何避免死锁1使用事务时,尽量缩短事务的逻辑处理过程,及早提交或回滚事务;2设置死锁超时参数为合理范围,如:3分钟-10分种;超过时间,自动放弃本次操作,避免进程悬挂;3优化程序,检查并避免死锁现象出现;4.对所有的脚本和SP都要仔细测试,在正是版本之前。5所有的SP都要有错误处理(通过@error)6一般不要修改SQLSERVER事务的默认级别。不推荐强行加锁解决问题如何对行表数据库加锁八几个有关锁的问题1如何锁一个表的某一行*FROMtableROWLOCKWHEREid=12锁定数据库的一个表SELECT*FROMtableWITH(HOLDLOCK)加锁语句:sybase:update表setcol1=col1where1=0;MSSQL:selectcol1from表(tablockx)where1=0;oracle:LOCKTABLE表INEXCLUSIVEMODE;加锁后其它人不可操作,直到加锁用户解锁,用commit或rollback解锁几个例子帮助大家加深印象设table1(A,B,C)ABCa1b1c1a2b2c2a3b3c31)排它锁新建两个连接在第一个连接中执行以下语句begintranupdatetable1setA='aa'whereB='b2'waitfordelay'00:00:30'--等待30秒committran在第二个连接中执行以下语句begintranselect*fromtable1whereB='b2'committran若同时执行上述两个语句,则select查询必须等待update执行完毕才能执行即要等待30秒2)共享锁在第一个连接中执行以下语句begintranselect*fromtable1holdlock-holdlock人为加锁whereB='b2'waitfordelay'00:00:30'--等待30秒committran在第二个连接中执行以下语句begintranselectA,Cfromtable1whereB='b2'updatetable1setA='aa'whereB='b2'committran若同时执行上述两个语句,则第二个连接中的select查询可以执行而update必须等待第一个事务释放共享锁转为排它锁后才能执行即要等待30秒3)死锁增设table2(D,E)DEd1e1d2e2在第一个连接中执行以下语句begintranupdatetable1setA='aa'whereB='b2'waitfordelay'00:00:30'updatetable2setD='d5'whereE='e1'committran在第二个连接中执行以下语句begintranupdatetable2setD='d5'whereE='e1'waitfordelay'00:00:10'updatetable1setA='aa'whereB='b2'committran同时执行,系统会检测出死锁,并中止进程补充一点:SqlServer2000支持的表级锁定提示HOLDLOCK持有共享锁,直到整个事务完成,应该在被锁对象不需要时立即释放,等于SERIALIZABLE事务隔离级别NOLOCK语句执行时不发出共享锁,允许脏读,等于READUNCOMMITTED事务隔离级别PAGLOCK在使用一个表锁的地方用多个页锁READPAST让sqlserver跳过任何锁定行,执行事务,适用于READUNCOMMITTED事务隔离级别只跳过RID锁,不跳过页,区域和表锁ROWLOCK强制使用行锁TABLOCKX强制使用独占表级锁,这个锁在事务期间阻止任何其他事务使用这个表UPLOCK强制在读表时使用更新而不用共享锁应用程序锁:应用程序锁就是客户端代码生成的锁,而不是sqlserver本身生成的锁处理应用程序锁的两个过程sp_getapplock锁定应用程序资源sp_releaseapplock为应用程序资源解锁注意:锁定数据库的一个表的区别SELECT*FROMtableWITH(HOLDLOCK)其他事务可以读取表,但不能更新删除SELECT*FROMtableWITH(TABLOCKX)其他事务不能读取表,更新和删除参考资料:
9. 为什么程序员都喜欢Linux操作系统
着作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:钟宇腾
链接:
来源:知乎
是的,因为Linux目前为止,也没有为“普通”用户真正的优化过
要让“普通”用户接受Linux,除了弄一个像Windows或Mac OS一样的图形界面,没有其它办法
你不可能说服用户去尝试使用Terminal,普通用户理你才怪呢。不使用Terminal,Linux系统的优势为零,残废一样的图形界面根本无法获得普通用户的青睐,只能说是“可用”。
而作为程序员,学习和探索是一项最基本的能力
Linux的Terminal和开发环境、文件组织结构都可以大大的提高你的开发效率,尤其是Shell的命令、管道等等功能,把命令组合起来可以发挥让人意想不到的效果,也大大地提高你的工作效率
而要程序员去掌握Linux的用法将是非常容易的,因为程序员本身就有读懂文档的能力,相对于普通用户来说门槛太低了
但是你不能要求普通用户去接受Linux,至少现在不可能,因为Linux没有任何一处是为了普通用户着想的,普通用户去读文档将会让他们感觉到非常地苦恼和沮丧
Linux本身没有问题,因为它只是一个内核,普通用户能不能接受它那是GUI的问题,和配套软件的问题
同样是UNIX系,Mac OS X从BSD走出来之后,在这之上构建了一个绚丽的图形系统,但是其内核依然是BSD,也可以使用各种CLI工具,所以Mac OS X几乎就是喜欢Linux的程序员们的最终归宿
而Mac OS X的图形界面使得普通用户的使用门槛降低,普通用户也会喜欢使用它的
所以Mac OS X不就是一个很好的例子么?Linux般的开发体验+普通用户喜爱的图形界面的完美结合。其实Linux阵营目前也在努力,Ubuntu现在就是想让Linux系统更亲近用户,希望它能成功吧
10. 程序员工作要做什么
程序员(英文Programmer)是从事程序开发、维护的专业人员。一般我们将程序员分为程序设计人员和程序编码员,但两者的界限并不非常清楚,特别是在中国。
作一个真正合格的程序员,应该具有的素质。
1:团队精神和协作能力
团队精神和协作能力是作为一个程序员应具备的最基本的素质。软件工程已经提了将近三十年了,当今的软件开发已经不是编程了,而是工程。独行侠可以写一些程序也能赚钱发财,但是进入研发团队,从事商业化和产品化的开发任务,就必须具备这种素质。可以毫不夸张的说这种素质是一个程序员乃至一个团队的安身立命之本。
2:文档习惯
文档是一个软件系统的生命力。一个公司的产品再好、技术含量再高,如果缺乏文档,知识就没有继承,公司还是一个来料加工的软件作坊。作为代码程序员,必须将30%的工作时间写用于技术文档。没有文档的程序员势必会被淘汰。
3:规范化的代码编写习惯
知名软件公司的代码的变量命名、注释格式,甚至嵌套中行缩进的长度和函数间的空行数字都有明确规定,良好的编写习惯,不但有助于代码的移植和纠错,也有助于不同技术人员之间的协作。 一些所谓的高手甚至叫嚣高手写的代码一般人看不懂,我只能说他不是一名合格的程序员。
4:需求理解能力
程序员要能正确理解任务单中描述的需求。在这里要明确一点,程序员不仅仅要注意到软件的功能需求,还应注意软件的性能需求,要能正确评估自己的模块对整个项目中的影响及潜在的威胁,如果有着两到三年项目经验的熟练程序员对这一点没有体会的话,只能说明他或许是认真工作过,但是没有用心工作。
5:模块化思维能力
作为一个优秀的程序员,他的思想不能在局限当前的工作任务里面,要想想看自己写的模块是否可以脱离当前系统存在,通过简单的封装在其他系统中或其他模块中直接使用。这样做可以使代码能重复利用,减少重复的劳动,也能是系统结构越趋合理。模块化思维能力的提高是一个程序员的技术水平提高的一项重要指标。
6:测试习惯
测试是软件工程质量保证的重要环节,但是测试不仅仅是测试工程师的工作,而是每个程序员的一种基本职责。程序员要认识测试不仅是正常的程序调试,而要是要进行有目的有针对性的异常调用测试,这一点要结合需求理解能力。
7:学习和总结的能力
程序员是很容易被淘汰的职业,所以要善于学习总结。许多程序员喜欢盲目追求一些编码的小技巧,这样的技术人员无论学了多少语言,代码写起来多熟练,我们只能说他是一名熟练的代码民工,他永远都不会有质的提高。一个善于学习的程序员会经常总结自己的技术水平,对自己的技术层面要有良好的定位,这样才能有目的地提高自己。这样才能逐步提高,从程序员升级为软件设计师、系统分析员。
作为高级程序员,乃至于设计师而言,除了应该具备上述全部素质之外,还需要具备以下素质:
1、 需求分析能力
2、 整体框架能力
3、 流程处理能力
4、 模块分解能力
5、 整体项目评估能力
6、 团队组织管理能力
一般招工时需要提供基础程序员证书,要参加考试的:
[编辑本段]考试说明
1、 考试要求:
(1) 熟练掌握基本算法和数据结构,用C语言编制程序;
(2) 掌握数据结构、程序变速器和操作系统的基础知识;
(3) 了解软件工程、数据库、多媒体和网络的基础知识;
(4) 掌握数制、机内代码及其算术运算和逻辑运算的基础知识;
(5) 了解计算机的体系结构和主要部件的基础知识。
2、 通过本级水平考试的合格人员能按照软件设计说明书编制程序,具有相当于助理工程师
的实际工作能力和业务水平。
3、 本级水平考试范围包括两个模块:模块1——程序编制能力(考试时间为150分钟);模
块2——基础知识(程序员级)考试时间为120分钟)。题型为:单项选择题十多项选择题。