• 用FPGA实现Aurora 8B/10B接口(1)—— 什么是Aurora 8B/10B协议?

    1、概述\x26amp;nbsp; \x26amp;nbsp; \x26amp;nbsp;Aurora 8B/10B协议是一个用于在点对点串行链路间

    02-07 98浏览
  • 射频和微波电路讲解——RF术语与概念5:S参数

    引言:在高速和射频领域,S参数是一个极其重要的参数,S参数即反射和传输系数,用于衡量高速(RF)器件和传输线之间的阻抗匹配情况。在链路仿真、器件性能评估、设计优化方面使用非常广泛,本节简述S参数相关知识。

    02-07 63浏览
  • 详解Linux内核

    一文读懂 Linux 内核:开发者必备的技术指南

    01-14 176浏览
  • 热拔插烧芯片怎么办?

    “热拔插”其实就是带电拔插,对于日常使用的电子产品来说,很多时候我们都是经常性的带电拔插,比如路由器,手机,平板,笔记本电脑等等,你很难做的到,说先把充电线接上设备,然后再去插220V的排插,反正我日常使用不会去刻意纠结这个顺序,咋方便咋来。那“热拔插”由于是带电拔插,所以就会在接触的那一瞬间,会产生尖峰电压,这对板子上的器件是致命的。那该如何改善这一情况呢?(1)加RC缓冲电路,如下图所示:具体的选值,需要先测出电路中尖峰的频率(本质上和LC振荡区别不大),再根据公式:C是电路中的杂散电容。L是电路中的等效电感。详细的计算过程我们后面在反激电源RC吸收电路中再展开讲。 (2)加TVS或者ESD,这个方式是比较简单,具体的选型要求可以翻看下面这两篇文章:TVS管几点选型经验!从SD卡电路中学习如何使用ESD管防静电 (3)复合防护电路,主要由TVS管和压敏,安规电容组成,效果较好,但成本稍高!好了,就先写到这吧!

    01-09 143浏览
  • 详解linux中mmap的底层原理及应用

    一、mmap在linux系统哪里? 二、什么是mmap? 通过上图我们可以知道mmap是操作硬件设备的一种方法,所谓操作设备,比如IO端口(点亮一个LED)、LCD控制器、磁盘控制器,实际上就是往设备的物理地址上读写数据。 但是,由于应用程序不能直接操作设备硬件地址,所以操作系统提供了这样一种机制——内存映射,把设备地址映射到进程虚拟地址,mmap就是实现内存映射的接口。 操作设备还有很多方法,如ioctl、ioremap等。 mmap的好处就是,mmap把设备内存映射到虚拟内存,则用户操作虚拟内存相当于在直接操作设备,省去了用户空间到内核空间的复制过程,相对IO操作来说,增加了数据的吞吐量。 三、什么是内存映射? 既然mmap是实现内存映射的接口,那么内存映射是什么呢?如下图所示: 每个进程都有独立的进程地址空间,通过页表和MMU,可以将虚拟地址转换为物理地址,每个进程都有独立的页表数据,这就可以解释为什么两个不同进程相同的虚拟地址却对应着不同的物理地址。 四、mmap在文件内存映射上的应用 在unix/linux平台上读写文件,一般有两种方式。分别为open系统调用函数和mmap内存映射。 1.open系统调用 首先open文件,接着使用read系统调用函数来读取文件。于是内核将文件的内容从磁盘上读取到内核页高速缓存中(主存RAM中),再从内核高速缓存读取到用户进程的地址空间。这么做需要在内核和用户空间之间做多次数据拷贝。而且当多个进程同时读取一个文件时,那么每个进程在自己的页表中都有这个文件的副本并且都对应到物理内存中各自的副本,这样便造成了物理内存的浪费。如下图所示: 2.mmap内存映射 mmap是一种内存映射的方法,就是将一个文件或者其他对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对应关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。如下图所示: 五、linux内存描述符 了解了内存映射的概念后,那么内核是怎么管理这些地址空间的呢?任何复杂的理论最终也是通过各种数据结构体现出来的,而这里使用的数据结构就是进程描述符。从内核角度看,进程是分配系统资源(CPU、内存)的载体,为了管理进程,内核必须对每个进程所做的事情进行清楚的描述,这就是进程描述符。内核用task_struct结构体来表示进程,并且维护一个该结构体链表来管理所有进程。该结构体包含一些进程状态、调度信息等上千个成员,我们这里主要关注进程描述符里面的内存描述符(struct mm_struct mm)。内存管理如下图所示: 现在已经知道了内存映射是把设备地址映射到进程空间地址(注意:并不是所有内存映射都是映射到进程地址空间的,ioremap是映射到内核虚拟空间的,mmap是映射到进程虚拟地址上的),实质上是分配了一个vm_area_struct结构体加入到进程的地址空间,也就是说,把设备地址映射到这个结构体,具体到映射的过程就是驱动程序要做的事情了。vm_area_struct结构中包含区域起始和终止地址以及其他相关信息,同时也包含一个vm_ops指针,其内部可引出所有针对这个区域可以使用的系统调用函数。这样,进程对某一虚拟内存区域的任何操作需要用到的信息,都可以从vm_area_struct中获得。并且如上图所示vm_area_struct结构通常是用链表的形式保存以方便进程快速的访问。 六、mmap内存映射原理 1.内存映射的步骤 用open系统调用打开文件,并返回文件描述符fd; 用mmap建立内存映射,并返回映射首地址指针start; 对映射文件进行各种操作,可以用指针偏移的方式进行读写; 用munmap关闭内存映射; 用close系统调用关闭文件描述符fd。 2.mmap内存映射的实现过程,总的来说可以分为三个阶段 (一)进程启动映射过程,并在虚拟地址空间中为映射创建虚拟映射区域 进程在用户空间调用库函数mmap,原型为:void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset); 在当前进程的虚拟地址空间中,寻找一段空闲的满足要求的连续的虚拟地址; 为此虚拟区域分配一个vm_area_struct结构体,接着对这个结构体的各个字段进行初始化; 将新建的虚拟区域结构体(vm_area_struct)插入到进程的虚拟地址区域链表或树中。 (二)调用内核空间的mmap函数(不同于用户空间的mmap函数),实现文件物理地址和进程虚拟地址的一一映射关系 为映射分配了新的虚拟地址区域后,通过待映射的文件指针,在文件描述符表中找到对应的文件描述符,通过文件描述符,链接到内核“已打开文件集”中该文件的文件结构体(struct file),每个文件结构体维护着和这个已打开文件相关的各项信息。 通过该文件的文件结构体,链接到file_operations模块,调用内核函数mmap,其原型为:int mmap(struct file *filp, struct vm_area_struct *vma),非用户空间的mmap函数; 内核mmap函数通过虚拟文件系统inode模块定位到文件磁盘物理地址; 通过remap_pfn_range函数建立页表,即实现了文件地址和虚拟地址区域的映射关系。此时,这片虚拟地址并没有任何数据关联到主存中。(本质上,用户进程的虚拟地址映射到磁盘文件中间还是需要经过物理内存的,也就是说进程操作虚拟地址会对应到物理地址上,物理内存再与磁盘交互数据) (三)进程发起对这片映射空间的访问,引发缺页异常,实现文件内容到物理内存的拷贝 注:前两个阶段仅在于创建虚拟区域并完成地址映射,但是并没有将任何文件数据拷贝至主存,真正的文件读取是当进程发起读或写操作时。 进程的读或写操作访问虚拟地址空间这一段地址映射,通过查询页表,发现这一段地址并不在物理页面上。因为目前只建立了地址映射,真正的硬盘数据还没有拷贝到内存中,因此引发缺页异常。 缺页异常进行一系列判断,确定无非法操作后,内核发起请求调页过程。 调页过程先在交换缓存空间(swap cache)中寻找需要访问的内存页,如果没有则调用nopage函数把所缺的页从磁盘装入到主存中。 之后进程即可对这片主存进行读或写的操作,如果写操作改变了其内容,一定时间后系统会自动回写脏页面到对应的磁盘地址,也即完成了写入文件的过程。 修改过的脏页面并不会立即更新回文件中,而是有一段时间的延迟,可以调用msync()来强制同步,这样所写的内容就能立即保存到文件里了。 3.mmap和常规文件读写的区别 简单介绍一下常规文件系统操作(调用read/fread等函数),函数的调用过程是: 进程发起读写文件请求; 内核通过查找进程文件符表,定位到内核已打开文件集上的文件信息,从而找到此文件的inode; inode在address_space上查找要请求的文件页是否已经缓存在内核页缓存中。如果存在,则直接返回这片文件页的内容; 如果不存在,则通过inode定位到文件磁盘地址,将数据从磁盘复制到内核页缓存。之后再次发起读页面的过程,进而将内核页缓存中的数据发给用户进程。 总结来说,常规文件操作为了提高读写效率和保护磁盘,使用了内核页缓存机制。这样造成读文件时需要先将文件页从磁盘拷贝到内核页缓存中,由于内核页缓存处在内核空间,不能被用户进程直接寻址,所以还需要将内核页缓存中的数据页再次拷贝到用户进程对应的物理内存中。这样,通过了两次数据拷贝过程,才能完成进程对文件内容的获取任务。写操作也是一样,待写入的buffer在内核空间是不能直接访问的,必须要先拷贝至内核空间对应的主存,再写回磁盘中(系统回延迟写脏页面),也是需要两次数据拷贝。 而使用mmap操作文件时,创建新的虚拟内存区域和建立文件磁盘地址和虚拟内存区域映射这两步没有任何文件拷贝操作。而之后访问数据时发现内存中并无数据而发起的缺页异常过程,可以通过已经建立好的映射关系,只使用一次数据拷贝,就从磁盘中将数据传入用户进程的内存中,供进程使用。 总而言之,常规文件操作需要从磁盘到内核页缓存再到用户进程物理内存的两次数据拷贝。而mmap操作文件,只需要从磁盘到用户进程物理内存的一次数据拷贝过程。说白了,mmap的关键点是实现了用户空间到内核空间的数据直接交互而省去了空间不同数据不通的繁琐过程,因此mmap效率更高。 七、mmap函数说明 头文件 #include 创建内存映射mmap void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); 参数说明: addr: 入参,如果这个地址为null那么内核将自己为你指定一个地址,如果不为null,将使用这个地址作为映射区的起始地址 length:映射区的大小(<=文件的大小) prot: 访问属性,一般用PROT_READ、PROT_WRITE、PROT_READ|PROT_WRITE flags:这个参数是确定映射的更新是否对映射相同区域的其他进程可见,以及是否对基础文件进行更新 MAP_SHARED:共享此映射,映射的更新对映射相同区域的其他进程可见 MAP_PRIVATE: 创建写时专用拷贝映射,映射的更新对映射的其他进程不可见,相同的文件,并且不会传递到基 础文件。 我们一般用MAP_SHARED,这两个权限是限制内存的,而不限制文件 fd:被映射的文件句柄 offset:默认为0,表示映射文件全部。偏移未知,需要时4K的整数倍。 返回值:成功:被映射的首地址 失败:MAP_FAILED (void *)-1 释放内存映射 int munmap(void *addr, size_t length); 参数说明: addr: 被映射的首地址 length: 映射的长度 返回值:0:成功 -1:失败 八、mmap的基础使用 #include #include #include #include #include #include int main(int argc, const char *argv[]){ char *p = NULL; int fd = -1; // 打开文件 fd = open("temp", O_RDWR|O_CREAT|O_TRUNC, 0644); if (-1 == fd) { printf("文件打开失败...\n"); return -1; } // 因为我们文件不能是一个0大小的文件,所以我们需要修改文件的大小 // 有两种方式:leek,write,或者ftruncate都可以 /* // 改变一个文件的读写指针 lseek(fd, 1023, SEEK_END); // 写入一个结束符\0 write(fd, "\0", 1); */ // 我们还是用这种,比较方便,直接就修改了,和上面效果一样 ftruncate(fd, 1024); // 创建一个内存映射,让内和指定一个映射地址,大小为1024,可读可写,共享,映射到这个fd上 p = mmap(NULL, 1024, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); if (p == MAP_FAILED) { printf("mmap failed\n"); close(fd); return -1; } // 拿到地址之后我们就可以像操作普通地址一样写数据,读数据了,例如memcpy,strcpy等等 memcpy(p, "hello world", sizeof("hello world")); // 读数据 printf("p = %s\n",p); // 最后释放这个映射 if (munmap(p, 1024) == -1) { printf("munmap failed\n"); close(fd); return -1; } close(fd); return 0;} gcc mmap.c 进行编译得到可执行文件a.out./a.out 可以得到执行结果p = hello world 然后看当前文件夹下会出现一个temp的文件 我们直接用cat命令进行输出: 我们会发现其实是和程序输出的一样的,到这里,基本使用就结束了。 九、mmap的使用注意事项 1.能使用创建出来的新文件进行映射吗? 答案:能,但是需要修改文件的大小,如果不修改则会出现总线错误,程序如下: #include #include #include #include #include #include int main(int argc, const char *argv[]){ char *p = NULL; int fd = -1; // 打开文件 fd = open("temp", O_RDWR|O_CREAT|O_TRUNC, 0644); if (-1 == fd) { printf("文件打开失败...\n"); return -1; } // 因为我们文件不能是一个0大小的文件,所以我们需要修改文件的大小 // 有两种方式:leek,write,或者ftruncate都可以 /* // 改变一个文件的读写指针 lseek(fd, 1023, SEEK_END); // 写入一个结束符\0 write(fd, "\0", 1); */ // 我们还是用这种,比较方便,直接就修改了,和上面效果一样 // TODO ftruncate(fd, 1024); // 主要修改了这行,我们不进行文件大小调整,那么文件大小就是0 // 创建一个内存映射,让内和指定一个映射地址,大小为1024,可读可写,共享,映射到这个fd上 p = mmap(NULL, 1024, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); if (p == MAP_FAILED) { printf("mmap failed\n"); close(fd); return -1; } // 拿到地址之后我们就可以像操作普通地址一样写数据,读数据了,例如memcpy,strcpy等等 memcpy(p, "hello world", sizeof("hello world")); // 读数据 printf("p = %s\n",p); // 最后释放这个映射 if (munmap(p, 1024) == -1) { printf("munmap failed\n"); close(fd); return -1; } close(fd); return 0;} 和基础使用例子一样,只是注释了修改文件大小的逻辑ftruncate(fd, 1024),这样新创建的文件大小就是0, 我们编译运行,如下图:Bus error 所以结论就是:创建映射区的文件大小为0,而指定的大小非零的时候会出现总线错误 2.创建映射区的文件大小为0,实际指定映射区的大小为0 得到的结果:无效的参数 3.如果打开文件时flag为O_RDONLY,mmap时PROT参数为PROT_READ|PROT_WRITE会怎样? 得到的结果:无效的参数 4.如果打开文件时flag为O_RDONLY(新文件不行,需要一个有文件大小的文件),mmap时PROT参数为PROT_READ会怎样? 得到的结果:在写数据的时候段错误 5.如果打开文件时flag为O_WRONLY(新文件不行,需要一个有文件大小的文件),mmap时PROT参数为PROT_WRITE会怎样? 得到的结果:没有权限,mmap在创建的时候需要读权限,mmap的读写权限应该小于等于文件的打开权限,文件至少必须要有读权限。(前提是MAP_SHARED 模式下) 6.文件描述符fd,在mmap创建映射区完成即可关闭,后续访问文件,用地址访问。 7.如果offset是1000会怎么样? 得到的结果:无效的参数,必须是4K的整数倍(这个跟MMU有关,MMU映射的最小单位就是4K) 8.对mmap越界操作会怎样? 得到的结果:段错误,mmap映射以页为单位,就是说得到的空间的大小是4096的倍数,举个例子就是你申请了10个字节,但系统会给你申请4096,因为不够一页(4k),如果你申请4097,那么会给你申请两个页,所以才会发现你申请10个空间却能写如20个或者4096以下的字节数也不会崩溃的原因。 9.对mmap++是否还能munmap成功 得到的结果:不能,无效的参数,首地址变了,munmap必须释放申请的地址 十、mmap父子进程间通信 #include #include #include #include #include #include #include #include #include // 全局变量 var int var = 100;int main(int argc, const char *argv[]){ int *p; pid_t pid; int ret = 0; int fd; // 打开一个文件 fd = open("temp", O_RDWR|O_TRUNC, 0644); if (fd < 0) { perror("open error"); exit(1); } // truncate文件大小 ftruncate(fd, 4); // 创建映射区 p = (int *)mmap(NULL, 4, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); if (p == MAP_FAILED) { perror("mmap error"); exit(1); } // 关闭fd,mmap创建成功后就可以关闭了,因为直接使用地址了,不需要fd了 close(fd); // fork一个进程 pid = fork(); if (pid == 0) // 子进程 { *p = 2000; var = 1000; printf("child *p = %d, var = %d\n", *p, var); }else{ // 父进程 sleep(1); // 休眠一秒,让子进程先执行 printf("parent *p = %d, var = %d\n", *p, var); wait(NULL); // 回收子进程 // 释放共享内存 if (munmap(p, 4) == -1) { perror("munmap error"); exit(1); } } return 0;} 结果: 结果发现p指向的地址的内容改掉了,而var没有被改掉(对于父子进程共享的东西是读共享,写复制) 十一、mmap无血缘关系的进程间通信 写进程,循环写这个结构体大小的数据到共享内存 #include #include #include #include #include #include #include #include #include struct student{ int id; char name[256]; int age; }; int main(int argc, const char *argv[]){ int fd; struct student stu = {0, "zhangsan", 18}; struct student *p; fd = open("temp", O_RDWR|O_CREAT|O_TRUNC, 0644); if (fd < 0) { perror("open error"); exit(1); } ftruncate(fd, sizeof(stu)); p = mmap(NULL, sizeof(stu), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); if (p == MAP_FAILED) { perror("mmap error"); exit(1); } close(fd); while (1) { // 循环写 memcpy(p, &stu, sizeof(stu)); stu.id++; sleep(3); } if (-1 == munmap(p, sizeof(stu))) { perror("munmap error"); exit(1); } return 0; } 读进程,循环从共享内存中读 #include #include #include #include #include #include #include #include #include struct student{ int id; char name[256]; int age; }; int main(int argc, const char *argv[]){ int fd; struct student stu = {0, "zhangsan", 18}; struct student *p; fd = open("temp", O_RDONLY, 0644); if (fd < 0) { perror("open error"); exit(1); } p = mmap(NULL, sizeof(stu), PROT_READ, MAP_SHARED, fd, 0); if (p == MAP_FAILED) { perror("mmap error"); exit(1); } close(fd); while (1) { // 循环读 printf("stu.id = %d, stu.name = %s, stu.age = %d\n", p->id, p->name, p->age); sleep(3); } if (-1 == munmap(p, sizeof(stu))) { perror("munmap error"); exit(1); } return 0; } 一个读端一个写端执行结果如下: 一个写端多个读端执行结果如下: 多个写端一个读端: 十二、匿名映射 前面我们每次使用共享内存时,都会创建一个文件,这样会造成垃圾文件,接下来我们使用unlink把创建的文件删除掉,创建完就删除这个文件:unlink(文件名) #include #include #include #include #include #include #include #include #include // 全局变量 varint var = 100;int main(int argc, const char *argv[]){ int *p; pid_t pid; int ret = 0; int fd; // 打开一个文件 fd = open("temp", O_RDWR|O_TRUNC, 0644); if (fd < 0) { perror("open error"); exit(1); } // TODO 添加了这句删除文件 ret = unlink("temp"); if (ret == -1) { perror("unlink error"); exit(1); } // truncate文件大小 ftruncate(fd, 4); // 创建映射区 p = (int *)mmap(NULL, 4, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); if (p == MAP_FAILED) { perror("mmap error"); exit(1); } // 关闭fd,mmap创建成功后就可以关闭了,因为直接使用地址了,不需要fd了 close(fd); // fork一个进程 pid = fork(); if (pid == 0) // 子进程 { *p = 2000; var = 1000; printf("child *p = %d, var = %d\n", *p, var); }else{ // 父进程 sleep(1); // 休眠一秒,让子进程先执行 printf("parent *p = %d, var = %d\n", *p, var); wait(NULL); // 回收子进程 // 释放共享内存 if (munmap(p, 4) == -1) { perror("munmap error"); exit(1); } } return 0;} 这样执行完成之后,那个临时文件就没了 又要open,又要unlink的好麻烦,有没有更方便的方法。答案是有的。可以直接使用匿名映射来代替,其实linux系统给我们提供了创建匿名映射区的方法,无需依赖一个文件即可创建映射区,同样需要借助标志位flags来指定。 使用MAP_ANONYMOUS(或MAP_ANON),如: int *p = mmap(NULL, 4, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0); 需要注意的是,MAP_ANONYMOUS和MAP_ANON这两个宏是linux操作系统中特有的,类UNIX系统中无该宏定义,可以使用如下两步来完成匿名映射区的建立 fd = open("/dev/zero", O_RDWR);p = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, fd, 0); linux匿名映射的例子如下:只能用于有血缘关系的进程间通信 #include #include #include #include #include #include #include #include #include // 全局变量 var int var = 100; int main(int argc, const char *argv[]){ int *p; pid_t pid; int ret = 0; // 创建映射区-----TODO 匿名映射,大小随便指定,权限随便指定,fd用-1 p = (int *)mmap(NULL, 4, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0); if (p == MAP_FAILED) { perror("mmap error"); exit(1); } // fork一个进程 pid = fork(); if (pid == 0) // 子进程 { *p = 2000; var = 1000; printf("child *p = %d, var = %d\n", *p, var); }else{ // 父进程 sleep(1); // 休眠一秒,让子进程先执行 printf("parent *p = %d, var = %d\n", *p, var); wait(NULL); // 回收子进程 // 释放共享内存 if (munmap(p, 4) == -1) { perror("munmap error"); exit(1); } } return 0; } 类unix的例子 #include #include #include #include #include #include #include #include #include // 全局变量 varint var = 100;int main(int argc, const char *argv[]){ int *p; pid_t pid; int ret = 0; int fd; // 打开一个文件 TODO /dev/zero fd = open("/dev/zero", O_RDWR|O_TRUNC, 0644); if (fd < 0) { perror("open error"); exit(1); } if (ret == -1) { perror("unlink error"); exit(1); } // 创建映射区 flags 加 MAP_ANONYMOUS p = (int *)mmap(NULL, 4, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, fd, 0); if (p == MAP_FAILED) { perror("mmap error"); exit(1); } // 关闭fd,mmap创建成功后就可以关闭了,因为直接使用地址了,不需要fd了 close(fd); // fork一个进程 pid = fork(); if (pid == 0) // 子进程 { *p = 2000; var = 1000; printf("child *p = %d, var = %d\n", *p, var); }else{ // 父进程 sleep(1); // 休眠一秒,让子进程先执行 printf("parent *p = %d, var = %d\n", *p, var); wait(NULL); // 回收子进程 // 释放共享内存 if (munmap(p, 4) == -1) { perror("munmap error"); exit(1); } } return 0;}

    01-09 168浏览
  • 机房的防雷接地系统设计

    本期我们来通过一个实例,详细了解机房如何做防雷接地? 一、为什么要做防雷接地? 计算机和网络越来越深入人们生活和工作中,同时也预示着数字化、信息化时代的来临。这些微电子网络设备的普遍应用,使得防雷的问题显得越来越重要。由于微电子设备具有高密度、高速度、低电压、和低功耗等特性,这就使其对各种诸如雷电过电压、电力系统操作过电压、静电放电、电磁辐射等电磁干扰非常敏感。如果防护措施不力,随时随地可能遭受重大损失。 二、机房防雷的必要性 雷击可以产生不同的破坏形式,国际电工委员会已将雷电灾害称为“电子时代的一大公害”,雷击、感应雷击、电源尖波等瞬间过电压已成为破坏电子设备的罪魁祸首。从大量的通信设备雷击事例中分析,专家们认为:由雷电感应和雷电波侵入造成的雷电电磁脉冲(LEMP)是机房设备损坏的主要原因。为此采取的防范原则是“整体防御、综合治理、多重保护”。力争将其产生的危害降低到最低点。 三、机房防雷接地系统设计 一、防雷设计 防雷接地系统是弱电精密设备及机房保护的重要子系统,主要保障设备的高可靠性,防止雷电的危害。中心机房是一个设备价值非常高的场所,一旦发生雷击事故,将会造成难以估量的经济损失和社会影响,根据GB50057《建筑物防雷设计规范》和IEC61024-1-1标准的有关规定,中心机房的防雷等级应定为二类标准设计。 目前大楼总配电室根据建筑物防雷设计规范,提供了第一级防雷,因此,在本工程网络中心机房市电配电柜前配置第二、三级复合防雷器。 防雷器采用独立模块,并应具有失效告警指示,当某个模块被雷击失效时可单独更换该模块,而不需要更换整个防雷器。 二三级复合防雷器的主要参数指标:单相通流量为:≥40KA(8/20μs),响应时间:≤25ns 二、接地系统设计 国家标准GB50174《计算机机房设计规范》中计算机机房应具有以下四种地:计算机系统的直流地、交流工作地、交流保护地和防雷保护地。 各接地系统电阻如下: Ø计算机系统设备直流地接地电阻不大于1Ω。 Ø交流保护地的接地电阻应不大于4Ω; Ø防雷保护地的接地电阻应不大于10Ω; Ø交流工作地的接地电阻应不大于4Ω; 1、机房室内等电位连接 在机房内设立一环形接地汇流排,机房内的设备及机壳采用S型的等电位连接形式,连接到接地汇流排上,用50*0.5铜铂带敷设在活动地板支架下,纵横组成1200*1200网格状,在机房一周敷设30*3(40*4)的铜带,铜带配有专用接地端子,用编织软铜线机房内所有金属材质的材料都做接地,接入大楼的保护地上。 工程中的所有接地线(包括设备、SPD、线槽等)、金属线槽搭接跨接线均应做到短、平、直,接地电阻要求小于或等于1欧姆。 2、机房屏蔽设计 整个机房屏蔽采用彩钢板进行六面体屏蔽,屏蔽板之前采用无缝焊接,墙身屏蔽体每边跟接地汇流排接地不少于2处。 3、机房接地装置设计 由于机房接地电阻要求较高,在该大楼附近另外增加人工接地装置,在地网槽内打入15根镀锌角钢,并用扁钢焊接起来,并采用降阻剂回填。机房静电接地采用50mm²多股铜芯线穿管引入。 接地装置的接地电阻要求小于或等于1欧姆。 四、机房地网制作方法 一、标准接地网的制作 在距建筑物1.5~3.0m处,以6m*3m矩形框线为中心,开挖宽度为0.8m、深0.6~0.8m的土沟,两长边中间贯通,采用长2.5m的L5(5*50*50)镀锌角钢,在沟底的每个交点处垂直打入一根,共计6-20根,作为垂直接地极; 然后采用4号(4*40)镀锌扁钢将六根角钢焊接连通,作为水平接地极;再用4号镀锌扁钢焊在地网框架的中间部位,引出至机房外墙角,离地高0.3m,作为PE接地端;最后从该接地端引出16-50平方毫米以上护套地线,沿墙边穿墙进入室内,连至机房内等电位接地汇集排。 二、利用大楼钢筋做地网 新建或翻建机房时,可利用入地混凝土立柱子内的钢筋作接地装置。在立柱内选取至少4根主筋(对角或对称的钢筋),用氧焊接通后再焊在两根伸出柱面的M12以上铜螺纹管上,作为接地端,引线至机房,与等电位接地汇流排连通,等电位接地排可设在防静电地板下面。 五、如何做机房防雷接地? 所谓接地,即把电路中的某一金属壳与大地边接在一起,形成电气回路。目的是为了让电流易于流如入大地,对人及设备形成保护。 接地的方法: 直流地悬浮法即直流地不接大地,与地严格绝缘; 直流地接地法,把计算机等设备中数字电路等的电位点地和网络。 无论采用何种形式,均须有接地母线,接地地杖,在此特别强调建议采用接地埋接地网络板,能更好的引导至大地,接地时应注意如下问题: Ø尽量不要在机房内把直流地和交流工作地短路或混接; Ø不允许交流线路与直流地线平行敷设,以防止干扰或短接; Ø直流地线网应装接在地板下,便于边接,即可减小接地电阻,便于泄流。 1、接地铜排 室内机房接地采用30*5(宽*厚,单位mm)规格之铜片,围绕机房墙壁一周离地面10cm高,且与室外接地体母线相连接。在铜片每隔50 cm钻一小孔,以利于分布在机房各区域的设备进行接地。 2、接地铜板 接地铜板采用宽60mm(厚10mm)之L型铜板固定于楼板,此铜墙铁壁板作为所有应与机房接地之设施的总接地。 3、地网 机房有架设高架地板,则应以2.5mm之多芯裸铜线缠绵高架地板柱做地网。 六、机房防雷接地工程实例 一、项目情况 某数据中心机房位于大楼三层,面积约1000m²。 本工程配电采用TN-S系统,独立设置接地线(PE)。采用大楼联合接地系统,并且要求接地小于1欧姆。 机房内设有功能性接地和保护性接地,共用一组接地装置。 1、保护接地,防雷保护接地延引大楼的接地。 2、机房内做M网型结构均压等电位网格。机房室内等电位做法在机房地板下沿机柜一周敷设等电位铜带30×3mm²(均压环),铜带用ZR-BVR6mm2与各机房动力配电柜PE排相连,并设置100*0.3mm²铜箔等电位网格。机房动力设备的地线、动力设备的外壳、不带电的金属管道、金属线槽外壳、计算机设备外壳、防静电地板支架、吊顶龙骨、等均须用ZR-BVR6mm2与等电位铜排网络就近可靠相连。机房内设置等电位端子箱,机房内等电位端子箱采用ZR-BVR50mm²的电缆与大楼综合接地端可靠连接。机房等电位接地示意图如图1-1所示。 二、防雷设计思路 一个完整的防雷方案包括防直接部分和防感应雷击两部分,中心机房所在的建筑物已具备防直接雷击防护措施,因此本方案只对机房电子设备的配电系统采取相应的防感应雷击措施。 工程计算机交流配电系统采用三级防雷: 第一级在大楼低压配电室内加装防雷器,实现第一级防雷(由大楼实现)。 第二级在UPS输入配电柜内加装B级防雷器,实现第二级防雷。 第三级在机房UPS输出列头配电柜内加装C级防雷器,实现第三级防雷。 机房防雷设计示意图如图2-1所示: 三、防雷设计思路 由于网络集成系统防护点多、面广,因此,为了保护建筑物和建筑物内各向电子网络设备不受雷电损害或使雷击损害降低到最低程度,应从整体防雷的角度来进行防雷方案的设计。现在都采取综合防雷,综合防雷设计方案应包括两个方面:直击雷的防护和感应雷的防护,缺少任何一方面都是不完整的,有缺陷的和有潜在危险的。 1、直击雷的防护 如果无直击雷防护,按IEC1312的估算几乎所有雷电流都流经进出建筑物的导体型线路(如电源线、信号线等)侵入设备,这样的损害就非常之严重,因此做好直接雷击防护是做感应雷击防护的前提;直击雷防护按照国标GB50057《建筑物防雷设计规范》设计和施工,主要使用避雷针、网、线、带及良好的接地系统,其目的是保护建筑外部不受雷击的破坏,给建筑物内的人或设备提供一个相对安全的环境。 2、电源系统的防护 统计数据资料表明,微电子网络系统80%以上的雷害事故都是因为与系统相连的电源线路上感应的雷电冲击过电压造成的。因此,做好电源线的防护是整体防雷中不容忽视的一环。 3、信号系统的防护 尽管在电源和通信线路等外接引入线路上安装了防雷保护装置,由于雷击发生在网络线(如双绞线)感应到过电压,仍然会影响网络的正常运行,甚至彻底破坏网络系统。雷击时产生巨大的瞬变磁场,在1公里范围内的金属线路,如网络金属连线等都会感应到极强的感应雷击; 另外,当电源线或通信线路传输过来雷击电压时,或建筑物的地线系统在泻放雷击时,所产生强大的瞬变电流,对于网络传输线路来说,所感应的过电压已经足以一次性破坏网络。即使不是特别高的过电压,不能够一次性破坏设备,但是每一次的过电压冲击都加速了网络设备的老化,影响数据的传输和存储,甚至死机,直至彻底损坏。所以网络信号线的防雷对于网络集成系统的整体防雷来说,是非常重要的环节。 4、等电位连接 集成网络系统主干交换机所在的中心机房应设置均压环,将机房内所有金属物体,包括电缆屏蔽层、金属管道、金属门窗、设备外壳以及所有进出大楼的金属管道等金属构件进行电气连接,并接至均压环上,以均衡电位。 5、接地 机房采用联合接地可有效的解决地电位升高的影响,合格的地网是有效防雷的关键。机房的联合地网通常由机房建筑物基础(含地桩)、环形接地(体)装置、工作(电力变压器)地网等组成。对于敏感的数据通讯设备的防雷,接地系统的良好与否,直接关系到防雷的效果和质量。如果地网不合要求,应改善地网条件,适当扩大地网面积和改善地网结构,使雷电流尽快地泄放,缩短雷电流引起的高过电压的保持时间,以达到防雷要求。 四、电源防雷 电源系统防雷采用三级防雷的方式。对机房配电箱的防雷应采取不少于二级保护(细保护),既在机房的主配电箱的输入一套安装二级防雷器,在机房配电箱输出端每一路安装三级防雷器。即在配电柜中总开关前端安装二级防雷器,这样既节省空间,又起到了美观、易维护的作用,并分别在市电配电柜、UPS配电柜各自的总开关前端安装三级防雷器,以保护机房内的设备。 五、接地系统 本机房有四种接地形式,即:计算机专用直流逻辑地、交流工作地、安全保护地、防雷保护地。 1、计算机机房接地系统 在机房活动地板下方安装铜排网,将机房所有计算机系统非带电壳体接入铜排网并由此引入大地。机房接地系统采用专用接地系统,专用接地系统由大楼提供,接地电阻≤1Ω。 2、机房内等电位接地具体做法: 用3mm×30mm的铜带,在机房活动地板下交叉排成方格,其交叉点与活动地板支撑的位置交错排列,交点处压接在一起,并在铜带下用垫绝缘子固定。在机房离墙400mm的距离沿墙采用3mm×30mm紫铜条造成一个M型或S型的地网,紫铜条间的接驳位用10mm镙母压接后烧铜焊,通过35mm2铜缆引下线驳接建筑物的联合接地体,这样就形成一个法拉第笼式接地系统,并保证接地电阻不大于1Ω。 机房等电位连接:将天花龙骨、墙身龙骨、活动地板支架、非计算机系统的管、金属的门、窗等均做等电位连接,并分别取多点通过16m m2的地线接入机房接地铜排网。 3、交流工作地 在电力系统中运行需要的接地(配电柜中性点接地),应不大于4欧姆。与变压器或发电机直接接地的中性点连接的中性线称零线;将零线上的一点或多点与地再次做电气连接称重复接地。交流工作地是中性点可靠地接地。当中性点不接地时,若一相碰地而人又触及另一相时,人体所受到的接触电压将超过相电压,而当中性点接地时,且中性点的接地电阻很小,则人体受到电压相当于相电压;同时若中性点不接地时,由于中性点对地的杂散抗阻很大,因此接地电流很小;相应的保护设备不能迅速切断电源,对人及设备产生危害;反之则行。 4、安全保护地 安全保护地是指机房内所有机器设备的外壳以及电动机、空调机等辅助设备的机体(外壳)与地之间做良好的接地,应不大于4欧姆。当机房内各类电器设备的绝缘体损坏时,将会对设备和操作及维修人员的安全构成威胁。所以应使设备的外壳可靠接地。 5、防雷保护地 即机房的防雷系统的接地,一般以水平连线和垂直接地桩埋设地下,主要是把雷电电流由受雷装置引到接地装置,应不大于10欧姆。 防雷装置可分为三个基本部分:即接闪器、引下线和接地装置,接闪器即接受雷电电流的金属导体。本方案只将加装防雷器的引下线与动力配电柜内的接地铜排连接。要求接地电阻≤4Ω。 六、防雷设计方案 1、直击雷的防护 机房所在大楼已有避雷针、避雷带等外部防雷设施,不再作外部防雷补充设计。如之前无直击雷防护,需在机房顶层做避雷带或是避雷网,若机房在空旷地带,视情况还需安装避雷针,避雷针、避雷带必须做好引下线,接入地网。 2、电源系统的防雷 (1)、对于网络集成系统的电源线防护,首先,进入系统总配电房的电源进线,应采用金属铠装电缆敷设,电缆铠装层的两端应良好接地;如果电缆没有铠装层,则就将电缆穿钢管埋地,钢管两端接地,埋地的长度应不小于15米。由总配电房至各大楼的配电箱以及机房楼层配电箱的电力线路,均应采用金属铠装电缆进行敷设。这样可以大大减少电源线感应过电压的可能性。 (2)、在电源线路上安装电源防雷器,是必不可少的防护措施。根据IEC防雷规范中有关防雷分区的要求,将电源系统分为三级保护。 ① 可在系统总配电房的配电变压器低压侧安装流通容量80KA~100KA的一级电源防雷箱。 ② 在各大楼的总配电箱安装通流容量为60KA~80KA的二级电源防雷箱; ③ 在机房的重要设备(如交换机、服务器、UPS等)的电源进线处安装通流容量20~40KA的三级电源防雷器; ④ 在机房控制中心硬盘刻录机及电视墙设备电源处用插座式防雷器。 所有防雷器均应良好接地。选用防雷器要注意接口的形式和接地的可靠性,重要场所应设置专用的接地线,切不可将防雷接地线与避雷针接地线并接,且要尽量远离、分开入地。 3、信号系统的防雷 (1)、网络传输线主要使用的是光纤和双绞线。其中光纤不需要特别的防雷措施,但若室外的光纤是架空的,那么需要将光纤的金属部分接地。而双绞线屏蔽效果较差,因此感应雷击的可能性比较大,应将此类信号线敷设在屏蔽线槽中,屏蔽线槽应良好接地;也可穿金属管敷设,金属管应全线保持电气上的连通,并且金属管两端应良好接地。 (2)、在信号线路上安装信号防雷器,对防感应雷是一种行之有效的办法。对于网络集成系统,可在网络信号线进入到广域网路由器之前安装专用信号防雷器;在系统主干交换机、主服务器以及各分交换机、服务器的信号线入口处分别安装RJ45接口的信号防雷器(如RJ45-E100)。信号防雷器的选型应综合考虑工作电压、传输速率、接口形式等。避雷器主要串接在线路的两端设备的接口处。 ① 服务器输入端口处安装单口 RJ45 端口信号避雷器,以保护服务器。 ② 24口网络交换机串联 24 口的RJ45 端口信号避雷器,避免因雷击感应或电磁场干扰沿双绞线窜入而毁坏设备。 ③ 在DDN专线接收设备上安装单口RJ11端口信号避雷器,保护DDN 专线上的设备。 ④ 在卫星接收设备前端安装同轴端口天馈线避雷器,以保护接收设备。 (3)、对于监控系统机房的防雷保护 ① 在硬盘录像机的视频线出线端加装视频信号防雷器或采用机架式视频信号防雷箱,12口全保护,安装方便。 ② 在矩阵与视频分割器的控制线进入端加装控制信号防雷器(DB-RS485/422)。 ③ 机房电话线采用音频信号防雷器,串接在电话机前端电话线处,安装方便,易维护。 ④ 在报警器前端信号线接入处装控制信号防雷器,对报警器信号线做有效的防雷保护。 注意:所有防雷器均应良好接地,选用防雷器要注意接口的形式和接地的可靠性,重要场所应设置专用的接地线,切不可将防雷接地线与避雷针接地线并接,且要尽量远离、分开入地。 4、机房等电位连接 在机房防静电地板下,沿着地面上布置40*3紫铜排,形成闭合环接地汇流母排。将配电箱金属外壳、电源地、避雷器地、机柜外壳、金属屏蔽线槽、门窗等穿过各防雷区交界的金属部件和系统设备的外壳,以及对防静电地板下的隔离架进行多点等电位接地就进至汇流排。并采用等电位连接线4-10mm2铜芯线螺栓紧固的线夹作为连接材料。同时在机房找出建筑物主钢筋,经测试确与避雷带连接良好,用14mm镀锌圆钢通过铜铁转换接头将接地汇流母排与之连接起来。形成等电位。采用联合接地网,目的是消除各地网之间的电位差,保证设备不因雷电的反击而损坏。 5、接地网制作设计 接地是避雷技术非常重要的环节之一,无论是直击雷或感应雷,最终都是把雷电流引入大地。因此,对于敏感的数据(信号)通信设备而言,没有合理而良好的接地系统是不能可靠避雷的。因此,对接地电阻>1Ω 的大楼地网,需按照规范要求整改,以提高机房接地系统的可靠性。根据具体情况,通过沿机房大楼建立不同形式的接地网(包括水平接地体、垂直接地体)来扩大接地网的有效面积和改善地网的结构。 采用共用接地装置时,共用接地电阻值不应大于1Ω; 采用专用接地装置时,其接地电阻值不应大于4Ω。 基本要求如下: 1 )在大楼周围做接地网,用较少的材料和较低的安装成本,完成最有效的接地装置; 2)接地电阻值要求 R ≤1Ω ; 3)接地体应离机房所在主建筑物 3~5m 左右设置; 4)水平和垂直接地体应埋入地下0.8m 左右,垂直接地体长 2.5m ,每隔 3~5m 设置一个垂直接接地体,垂直接地体采用 50×50×5mm 的热镀锌角钢,水平接地体则选 50×5mm 的热镀锌扁钢; 5)在地网焊接时,焊接面积应≥6 倍接触点,且焊点做防腐蚀防锈处理; 6)各地网应在地面下0.6~0.8m 处与多根建筑立柱钢筋焊接,并作防腐蚀、防锈处理; 7)土壤导电性能差时采用敷设降阻剂法,使接地电阻≤1Ω ; 8)回填土必须是导电状态较好的新粘土; 9)与大楼基础地网多点焊接,并预留接地测试点。 以上是一种传统的廉价实用的接地方式,根据实际情况,接地网材料也可以选用新型技术接地装置,如免维护电解离子接地系统、低电阻接地模块、长效铜包钢接地棒等等。   五、机房防雷接地注意事项 1、考虑到雷电或其他电信设备的干扰,计算机房不宜设置在大楼的顶层或靠外墙侧,特殊情况限制的,应设置屏蔽层防止雷电干扰。对于特别重要的计算机系统,应考虑设置独立的屏蔽机房。建筑物(包括计算机机房)内设备及管线接地安装应按照相关规范执行,做好等电位联结; 2、防止雷电危害还应防雷击引起的电磁脉冲,计算机房的配电箱应设置SPD(防电磁浪涌)保护装置,防止机房供电电源由于雷击电磁脉冲而造成断电。另外,对于重要的系统主机,其通讯电缆也应设置SPD保护装置,由于通讯电缆数量一般比较多,因此通讯线的保护设置应根据具体实际情况合理设置; 3、电气接地系统宜采用TN-S接地系统,PE线与相线分开,机房电源接入处应做重复接地; 4、机房接地一般分为交流工作接地、直流工作接地、安全工作接地、防雷保护接地。根据《建筑物防雷设计规范》的要求,防雷设计采用共用接地系统时,各接地系统宜共用一组接地装置。信息系统的所有外露导电物(各种箱体、壳体、机架等金属组件)应建立一等电位联结网络。 因此,电气防雷设计应在计算机房设置专用的等电位联结排,通过引下线与大楼总等电位联结排连接。根据共用接地系统的层层等电位原则,采用结构主钢筋作为引下线,更适用于共用接地系统。另外强调,大楼接地系统的接地电阻不应大于1Ω。 

    01-09 75浏览
  • 看懂电路图简单,注意这10大原则7大步骤

    01电路简化的基本原则 初中物理电学中的复杂电路可以通过如下原则进行简化: ☀第一:不计导线电阻,认定R线≈0。有电流流过的导线两端电压为零,断开时开关两端可以测得电压(电路中没有其他断点)。 ☀第二:开关闭合时等效于一根导线;开关断开时等效于断路,可从电路两节点间去掉。开关闭合有电流流过时,开关两端电压为零,断开时开关两端可以测得电压(电路中没有其他断点)。 ☀第三:电流表内阻很小,在分析电路的连接方式时,有电流表的地方可看作一根导线。 ☀第四:电压表内阻很大,在分析电路的连接方式时,有电压表的地方可视作断路,从电路两节点间去掉. ☀第五:用电器(电阻)短路:用电器(电阻)和导线(开关、电流表)并联时,用电器中无电流通过(如下图示),可以把用电器从电路的两节点间拆除(去掉)。 ☀第六:滑动变阻器Pa段被导线(金属杆)短接不工作,去掉Pa段后,下图a变为图b。 ☀第七:根据串、并联电路电流和电压规律“串联分压、并联分流”分析总电流、总电压和分电流、分电压的关系。 ☀第八:电流表和哪个用电器串联就测哪个用电器的电流,电压表和哪个用电器并联就测哪个用电器的电压。判断电压表所测量的电压可用滑移法和去源法。 ☀第九:电压表原则上要求并联在电路中,单独测量电源电压时,可直接在电源两端。 一般情况下,如果电压表串联在电路中,测得的电压是电源两端电压(具体情况见笔记)。电流表直接接在电源两端会被烧坏,且让电源短路,烧坏电源。 ☀第十:如果导线上(节点之间)没有用电器(开关,电流表除外),那么导线上的各点可以看做是一个点,可以任意合并、分开、增减。(此法又称节点法)例如: 02电路简化步骤 ☀第一步:按照题目要求将断开的开关去掉,将闭合的开关变成导线。 ☀第二步:将电流表变成导线(视具体情况也可保留)。 ☀第三步:去掉电压表。 ☀第四步:合并(或者换位)导线上的节点。(此步骤在电路中用电器比较多,且相互纠结时,采用) ☀第五步:画出等效电路图,判断各用电器是串联还是并联。 ☀第六步:在原电路中利用原则七、八判断电流表和电压表各测量哪个用电器的电流和电压。 ☀第七步:将电压表和电流表添加到等效电路图中,分析各电流表和电压表示数之间的关系。(利用原则七) 03经典例题选讲 ☀例1:在如下电路图中,开关S闭合后,电压表V1的示数是2.5V,V2的示数是1V,如果A2的示数是0.2A,那么A1的示数是多少?试求两只灯泡两端的电压。 分析:第一步:将开关变成导线;第二步:将电流表变成导线;第三步将电压表去掉。第四步(略)第五步:判断用电器连接方式 很显然,电路中两个灯泡是串联的。 第六步:根据原则四,知道电压表V2处断开,所以没有电流从A1流过,示数为零;根据滑移法知道V1和电源并联,测电源两端电压。V2和L2并联,测L2两端电压。 第七步:等效电路图如下: 根据等效电路图,可知所求I1=I2=0.2A U1=2.5V-1V=1.5V   U2=1V☀例2 :如图示,开关s闭合后下列各电压表示数的关系是,各电流表示数之间的关系是___。 分析:第一步:把开关变成导线;第二步:把电流表变成导线;第三步:去掉电压表;第四步(略);第五步:判断各用电器的连接方式: 第六步:根据原则七和原则八以及滑移法或去源法判断电流表和电压表各自所测量的对象。①在原电路中,去掉电压表,可以发现电流表A1和A2都与灯泡串联,所以电流表示数相等;②用滑移法可以判断出V1测L1两端的电压,V2测电源两端的电压;V3测L2两端的电压。 第七步:等效电路图如下: ☀例3 : 电路开关闭合后,v1、v2、v3的示数分别是8V、9V、4V,则L1、L2、L3两端的电压各是多少 所求的电压关系式为:U2=U1+U3   I1=I2解:根据“十原则,七步骤”可以得到该电路的等效电路图如下: 从等效图可以得到如下方程组:UL1+UL2=8VUL2+UL3=9VUL3=4V解得:UL1=3v     UL2=5v   UL3=4V ☀例4:如图所示,已知两只灯泡L1和L2是串联的,则在①、②和③三个电表中(电流表或电压表)判断正确的是(   ) A. ①是电流表,②和③是电压表;B. ①和③是电压表,②是电流表;C. ①和②是电流表,③是电压表;D. ①②和③都是电流表 分析:本题可用排除法解答。将A答案的各表填入 三个位置中,根据“十原则,七步骤”电路图简化为: 很明显,不符合题意。 将B答案各表填入图中,电路可简化为: 这种填法符合题意。 把C答案各表填入电路中,电路L1被断路,简化后的电路图和A答案相同,不合题意。把D答案各表填入图中,电源短路,两个灯泡没有电流流过,不合题意。所以选择答案B。 声明 本号所刊发文章仅为学习交流之用,无商业用途,向原作者致敬。因某些文章转载多次无法找到原作者在此致歉,若有侵权请联系小编,我们将及时删文或者付费转载并注明出处,感谢您的支持! (来源:网络,版权归原作者)

    01-09 174浏览
  • 什么是天线调谐开关?

    引言:天线调谐开关也叫孔径调谐开关,关于什么是孔径调谐,会在后续其余章节讲到。随着消费场景的天线越做越小巧,天线尺寸缩小将导致天线效率降低,更容易受天线周围介质变化的影响,介质变化引起的瞬态响应会造成天线频率响应漂移。

    01-08 95浏览
  • PCB上常见的图标都是什么意思?

    在很多电子产品的电路板中都能经常见到如下的图标:今天核桃就和大伙理一理这些电路板上的图标到底表示啥意思。(1)防静电标志 防静电标志在电子制造业中非常重要,因为静电给电子器件带来的损伤是非常严重的,特别是集成电路,造成的损失是无法估算的,防静电标志旨在提醒工作人员在接触电路板时请做好防范措施。 (2)WEEE 这个WEEE图标的含义主要是提醒用户或者制造商在废弃板卡时需要正确的回收或者处理,不能随手就丢弃在垃圾桶里,以免对环境造成污染。(3)无铅标识 这个图标表示的是电路板在制作的过程中没有加入含铅成分的材料。以减少对环境和人体的危害。很多国家对电路板和器件都明确表示需要不含铅的才能进行销售。(4)FCC,CE FCC是美国联邦通信委员会(Federal Communications Commission)的缩写,负责管理无线电频率的使用和电子产品的电磁兼容性。FC图标表示该电子产品已经通过了FCC的认证,符合电磁兼容性和射频干扰的标准‌。CE是欧盟对产品进入欧洲市场的基本安全要求。CE标志表示产品符合欧盟的指令和标准,包括低电压指令(LVD)和电磁兼容性指令(EMC)。CE认证确保产品在使用过程中不会对用户和环境造成危害,并且符合安全、健康、环保等要求‌(5)RoHS、RU RoHS全称是《关于限制在电子电气设备中使用某些有害物质的指令》(Restriction of Hazardous Substances Directive),这是一项由欧盟颁布的强制性环保标准,旨在限制在电子电气设备制造过程中使用10种有害化学物质,包括铅(Pb)、汞(Hg)、镉(Cd)、六价铬(Cr(VI))、多溴联苯(PBB)、多溴二苯醚(PBDE)、邻苯二甲酸二(2-乙基己基)酯(DEHP)、邻苯二甲酸丁苯甾酯(BBP)、邻苯二甲酸二丁酯(DBP)和邻苯二甲酸二异丁酯(DIBP)‌。PCB上含有这个图标说明该板卡通过了检测,板卡在制作过程中的有害物质控制符合欧盟环保法规要求。RU是美国和加拿大的认可部件标志,主要针对的是电子元器件。这个标志的商业权属于美国保险商实验室(UL)。也就是说你的板子上使用的器件都是要经过UL认证授权之后才能在板卡上打上这个标识。(6)高压图标 很明显,这个图标的意思就是提醒操作人员,电路板此处有高压,注意人身安全。其实这类的图标还有很多很多,以上只是例举出常见的!好了,今天就先写到这吧!

    01-08 179浏览
  • 详解linux系统组成结构

    NB的架构师都要具备足够的技术深度,然后才能透过问题看本质,所谓技术深度就是扎实的基础知识,要不断深入,反复研究学习,打磨自己的硬实力。不论从事云计算、虚拟化、容器、大数据、人工智能,几乎都是基于 Linux 服务器部署服务。 一、linux系统结构 linux系统看似纷繁复杂,单其核心只有一点,那就冯洛伊曼体系“存储计算”,万变不离其宗。就像一颗大树一样,枝叶繁多,但主干却很清晰简单。 Linux系统一般有4个主要部分:programs/utilities/tools 内核、shell/工具(GUN工具)、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。部分层次结构如图1-1所示。 Computer Resources:硬件资源 Kernel:内核 GUN工具: Shell:shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行,是一个命令解释器 Programs/Utilities/Tools:库函数、工具等 File systems:文件系统是文件存放在磁盘等存储设备上的组织方法。Linux系统能支持多种目前流行的文件系统,如EXT2、 EXT3、 FAT、 FAT32、 VFAT和ISO9660。 User Application:Linux应用,标准的Linux系统一般都有一套被称为应用程序的程序集,它包括文本编辑器、编程语言、X Window、办公套件、Internet工具和数据库等 Linux开机后,内核启动,激活内核空间,抽象硬件、初始化硬件参数等,运行并维护虚拟内存、调度器、信号及进程间通信(IPC)。内核启动后,再加载Shell和用户应用程序,用户应用程序使用C\C++编写,被编译成机器码,形成一个进程,通过系统调用(Syscall)与内核系统进行联通。进程间交流需要使用特殊的进程间通信(IPC)机制。 二. Linux系统1: linux内核组成 Linux内核是世界上最大的开源项目之一,内核是与计算机硬件接口的易替换软件的最低级别。它负责将所有以“用户模式”运行的应用程序连接到物理硬件,并允许称为服务器的进程使用进程间通信(IPC)彼此获取信息。 内核是操作系统的核心,具有很多最基本功能,其核心功能就是:管理硬件设备,供应用程序使用。硬件设备包括CPU、Memory(内存和外存)、输入输出设备、网络设备和其它的外围设备。它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。 Linux 内核由如下几部分组成:内存管理、进程管理、设备驱动程序、文件系统和网络管理等。如图: 系统调用接口: SCI 层提供了某些机制执行从用户空间到内核的函数调用。这个接口依赖于体系结构,甚至在相同的处理器家族内也是如此。SCI 实际上是一个非常有用的函数调用多路复用和多路分解服务。在 ./linux/kernel 中您可以找到 SCI 的实现,并在 ./linux/arch 中找到依赖于体系结构的部分。 1、内存管理 负责管理Memory(内存)资源,以便让各个进程可以安全地共享机器的内存资源。另外,内存管理会提供虚拟内存的机制,该机制可以让进程使用多于系统可用Memory的内存,不用的内存会通过文件系统保存在外部非易失存储器中,需要使用的时候,再取回到内存中。 内存管理系统在操作系统中,不同的进程有不同的内存空间,这些内存空间需要统一的管理和分配,这就需要内存管理系统。 对任何一台计算机而言,其内存以及其它资源都是有限的。为了让有限的物理内存满足应用程序对内存的大需求量,Linux  采用了称为“虚拟内存”的内存管理方式。Linux  将内存划分为容易处理的“内存页”(对于大部分体系结构来说都是 4KB)。Linux 包括了管理可用内存的方式,以及物理和虚拟映射所使用的硬件机制。 不过内存管理要管理的可不止 4KB 缓冲区。Linux 提供了对 4KB 缓冲区的抽象,例如 slab 分配器。这种内存管理模式使用 4KB 缓冲区为基数,然后从中分配结构,并跟踪内存页使用情况,比如哪些内存页是满的,哪些页面没有完全使用,哪些页面为空。这样就允许该模式根据系统需要来动态调整内存使用。 为了支持多个用户使用内存,有时会出现可用内存被消耗光的情况。由于这个原因,页面可以移出内存并放入磁盘中。这个过程称为交换,因为页面会被从内存交换到硬盘上。内存管理的源代码可以在 ./linux/mm 中找到。 2 .进程管理 进程管理系统在操作系统中,进程的执行也需要分配CPU来执行,所以,为了管理进程,我们还需要一个进程管理系统。如果运行的进程很多,则一个CPU会并发地运行多个进程,这就需要CPU的调度能力了。 进程实际是某特定应用程序的一个运行实体。在 Linux  系统中,能够同时运行多个进程,Linux  通过在短的时间间隔内轮流运行这些进程而实现“多任务”。这一短的时间间隔称为“时间片”,让进程轮流运行的方法称为“进程调度” ,完成调度的程序称为调度程序。 进程调度控制进程对CPU的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行进程实际上是仅等待CPU资源的进程,如果某个进程在等待其它资源,则该进程是不可运行进程。Linux使用了比较简单的基于优先级的进程调度算法选择新的进程。 通过多任务机制,每个进程可认为只有自己独占计算机,从而简化程序的编写。每个进程有自己单独的地址空间,并且只能由这一进程访问,这样,操作系统避免了进程之间的互相干扰以及“坏”程序对系统可能造成的危害。为了完成某特定任务,有时需要综合两个程序的功能,例如一个程序输出文本,而另一个程序对文本进行排序。为此,操作系统还提供进程间的通讯机制来帮助完成这样的任务。Linux 中常见的进程间通讯机制有信号、管道、共享内存、信号量和套接字等。 内核通过 SCI 提供了一个应用程序编程接口(API)来创建一个新进程(fork、exec 或 Portable Operating System Interface [POSⅨ] 函数),停止进程(kill、exit),并在它们之间进行通信和同步(signal 或者 POSⅨ 机制)。 3. 文件系统 Linux系统,一切皆文件: 1)启动一个进程,需要一个二进制文件。 2)启动进程时,需要加载一些配置文件如yml, properties等,这是文本文件 3)把日志打印到控制台上,是标准输出stdout文件 4)一个进程的输出作为另一个进程的输入,称为管道,管道也是一个文件 5)进程可以通过网络和其他进程通信,建立的socket,也是一个文件 6)进程需要访问的外部设备,也是一个文件 7)文件夹也是一个文件每个文件,Linux都会分配一个文件描述符(File Descriptor),这是一个整数。有了这个文件描述符,我们就可以使用系统调用,查看或干预进程运行的方方面面。 和 DOS 等操作系统不同,Linux 操作系统中单独的文件系统并不是由驱动器号或驱动器名称(如 A:  或 C:  等)来标识的。相反,和 UNIX  操作系统一样,Linux 操作系统将独立的文件系统组合成了一个层次化的树形结构,并且由一个单独的实体代表这一文件系统。Linux  将新的文件系统通过一个称为“挂装”或“挂上”的操作将其挂装到某个目录上,从而让不同的文件系统结合成为一个整体。Linux  操作系统的一个重要特点是它支持许多不同类型的文件系统。Linux 中最普遍使用的文件系统是 Ext2,它也是 Linux  土生土长的文件系统。但 Linux  也能够支持 FAT、VFAT、FAT32、MINIX 等不同类型的文件系统,从而可以方便地和其它操作系统交换数据。由于 Linux  支持许多不同的文件系统,并且将它们组织成了一个统一的虚拟文件系统. 虚拟文件系统(VirtualFileSystem,VFS):隐藏了各种硬件的具体细节,把文件系统操作和不同文件系统的具体实现细节分离了开来,为所有的设备提供了统一的接口,VFS提供了多达数十种不同的文件系统。虚拟文件系统可以分为逻辑文件系统和设备驱动程序。逻辑文件系统指Linux所支持的文件系统,如ext2,fat等,设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。 虚拟文件系统(VFS)是 Linux 内核中非常有用的一个方面,因为它为文件系统提供了一个通用的接口抽象。VFS 在 SCI 和内核所支持的文件系统之间提供了一个交换层。即VFS 在用户和文件系统之间提供了一个交换层。 VFS         在用户和文件系统之间提供了一个交换层: 在 VFS 上面,是对诸如 open、close、read 和 write 之类的函数的一个通用 API 抽象。在 VFS 下面是文件系统抽象,它定义了上层函数的实现方式。它们是给定文件系统(超过 50 个)的插件。文件系统的源代码可以在 ./linux/fs 中找到。 文件系统层之下是缓冲区缓存,它为文件系统层提供了一个通用函数集(与具体文件系统无关)。这个缓存层通过将数据保留一段时间(或者随即预先读取数据以便在需要是就可用)优化了对物理设备的访问。缓冲区缓存之下是设备驱动程序,它实现了特定物理设备的接口。 因此,用户和进程不需要知道文件所在的文件系统类型,而只需要象使用 Ext2  文件系统中的文件一样使用它们。 4. 设备驱动程序 设备驱动程序是 Linux  内核的主要部分。和操作系统的其它部分类似,设备驱动程序运行在高特权级的处理器环境中,从而可以直接对硬件进行操作,但正因为如此,任何一个设备驱动程序的错误都可能导致操作系统的崩溃。设备驱动程序实际控制操作系统和硬件设备之间的交互。设备驱动程序提供一组操作系统可理解的抽象接口完成和操作系统之间的交互,而与硬件相关的具体操作细节由设备驱动程序完成。一般而言,设备驱动程序和设备的控制芯片有关,例如,如果计算机硬盘是 SCSI  硬盘,则需要使用 SCSI  驱动程序,而不是 IDE 驱动程序。 5.网络接口(NET) 提供了对各种网络标准的存取和各种网络硬件的支持。网络接口可分为网络协议和网络驱动程序。网络协议部分负责实现每一种可能的网络传输协议。众所周知,TCP/IP  协议是 Internet  的标准协议,同时也是事实上的工业标准。Linux  的网络实现支持 BSD 套接字,支持全部的TCP/IP协议。Linux内核的网络部分由BSD套接字、网络协议层和网络设备驱动程序组成。 网络设备驱动程序负责与硬件设备通讯,每一种可能的硬件设备都有相应的设备驱动程序。 需要C/C++ Linux服务器架构师学习资料加qun812855908获取(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等),免费分享 二、Linux系统1: 内核运行原理 百度搜索:漫画趣解Linux内核:内容大概如下: 一幅来自 TurnOff.us 的漫画 “InSide The Linux Kernel” 。TurnOff.us 是一个极客漫画网站,作者 Daniel Stori 画了一些非常有趣的关于编程语言、Web、云计算、Linux 相关的漫画。 整体架构画面分为三层:(按我个人理解) 最下面一层看起来像是一个仓库,就是文件系统(File System); 地面层有很多人(大部分都是企鹅)在各种忙碌,代表着进程表(Process Table); 还有一个跃层,代表着人机交互界面(Terminals And Termina process); 这些就是Linux内核的基本层次架构,所有程序执行、资源调度、系统功能都在这个内核中运行和实现。 关于操作系统处理任务/服务的大体流程简单归纳为:1.输入—2.中断/异常处理——3.调度进程——4.服务进程处理——5.输出结果: 接下来我们按照漫画的分层分开说明一下这些流程: 1、顶层的半层:输入输出交互界面 交互界面是一个跃层,说明它是内核的一部分,但和进程管理大厅联系紧密。这里墙上有很多屏幕,代表它通过可视化的界面来处理信息,实际上就是系统和人的交互界面。 屏幕有很多个,代表系统可以同时处理多路的命令交互。屏幕上的内容都有不同,有的屏幕还没有开启,有的屏幕是字符界面,有的还有图形界面,代表不同的GUI的交互状态。 这里有两个进程来管理这些屏幕。有一个进程面向屏幕,正在一个控制板上进行操作,笔者的理解是它是一个输出进程,可以控制各个屏幕的不同状态和输出内容;另一个进程面向大厅,手中拿着一份文件,应该正在向大厅里面的进程下达质量,所以它是一个输入控制进程。这样我们也能够理解为什么这里是一个半层,因为它需要一个开放的架构来连接输入输出和执行进程。 跃层有很多不同的屏幕,每个屏幕上写着 TTY(这就是对外的终端)。比如说最左边 tty4 上输入了 “fre” ——这是想输入 “freshmeat…” 么 :d ;它旁边的 tty2 和 tty3 就正常多了,看起来是比较正常的命令;tty7 显示的图形界面,对,图形界面(X Window)一般就在 7 号终端;tty5 和 tty6 是空的,这表示这两个终端没人用。等等,tty1 呢? 跃 层,也是最接近用户的一层。两只企鹅在名为 TTY 的窗口面前工作,一只企鹅在控制台前戳戳点点,另一只在仔细端详程序的输出。TTY 中文为电传打字机,关于 TTY,可以追溯到计算机的远古时代,那时候我们使用的还只是没有主机的打字机。设备的输入要经过长长的串行线路才能到达那昂贵的大型主机 (Mainframe Computer)。 作为 Unix-like 的 Linux 也继承了这一特性,在 /dev 目录下和 ps 命令的输出中我们都可以看到它的身影。 TTY(终端)是对外沟通的渠道之一,但是,不是每一个进程都需要 tty,某些进程可以直接通过其他途径(比如端口)来和外部进行通信,对外提供服务的,所以,这一层不是完整的一层,只是个跃层。 2、中间层:进程和进程调度 中间层则体现的是流程中的:调度,服务以及输出, 进程调度处理任务:忙碌的大厅,各司其职。 大厅里,就是各种进程运行和忙碌的主要场所了。 大厅的中心,是一张长条桌。这里应该就是主进程表了,一个主进程正在和一堆进程开会,可能正在协调它们的运行;这些进程神态和状态各异,有的认真听讲,有的不屑一顾,有的左顾右盼,有的沉默不语...,确实很像系统中各种任务执行的状态。 大厅一角堆了很多管道,这是Linux处理信息的 应用进程(企鹅): 图中有很多企鹅,它们通常代表着在Linux内核中运行的进程。之所以使用企鹅,应该是因为Linux的Logo和形象代表就是一个企鹅。但如果我们认真观察,会发现虽然它们都是企鹅,但是它们的装扮、动作甚至神态都是不一样的,隐喻着它们有不同的特性和状态。一般情况下,企鹅的胸前会挂着一个写有数字的工牌,代表着这个进程的进程编号。 初始化(init)进程:左上角有一个小企鹅,站着,仿佛在说些什么这显然是一位家长式的人物,不过看起来周围坐的那些小企鹅不是很听话 —— 你看有好多走神、自顾自聊天的 —— “喂喂,说你呢,哇塞娃(171),转过身来”。它代表着 Linux 内核中的初始化(init)进程,也就是我们常说的 PID 为 1 的进程。桌子上坐的小企鹅都在等待状态(Wait)中,等待工作任务。 监控进程(看门狗):除了企鹅之外,我们还看到有几条小狗。这些都是看门狗(Watch Dog)。它们负责在系统内部进行巡查,处理各种异常状况。当小企鹅们不听话时,它就会汪汪地叫喊起来。 异常进程: 最后还有一个小丑,应该就代表着系统内部的异常进程,比如病毒木马等恶意软件。 cron 进程:看它急得头上都冒汗了,这位老弟不断的看着手表,执行着周期性任务。 web守护进程:一只 PID 为 1341 的小企鹅就是大名鼎鼎的 Apache HTTP 服务器进程。它坚守在 80 端口提供 HTTP 服务。它头上的羽毛就是 Apache 的标志。 ssh守护进程:墨镜的企鹅守护着 22 端口。它看着要比其他的企鹅要更加有威严,脸上彷佛写着生人勿进四个字。原来它看护的是用于 SSH 服务的 22 端口,SSH 服务常常用于远程登陆,所以必须要仔细审查。 进程交互:管道 两位企鹅累的满头大汗,任劳任怨的在搬动着管道。一只小企鹅可以把自己手上的东西通过这个管道,传递给后面的小企鹅。 进程端口号:门 这个大厅里面,有几扇门,代表着和外部世界沟通的网络端口。 通用web端口号80: 左边的那个门上面的编号是80,这是标准的HTTP的端口号,所以这是一个标准Web端口;端口旁边有一个守卫进程,熟悉网络编程的同学应该可以看出来它就是Apache Tomcat,因为它头上戴着那个熟悉的羽毛。 ssh端口号22:右边那个门编号是22,就是SSH的端口,旁边那个戒备森严,戴墨镜耳机的保安,表明了这个端口的安全级别比较高。 ftp端口21:中间角落里面那个门的门牌都歪了,因为它已经年久失修。因为它是ftp端口(端口编号21),现在已经基本上没人用了。 系统交互:楼梯 和shell界面交互:SSH旁边的楼梯,可以上到交互界面层; 和文件系统交互:而21端口旁边,还有一个隐蔽的楼梯,上面FS的指示牌,表明从这里可以下到文件系统层。 3、地基层:文件系统 文件系统是单独的一层。这里面有很多柜子,按照行列码放整齐,表明了文件系统保存文件的方式和结构。文件放在柜子的抽屉里面,而且也是按照索引依次存放。 大部分抽屉都是关闭的,说明现在还没有人来访问。库房里有编号是421(PID(Process ID) 为 421 的进程)的一个进程正在查看文件;还有一个柜子已经打开,但旁边却没有人,可能是那个进程打开了文件,却由于某种原因没有正常关闭(比如异常或强行退出,甚至进程本身就忘了要关闭文件句柄),所以需要一条看门狗(右下角有一只小狗Watchdog)来进行处理,这代表对文件系统的监控。 4、总结、使用银行柜台业务总结linux系统处理任务流程: 这里像不像去银行柜台办理业务处理:1.请求输入—2.中断/异常处理——3.调度进程——4.服务进程处理——5.输出结果: 大家应该都去过银行办业务,由于银行的柜台就那么几个,办业务的人数又多,所以,去银行的第一件事就是排队取号: 银行柜台办理不同的业务类型: 普通业务(存取款)柜台(80web端口服务线程池):、例如有个有两个固定普通业务窗口(核心线程数为2)3位工作人员(最大线程数为3),等候座位(任务队列),一个规则《超出银行最大接待能力处理办法》(饱和等待策略)。 vip业务柜台(22 ssh端口直接优先处理): 办卡业务(办卡机直接办理):直接shell脚本处理。 如果大家办理普通业务, 首先是内存管理(叫号系统的号码): 由于银行的普通业务柜台就那么2个,办业务的人数又多。所以,去银行的第一件事就是排队取号,注意这个号号,并不代表去哪个柜台办业务,只是说你前面等待办业务的人数,不过需要等着叫号系统叫到你之后,才能办理业务,而且最终办理业务的柜台是随机的。好了,类比一下就是,银行柜台好比是物理内存,而排队序号就是虚拟地址,我们想办业务只能通过手里拿着的这个 “虚拟地址”,然后,必须通过叫号系统,将虚拟地址,即排队序号 翻译成具体的物理地址,即柜台号,我们才能办理业务。 进程管理: 进程属性: 每个柜台窗口都有窗口id(进程ID和服务端口号) 进程调度: 按照叫号系统的指示,办理普通业务的客户被安排到普通业务窗口,办理办卡业务的客户被安排办卡机办理。 线程调度: 例如有个有两个固定普通业务窗口(核心线程数为2)3位工作人员(最大线程数为3),等候座位(任务队列),一个规则《超出银行最大接待能力处理办法》(饱和拒绝策略)。 A客户(任务A)去银行(线程池)办理业务,但银行刚开始营业,窗口服务员还未就位(相当于线程池中初始线程数量为0),于是经理(线程池管理者)就安排1号工作人员(创建核心线程1去执行任务)接待A客户。 在A客户业务还没办完时,B客户(任务B)又来了,于是经理(线程池管理者)就安排2号工作人员(创建核心线程2去执行任务)接待B客户。 在A、B客户都没有办完业务的情况下,C客户(任务C)来了,于是经理(线程池管理者)就安排C客户先坐到等候座位上,并告知他:如果1、2号工作人员空出,C客户就可以前去办理业务。 此时D客户(任务D)又来了,(两个窗口都在忙,等候座位也满了)于是经理(线程池管理者)赶紧安排3号工作人员(创建非核心线程3去临时执行任务D)在大堂站着给D客户办理业务。 假如前面的业务都没有结束的时候E客户(任务E)又来了,此时2位窗口工作人员,和1位临时工作人员都在忙,等候座位也满了,于是经理只能按《超出银行最大接待能力处理办法》(饱和处理机制)拒接接待E客户。 如果是vip客户,可以直接被被安排到前面,抢占其他客户的时间办理,这显然是调度算法显然调高了vip客户(某个应用程序)的优先级,可以快速抵达“柜台”。 这当于Linux中进程的调度,它的头脑十分强大,需要按照各个应用程序的优先级顺序,必要时可以进行“抢占式调度”,抢占调度指的是一个高优先级进程是否可以强行夺取低优先级进程的处理器资源。如果可以强行夺取,就是可抢占的调度。这也是础光Linux实时性改造的一大亮点。 中断处理: 中断是指CPU接受到I/O设备发送的中断信号的一种响应。CPU会暂停正在执行的程序,保留CPU环境后自动转去执行该I/O设备的中断处理程序。执行完毕后回到断点。继续执行原来的程序。中断是由外部程序引起的所以称为外中断。小企鹅们会根据各类中断请求来进行CPU的工作安排。 类比银行业务,当前窗口柜台的客户X办理业务需要一些手续盖章而中断一段时间,但业务员可以继续办理其他客户业务,当客户X办理业务的手续盖章完成了,业务员继续唤醒客户X来办理。 三 . linux系统2: shell shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行,是一个命令解释器。另外,shell编程语言具有普通编程语言的很多特点,用这种编程语言编写的shell程序与其他应用程序具有同样的效果。 在Linux系统上,通常有好几种Linux shell可用。不同的shell有不同的特性,有些更利于创建脚本,有些则更利于管理进程。所有Linux发行版默认的shell都是bash shell。bash shell由GNU项目开发,被当作标准Unix shell。目前主要有下列版本的shell: 1.Bourne Shell:是贝尔实验室开发的。  2.BASH:是GNU的Bourne Again Shell,是GNU操作系统上默认的shell,大部分linux的发行套件使用的都是这种shell。 3.Korn Shell:是对Bourne SHell的发展,在大部分内容上与Bourne Shell兼容。  4.C Shell:是SUN公司Shell的BSD版本。 1、shell的类型 linux启动什么样的shell程序取决于用户ID配置。 在/etc/passwd文件中,在用户ID记录的第7个字段中列出了默认的shell程序。只要用户登录到某个虚拟控制台终端或是在GUI中启动终端仿真器,默认的shell程序就会开始运行。例如:用户root使用/bin/bash(bash shell)作为自己的默认shell程序. 不过还有另外一个默认shell是/bin/sh,它作为默认的系统shell,用于那些需要在启动时使用的系统shell脚本。你经常会看到某些发行版使用软链接将默认的系统shell设置成bash shell,如CentOS发行版: $ ls -l /bin/sh /bin/sh 相当于 /bin/bash --posix,使用 sh 调用执行脚本相当于打开了bash 的 POSIX 标准模式,它们之间的各种差异都是来自 POSIX 标准模式和bash的差异。 2、shell的父子关系 用于登录某个虚拟控制器终端或在GUI中运行终端仿真器时所启动的默认的交互shell,是一个父shell。 在CLI提示符后输入/bin/bash命令或其他等效的bash命令时,会创建一个新的shell程序。这个shell程序被称为子shell(child shell)。子shell也拥有CLI提示符,同样会等待命令输入。 例如:使用ps -f 使用ps -f的时候,显示出了两个进程: 第一个bash shell程序,也就是父shell进程,进程ID是3966191,运行的是bash shell程序。 第二个bash shell程序,即子shell进程,进程ID为3972365,对应的是命令ps -f。 在生成子shell进程时,只有部分父进程的环境被复制到子shell环境中。 3、常用的GUN命令总结 GUN是GNU的一种小工具,它是“GNU即不仅仅是UNIX”的缩写。GNU工具集是一系列用于UNIX操作系统的自由软件工具。这些工具提供了强大的功能,可以用于文件操作、文本处理、版本控制、编译和调试等任务。 下面是一些常见的GUN工具及其含义: 1). 文本处理工具 grep:用于在文件中搜索指定的字符串,并返回匹配的行。它支持正则表达式,可以进行高级搜索。 awk:一种强大的文本处理工具,它可以根据指定的规则对输入文件进行处理。它常用于提取、转换和格式化文本数据。 sed:流编辑器,用于对输入流进行文本转换。它可以在文件中查找和替换字符串,删除或插入行,并执行其他编辑操作。 2). 文件管理工具: GUN命令集还包含了用于文件管理的工具。 ls:命令用于列出目录内容, cp:命令用于复制文件, mv:命令用于移动或重命名文件, rm:命令用于删除文件等。 find:用于在指定目录中查找文件。它可以基于文件属性(如文件名、大小、时间戳等)进行搜索,并支持复杂的逻辑操作。 tar:用于创建和提取归档文件。它可以将多个文件和目录打包成一个单独的文件,也可以提取已打包的文件。 gzip:用于压缩文件。它使用Lempel-Ziv算法对文件进行压缩,以减小文件大小。 这些工具提供了对文件系统的基本操作。 3). 进程管理和系统监控: GUN命令集中的一些工具可用于管理和监控系统中运行的进程。 ps:命令用于列出当前运行的进程, top:命令用于实时监视系统资源的使用情况, kill:命令用于终止正在运行的进程等。 4). 网络工具 GUN命令集包含了一些网络工具,用于管理和配置网络连接。 ifconfig:命令用于配置网络接口, ping:命令用于测试网络连接的可达性, netstat:命令用于显示当前网络连接和端口状态等。 5). 软件包管理: GUN命令集中还包含了一些用于软件包管理的工具。 apt-get命令:用于在Debian和Ubuntu系统中安装和升级软件包, yum命令:用于在Red Hat和CentOS系统中进行相同的操作。 这些工具简化了软件安装和更新的过程。 6). 软件编译相关: make:用于自动构建软件项目。它根据指定的规则和依赖关系,自动编译和链接源代码文件,生成可执行文件或库文件。 gcc:GNU编译器集合,用于编译C、C++和其他支持的编程语言。它将源代码文件编译成可执行文件。 gdb:GNU调试器,用于调试程序。它可以在程序运行过程中暂停执行,并提供查看变量、堆栈和内存的功能。 四 . linux系统3: 文件管理系统 各操作系统使用的文件系统并不相同,例如,Windows98 以前的微软操作系统使用 FAT(FAT16)文件系统,Windows 2000 以后的版本使用 NTFS 文件系统,而 Linux 的正统文件系统是 Ext2。 在 CentOS 6.3 系统中,默认的文件系统是 Ext4,它是 Ext3(Ext2) 文件系统的升级版,在性能、伸缩性和可靠性方面进行了大量改进,变化可以说是翻天覆地的,比如: 向下兼容 Ext3; 最大 1EB 文件系统和 16TB 文件; 无限数量子目录; Extents 连续数据块概念; 多块分配、延迟分配、持久预分配; 快速 FSCK、日志校验、无日志模式、在线碎片整理、inode 增强、默认启用 barrier 等; Linux支持的常见文件系统 Linux 系统能够支持的文件系统非常多,除 Linux 默认文件系统 Ext2、Ext3 和 Ext4 之外,还能支持 fat16、fat32、NTFS(需要重新编译内核)等 Windows 文件系统。也就是说,Linux 可以通过挂载的方式使用 Windows 文件系统中的数据。Linux 所能够支持的文件系统在 "/usr/src/kemels/当前系统版本/fs" 目录中(需要在安装时选择),该目录中的每个子目录都是一个可以识别的文件系统。我们介绍较为常见的 Linux 支持的文件系统,如表 1 所示。 五 . linux系统4: 应用程序,用户态和内核态 应用程序是无法直接访问硬件资源的,需要通过通过内核SCI 层提供的接口来访问硬件资源。 Linux系统将自身划分为两部分,一部分为核心软件,即是kernel,也称作内核空间,另一部分为普通应用程序,这部分称为用户空间。 区分用户空间和内核空间的目的是为确保系统安全。在CPU的所有指令中,有一些指令是非常危险的,如果错用,将导致整个系统崩溃。比如:清内存、设置时钟等。因为如果应用程序和内核在同一个保护级别,那么应用程序就有可能有意或者不小心进入了内核空间,破坏了内核空间的代码和数据,系统崩溃就不足为奇。所以CPU将指令分为特权指令和非特权指令,对于那些危险的指令,只允许操作系统及其相关模块使用,普通的应用程序只能使用那些不会造成灾难的指令。Intel的CPU将特权级别分为4个级别:RING0,RING1,RING2,RING3, 内核空间级别为“RING0”, 用户空间级别为RING3。 linux的内核是一个有机的整体。每一个用户进程运行时都好像有一份内核的拷贝,每当用户进程使用系统调用时,都自动地将运行模式从用户级转为内核级,此时进程在内核的地址空间中运行。 当应用程序进程执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(RING0级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。即此时处理器在特权级最低的(RING3级)用户代码中运行。当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态。因为中断处理程序将使用当前进程的内核栈。这与处于内核态的进程的状态有些类似。 内核态与用户态是操作系统的两种运行级别,跟intel cpu没有必然的联系, 如上所提到的intel cpu提供Ring0-Ring3四种级别的运行模式,Ring0级别最高,Ring3最低。Linux使用了Ring3级别运行用户态,Ring0作为 内核态,没有使用Ring1和Ring2。 内核空间和用户空间 x86 CPU采用了段页式地址映射模型。进程代码中的地址为逻辑地址,经过段页式地址映射后,才真正访问物理内存。 通常32位Linux内核地址空间划分0~3G为用户空间,3~4G为内核空间。64位内核地址空间划分是不同的。 32位与64位具体地址分布如下图: 64位地址时将0x0000,0000,0000,0000 – 0x0000,7fff,ffff,f000这128T地址用于用户空间。参见定义: #define TASK_SIZE_MAX   ((1UL << 47) - PAGE_SIZE),注意这里还减去了一个页面的大小做为保护。 而0xffff,8000,0000,0000以上为系统空间地址。注意:该地址前4个都是f,这是因为目前实际上只用了64位地址中的48位(高16位是没有用的),而从地址0x0000,7fff,ffff,ffff到0xffff,8000,0000,0000中间是一个巨大的空洞,是为以后的扩展预留的。 而真正的系统空间的起始地址,是从0xffff,8800,0000,0000开始的,参见: #define __PAGE_OFFSET     _AC(0xffff,8800,0000,0000, UL) 而32位地址时系统空间的起始地址为0xC000,0000。 另外0xffff,8800,0000,0000 – 0xffff,c7ff,ffff,ffff这64T直接和物理内存进行映射,0xffff,c900,0000,0000 – 0xffff,e8ff,ffff,ffff这32T用于vmalloc/ioremap的地址空间。 而32位地址空间时,当物理内存大于896M时(Linux2.4内核是896M,3.x内核是884M,是个经验值),由于地址空间的限制,内核只会将0~896M的地址进行映射,而896M以上的空间用做一些固定映射和vmalloc/ioremap。而64位地址时是将所有物理内存都进行映射。 内核态与用户态 用户态Ring3状态不能访问内核态Ring0的地址空间,包括代码和数据。(例如32位Linux进程的4GB地址空间,3G-4G部 分大家是共享的,是内核态的地址空间,这里存放在整个内核的代码和所有的内核模块,以及内核所维护的数据)。用户运行一个程序,该程序所创建的进程开始是运行在用户态的,如果要执行文件操作,网络数据发送等操作,必须通过write,send等系统调用,这些系统调用会调用内核中的代码来完成操作,这时,必 须切换到Ring0,然后进入内核地址空间去执行这些代码完成操作,完成后,切换回Ring3,回到用户态。这样,用户态的程序就不能 随意操作内核地址空间,具有一定的安全保护作用。 处理器总处于以下状态中的一种: 1、内核态,运行于进程上下文,内核代表进程运行于内核空间; 2、内核态,运行于中断上下文,内核代表硬件运行于内核空间; 3、用户态,运行于用户空间。 从用户空间到内核空间有两种触发手段: 1.系统调用: 用户空间的应用程序,通过系统调用,进入内核空间。这个时候用户空间的进程要传递很多变量、参数的值给内核,内核态运行的时候也要保存用户进程的一些寄存器值、变量等。所谓的“进程上下文”,可以看作是用户进程传递给内核的这些参数以及内核要保存的那一整套的变量和寄存器值和当时的环境等。 2.中断: 硬件通过触发信号,导致内核调用中断处理程序,进入内核空间。例如网卡发送一个数据包或硬盘驱动器提供一次 IO 请求等。这个过程中,硬件的一些变量和参数也要传递给内核,内核通过这些参数进行中断处理。所谓的“中断上下文”,其实也可以看作就是硬件传递过来的这些参数和内核需要保存的一些其他环境(主要是当前被打断执行的进程环境)。

    01-03 152浏览
正在努力加载更多...
广告