当前位置:文档之家› 大内高手--调试手段及原理

大内高手--调试手段及原理

大内高手--调试手段及原理
大内高手--调试手段及原理

大内高手--调试手段及原理

知其然也知其所以然,是我们《大内高手》系列一贯做法,本文亦是如此。这里我不打算讲解如何使用boundschecker、purify、valgrind或者gdb,使用这些工具非常简单,讲解它们只是多此一举。相反,我们要研究一下这些工具的实现原理。

本文将从应用程序、编译器和调试器三个层次来讲解,在不同的层次,有不同的方法,这些方法有各自己的长处和局限。了解这些知识,一方面满足一下新手的好奇心,另一方面也可能有用得着的时候。

从应用程序的角度

最好的情况是从设计到编码都扎扎实实的,避免把错误引入到程序中来,这才是解决问题的根本之道。问题在于,理想情况并不存在,现实中存在着大量有内存错误的程序,如果内存错误很容易避免,JA V A/C#的优势将不会那么突出了。

对于内存错误,应用程序自己能做的非常有限。但由于这类内存错误非常典型,所占比例非常大,所付出的努力与所得的回报相比是非常划算的,仍然值得研究。

前面我们讲了,堆里面的内存是由内存管理器管理的。从应用程序的角度来看,我们能做到的就是打内存管理器的主意。其实原理很简单:

对付内存泄露。重载内存管理函数,在分配时,把这块内存的记录到一个链表中,在释放时,从链表中删除吧,在程序退出时,检查链表是否为空,如果不为空,则说明有内存泄露,否则说明没有泄露。当然,为了查出是哪里的泄露,在链表还要记录是谁分配的,通常记录文件名和行号就行了。

对付内存越界/野指针。对这两者,我们只能检查一些典型的情况,对其它一些情况无能为

力,但效果仍然不错。其方法如下(源于《Comparing and contrasting the runtime error detection technologies》):

l 首尾在加保护边界值

Header

Leading guard(0xFC)

User data(0xEB)

Tailing guard(0xFC)

在内存分配时,内存管理器按如上结构填充分配出来的内存。其中Header是管理器自己用的,前后各有几个字节的guard数据,它们的值是固定的。当内存释放时,内存管理器检查这些guard数据是否被修改,如果被修改,说明有写越界。

它的工作机制注定了有它的局限性: 只能检查写越界,不能检查读越界,而且只能检查连续性的写越界,对于跳跃性的写越界无能为力。

l 填充空闲内存

空闲内存(0xDD)

内存被释放之后,它的内容填充成固定的值。这样,从指针指向的内存的数据,可以大致判断这个指针是否是野指针。

它同样有它的局限:程序要主动判断才行。如果野指针指向的内存立即被重新分配了,它又被填充成前面那个结构,这时也无法检查出来。

从编译器的角度

boundschecker和purify的实现都可以归于编译器一级。前者采用一种称为CTI(compile-time instrumentation)的技术。VC的编译不是要分几个阶段吗?boundschecker在预处理和编译两个阶段之间,对源文件进行修改。它对所有内存分配释放、内存读写、指针赋值和指针计算等所有内存相关的操作进行分析,并插入自己的代码。比如:

Before

if (m_hsession) gblHandles->ReleaseUserHandle( m_hsession );

if (m_dberr) delete m_dberr;

After

if (m_hsession) {

_Insight_stack_call(0);

gblHandles->ReleaseUserHandle(m_hsession);

_Insight_after_call();

}

_Insight_ptra_check(1994, (void **) &m_dberr, (void *) m_dberr);

if (m_dberr) {

_Insight_deletea(1994, (void **) &m_dberr, (void *) m_dberr, 0);

delete m_dberr;

}

Purify则采用一种称为OCI(object code insertion)的技术。不同的是,它对可执行文件的每条

指令进行分析,找出所有内存分配释放、内存读写、指针赋值和指针计算等所有内存相关的操作,用自己的指令代替原始的指令。

boundschecker和purify是商业软件,它们的实现是保密的,甚至拥有专利的,无法对其研究,只能找一些皮毛性的介绍。无论是CTI还是OCI这样的名称,多少有些神秘感。其实它们的实现原理并不复杂,通过对valgrind和gcc的bounds checker扩展进行一些粗浅的研究,我们可以知道它们的大致原理。

gcc的bounds checker基本上可以与boundschecker对应起来,都是对源代码进行修改,以达到控制内存操作功能,如malloc/free等内存管理函数、memcpy/strcpy/memset等内存读取函数和指针运算等。Valgrind则与Purify类似,都是通过对目标代码进行修改,来达到同样的目的。

Valgrind对可执行文件进行修改,所以不需要重新编译程序。但它并不是在执行前对可执行文件和所有相关的共享库进行一次性修改,而是和应用程序在同一个进程中运行,动态的修改即将执行的下一段代码。

Valgrind是插件式设计的。Core部分负责对应用程序的整体控制,并把即将修改的代码,转换成一种中间格式,这种格式类似于RISC指令,然后把中间代码传给插件。插件根据要求对中间代码修改,然后把修改后的结果交给core。core接下来把修改后的中间代码转换成原始的x86指令,并执行它。

由此可见,无论是boundschecker、purify、gcc的bounds checker,还是Valgrind,修改源代码也罢,修改二进制也罢,都是代码进行修改。究竟要修改什么,修改成什么样子呢?别急,下面我们就要来介绍:

管理所有内存块。无论是堆、栈还是全局变量,只要有指针引用它,它就被记录到一个全局表中。记录的信息包括内存块的起始地址和大小等。要做到这一点并不难:对于在堆里分配的动态内存,可以通过重载内存管理函数来实现。对于全局变量等静态内存,可以从符号表中得到这些信息。

拦截所有的指针计算。对于指针进行乘除等运算通常意义不大,最常见运算是对指针加减一个偏移量,如++p、p=p+n、p=a[n]等。所有这些有意义的指针操作,都要受到检查。不再是由一条简单的汇编指令来完成,而是由一个函数来完成。

有了以上两点保证,要检查内存错误就非常容易了:比如要检查++p是否有效,首先在全局表中查找p指向的内存块,如果没有找到,说明p是野指针。如果找到了,再检查p+1是否在这块内存范围内,如果不是,那就是越界访问,否则是正常的了。怎么样,简单吧,无论是全局内存、堆还是栈,无论是读还是写,无一能够逃过出工具的法眼。

代码赏析(源于tcc):

对指针运算进行检查:

void *__bound_ptr_add(void *p, int offset)

{

unsigned long addr = (unsigned long)p;

BoundEntry *e;

#if defined(BOUND_DEBUG)

printf("add: 0x%x %d\n", (int)p, offset);

#endif

e = __bound_t1[addr >> (BOUND_T2_BITS + BOUND_T3_BITS)];

e = (BoundEntry *)((char *)e +

((addr >> (BOUND_T3_BITS - BOUND_E_BITS)) &

((BOUND_T2_SIZE - 1) << BOUND_E_BITS)));

addr -= e->start;

if (addr > e->size) {

e = __bound_find_region(e, p);

addr = (unsigned long)p - e->start;

}

addr += offset;

if (addr > e->size)

return INV ALID_POINTER; /* return an invalid pointer */ return p + offset;

}

static void __bound_check(const void *p, size_t size)

{

if (size == 0)

return;

p = __bound_ptr_add((void *)p, size);

if (p == INV ALID_POINTER)

bound_error("invalid pointer");

}

重载内存管理函数:

void *__bound_malloc(size_t size, const void *caller)

{

void *ptr;

/* we allocate one more byte to ensure the regions will be separated by at least one byte. With the glibc malloc, it may

be in fact not necessary */

ptr = libc_malloc(size + 1);

if (!ptr)

return NULL;

__bound_new_region(ptr, size);

return ptr;

}

void __bound_free(void *ptr, const void *caller)

{

if (ptr == NULL)

return;

if (__bound_delete_region(ptr) != 0)

bound_error("freeing invalid region");

libc_free(ptr);

}

重载内存操作函数:

void *__bound_memcpy(void *dst, const void *src, size_t size)

{

__bound_check(dst, size);

__bound_check(src, size);

/* check also region overlap */

if (src >= dst && src < dst + size)

bound_error("overlapping regions in memcpy()");

return memcpy(dst, src, size);

}

从调试器的角度

现在有OS的支持,实现一个调试器变得非常简单,至少原理不再神秘。这里我们简要介绍一下win32和linux中的调试器实现原理。

在Win32下,实现调试器主要通过两个函数:WaitForDebugEvent和ContinueDebugEvent。下面是一个调试器的基本模型(源于: 《Debugging Applications for Microsoft .NET and Microsoft Windows》)

void main ( void )

CreateProcess ( ..., DEBUG_ONL Y_THIS_PROCESS ,... ) ;

while ( 1 == WaitForDebugEvent ( ... ) )

{

if ( EXIT_PROCESS )

{

break ;

}

ContinueDebugEvent ( ... ) ;

}

}

由调试器起动被调试的进程,并指定DEBUG_ONLY_THIS_PROCESS标志。按Win32下事件驱动的一贯原则,由被调试的进程主动上报调试事件,调试器然后做相应的处理。

在linux下,实现调试器只要一个函数就行了:ptrace。下面是个简单示例:(源于《Playing with ptrace》)。

#include

#include

#include

#include

#include /* For user_regs_struct

etc. */

int main(int argc, char *argv[])

{ pid_t traced_process;

struct user_regs_struct regs;

long ins;

if(argc != 2) {

printf("Usage: %s \n",

argv[0], argv[1]);

exit(1);

}

traced_process = atoi(argv[1]);

ptrace(PTRACE_ATTACH, traced_process,

NULL, NULL);

wait(NULL);

ptrace(PTRACE_GETREGS, traced_process,

NULL, ®s);

ins = ptrace(PTRACE_PEEKTEXT, traced_process,

regs.eip, NULL);

printf("EIP: %lx Instruction executed: %lx\n",

regs.eip, ins);

ptrace(PTRACE_DETACH, traced_process,

NULL, NULL);

return 0;

}

由于篇幅有限,这里对于调试器的实现不作深入讨论,主要是给新手指一个方向。以后若有时间,再写个专题来介绍linux下的调试器和ptrace本身的实现方法。

大内高手—惯用手法

《POSA》中根据模式粒度把模式分为三类:架构模式、设计模式和惯用手法。其中把分层模式、管道过滤器和微内核模式等归为架构模式,把代理模式、命令模式和出版-订阅模式等归为设计模式,而把引用计数等归为惯用手法。这三类模式间的界限比较模糊,在特定的情况,有的设计模式可以作为架构模式来用,有的把架构模式也作为设计模式来用。

在通常情况下,我们可以说架构模式、设计模式和惯用手法,三者的重要性依次递减,毕竟整体决策比局部决策的影响面更大。但是任何整体都是局部组成的,局部的决策也会影响全局。惯用手法的影响虽然是局部的,其作用仍然很重要。它不但在提高软件的质量方面,而且在加快软件开发进度方面都有很大贡献。本文介绍几种关于内存的惯用手法,这些手法对于老手来说已经习以为常,对于新手来说则是必修秘技。

1. 预分配

假想我们实现了一个动态数组(vector)时,当向其中增加元素时,它会自动扩展(缩减)缓冲区的大小,无需要调用者关心。扩展缓冲区的大小的原理都是一样的:

l 先分配一块更大的缓冲区。

l 把数据从老的缓冲区拷贝到新的缓冲区。

l 释放老的缓冲区。

如果你使用realloc来实现,内存管理器可能会做些优化:如果老的缓冲区后面有连续的空闲空间,它只需要简单的扩展老的缓冲区,而跳过后面两个步骤。但在大多数情况下,它都要通过上述三个步骤来完成扩展。

以此可见,扩展缓冲区对调用者来说虽然是透明的,但决不是免费的。它得付出相当大的时间代价,以及由此产生的产生内存碎片问题。如果每次向vector中增加一个元素,都要扩展缓冲区,显然是不太合适的。

此时我们可以采用预分配机制,每次扩展时,不是需要多大就扩展多大,而是预先分配一大块内存。这一大块可以供后面较长一段时间使用,直到把这块内存全用完了,再继续用同样的方式扩展。

预分配机制比较常见,多见于一些带buffer的容器实现中,比如像vector和string等。

2. 对象引用计数

在面向对象的系统中,对象之间的协作关系非常复杂。所谓协作其实就调用对象的函数或者向对象发送消息,但不管调用函数还是发送消息,总是要通过某种方式知道目标对象才行。而最常见的做法就是保存目标对象的引用(指针),直接引用对象而不是拷贝对象,提高了时间和空间上的效率,也避免了拷贝对象的麻烦,而且有的地方就是要对象共享才行。

对象被别人引用了,但自己可能并不知道。此时麻烦就来了,如果对象被释放了,对该对象的引用就变成了野针,系统随时可能因此而崩溃。不释放也不行,因为那样会出现内存泄露。怎么办呢?

此时我们可以采用对象引用计数,对象有一个引用计数器,不管谁要引用这个对象,就要把对象的引用计数器加1,如果不再该引用了,就把对象的引用计数器减1。当对象的引用计数器被减为0时,说明没有其它对象引用它,该对象就可以安全的释放了。这样,对象的生

命周期就得到了有效的管理。

对象引用计数运用相当广泛。像在COM和glib里,都是作为对象系统的基本设施之一。即使在像JA V A和C#等现代语言中,对象引用计数也是非常重要的,它是实现垃圾回收(GC)的基本手段之一。

代码示例: (atlcom.h: CcomObject)

STDMETHOD_(ULONG, AddRef)() {return InternalAddRef();}

STDMETHOD_(ULONG, Release)()

{

ULONG l = InternalRelease();

if (l == 0)

delete this;

return l;

}

3. 写时拷贝(COW)

OS内核创建子进程的过程是最常见而且最有效的COW例子:创建子进程时,子进程要继承父进程内存空间中的数据。但继承之后,两者各自有独立的内存空间,修改各自的数据不会互相影响。

要做到这一点,最简单的办法就是直接把父进程的内存空间拷贝一份。这样做可行,但问题在于拷贝内容太多,无论是时间还是空间上的开销都让人无法接受。况且,在大多数情况下,子进程只会使用少数继承过来的数据,而且多数是读取,只有少量是修改,也就说大部分拷贝的动作白做了。怎么办呢?

此时可以采用写时拷贝(COW),COW代表Copy on Write。最初的拷贝只是个假象,并不是真正的拷贝,只是把引用计数加1,并设置适当的标志。如果双方都只是读取这些数据,那好办,直接读就行了。而任何一方要修改时,为了不影响另外一方,它要把数据拷贝一份,然后修改拷贝的这一份。也就是说在修改数据时,拷贝动作才真正发生。

当然,在真正拷贝的时候,你可以选择只拷贝修改的那一部分,或者拷贝全部数据。在上面的例子中,由于内存通常是按页面来管理的,拷贝时只拷贝相关的页面,而不是拷贝整个内存空间。

写时拷贝(COW)对性能上的贡献很大,差不多任何带MMU的OS都会采用。当然它不限于内核空间,在用户空间也可以使用,比如像一些String类的实现也采用了这种方法。

代码示例(MFC:strcore.cpp):

拷贝时只是增加引用计数:

CString::CString(const CString& stringSrc)

{

ASSERT(stringSrc.GetData()->nRefs != 0);

if (stringSrc.GetData()->nRefs >= 0)

{

ASSERT(stringSrc.GetData() != _afxDataNil);

m_pchData = stringSrc.m_pchData;

InterlockedIncrement(&GetData()->nRefs);

}

else

{

Init();

*this = stringSrc.m_pchData;

}

}

修改前才拷贝:

void CString::MakeUpper()

{

CopyBeforeWrite();

_tcsupr(m_pchData);

}

void CString::MakeLower()

{

CopyBeforeWrite();

_tcslwr(m_pchData);

}

拷贝动作:

void CString::CopyBeforeWrite()

{

if (GetData()->nRefs > 1)

{

CStringData* pData = GetData();

Release();

AllocBuffer(pData->nDataLength);

memcpy(m_pchData, pData->data(), (pData->nDataLength+1)*sizeof(TCHAR));

}

ASSERT(GetData()->nRefs <= 1);

}

4. 固定大小分配

频繁的分配大量小块内存是内存管理器的挑战之一。

首先是空间利用率上的问题:由于内存管理本身的需要一些辅助内存,假设每块内存需要8字节用作辅助内存,那么即使只要分配4个字节这样的小块内存,仍然要浪费8字节内存。一块小内存不要紧,若存在大量小块内存,所浪费的空间就可观了。

其次是内存碎片问题:频繁分配大量小块内存,很容易造成内存碎片问题。这不但降低内存管理器的效率,同时由于这些内存不连续,虽然空闲却无法使用。

此时可以采用固定大小分配,这种方式通常也叫做缓冲池(pool)分配。缓冲池(pool)先分配一块或者多块连续的大块内存,把它们分成N块大小相等的小块内存,然后进行二次分配。由于这些小块内存大小是固定的,管理大开销非常小,往往只要一个标识位用于标识该单元是否空闲,或者甚至不需要任何标识位。另外,缓冲池(pool)中所有这些小块内存分布在一块或者几块连接内存上,所以不会有内存碎片问题。

固定大小分配运用比较广泛,差不多所有的内存管理器都用这种方法来对付小块内存,比如glibc、STLPort和linux的slab等。

5. 会话缓冲池分配(Session Pool)

服务器要长时间运行,内存泄露是它的威胁之一,任何小概率的内存泄露,都可能会累积到具有破坏性的程度。从它们的运行模式来看,它们总是不断的重复某个过程,而在这个过程中,又要分配大量(次数)内存。

比如像WEB服务器,它不断的处理HTTP请求,我们把一次HTTP请求,称为一次会话。一次会话要经过很多阶段,在这个过程要做各种处理,要多次分配内存。由于处理比较复杂,分配内存的地方又比较多,内存泄露可以说防不甚防。

针对这种情况,我们可以采用会话缓冲池分配。它基于多次分配一次释放的策略,在过程开始时创建会话缓冲池(Session Pool),这个过程中所有内存分配都通过会话缓冲池(Session Pool)来分配,当这个过程完成时,销毁掉会话缓冲池(Session Pool),即释放这个过程中所分配的全部内存。

因为只需要释放一次,内存泄露的可能大大降低。会话缓冲池分配并不是太常见,apache 采用的这种用法。后来自己用过两次,感觉效果不错。

当然还有其一些内存惯用手法,如cache等,这里不再多说。上述部分手法在《实时设计模式》里有详细的描述,大家可以参考一下。

笔者水平有限,若遗漏了某些重要的内存惯用手法,还望各位高手补充。

大内高手—常见内存错误

随着诸如代码重构和单元测试等方法引入实践,调试技能渐渐弱化了,甚至有人主张废除调试器。这是有道理的,原因在于调试的代价往往太大了,特别是调试系统集成之后的BUG,一个BUG花了几天甚至数周时间并非罕见。

而这些难以定位的BUG基本上可以归为两类:内存错误和并发问题。而又以内存错误最为普遍,即使是久经沙场的老手,也有时也难免落入陷阱。前事不忘,后世之师,了解这些常见的错误,在编程时就加以注意,把出错的概率降到最低,可以节省不少时间。

这些列举一些常见的内存错误,供新手参考。

1.内存泄露。

大家都知道,在堆上分配的内存,如果不再使用了,应该把它释放掉,以便后面其它地方可以重用。在C/C++中,内存管理器不会帮你自动回收不再使用的内存。如果你忘了释放不再使用的内存,这些内存就不能被重用,就造成了所谓的内存泄露。

把内存泄露列为首位,倒并不是因为它有多么严重的后果,而因为它是最为常见的一类错误。一两处内存泄露通常不至于让程序崩溃,也不会出现逻辑上的错误,加上进程退出时,系统会自动释放该进程所有相关的内存,所以内存泄露的后果相对来说还是比较温和的。当然了,量变会产生质变,一旦内存泄露过多以致于耗尽内存,后续内存分配将会失败,程序可能因此而崩溃。

现在的PC机内存够大了,加上进程有独立的内存空间,对于一些小程序来说,内存泄露已经不是太大的威胁。但对于大型软件,特别是长时间运行的软件,或者嵌入式系统来说,内存泄露仍然是致命的因素之一。

不管在什么情况下,采取比较谨慎的态度,杜绝内存泄露的出现,都是可取的。相反,认为内存有的是,对内存泄露放任自流都不是负责的。尽管一些工具可以帮助我们检查内存泄露问题,我认为还是应该在编程时就仔细一点,及早排除这类错误,工具只是用作验证的手段。

2.内存越界访问。

内存越界访问有两种:一种是读越界,即读了不属于自己的数据,如果所读的内存地址是无效的,程度立刻就崩溃了。如果所读内存地址是有效的,在读的时候不会出问题,但由于读到的数据是随机的,它会产生不可预料的后果。另外一种是写越界,又叫缓冲区溢出。所写入的数据对别人来说是随机的,它也会产生不可预料的后果。

内存越界访问造成的后果非常严重,是程序稳定性的致命威胁之一。更麻烦的是,它造成的后果是随机的,表现出来的症状和时机也是随机的,让B UG的现象和本质看似没有什么联系,这给BUG的定位带来极大的困难。

一些工具可以够帮助检查内存越界访问的问题,但也不能太依赖于工具。

内存越界访问通常是动态出现的,即依赖于测试数据,在极端的情况下才会出现,除非精心设计测试数据,工具也无能为力。工具本身也有一些限制,甚至在一些大型项目中,工具变得完全不可用。比较保险的方法还是在编程是就小心,特别是对于外部传入的参数要仔细检查。

3.野指针。

野指针是指那些你已经释放掉的内存指针。当你调用free(p)时,你真正清楚这个动作背后的内容吗?你会说p指向的内存被释放了。没错,p本身有

变化吗?答案是p本身没有变化。它指向的内存仍然是有效的,你继续读写p指向的内存,没有人能拦得住你。

释放掉的内存会被内存管理器重新分配,此时,野指针指向的内存已经被赋予新的意义。对野指针指向内存的访问,无论是有意还是无意的,都为此会付出巨大代价,因为它造成的后果,如同越界访问一样是不可预料的。

释放内存后立即把对应指针置为空值,这是避免野指针常用的方法。这个方法简单有效,只是要注意,当然指针是从函数外层传入的时,在函数内把指针置为空值,对外层的指针没有影响。比如,你在析构函数里把this 指针置为空值,没有任何效果,这时应该在函数外层把指针置为空值。

4.访问空指针。

空指针在C/C++中占有特殊的地址,通常用来判断一个指针的有效性。空指针一般定义为0。现代操作系统都会保留从0开始的一块内存,至于这块内存有多大,视不同的操作系统而定。一旦程序试图访问这块内存,系统就会触发一个异常。

操作系统为什么要保留一块内存,而不是仅仅保留一个字节的内存呢?原因是:一般内存管理都是按页进行管理的,无法单纯保留一个字节,至少要保留一个页面。保留一块内存也有额外的好处,可以检查诸如p=NULL;

p[1]之类的内存错误。

在一些嵌入式系统(如arm7)中,从0开始的一块内存是用来安装中断向量的,没有MMU的保护,直接访问这块内存好像不会引发异常。不过这块内存是代码段的,不是程序中有效的变量地址,所以用空指针来判断指针的有效性仍然可行。

电路图、工作原理、调试步骤

1、稳压电源电路图、工作原理、调试步骤 a)仪器的准备 1、调压器 2、变压器 3、指针万用表(2.5A插孔) 4、数字万用表 5、负载电阻12Ω/25W 6、电子电压表 b)电路的功能 该电路是一个串联形直流稳压电路,它是由电源变换电路、整流电路、滤波电路、稳压电路和负载组成。该电路可以实现整流、滤波、稳压。其中稳压部分包括基准电压、取样电路、比较放大器、调整电路等。 c)电路原理图 d)电路的原理 ◆稳压的工作原理 稳压电路是利用负反馈的原理,以输出电压的变化量ΔUL,经取样管VT3与基准电压7.5V(VD5稳压管提供)比较放大后,去控制调整管VT2的基极电流Ib,当Ib增大,调整管Uce将减小;当Ib减小,调整管Uce将增大;使输出电压UL基本保持不变。 当电网电压升高或输出电流减小时: Uo↑→Ub(VT3)↑→Ube(VT3)↑→Ic(VT3)↑→Uc(VT3)↓→Ub(VT1)↓→Ic(VT1)↓→Ic(VT2)↓→Uce(VT2) ↑→Uo↓ 当电网电压下降或输出电流变大时: Uo↓→Ub(VT3) ↓→Ube(VT3) ↓→Ic(VT3) ↓→Uc(VT3) ↑→Ub(VT1) ↑→Ic(VT1) ↑→Ic(VT2) ↑→Uce(VT2) ↓→Uo↓ ◆说明各元件在电路中的作用 VD1、VD2、VD3、VD4桥式整流电路。C6、C7、C8、C9滤波电容、保护整流二极管。VT1、VT2组成复合管,增大等效β值改善稳压性能。C1、C2、C3、C4、C5为滤波电容。R5为VD5限流电阻。R4给VT1的反向穿透电流提供一条通路,防止高温时,VT2出现失控。R8、RP1、R7为VT3分压偏置电阻。R1、R3为VT2负载电阻。R2、R6、R9为VT1偏置、负载电阻。 e)电路的测量步骤

备自投工作原理

微机备自投装置的基本原理及应用 本文介绍了微机线路备自投保护装置特性和应用中的供电方式,阐述其应用于母联备自投工作和线路备自投的工作原理及备自投保护装置运行条件及动作条件。 备自投保护供电方式技术条件 1.引言 随着我国人民生产生活的现代化程度日益提高,人们对电力的需求和依赖程度也在倍增,对电能质量的要求也更加严格,供配电在各个领域也不断向自动化、无人值守、远程控制、不间断供电的目标迈进。有些电力用户尤其对不间断供电的要求显得更加突出。我国的电力供应主要还是依靠国家电网供电,电力缺口也在不断增大,尤其在用电高峰期缺电现象严重,为此很多大型企业便自建电厂或配备发电机,因此各种电源的相互切换,保证电源的不间断供电和供电的高可靠性成了现代配电工程中保护和控制回路的重要部分。在GB50062 《电力装置的继电保护和自动装置设计规范》中的第十一章也明确规定了备用电源和备用设备的自动投入的具体要求。 微机线路备自投保护装置使系统自动装置与继电保护装置相结合,是一种对用户提供不间断供电的经济而又有效的技术措施,它在现代供电系统中得到了广泛的应用。在此只对微机线路备自投保护装置在电力系统中两种备自投方式和基本原理进行探讨。

微机线路备自投保护装置(以下简称备自投)核心部分采用高性能单片机,包括CPU模块、继电器模块、交流电源模块、人机对话模块等构成,具有抗干扰性强、稳定可靠、使用方便等优点。其液晶数显屏和备自投面板上所带的按键使得操作简单方便,也可通过RS485通讯接口实现远程控制。装置采用交流不间断采样方式采集到信号后实时进行傅立叶法计算,能精确判断电源状态,并实施延时切换电源。备自投具有在线运行状态监视功能,可观察各输入电气量、开关量、定值等信息,其有可靠的软硬件看门狗功能和事件记录功能。 产品在不同的电压等级如110kV、10kV、0.4kV系统的供配电回路中使用时需要设定不同的电气参数,在订货时必须注明。在选择备自投功能时则一定不可以投入低电压保护,以免冲突引起拒动或误动。 变配电站备自投有两种基本的供电方式。第一种如图1所示母联分段供电方式,母联开关断开,两个工作电源分别供电,两个电源互为备用,此方式称为母联备自投方式。第二种如图2所示双进线向单母线供电方式,即由一个工作电源供电,另一个电源为备用,此方式称为线路备自投方式。

现场备自投实验调试心得李明阳

进线备自投实验失败心得 项目现场:大连香洲田园城项目 主要设备:两台PMC-651F和1台PMC-6830L 现场问题描述:现场两条进线1#和2#,PMC-6830L进线自投逻辑已正确输入到装置中,实验过程中,1#进线无压无流条件满足后,备自投跳开1#进线,达到合闸时间后备自投合2#进线,可以实现,但当2#进线满足无压无流条件后,备自投跳开2#进线后,1#进线合闸不成功。 问题解决过程:检查发现1#进线保护灯亮,事件是外保护动作,可以复归,分析可能是导致合闸不成功的原因,重新做试验发现只要2#进线合闸,1#进线保护装置保护灯点亮,并报出外保护动作事件,不可以复归,只有2#进线断路器分闸后,才可复归,检查PMC-6830L事件,查看到存在合1#进线命令,也听到断路器动作声音,但是没合上闸,说明备自投逻辑没问题,问题出在外保护动作信号上。由于出现了2#进线可以成功自投合闸,说明两条进线的接线不一致;经过查看联跳入口处的原理图纸,然后检查两条进线的接线,发现1#进线断路器的的合闸的信号没有接到2#进线的保护联跳入口处,处于悬空状态,而2#进线断路器的合闸信号接到了1#进线保护的联跳入口处;从原理上讲在2#进线跳开后,4S 合闸时间时间已足够1#进线保护的联跳继电器复归,解除跳闸信号;另外在断路器分闸的情况下,是不需要保护动作的,这是不合理的现象; 为了现场能顺利送电,备自投功能的实现,建议把对侧合闸联锁信号由原来的联跳入口改接到跳闸入口,重新做实验备自投功能可以正常实现; 该问题既有图纸设计问题又有装置本身的继电器问题,首先两条进线的联锁信号不应该接到对侧的联跳入口处,会导致在本侧分闸时,对侧合闸后,本侧会出现保护动作信号;其次在对侧进线跳开后,本侧的联跳继电器没有复归。

10kV备自投调试报告

10kV精细化工开关站 备自投装置试验报告 主管: 审核: 检验: 湖南鸿源电力建设有限公司 2016年12月

10kV备自投试验报告 安装地点:精细化工开关站间隔名称:公用测控屏一、刻度调试 条件:加相电压 100V,加进线电流5A 装置型号ISA-358G 制造厂家长园深瑞继保自动化有限公司 刻度试验 1#进线柜(661开关)2#进线柜(662开关) Uab1 Ubc1 IL1 Uab2 Ubc2 IL2 10.02kV 10.01kV 4.991A 10.01kV 10.03kV 4.995A 检查结果 备注: 二、整定值、闭锁调试 整定值调试 有压值70V 无压值30V 无流值0.2A 大于整定值105%,有压动作小于整定值95%,无压动作大于整定值105%,可靠动作闭锁备 自投 小于整定值95%,有压不动作大于整定值105%,无压不动作小于整定值95%,其他条件满足是, 自投能启动 自投跳进线开关时间8529毫秒/8531毫秒 661开关手跳、保护跳闸闭锁自投闭锁备自投动作。 662开关手跳、保护跳闸闭锁自投闭锁备自投动作。 661、662开关有流闭锁自投闭锁备自投动作 661开关TV断线闭锁自投闭锁备自投动作,发I母TV断线告警信号。 662开关TV断线闭锁自投闭锁备自投动作,发II母TV断线告警信号。 闭锁备自投压板投入闭锁备自投动作。 检查结果合格

三、自投逻辑功能试验 序号自投1 自投2 自投条件I段母线电压失压、II段母线电压有压、#1进线无流II段母线电压失压、I段母线电压有压、#2进线无流动作前开关状态661开关合,662开关合,660开关分661开关合,662开关合,660开关分动作情况自投动作,跳661开关,合660开关。自投动作,跳662开关,合660开关。 检查结果合格 整定通知单编号珠调继字P16042号 备自投整定值:有压定值:70V 无压定值:30V 无流定值:0.2A 自投跳进线开关时间:8.5秒 调试人员:调试日期:2016年12 月26日

操作系统原理答案(张丽芬)

第2章习题答案 2-9. (1)x<=3 运行顺序为Px,P3,P5,P6,P9 T=(x+(x+3)+(x+3+5)+(x+3+5+6)+(x+3+5+6+9))/5=x+ (2)3

作业4还未到,只能选作业3运行。 作业3运行到结束,再计算剩余的作业2和4: 作业2的响应比=(()+)/= 作业4的响应比=( /=2 选作业2运行。 作业2到完成。最后运行作业4。运行到,全部结束。 各个作业的周转时间计算如下: t1=2 t2== t3= t4== 各个作业的平均周转时间计算如下: T==(2++1+/4= 各个作业的平均带权周转时间计算如下: W=(2/2++1/+/4= 2-13.已知作业A,B,C,D,E需要的运行时间分别为10,6,2,4,8分钟,优先级分别为3,5,2,1,4。 (1)轮转法(假定时间片=2分钟) 作业完成的顺序为C,D,B,E,A 开始作业轮转一周需10分钟, 作业C的周转时间:Tc=10分钟(6分) C完成后,剩下四个作业,轮转一周需8分钟, 作业D的周转时间:Td=10+8×(4-2)/2=18分钟(16分) D完成后,剩下三个作业,轮转一周需6分钟, 作业B的周转时间:Tb=18+6×(6-2-2)/2=24分钟(22分) B完成后,剩下两个作业,轮转一周需4分钟, 作业E的周转时间:Te=24+4=28分钟(28分) E完成后,只剩下作业A, 作业A的周转时间:Ta=28+2=30分钟(30分) 平均周转时间:T=(10+18+24+28+30)/5=22分(分) (2)优先级调度法 作业完成顺序为:B,E,A,C,D Tb=6分,Te=6+8=14分,Ta=14+10=24分,Tc=24+2=26分, Td=26+4=30分。 平均周转时间:T=(6+14+24+26+30)/5=20分 第3章习题答案 3-7. 系统中有n+1个进程。其中A1、A2、…、An分别通过缓冲区向进程B发送消息。相互之间的制约关系为:发送进程A1、A2、…、An要互

调试器工作原理探究系列第三篇

本文是调试器工作原理探究系列的第三篇,在阅读前请先确保已经读过本系列的第一和第二篇。 本篇主要内容 在本文中我将向大家解释关于调试器是如何在机器码中寻找C 函数以及变量的,以及调试器使用了何种数据能够在C源代码的行号和机器码中来回映射。 调试信息 现代的编译器在转换高级语言程序代码上做得十分出色,能够将源代码中漂亮的缩进、嵌套的控制结构以及任意类型的变量全都转化为一长串的比特流——这就是机器码。这么做的唯一目的就是希望程序能在目标CPU上尽可能快的运行。大多数的C代码都被转化为一些机器码指令。变量散落在各处——在栈空间里、在寄存器里,甚至完全被编译器优化掉。结构体和对象甚至在生成的目标代码中根本不存在——它们只不过是对内存缓冲区中偏移量的抽象化表示。 那么当你在某些函数的入口处设置断点时,调试器如何知道该在哪里停止目标进程的运行呢?当你希望查看一个变量的值时,调试器又是如何找到它并展示给你呢?答案就是——调试信息。 调试信息是在编译器生成机器码的时候一起产生的。它代表着可执行程序和源代码之间的关系。这个信息以预定义的格式进行编码,并同机器码一起存储。许多年以来,针对不同的平台和可执行文件,人们发明了许多这样的编码格式。由于本文的主要目的不是介绍这些格式的历史渊源,而是为您展示它们的工作原理,所以我们只介绍一

种最重要的格式,这就是DWARF。作为Linux以及其他类Unix平台上的ELF可执行文件的调试信息格式,如今的DWARF可以说是无处不在。 ELF文件中的DWARF格式 根据维基百科上的词条解释,DWARF是同ELF可执行文件格式一同设计出来的,尽管在理论上DWARF也能够嵌入到其它的对象文件格式中。 DWARF是一种复杂的格式,在多种体系结构和操作系统上经过多年的探索之后,人们才在之前的格式基础上创建了DWARF。它肯定是很复杂的,因为它解决了一个非常棘手的问题——为任意类型的高级语言和调试器之间提供调试信息,支持任意一种平台和应用程序二进制接口(ABI)。要完全解释清楚这个主题,本文就显得太微不足道了。说实话,我也不理解其中的所有角落。本文我将采取更加实践的方法,只介绍足量的DWARF相关知识,能够阐明实际工作中调试信息是如何发挥其作用的就可以了。 ELF文件中的调试段

备自投保护工作的原理

备自投保护工作的原理 一、备自投保护工作的原理 A、进线备自投及自恢复原理 进线1为本说明中的主回路来安变AH1柜,进线2为本说明中马2线AH10柜。以下按照进线1和进线2作说明。 1、进线备自投:(进线1合位,进线2分位) 备自投充电的条件如下(只有备自投充电完成后备自投才能动作) a、进线1电源正常,且开关在合位; b、进线2开关分位; c、备自投检测到进线1合位信号(常开接点接入开入量3); d、备自投检没有测到进线2合位信号(常开接点接入开入量4); e、备自投没有被闭锁(入开入量7没有信号接入); 满足以上五个条件时,备自投充电15秒后充电完成,保护液晶屏上显示“充电1”,;当母线失压时,则延时跳开进线1开关,经延时后合上进线2开关。 2、自恢复:(进线1分位,进线2合位) 自恢复的条件是: a、进线1开关分位; b、进线2开关合位; c、备自投没有检测到进线1合位信号(常开接点接入开入量3); d、备自投检测到进线2合位信号(常开接点接入开入量4); 满足以上四个条件后,当进线1恢复有压时,“自恢复”动作,则

延时后跳开进线2开关,经延时后合上进线1开关。 本次工厂停电时的系统工作状态正好符合系统自恢复工作条件,导致本次停电事件的发生。 二、其他情况 1、停电后,公司设备管理人员对设备进行了几次手动操作实验,发现手动分进线1开关,备自投自动合进线2开关。 针对手动操作时,备自投出现合进线2开关的情况,我部门仔细询问了综保生产厂家技术支持后得知,本综保出厂参数在调试过程中有改动,定值中的“合断路器延时”1S改为了0秒,造成备自投对“手动操作”与“自投发出分闸信号”无法加以判断。在此也表述一下手动操作的判断逻辑,具体如下: 手动操作判断逻辑:-----手动分进线1开关-----进线1开关状态信号转换-----开入量由合到分-----备自投装置延时(0.5~1S)判断-----进线1开关状态信号转换时间是否在备自投发出分闸信号前-----是-----备自投不充电------程序运行终止-----不发出合进线2信号。 回路故障动作判断逻辑:----回路故障----进线柜保护综保发出分进线断路器信号-------进线开关状态信号转换-----开入量由合到分-----备自投装置延时(0.5~1S)判断-----进线开关状态信号转换时间是否在备自投发出分闸信号前-----是-----备自投不充电------程序运行终止-----不发出合另一进线命令信号。 从以上“手动操作”和“回路故障动”逻辑很清楚可以看出,备自投装置延时(0.5~1S)判断这个值很关键,如果没有这个判断时间节点,

快切装置替换低压备自投安装调试方法

快切装置替换低压备自投安装调试方法 摘要 文章简要说明了目前低压备自投装置存在的缺点及400V电源快速切换装置(以下简称“快切装置”)与备自投对比下的优点,根据炼化低压单母分段方式运行的情况,以金智MFC5101A工业企业快切装置为例,详细论述400V电源快切装置替换低压备自投装置的安装调试方法。 关键词:快切;备自投;接线;调试;方法 1、前言 石化、冶金等大中型工业企业,由于外部电网或部供电网络故障或异常的原因,造成非正常停电、电压大幅波动或短时断电(俗称“晃电”)的情况屡见不鲜。由于冶金、石化企业工艺流程的特殊性,供电的中断或异常往往会造成设备停运或空转、工艺流程中断或废品产生,有时甚至造成生产设备的报废等严重后果。 目前在石化、冶金等要求连续供电的企业,低压备自投使用效果并不理想。原因是备自投完成动作的过程持续时间长短1—2秒,甚至更长,一些重要装置的机泵跳停后,1秒左右就达到连锁条件,造成装置停车。主要原因一是备自投装置启动太迟,二是备自投装置启动后将备用电源投入的时间太长。工业企业电源快切装置的优点是①安全性,在切换过程中,装置实时跟踪开关两侧电源的电压、频率和相位,并提供了多种可靠的起动方式和切换方式,能够保证快速安全的投入备用电源,同时不会对电动机造成大的冲击。②灵活性,仅需更改部分定值即可满足多种现场工程实施需求。③快速性、准确性,高精度AD采样芯片,保证了数据的实时性以及切换的快速性。④可靠性,在

硬件和软件上均设计了专门的抗干扰措施,其抗干扰性能有充分的保证。 下面以金智MFC5101A快切装置为例,详细讲解快切装置替换低压备自投装置的过程。 2、快切装置参数及低压电力系统主接线方式 2.1、MFC5101A快切装置主要技术指标 MFC5101A有手动起动、保护起动、失压起动、误跳起动、无流起动、逆功率起动等多种起动方式;有并联、串联和同时切换方式;有快速切换、同期捕捉切换、残压切换、长延时切换等实现方式;切换闭锁功能,其主要技术指标如下表。 表一MFC5101A主要技术指标

操作系统原理考题及答案

《操作系统原理》期末考试题 班级学号姓名 一、单项选择题(每题2分,共26分) 1.操作系统是一种()。 A. 系统软件 B. 系统硬件 C. 应用软件 D. 支援软件 2.分布式操作系统与网络操作系统本质上的不同在于()。 A.实现各台计算机这间的通信 B.共享网络中的资源 C.满足较在规模的应用 D.系统中多台计算机协作完成同一任务 3.下面对进程的描述中,错误的是()。 A.进程是动态的概念 B. 进程执行需要处理机 C.进程是指令的集合 D. 进程是有生命期的 4.临界区是指并发进程中访问共享变量的()段。 A.管理信息 B.信息存储 C.数据 D.程序 5.要求进程一次性申请所需的全部资源,是破坏了死锁必要条件中的哪一条()。 A.互斥 B.请求与保持 C.不剥夺 D.循环等待 6.以下哪种存储管理不可用于多道程序系统中()。 A.单一连续区存储管理 B.固定式区存储管理 D. 段式存储管理 C.可变分区存储管理7.在可变式分区存储管理

中,某作业完成后要收回其主存空间,该空间可能与 1 / 8 相邻空闲区合并,修改空闲区表,使空闲区数不变且空闲区起始地址不变的 情况是()。 A.无上邻空闲区也无下邻空闲区 B.有上邻空闲区但无下邻空闲区 C.有下邻空闲区但无上邻空闲区 D.有上邻空闲区也有下邻空闲 区 8.系统“抖动”现象的发生不是由()引起的。 A.置换算法选择不当 B.交换的信息量过大 C.主存容量不足 D.请求页式管理方案 9.在进程获得所需全部资源,唯却CPU时,进程处于()状态。 A.运行 B.阻塞 C.就绪 D.新建 10.要页式存储管理系统中,将主存等分成()。 A.块 B.页 C.段长 D.段 11.系统利用SPOOLING技术实现()。 A.对换手段 B.虚拟设备 C.系统调用 D.虚拟存储 12.设备从磁盘驱动器中读出一块数据的总时间为()。 A.等待时间+ 传输时间 B.传输时间 D.延迟时间+ 查找时间+ 传输时间 C.查找时间+ 传输时间 13.如果允许不同用户的文件可以具有相同的文件名,通常采用()

TI低功率SmartPA调试系列之一扬声器工作原理及软件

Application Notes 1 TI 低功率Smart PA 调试系列之一: 扬声器工作原理及软件调试入门 Anjin Du/Ding Wei/Xiangyan Xue 摘要 本系列汇集了关于TI 低功率Smart PA 的四篇应用笔记,分别从扬声器基础、软件调试、算法等方面介绍了TI 低功率Smart PA 技术。本文是这个系列的第一篇,主要介绍了扬声器的基础知识和工作原理,以及TI 低功率闭环Smart PA 器件的架构和调试入门,是后续文章的基础。 随后的系列应用笔记还包括《TI Smart PA 基础调音指南》、《TAS25xx Smart AMP Anti-Clipper 模块的音效调试》、《TI Smart PA 算法介绍》。 目录 1 扬声器工作原理及结构 (2) 1.1 电动式扬声器的工作原理: (2) 1.2 电动式扬声器的结构: (3) 1.3 扬声器的音质的评判 (6) 2 扬声器的主要参数 (6) 3 低功率Smart PA 的引入及其对扬声器性能的提升 (10) 3.1 传统应用中扬声器参数对其性能的限制 (10) 3.2 低功率Smart PA 的工作原理及其对扬声器性能的提升 (10) 4 PPC3 软件的使用以及喇叭参数的获取 (12) 4.1 PPC3(Pure Path Console 3)软件介绍 (12) 4.2 扬声器参数的建模提取 (13) 5 总结 .............................................................................................................................................. 15 6 参考资料 (15) 图 Figure 1电动式扬声器工作原理示意图 (3) Figure 2电动式扬声器结构框图 (4) Figure 3 扬声器的主要组成构件 (4) Figure 4 传统功放和低功率闭环Smart PA 功放的工作原理比较 (11) Figure 5 Smart PA 架构 (12) Figure 7 PPC3 典型界面 (13) Figure 8 扬声器参数提取的硬件环境 (14) Figure 9 Smart PA 参数界面 (15)

电力系统备自投的原理说明

电力系统备自投的原理说明 九十年代初期,厂用电系统的综合保护逐步受到重视,在一些工程中使用了进口的电动机综合保护装置。后来国内一些厂家仿进口装置开发了模拟式电动机综合保护装置,但普遍存在着零漂影响大,误动作多等缺点,到目前为止微机型厂用电系统综合保护装置已普遍取代了过去传统的继电器和模拟式装置。 随着计算机技术的不断发展,控制现场对控制装置的自动化水平要求越来越高。现场DCS的普遍应用,使得将保护、控制、测量及通讯功能集于一体成为可能,且为现场所急需。为了适应现场的需要,我们在MPW-1、2系列厂用电系统微机综合保护装置的基础上进行了极大的改进与发展,开发出集保护、控制、测量及通讯功能于一体的第三代微机型厂用电系统综合保护及控制装置。 MPW-4系列厂用电系统综合保护及控制装置应用先进的保护原理,软、硬件采用模块化体系结构和高抗干扰设计,操作简单、实用,运行可靠。产品包括电动机综合保护及控制装置、电动机差动保护、低压变压器综合保护及控制装置、线路综合保护及控制装置、分支综合保护及控制装置、备用电源自投装置及SC-9000保护通讯控制器(电气工程师站),适用于电力、石油、化工、冶金、煤炭等领域的保护、控制及综合自动化系统。 MPW-4系列装置具有如下特点:

1.采用高性能的高速DSP(TMS320DSP243)单片数字信号处理控制器作为主控单元。 2.采用高速14位AD,极大提高测量精度。保护通道误差小于0.5%,时间误差小于20ms。量测通道误差小于0.2%。 3.用大容量串行EEPROM存放保护定值、运行参数、统计值、事件记录及故障记录,保证数据安全可靠。 4.采用全交流采样,软件数字滤波,彻底消除了硬件电路零漂的影响。 5.全中文液晶显示,操作界面直观简便。 6.装置具有完善的自检功能;三级Watchdog及电源监视功能,保证装置可靠运行。 7.所有定值和参数均可在面板上直接操作或通过网络在电气工程师站操作。 8.具有故障录波及电动机启动过程自动录波功能,可记录出口动作时刻的运行参数及电机启动过程的电流最大值,实现故障波形及启动过程波形的再现。 9.独有电动机自启动过程的自动识别功能,可有效防止电动机自启动过程的保护误动。 10.电动机保护(综合保护及差动保护)的定值,采用启动过程的定值与正常运行时的定值独立设置的方式,既可以保证启动时不误动,

400V系统备自投试验方法及步骤1

一、上电前的检查: 1.装置安装及接线检查。 2.装置就位正确无误。 3.柜内所有控制连接线连接正确无误。 4.柜内输出到端子正确无误。 5.柜外所有控制连接线连接到柜内端子正确无误。 6.交流电源输入正确无误。 7.电源回路绝缘测试符合技术要求。 8.主要设备安全可靠接地。 二.方法: 利用目前运行电源,作为I段和II段进线电源,来模拟400V 系统备自投,检查备自投流程,动作情况及信号。 三..步骤: 400V系统有二种备自投方式,即I段和II段进线电源都失电时,运行村和柴油机分别作为备用电源,给I段或II段供电(备用电源只给I段或II段其中一段母线供电)。 方式一.运行电源作为备用电源。 1.用2个空气开关并运行中电源至400V系统I段和II 段进线上,作为这二段的进线电源(相序保持一致)。 2.切除I段和II段上的所有负荷电源。

3.手动把BC2,BC3,BC4,BC5开关分闸,并切为远方位置。 4.手动合上BC1,BC6开关,让I段和II段分段运行,并切为远方位置。 5.分掉BC1进线上的空气开关,让BC1开关自动无压分闸。 6.分掉BC6进线上的空气开关,让BC6开关自动无压分闸。 7.公用LCU检测运行中线路有压时,发令合BC4开关,使Ш段母线带电。 8.公用LCU检测BC1处于分闸位置时(非故障跳闸),发令合I-Ш段母联开关BC2,使I段母线带电运行(如公用LCU检测BC2由于故障原因未合闸并且BC6处于分闸位置时(非故障跳闸),发令合II-Ш段母联开关BC5,使II段母线带电运行)。 9.公用LCU发备自投动作信号,备自投结束。 方式二.柴油机作为备用电源。 1.用2个空气开关并运行中电源至400V系统I段和II 段进线上,作为这二段的进线电源(相序保持一致)。2.切除I段和II段上的所有负荷电源。 3.手动把BC2,BC3,BC4,BC5开关分闸,并切为远方位置。

操作系统原理练习题附答案

《操作系统原理》练习题 一、填空题 1. 每个进程都有一个生命周期,这个周期从__(1)__开始,到__(2)__而结束。 2. 当一个进程独占处理器顺序执行时,具有两个特性:__(3)__和可再现性。 3. 并发进程中与共享变量有关的程序段称为__(4)__。 4. 一个进程或者由系统创建,或者由__(5)__创建。 5. 一个进程的静态描述是处理机的一个执行环境,被称为__(6)__。 6. 信号量的物理意义是:信号量大于0,其值为__(7)__;信号量小于0,其绝对值为__(8)__。 7. 系统有某类资源5个,供3个进程共享,如果每个进程最多申请__(9)__个该类资源,则系统是安全的。 8. 不可中断的过程称为__(10)__。 9. 操作系统中,进程可以分为__(11)__进程和__(12)__进程两类。 10. 操作系统为用户提供两种类型的使用接口,它们是__(13)__接口和__(14)__接口。 11. 批处理操作系统中,操作员根据作业需要把一批作业的有关信息输入计算机系统,操作系统选择作业并根据__(15)__的要求自动控制作业的执行。 12. 在批处理兼分时的系统中,往往由分时系统控制的作业称为前台作业,而由批处理系统控制的作业称为__(16)__作业。 13. 采用SPOOL技术的计算机系统中,操作员只要启动__(17)__程序工作,就可以把作业存放到__(18)__中等待处理。 14. 作业控制方式有__(19)__方式和__(20)__方式二种。 15. 对资源采用抢夺式分配可以防止死锁,能对处理器进行抢夺式分配的算法有__(21)__算法和__(22)__算法。 16. 因争用资源产生死锁的必要条件是互斥、__(23)__、不可抢占和__(24)__。 17. 死锁的形成,除了与资源的__(25)__有关外,也与并发进程的__(26)__有关。 18. 为破坏进程循环等待条件,从而防止死锁,通常采用的方法是把系统中所有资源类进行__(27)__,当任何一个进程申请两个以上资源时,总是要求按对应资源号__(28)__次序申请这些资源。 19. 内存管理的核心问题是如何实现__(29)__的统一,以及它们之间的__(30)__问题。 20. 页式存储管理中,处理器设置的地址转换机构是__(31)__寄存器。 21. 在页式和段式存储管理中,__(32)__存储管理提供的逻辑地址是连续的。 22. 实现地址重定位或地址映射的方法有两种:__(33)__和__(34)__。 23. 在响应比最高者优先的作业调度算法中,当各个作业等待时间相同时,__(35)__的作业将得到优先调度;当各个作业要求运行的时间相同时,__(36)__的作业得到优先调度。 24. 确定作业调度算法时应注意系统资源的均衡使用,即使CPU繁忙的作业和__(37)__的作业搭配使用。 25. 按照组织形式分类文件,可以将文件分为普通文件、目录文件和__(38)__。 26. 文件系统为用户提供了__(39)__的功能,以使得用户能透明地存储访问文件。 27. 文件名或记录名与物理地址之间的转换通过__(40)__实现。 28. 文件的__(41)__与文件共享、保护和保密紧密相关。

备自投的设计与调试方法举例

备自投的设计与调试方法举例 结合实际情况,针对现场应用中遇到的问题,从较为简单的内桥接线方式时的进线备自投入手,对备自投的设计及调试方法进行了分析及探讨。 标签:备自投跳闸闭锁可靠性 1 概述 “备自投”是备用电源自动投入装置和备用设备自动投入装置的简称。“备自投”装置可以大大改进电网的供电能力,减轻重载线路的负荷,对短路电流进行限制,以确保正常地、连续地供电。近些年来,电网供电系统有了进一步的发展,“备自投”装置也从技术和应用方面有了很大的改进。但在实际应用过程中,这种装置的运行模式以及逻辑关系都达不到电网运行规范,因此有的电网系统即便已安装了备自投装置,却无法使其发挥真正的作用。笔者在本文中就进线备自投设计时不得不注意的几个问题进行可深入的分析,同时根据问题产生的根源制定了一系列解决问题的方案,并且对调试方法进行了举例分析。 2 内桥接线方式进线备自投的动作过程分析 首先对较常见的内桥接线方式的进线备投进行详细的阐述。如图1 当1DL分位,2DL、3DL合位,2#进线处于运行状态时,1#进线为2#进线备用,称为进线备投方式。 对于进线备投,当正常运行时,1#进线处于热备用,2#进线处于运行状态,3DL合位,此时系统的特点: ①开关量的特点为1DL为分位,2DL、3DL为合位。 ②电气特点为1、2#母线电压为正常电压,1、2#进线线路电压正常,我们把以上电气量与开关量的状态称为允许备投启动状态,就是我们常说的充电状态。 取一种最简单常见的故障,当2#进线对侧发生故障,对侧开关跳闸(两侧都不投重合闸),本侧开关尚未跳开时,称为状态二,此时系统的特点: ①开关量特點应为1DL为分位,2DL、3DL为合位。 ②电气量特点应为1、2母线失压,同时进线2无压。 那么此时备自投就应该立即启动,去跳开本侧2#进线开关,同时合上1#进线开关恢复正常供电。由于出现状态2以后备自投即启动动作,所以把状态2称作备投启动状态。 以上即为进线备投的一个简单准备、启动、动作过程。但是备自投在实际应用中还要与线路(变压器)保护及重合闸配合使用,因此还有许多需要注意的地方。 3 备投在实际应用中需要注意的问题 3.1 备自投装置应保证只动作一次 当工作母线发生永久性故障或引出线上发生永久性故障,且没有被出线断路器切除时,由于工作母线电压降低,备自投装置动作,第一次将备用电源或备用设备投入,因为故障仍然存在,备用电源或备用设备上的继电保护会迅速将备用电源或备用设备断开,此时再投入备用电源或备用设备,不但不会成功,还会使备用电源或备用设备、系统再次遭受故障冲击,并造成扩大事故、损坏设备等严重的后果。实现方法:当系统满足状态一时,控制备用电源或设备断路器的合闸脉冲,使之只动作一次,就是我们通常称之为的充电状态。

操作系统原理与实践教程(第二版)第2章习题答案

第2章操作系统的界面 (1) 请说明系统生成和系统引导的过程。 解: 系统的生成过程:当裸机启动后,会运行一个特殊的程序来自动进行系统的生成(安装),生成系统之前需要先对硬件平台状况进行检查,或者从指定文件处读取硬件系统的配置信息,以便根据硬件选择合适的操作系统模块组,比较重要的信息通常有:CPU类型、内存大小、当前关联设备的类型和数量以及操作系统的重要功能选项和参数。按照这些信息的指示,系统生成程序就可以正确地生成所需的操作系统。 系统引导的过程:系统引导指的是将操作系统内核装入内存并启动系统的过程。主要包括初始引导、内核初始化、全系统初始化。初始引导工作由BIOS完成,主要完成上电自检,初始化基本输入输出设备,载入操作系统内核代码等工作。内核被载入内存后,引导程序将CPU控制权交给内核,内核将首先完成初始化功能,包括对硬件、电路逻辑等的初始化,以及对内核数据结构的初始化,如页表(段表)等。全系统初始化阶段要做的就是启动用户接口程序,对系统进行必要的初始化,使系统处于等待命令输入状态。 (2) 操作系统具有哪些接口?这些接口的作用是什么? 解: 操作系统为用户提供的接口有图形接口、命令接口和程序接口几种形式。 操作系统包括三种类型的用户接口:命令接口(具体又可分为联机命令接口与脱机命令接口)、程序接口及图形化用户接口。其中,命令接口和图形化用户接口支持用户直接通过终端来使用计算机系统,而程序接口则提供给用户在编制程序时使用。 (3) 请说明操作系统具有的共性服务有哪些不同类别,这些类别分别用于完成什么功能? 解:所有的操作系统都通过一些基本服务来帮助用户简单便捷地使用计算机各类资源,它们包括以下几个类别: 1.控制程序运行:系统通过服务将用户程序装入内存并运行该程序,并且要控制程序 在规定时间内结束。 2.进行I/O操作:用户是不能直接控制设备的,只能通过操作系统与外部设备进行交 互,由系统调用将结果显示在屏幕上或交给用户。 3.操作文件系统:为了保证实现“按名存取”,文件系统应该为用户提供根据文件名 来创建、访问、修改、删除文件的方法,以确保文件数据的安全可靠以及正确存取。 4.实现通信:操作系统需要提供多个程序之间进行通讯的机制,来控制程序的执行顺 序。 5.错误处理:操作系统通过错误处理机制,以便及时发现错误并采取正确的处理步骤, 避免损害系统的正确性和统一性。 (4) 系统调用的用途是什么? 解: 通常,在操作系统内核设置有一组用于实现各种系统功能的子程序(过程),并将它们提供给用户程序调用。每当用户在程序中需要操作系统提供某种服务时,便可利用一条系统调用命令,去调用所需的系统过程。这即所谓的系统调用。系统调用的主要类型包括: 1.进程控制类,主要用于进程的创建和终止、对子进程结束的等待、进程映像的替换、 进程数据段大小的改变以及关于进程标识符或指定进程属性的获得等; 2.文件操纵类,主要用于文件的创建、打开、关闭、读/写及文件读写指针的移动和

微机原理实验一调试程序的使用

物理与机电工程系 (2015——2016 学年第一学期) 《调试程序的使用》 上机实验报告 专业:电子信息科学与技术 学号: 1524812252 姓名:刷卡机 任课教师:风机房 实验地点:理工实验楼9007 项目编号:实验一

执行R命令,即查看、修改CPU寄存器的内容,此时执行结果为: AX =0000 DS=1420 BX=0000 SS=1420 CX=0000 CS=1420 DX=0000 ES=1420 执行D命令,即显示存储单元中的内容命令,此时执行结果为:1420:0100 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 1420:0110 00 00 00 00 00 00 00 00-00 00 00 00 34 00 0F 14 ................ 1420:0120 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 1420:0130 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

-T AX=EE9A BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1420 ES=1420 SS=1420 CS=1420 IP=0129 NV UP EI NG NZ AC PE NC 1420 : 0129 0000 ADD [BX+SI] , AL DS:0000=D1 这是第一条指令执行后的结果和各寄存器内的存储变化码以及其机器显示,此时的标志位为NV UP EI NG NZ AC PE NC 即 溢出标志OF=0 不溢出方向标志DF=0增) 中断标志IF=1开中断符号标志SF=1为负 零标志ZF=0为非零辅助进位AF=1辅助有进位

备自投原理

主所33KV自投原理 批准: 审核: 初核: 编制: 广州地铁四号线供变电 2012年02月

主要内容 1、什么是备用电源自动投入装置? 2、备自投装置应满足哪些基本要求? 3、分段自投原理。 4、备用电源自动投入条件。 5、运行中应注意的几个问题。 一.什么是备用电源自动投入装置? 备用电源自动投入装置是当工作电源因故障断开以后,能自动而迅速地将备用电源投入到工作或将用户切换到备用电源上去,从而使用户不至于被停电的一种自动装置,简称备自投装置。 二、备自投装置应满足哪些基本要求? 1、工作电源断开后,备用电源才能投入; 2、备自投装置投入备用电源断路器必须经过延时,延时时限应大于最长的外部故障切除时间. 3、在手动跳开工作电源时,备自投不应动作。 4、应具备闭锁备自投装置的逻辑功能,以防止备用电源投到故障的元件上,造成事故扩大的严重后果。 5、备用电源无压时,BZT不应动作; 6、BZT在电压互感器(PT)二次熔断器熔断时不应误动,故应设置PT短线告警; 7、BZT只能动作一次,防止系统受到多次冲击而扩大事故; 三、备自投原理 备自投的主要形式有: 桥备投、分段备投、母联备投、线路备投、变压器备投。

单母线分段 1、备自投的主要形式有: (1)若正常运行时,一台主变带两段母线并列运行,另一台主变作为明备用,采用进线(变压器)备自投;若正常运行时,两段母线分列运行,每台主变各带一段母线,两段母线互为暗备用,采用分段备自投。 (2)若正常运行时,一条进线带两段母线并列运行,另一条进线作为明备用。采用进线备自投;若正常运行时,每条进线各带一段母线,两条进线互为暗备用,采用分段备自投。 2、模拟量输入 外部电流及电压输入经隔离互感器隔离变换后,由低通滤波器输入模数变换器。

《操作系统原理》考题及答案

《操作系统原理》期末考试题 、单项选择题(每题 分,共分) 1. 操作系统是一种( )。 A. 系统软件 B. 系统硬件 C. 应用软件 D. 支援软件 2. 分布式操作系统与网络操作系统本质上的不同在于( )。 A. 实现各台计算机这间的通信 B. 共享网络中的资 源 C.满足较在规模的应用 D. 系统中多台计算机协作完成同一任务 3. 下面对进程的描述中,错误的是( A.进程是动态的概念 B. C.进程是指令的集合 D. 4?临界区是指并发进程中访问共享变量的( )段。 5. 要求进程一次性申请所需的全部资源,是破坏了死锁必要条件中的哪一条 。 A.互斥 B. 请求与保持 C. 不剥夺 D. 循环等待 6. 以下哪种存储管理不可用于多道程序系统中( )。 A.单一连续区存储管理 B.固定式区存储管理 C.可变分区存储管理 D.段式存储管理 7. 在可变式分区存储管理中,某作业完成后要收回其主存空间,该空间可能与 相邻空闲区合 并,修改空闲区表,使空闲区数不变且空闲区起始地址不变的 )。 进程执行需要处理机 进程是有生命期的 A.管理信息 B.信息存储 C. 数据 D. 程序

情况是()。 A.无上邻空闲区也无下邻空闲区 C.有下邻空闲区但无上邻空闲区 8. 系统“抖动”现象的发生不是由 A.置换算法选择不当 C.主存容量不足 9. 在进程获得所需全部资源,唯却 A.运行 B.阻塞 10. 要页式存储管理系统中,将主存等分成( A.块 B.页B. D. B. D. CPU 时,有上邻空闲区但无下邻空闲区 有上邻空闲区也有下邻空闲 区)引起的。 交换的信息量过大 请求页式管理方案 进程处于( C.就绪 )。 C. 段长 状态。 D.新建 D.段

智慧树知到《操作系统原理》章节测试答案

智慧树知到《操作系统原理》章节测试答案 第一章单元测试 1、允许多个用户将若干个作业提交给计算机系统集中处理的操作系统称为()。A:网络操作系统 B:分时操作系统 C:实时操作系统 D:批处理系统 正确答案:批处理系统 2、()是指两个或两个以上的活动或事件在同一时间间隔内发生。 A:并行 B:并发 C:共享 D:同步 正确答案:并发 3、操作系统()采用了分层式结构进行设计。 A:UNIX B:IBM OS/360 C:Multics D:MS-DOS 正确答案:Multics 4、批处理系统的运行方式有()等几种。 A:执行系统

B:加载系统 C:早期批处理 D:脱机批处理 E:联机批处理 正确答案:执行系统,早期批处理,脱机批处理,联机批处理 5、分时操作系统具有()的特征。 A:及时性 B:多路性 C:异步性 D:独占性 E:交互性 正确答案:及时性,多路性,独占性,交互性 6、多道程序设计技术必须要在多个处理器上才能实现。 A:对 B:错 正确答案:错 7、虚拟机通过软件模拟硬件系统功能,可以将一台计算机虚拟成多个计算机。A:对 B:错 正确答案:对 8、互斥访问的计算机资源不能被共享。 A:对

B:错 正确答案:错 9、实时操作系统不需要具有很强的交互能力。 A:对 B:错 正确答案:对 10、Minix3是由荷兰Vrije大学计算机科学系Dijkstra 教授领导开发的。A:对 B:错 正确答案:错 第二章单元测试 1、处理器管理的核心问题是()。 A:处理器调度 B:进程管理 C:作业管理 D:线程管理 正确答案:进程管理 2、()是操作系统感知进程存在的惟一标志。 A:JCB B:TCB C:FCB D:PCB

相关主题
文本预览
相关文档 最新文档