通信笔试宝典
马守贵
版本记录
版本号
时间
完成人
V1 2007-10 胥进 V2a 2008-10 马守贵
-1-
通信笔试宝典(第二版)
前言
本文是作者及周围同学在找工作过程中总结的一些笔试面试常考的基础知识,主要针对IT相关专业尤其是电子通信类偏软类毕业生。适合于欲在短时间内准备工作面试笔试的同学。
本文主要内容有以下几个部分:
① C/C++语言。C/C++语言是IT行业公司必考知识。本文没有拘泥于其基本语法,只是列出笔试面试中易考的基本概念,并对需要深入理解的部分做了详细说明。主要涉及引用与指针、类与对象、继承等。
② 数据结构部分。数据结构是另外一个很重要的基础知识部分。主要介绍了链表、队列等数据结构的基本操作,以及排序算法等常考知识点。最后,简要介绍了字符串相关操作。
③ 嵌入式程序设计部分。关注了嵌入式程序设计职位需要考察的几个基本知识点。
④ 操作系统部分。主要介绍了操作系统相关的主要知识点,如进程线程、并发进程、处理器调度、内存管理和设备管理等。
⑤ 计算机网络部分。计算机网络也是笔试面试中的常考内容。本文主要针对一些重要部分和容易混淆的概念做了详细介绍。
⑥ 通信原理部分。本文最后特地针对应聘通信企业添加了通信相关知识。通信原理部分主要介绍通信专业本科生的基本知识,主要包括模拟和数字调制技术、信源和信道编码技术、基带和频带传输技术等。
⑦ 移动通信原理部分。该部分针对通信专业中无线通信方向的职位特意准备。主要介绍了移动通信的基本结构和基本原理。主要包括无线信道特点、移动通信、OFDM和MIMO技术等。
由于时间仓促和水平所限,难免存在遗漏和错误,文章排版也没有完成,欢迎各位读者指正。可以通过电子邮件与作者联系:mashougui@gmail.com。
作者保留版权,引用请注明出处。
马守贵
2008-10-19于移动通信国家重点实验室
-2-
通信笔试宝典(第二版)
1 C/C++部分
1.1 C语言
1 int (* (*f)(int, int))(int)这里的f是什么?
答案:f是指针,指向一个参数为(int,int),返回值为一个指针的函数这个返回的指针指向一个参数为(int),返回值为int的函数〕。
2 描述内存分配方式以及它们的区别? 从静态存储区域分配:内存在程序编译的时候就已经分配好,这块内存在程序的整
个运行期间都存在。例如全局变量,static变量。
在栈上创建:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数
执行结束后,这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集。 从堆上分配:亦即动态内存分配。程序在运行的时候用户malloc或者new申请任
意多的内存,程序员自己负责在何时使用free或者delete释放内存。动态内存的生存期由程序员决定,使用非常灵活,但问题也最多。
1.2 高质量的C/C++代码
浮点型数据与与零值的比较:if(a == 0.0) //隐含错误; 循环语句的效率
(1) 在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。
(2) 当循环中存在判断时,如果循环次数很大,可以将判断移到循环外面来,以提高循环执行的效率。
函数的设计:
(3) 函数的参数表要完整;
(4) 传递指针参数,且其值仅作输入,可将其声明为const *参数,以防止函数内对该指针意外的修改;
(5) 输入参数采用值传递时,可以考虑使用const &,这样可以省去临时对象的构造和析构过程,提高效率。
(6) 输入参数不易太多,5个以内。
1.3 Static、extern、inline、const等关键词详解
1.3.1 Static
作用:控制变量的存储方式和可见性;
(1) Static变量存储在静态存储区,而非栈上; (2) 内部连接,与“extern”相对;
(包括数据成员和成员函数),是类的成员而非某一特定对象的(3) 类中的static成员
成员,属于整个类,没有this指针;隐藏在类的内部,对外不可见;
(4) 注意静态成员的初始化、削除的顺序;
(5) 静态成员函数不能直接引用非静态数据成员,必须指定特定的对象;
-3-
通信笔试宝典(第二版)
控制变量的存储方式和可见性。
1.3.2 Const
出现的背景及用法: (1) 为了取代预编译指令(#define),同时可以实现在预编译的时候引入类型检测机制。
而是保存在符号表中,整个编译期间的常量; (2) C++编译器不为const常量分配空间,
(3) 左结合修饰符:
int const *a; //指针a可变,指针指向的变量*a 不可变; int *const a; //指针a不可变,指针指向的变量*a可变; (4) 限定函数的传递参数,最好在函数内部进行限定; 例如,void fun(const int var), 可以定义成如下的形式: Void fun(int var){
Const int & varalias = var;
Varalias …… …… }
待续……
不能把非const指针指向const变量 同#define的区别:
Const和#define均可以定义常量,但是从const有以下优点:
Const常量有数据类型,而宏常量没有数据类型。编译器对前者进行类型安全
检查,而对后者只进行字符替换。
有些集成化测试工具可以对const常量进行调试,但是不能归宏常量进行调试。
因此在C++中,const完全代替宏常量。
1.3.3 Inline定义的内联函数
C++中用来替代C中表达式形式的宏定义。
(1) 存放在符号表中,调用是可以直接展开,象宏定义一样,效率大大提高;
编译器并不只是简单的替换,而是象一个函数一样进行参数类型检(2) 与宏定于不同,
测等一系列的相关检测。
(3) 消除了宏定义的副作用。
注意:内联函数在调用之前必须进行定义,否则编译器无法知道插入什么代码。所以内联函数通常写在主函数的前面。 z 内联函数和宏的区别是什么?
内联函数和普通函数相比可以加快程序运行的速度,因为不需要中断,在编译的时
候内联函数可以直接嵌入到代码中去。而宏只是一个简单的替换。 内联函数要作参数类型检查,这是内联函数和宏相比的优势。
Incline是指嵌入代码,就是在调用函数的地方,在编译的时候,直接将代码写到那
里去。对于短小的代码来说,可以带来效率的提升,而且和宏相比,更加安全可靠。然而这是以增加空间消耗为代价的。
宏不是函数,只是在编译预处理阶段将程序中有关字符替换成宏体。
Incline是函数,但是在编译中不单独产生代码,而是将有关代码嵌入到调用处。
-4-
通信笔试宝典(第二版)
1.4 C++中的特性
C++中不但全面兼容C的特性,还增加了一些面向对象的新特性。
1.4.1 注释行
//
1.4.2 C和C++的区别
1、 在C中main()前可以没有void,而在C++中必须添加函数类型; 2、 在C中变量声明要在所有语句之前;C++放松了这个,但必须在使用之前声明变量; 3、 在C声明变量时进行初始化,只能用常量,而C++中放松了这种,声明变量时可以
使用有效的表达式来初始化;
4、 在C++中使用cin,cout分别代替printf和scanf;但是在C中则没有这两个对象;
5、 scanf与printf一样也可以使用格式化自负,但他们也有不同,首先,scanf的所有变量
都是内存地址,除非是一个指针,否则必须在变量前加入一个&;其次,scanf对类型要求更为严格,long类型必须使用%ld,double必须使用%lf等等;
6、 函数原型声明时后面要添加分号,而在函数定义时就不需要加分号了;
7、 C++的main()函数与其他函数一样,但也有两点不同:一是它是函数的入口;二是它
不需要函数原型;
8、 静态变量综合了局部变量的作用域和全局变量扩展的的生存周期,在两次调用之间
数值保持不变;即,在一个函数被调用多次时,静态变量只被初始化一次; 静态函数(了作用域),只在被声明的程序模块中可见,一般的函数在工程所有
模块都是可见的;而对于变量,除非被声明为外部的,否则它仅在被声明的程序模块中是可见的,声明外部变量首先要将其声明为全局变量,在要是使用此变量的程序模块中加上extern 声明;
9、 位段,用一个简洁的结构,例如:unsigned 10、 C++允许&对引用的参数进行声明(和指针作用一样,可以修改原始数据;而不是
像参数传递一样,修改数据副本),C没有这个特点;
例如:函数声明void func_1(int *argument);
而在函数调用时:int argment1; func_1(&argument1); &的使用建立了堆栈,引用后,自动释放堆栈
11、 C,C++做动态内存分配时malloc和free都支持;但new和delete 是C++特有的,并且
new和delete可以自动的调用构造函数和析构函数;他们要成对使用,不要交叉使用。 ♦ (Malloc与普通变量一点不同,malloc内的元素不可以直接访问,只能应用指针来
操作;)
♦ 对象指针:C++支持new和delete关键字来动态的创建对象,例如: CStr *pString; pString=new CStr; //…… delete pString;
♦ new和delete的使用方法:
pointer=new type[num_elements];
(new的长度要加1,终止符的位置也要占一位)
delete [] pointer;
-5-
通信笔试宝典(第二版)
1.4.3 新的I/O流
cin>>; cout<<;
包含头文件 1.4.4 函数原型 C++中规定必须为每一个函数建立原型(C语言中只是建议)。其主要目的是让C++编译器进行检查以确定调用函数的参数与事先声明的原型是否相符。 说明: (1) 函数原型的参数表中可以只有类型而不给出他们的参数; (2) 函数定义时必须给出完整的参数表,包括参数类型和参数名。而且不同与C语言,C++中不允许函数的参数说明放在函数说明部分和函数体之间; (3) 主函数main()不必进行原型说明,因为他只会被操作系统调用而不会被其他函数调用; (4) C++中默认的函数(包括main函数)返回值为int型; (5) 如果一个函数没有返回值,在其原型中必须注明void。 1.4.5 函数重载 C++中两个或两个以上的函数可以共用同一个函数名,这就是函数的重载。重载函数之间在参数个数或参数类型上要所区别,或者两者兼而有之。 只有返回值类型不同的函数之间无法重载。 一般而言,重载的函数应该执行相同的操作。 1.4.6 作用域运算符“::” 局部变量在其作用域内有较高的优先级,如果在局部变量的作用域内希望访问同名的全局变量,需要使用作用域运算符“::”,如::var。 1.4.7 无名联合 Union后面不给出联合名,使一组数据共享同一内存地址。 访问时直接访问其中的数据名。 1.4.8 C++中的强制类型转换 C++中的强制类型转换兼容C中的类型转换。 增加了如下的转换形式; Int i; Float x = float(i); 即将函数类型名作为函数名使用,使得类型转换的执行好像调用了一个函数一样,更为方便和易于理解。 1.4.9 New和delete New和delete可以动态分配和释放内存空间,类似于C中的malloc和free,但比后者更方便,更安全。 New的使用形式为: p = new type; 其中type为类型名(可以是类名),p为指向该数据类型的指针。New从一个称为堆的自由存储区中分配一块sizeof(type)字节大小的内存空间,并把该内存空间的首地址赋给指针p。 Delete用来释放new分配的内存空间,形式为: -6- 通信笔试宝典(第二版) Delete p; 其中p为指针,保持着new分配内存的首地址。 优点: (1) 自动分配内存的大小,无需使用sizeof计算; (2) 自动返回真确的指针类型; (3) 能够在new的时候初始化; (4) 可以重载new和delete; 注意: (1) New与delete需要配对使用; (2) 可以为数组分配内存空间,如:p = new int[10]; (3) New可以为简单变量初始化,如:p = new int(10); (4) New无法为动态分配的数组进行初始化; (5) 释放动态分配的数组存储区时,delete的格式如:delete []p; (6) 内存分配失败时,new返回的指针为NULL,因此要对分配后的指针进行检查,以确保内存分配成功,或对内存分配失败的异常情况进行处理。 1.4.10 引用 1 引用的定义 类姓名 &,它的含义是“type类型的引用”,此引用与type类型的对象或变量的地址相关联。某变量或对象的引用类似与给该变量或对象起了一个“别名”,此别名与原变量或对象指向同一个内存地址。内容会同时变化。 说明: (1) 定义引用是必须立即进行初始化,且不可再被重新赋值; ; (2) 引用实际上是一种“隐式指针” (3) 引用不同于普通变量; (4) 当使用&云算符取一个引用的地址时,取出的是所引用变量的地址。 2 引用参数 将引用作为函数的参数,可以产生与指针参数一样的效果,但是必指针传递更清除简单。 将引用作为参数传入函数体后,函数内对该参数的操作都是在原参数地址上进行的,因此函数体内对参数的改变能够反映到函数外。但是采用“值传递”的方式是却不同,采用值传递时,函数会在函数体内重新生成传入参数的“副本”,虽然具有相同的值,但是却与原参数不共用同一地址,因此在函数体内对该“副本”的操作无法体现在函数体外。 C++中主张用引用传递取代地址传递。 3 引用返回值 将一个函数的返回值声明为一个引用的主要目的是:将该函数用在赋值运算符的左边。 4 什么时候需要用“引用”? 流操作符<<和>>; 值操作符=的返回值; 拷贝构造函数的参数; 赋值操作符的参数。 5 指针和引用的区别? 非空区别:在任何情况下都不能使用指向空值的引用。 合法性区别:在使用引用之前不需要测试它的合法性。相反,指针则应该总被测试, 防止它为空。 可修改区别:引用总是指向初始化时被指定的对象,而不能改变。但是其指定的对 -7- 通信笔试宝典(第二版) 象的内容是可以改变的。 1.5 类和对象 1.5.1 类和对象的基本概念 1 对象、类和继承 ♦ 类:c++语言封装的基本单位,将数据和函数封装在一起;描述一类事务的共同属 性 ♦ 对象:类的实例,每个属性都有确定值。 ♦ 继承:派生类继承了父类的属性和操作,但也定义了新的属性和操作。 2 定义一个空类,系统产生四个默认的函数 ♦ 默认构造函数 ♦ 默认析构函数 ♦ 默认拷贝构造函数 ♦ 默认赋值函数 3 类和结构的惟一不同就是访问控制。 ♦ 结构体默认是public ♦ 类默认是private 1.5.2 构造函数 1. 拷贝构造函数 特殊的构造函数,用于依据已建立的对象建立一个新对象。 (1) 自定义的拷贝构造函数 Classname(const classname &p) { //函数体; } (2) 缺省的拷贝构造函数 C++编译器自动生成,基本能够胜任大多数工作,无需再自定义。 但只能执行浅拷贝。当成员变量含有指向堆的指针时,就必须用深拷贝,即自己定义拷贝构造函数。 ( 浅拷贝:没有复制资源,复制后指向同一资源 深拷贝:复制了资源,复制后指向不同资源。 ) (3) 调用形式: Classname p2(p1); //p1是已建立的对象; Classname p2 = p1; 注意:与构造函数一样,拷贝构造函数同样没有返回值。类中有指针时,有时拷贝构造函数有可能会产生错误。 3 如果一个类对象作为另外一个类的成员,即组合,则在构造时,先调用成员构造函数,再调用整个类的构造函数。析构时顺序相反。 -8- 通信笔试宝典(第二版) 1.5.3 析构函数 与构造函数执行相反的操作,用于清理、释放对象的内存空间。 特点: (1) 与类同名但是前面加波浪号(~); (2) 没有参数,也没有返回值,而且不能被重载,因此一个类中只能有一个析构函数; 如果没有显式的定义时,编译器会为该类自动生成(3) 每个类中必须有一个析构函数, 一个缺省的析构函数; (4) 与构造函数一样,只能为public类型,否则外界不能调用 (5) 不能显式的调用,撤销对象时系统会自动调用析构函数。 (6) 一般设为虚函数 (7) 如果用new分配对象,则必须采用delete才会调用析构函数。 (8) 如果类定义中使用new为数据成员分配内存,则必须显式定义析构函数,采用delete释放内存。否则,即使调用析构函数,也不会释放内存。 1.5.4 对象数组和对象指针 1. 对象数组 2. 对象指针 3. This指针 This指针是一种特殊的对象指针,是一种隐含指针。它是成员函数所属对象的指针,指向调用该成员函数的对象的地址。 This指针是如何工作的呢? 对于每一个成员函数,C++编译器都会将其做一些简单处理,如: Init(int x, int y); 会变成: Init(&ob,int x,int y); C++编译器把对象作为参数传递给函数(传地址)。 1.5.5 向函数传递对象 有传值和传指针两种形式(包括引用传递),类似与C中的用法,不再赘述。 1.5.6 静态成员 静态成员包括:静态数据成员和静态成员函数。在类的定义中通过关键字“static”来声明。 静态成员的特性:不管创建了的多少个类对象,而其静态成员只有一个拷贝(副本),这个拷贝被所有的类对象共享。 1. 静态数据成员 ,而不属于某一特定的(1) 静态数据成员属于整个类(或者说是属于该类的所有对象) 对象,因此对静态数据成员的引用需要使用类名,如“类名::静态数据成员名”; (2) 静态数据成员的初始化不能在类定义内部,因为类中不给它分配内存空间(注意,静态数据成员的存储区域不同于普通的数据成员,它存储在程序的静态存储区,而普通的数据成员通常存储在堆栈中)。因此,要在类外进行定义和初始化,且只能初始化一次。 (3) 在编译时创建并初始化。 (4) 主要用途是定义类的各个对象所共用的数据,而不必使用全局变量。 2. 静态成员函数 基本上只访问静态数据成员和全局变量。 说明: -9- 通信笔试宝典(第二版) (1) 可以定义为内嵌的,也可以在类外定义,在类外定义时不能使用“static”前缀; (2) 编译器会把静态成员函数限定为内部连接,不会与其他同名函数发生冲突; (3) 静态成员函数可以在定义任何对象之前对静态数据成员进行处理; (4) 静态成员函数中没有this指针; (5) 一般来说,静态成员函数不能访问类中的非静态成员。 1.5.7 友元 一个类中,对某个函数前声明加friend ,则该函数就是其友元函数。可以访问所有数据成员。 1.5.8 类对象作为成员(组合) 注意与继承方式的区别 访问控制方式 1.6 派生类与继承 1.6.1 派生类声明 定义格式: Class 派生类名:派生方式 基类名{ //派生类数据成员、成员函数声明 } 1.6.2 派生方式 (1) 共有派生(public) 在共有派生方式中,基类的共有成员在派生类中仍是共有成员,外部函数和派生类的成员函数可以直接访问。 但是基类的私有成员不能被派生类的成员函数和外部函数直接访问,但是派生类可以通过调用基类的共有成员函数来间接访问基类的私有成员。 说明: 派生类以共有派生的方式继承了基类,但派生类并不可以直接访问基类的私有成员。基类无论怎样被继承,它的私有成员都对该基类保持私有性,外部函数和派生类的成员函数都无权访问它。 如果派生类与基类出现了同名的函数,则在派生类中对该名字函数的访问总是调用派生类中定义的函数体。 (2) 私有派生(private) 在私有派生方式中,基类的共有成员函数在派生类中成为私有成员,这些私有成员可以被派生类的成员函数访问。 但是基类的私有成员虽然被继承为派生类的私有成员,但是派生类不能直接访问它,只能通过基类提供的共有成员函数来间接访问。 基类中的私有成员只能被基类的共有成员函数访问。 (3) 共有派生与私有派生的异同 无论哪种派生方式,基类中的私有成员都不能够被派生类成员函数和外部函数访问,但派生类可以通过基类提供的共有成员函数访问; 共有派生与私有派生的区别在与:基类的共有成员在派生类中的访问属性。 保护成员的作用 保护成员只对派生类开放,派生类成员函数可以直接访问基类的保护成员。 基类成员在派生类中的访问权限:在共有派生的情况下,基类中所有成员的访问特性 -10- 通信笔试宝典(第二版) 在派生类中保持不变;在私有派生的情况下,基类所有成员在派生类中都成为私有成员。如下表: 派生方式 Public 共有派生 Private 私有派生 基类中的访问权限 Public Protected Private Public Protected Private 派生类中的访问权限 Public Protected Private Private Private Private 1.6.3 派生类构造函数和析构函数 1 派生类构造函数和析构函数的执行顺序 基类的构造函数Æ派生类的构造函数; 派生类的析构函数Æ基类的析构函数; 2 派生类构造函数和析构函数的构造规则 派生类不能继承基类中的构造函数和析构函数。 如果基类的构造函数没有参数,则派生类的构造函数可以不向基类传递参数甚至可以不定义构造函数。但是,如果基类中的构造函数带有参数时,基类必须定义带参数的构造函数,并且需要向基类传递参数。 派生类中的构造函数的定义方式为: 派生类构造函数名(参数表):基类的构造函数名(参数表) { //… } 基类与派生类的构造函数执行顺序如1中所述。 如果派生类的成员中含有对象成员时,其构造函数的定义格式为: 派生类构造函数名(参数表):基类的构造函数名(参数表),对象成员名1(参数表),…,对象成员n(参数表) { //… } 在定义派生类对象时,其执行顺序为: 基类的构造函数Æ派生类对象成员的构造函数Æ派生类的构造函数; 其析构函数的执行顺序正好相反。 说明: (1) 基类中的构造函数不带参数表时,派生类可以不定义构造函数,甚至可以省略掉“:基类构造函数(参数表)”。但是如果基类中的构造函数带有哪怕只有一个参数时,所有的派生类都需要定义构造函数,甚至所定义的派生类构造函数体为空,仅仅起到参数传递的作用。 (2) 如果派生类的基类同样是由某个类派生得来的,那么每个派生类只负责其直接基类的构造,依次上溯。 (3) 派生类与基类的析构函数是各自的。 1.6.4 多重继承 1. 多重继承的声明 多重继承的声明形式: Class 派生类名:派生方式1 基类1,派生方式2,基类2,…,派生方式n 基类n -11- 通信笔试宝典(第二版) { //派生类新增的数据成员和成员函数… } 2. 多重继承的构造函数和析构函数 多重继承的构造函数定义的一般形式如下: 派生类构造函数名(参数表):基类1(参数表),基类2(参数表),…,基类n(参数表),对象成员名1(参数表),…,对象成员名m(参数表) { //派生类新增的成员函数和数据成员 } 多重继承的构造函数与析构函数的执行顺序与单继承类似,不再赘述。 另外,在多个基类之间,严格按照派生类声明时从左到右的顺序来排列先后。 3. 虚基类 ♦ 消除二义性 ♦ 虚基类的定义,通过关键字virtual来完成。 ♦ 虚基类的初始化 ♦ 虚基类构造函数的调用先于非虚基类构造函数调用。 ♦ 关键字virtual与派生方式关键字public或private的先后顺序无关紧要。 1.7 多态性 ♦ 编译时多态,静态联编,函数重载和运算符重载; ♦ 运行时多态,动态联编,继承和虚函数; 1.7.1 函数重载 参数不同的函数重载在前面已介绍过,不再赘述。 参数相同的函数重载(属于不同的类)时: (1) 根据对象所属的类来实现不同的动作; :”加以区分。 (2) 或者通过使用“类名: C++编译器时常采用“名字压延”的方式来区分重载函数。指在编译器“看”到函数后改变函数的名字。 1.7.2 运算符重载 1.8 内存泄漏浅析 就是使用内存资源后没有被回收。通常是指堆内存的泄漏,堆内存在使用完后必须显式释放。 malloc,realloc,new申请,free,delete释放。 内存泄漏分为4类: (1) 常发性内存泄漏; (2) 偶发性内存泄漏; (3) 一次性内存泄漏; (4) 隐式内存泄漏; 单元测试,一个一个得试,看是哪个模块出了问题。 检测内存泄漏,关键是能截获住对分配和释放内存的函数的调用,然后跟踪每一块内存 -12- 通信笔试宝典(第二版) 的生命周期。 Windows下,检测内存泄漏的工具常用的有三种: (1) MS C-runtime Library; (2) Performance Monitor; (3) Purify, BoundsChecher等,外挂式; 1.9 C++中类的继承和组合 继承:继承是面向对象语言的一个重要特征。 B是A的“一种”, 并且A的所有功能和属性对B而言都有意义,则允许B继承A的功能和属性。 组合:如果逻辑上A是B的“一部分”,则不允许B从A继承,而是要用A和其它东西组合出B。 1.10 虚函数 用于实现多态机制,核心理念就是通过基类访问派生类定义的函数。一个类中的虚函数常常是你希望重载的成员函数。 多态:用同一代码产生不同的效果的特点。 使用时,基类声明的虚函数,在派生类中也是虚函数,即使不再使用virtual关键字。 虚函数的: ♦ 只有类的成员才能声明为虚函数; ♦ 静态成员函数不能声明为虚函数 ♦ 内联函数不能声明为虚函数 ♦ 构造函数不能声明为虚函数 ♦ 析构函数通常声明为虚函数,否则会出现内存泄漏的情况。 1.10.1 多态性、动态联编 多态性是面向对象的核心,即“一个接口,多个实现”。在C++中的具体表现为,通过基类指针访问派生类的函数和方法。C++中的动态联编是通过虚拟函数表“vtable”实现的。 1.10.2 “Vtable”机制 编译器为每个类的虚函数建立一个虚函数表Vtable,vtable实际上是一个函数指针的数组,派生类有自己的vtable,派生类的vtable与基类的vtable有相同的函数排列顺序,在创建类事例的时候,编译器还会在每个事例的内存布局中增加一个vptr字段,该字段指向本类的vtable。在运行时刻决定调用个函数。 每个虚函数都在vtable中占了一个表项,保存着一条跳转到它的入口地址的指令(实际上就是保存了它的入口地址)。当一个包含虚函数的对象(注意,不是对象的指针)被创建的时候,它在头部附加一个指针指向vtable中相应的位置。调用虚函数的时候,不管你是用什么指针调用的,它先根据vtable找到入口地址再执行,从而实现了“动态”联编。而不是像普通函数那样简单地跳转到一个固定位置。 1.10.3 override与overload的区别 override是指派生类重写基类的虚函数,类似与“覆盖”。允许子类重新定义成员函数。本质是迟后联编。正是多态的实现方式。 -13- 通信笔试宝典(第二版) overload是指编写一个与已有函数同名但参数表不同的函数,类似与“重载”。允许存在多个同名函数,依靠参数确定与哪个函数匹配。本质是先期联编,与多态无关。 1.10.4 纯虚函数 classa { virtualb()=0;//纯虚函数 virtualc(){...}//虚函数 }; ♦ 纯虚函数所属的类仅做为接口使用,不能实例化(即不能生成一个该类的对象).属于 抽象类。 ♦ 接口类的子类(derivedclass)必须overriden每个纯虚函数,使之成为非纯虚函数后,该 类才能产充许产生实例; ♦ 纯虚函数可以有该函数的定义,有可以没有.但纯虚析构函数必须要有定义. ♦ 虚函数在派生类中可以重载也可以不,但纯虚函数必须要重载。二者都体现了多态 性。但最大区别:有纯虚函数的类不能定义对象。 1.10.5 虚析构函数 基类的析构函数必须是虚的。否则,会出现一种典型的,很隐蔽的内存泄漏情况,如下: 基类的析构函数必须是虚的,否则会出现一种典型的内存泄漏情况。 class A { Public: A() {ptra = new char[10];} ~A() {delet[] ptra;} Private: Char *ptra; }; Class B:public A { Public: B() {ptrb = new char[20];} ~B() {delete[] ptrb;} Private: Char *ptrb; }; Void foo() { A *a = new B; Delete a; } //由于在delete a的时候实际上调用的析构函数是A::~A(),而B类的析构函数并没有被 -14- 通信笔试宝典(第二版) 调用,此时会出现内存泄漏。 //因此,基类的析构函数必须要声明为虚函数。 1.11 文件操作 声明一个文件指针:FILE *fp; 打开文件:fp = fopen(filename,使用方式); 关闭文件:fclose(fp); 向文件写字符:fputc(ch,fp); 从文件读字符:ch = fget(fp); -15- 通信笔试宝典(第二版) 2 数据结构 根据逻辑关系,数据结构可分为4类:集合、线性结构、数结构、图结构。 两种存储方式:顺序存储结构和链接存储结构。 2.1 算法概述 算法是对特定问题求解步骤的一种描述,算法的5个重要特性:输入、输出、有穷性、确定性和可行性。一个“好”算法还需要具有下列特性:正确性、鲁棒性、简单性、抽象分级和高效性。 伪代码是“算法语言”。 1. 算法设计的一般原则: (1) 理解问题。准确的理解算法的输入是什么?要求算法完成什么?即明确算法的入口和出口。 (2) 预测所有可能的输入。包括合法的输入和非法的输入。列举出算法必须处理的所有情况。 (3) 抽象分级,使解决方案模块化。可以有效的帮助我们解决复杂问题。 (4) 跟踪代码。发现算法中的逻辑错误的唯一重要的方法就是系统的跟踪算法。 2. 算法时间复杂度的分析方法 (1) 找出算法中的基本语句,执行次数最多的语句就是基本语句,通常是最内层循环的循环体。 (2) 计算基本语句执行次数的数量级。 (3) 用大O极好表示算法的时间性能。如果算法中包含嵌套的循环,则基本语句通常是最内层的循环体,如果算法中包含并列的循环,则将并列循环的时间复杂度相加。 2.2 线性表(重要,需要编码练习) 线性表可以顺序表、单链表、循环表、双链表和静态链表等。 2.2.1 单链表 1. 编写用来删除单链表的头元素的函数。 void RemoveHead(node **head) { node *tmp; // if the head is a NULL, do nothing. if(!(*head)) return; tmp = (*head)->next; free(*head); *head = tmp; return; } (1) 查看输入的参数是否合法; 考虑通常情况下的操作是否达到要求; -16- 通信笔试宝典(第二版) 考虑返回值是否达到要求; 检查异常情况下函数的功能; 最后检查函数的正确性需要满足如下三个条件: 1.能够完成要求的工作; 2.能够被正确调用,能够产生正确的返回值; 3.能够对异常情况作出适当处理。 2. 删除单链表的倒数第m个元素,算法需要即节省时间又节省空间,并对异常情况做出适当的处理。 解决思路:单链表,显然我们无法知道其长度n,因此在确定倒数第m个元素之前,我们首先要找到该链表的尾指针。那么首先,可以想到的一个算法就是先遍历该单链表,计算该链表的长度n,然后,我们可以确定倒数第m个元素的位置为(n-m),然后,再重新从链表的头开始搜索,找到(n-m)个元素后,就是需要找的。 这种方法的时间复杂度:O(n)。 空间复杂度:就是一个辅助指针。 那么这是不是最节省时间和空间的呢?不见得,我们还可以增加一个辅助指针变量,使其与遍历指针保持m个距离,即当“前导指针”遍历到第m个元素时,启动“拖后指针”,使“拖后指针”指向本链表的头指针,然后与“前导指针”同步移动,那么,当“前导指针”指向链表末时,此时“拖后指针”当前指向的元素即为“倒数第m个”元素。找到需要的元素。这种算法的时间复杂度:O(n),但是要比前一种方法节省了越一般的时间,因为,前一种方法需要对链表进行两次遍历,而后这只需要遍历一遍,付出的代价仅仅是增加了一个指针变量。所以是值得的。因此,我们可以选择第二种方法。 下面,我们来讨论一下本算法的函数原型:一般来说,我们总是希望函数的返回值能够是要找的“倒数第m个”元素,但是,考虑到可能出现的异常情况:寻找失败,所以,我们可以,令函数返回值为一个错误码,即寻找成功返回1,失败返回0,然后通过一个指向指针的指针参数来获得所要找的元素。代码如下,第一段代码的语义不够简洁,因此我又对其改进,如第二段代码。 //第一种实现代码。 int FindRevM(node const *head,void **getm,int m) { node *pre = head; node *behind = NULL; int i = 0; if(head == NULL) {return 0;} while(pre) { if(i < m) { i++; pre = pre->next; -17- 通信笔试宝典(第二版) } if(i == m) { behind = head; } pre = pre->next; behind = behind->next; } if(i < m) {return 0;} *getm = behind; return 1; } //第二种实现代码。 int FindRevM(node const *head,void **getm,int m) { node *pre = head; node *behind = NULL; int i = 0; if(head == NULL) {return 0;} for(i = 0; i < m; i++) { if(pre->next) { pre = pre->next; } // if the pre pointer reach the end of chain // before i reachs m, return false. because the // number of nodes on the chain is less than m. else { return 0;} } //start the behind pointer. behind = head; while(pre->next) { pre = pre->next; behind = behind->next; } //getm. *getm = behind; return 1; -18- 通信笔试宝典(第二版) } 2.2.2 数组 数组编程试题:删除特定字符 用C语言编写一个高效率的函数来删除字符串中 特定的字符,函数调用模型如下: void RemoveChars(char *str,char *remove) { int src,dst,removeArray[256]; //256 ASSIC characters, //Zero all elements in array. for(src = 0; src < 256; src++) { removeArray[src] = 0; } //mark the chars to be removed. src = 0; while(remove[src]) { removeArray[remove[src]] = 1; src++; } //Copy char unless it must be removed. src = dst = 0; do{// do...while terminates after NUL. if(!removeArray[str[src]] { str[dst++] = str[src]; } }while(str[src++]);} 2.3 特殊线性表 – 堆栈、队列和串(重要) 2.3.1 堆栈 栈是限定在表尾进行插入和删除操作的线性表,栈中元素除了具有线性关系外,还具有先进后出(LIFO,Last in First out)的特性。 用C++代码实现堆栈类: Class stack { public: stack(); ~stack(); Void push(void *data) Void pop(); Protected: -19- 通信笔试宝典(第二版) //Element struct needed only internally. Typedef struct elementT { Struct elementT *next; Void *data; } elementT; elementT *header; }; //constructure of stack class. stack::stack() { Header = NULL; Return; } Stack::~stack() { elementT *tmp; While(header) { tmp = header->next; free(header); header = tmp; } Return; } Stack::push(void *data) { elementT *tmp = new elementT; tmp->data = data; tmp->next = header; header = tmp; return; } Void *stack::pop() { elementT *tmp; void *data; assert(header != NULL); data = header->data; -20- 通信笔试宝典(第二版) tmp = header->next; free(header); header = tmp; return data; } 2.3.2 堆(heap)和堆栈(stack) heap:是由malloc之类函数分配的空间所在地。地址是由低向高增长的。 stack:是自动分配变量,以及函数调用的时候所使用的一些空间。地址是由高向低减少的。 一个由c/C++编译的程序占用的内存分为以下几个部分: ①栈区(stack) 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 ②堆区(heap) 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 ③全局区(静态区)(static) 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 ④文字常量区 常量字符串就是放在这里的。 程序结束后由系统释放 ⑤程序代码区 存放函数体的二进制代码。 2.3.3 队列 队列是只允许在一端进行插入操作、而在另一端进行删除操作的线性表,队列中的元素除了具有线性关系外,还具有先进先出(FIFO,First in First out)的特性。 2.4 树和二叉树 2.5 图 2.6 查找技术(重要) 静态查找:不涉及插入和删除操作的查找。 动态查找:涉及插入和删除操作的查找。 用平均查找长度衡量查找算法的时间性能。 -21- 通信笔试宝典(第二版) 折半查找判定树、时空权衡、平衡二叉树。 2.7 排序技术(重要,需要编码练习) 任意序列Æ按键值有序的序列。 排序算法的稳定性:具有相同键值的记录经过排序后其相对次序保持不变,则稳定。否则,不稳定。 1. 插入排序 插入排序:将记录插入到已排序序列的正确位置上。 直接插入排序Æ希尔排序。 直接插入排序:依次将待排序序列中的每一个记录插入到一个已排好序的序列中。时间复杂度:最好情况O(n),最坏情况O(n2),平均情况O(n2)。 希尔排序:直接插入排序的改进。先将待排序记录序列分割成若干子序列,在子序列内分别进行直接插入排序,最后对全体记录进行一次直接插入排序。时间复杂度:O(nlogn)~ 2 O(n)。 2 2. 交换排序 交换排序:将两个记录进行比较,当反序时进行交换。 冒泡排序Æ快速排序。 冒泡排序:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。 时间复杂度:最好O(n),最坏O(n2),平均O(n2)。 快速排序:冒泡排序的改进,选定轴值,将待排序记录分割成的两部分,左侧记录的关键码都小于等于轴值,右侧记录都大于等于轴值,然后分别对左右两部分再分别重复上述过程,直到整个序列有序。 时间复杂度:平均O(nlogn)。 2 3. 选择排序 选择排序:从未排序序列中选出最小记录放入已排序队列的一端。 简单选择排序Æ堆排序。 简单选择排序:第i趟通过n−i次关键码的比较,在n−i+1(1≤i≤n−1)个记录中选取关键码最小的,并通过与第i个记录交换最为有序序列的第i个记录。 时间复杂度:最好、最坏、平均都是O(n2)。 堆排序:简单选择排序的改进。首先将待排序序列构造成一个堆,然后选择堆中最大的记录即堆顶,从堆中移走,并将剩下的记录再调整成堆,找出其中最大的记录,再移走,以此类推。 时间复杂度:最好、最坏、平均都是O(nlogn)。 2 4. 归并排序 归并排序:将有序序列进行合并。 二路归并排序:将若干个有序序列两两归并,直至所有待排序记录都在一个有序序列为止。 时间复杂度:最好、最坏、平均都是O(nlogn)。 2 2.7.1 插入排序: z 直接插入排序 z 希尔排序 直接插入排序:把数组A[n]中待排序的n个元素看成一个有序表和一个无序表,开始 -22- 通信笔试宝典(第二版) 时,有序表中只包含一个元素A[0],无序表中包含n-1个元素A[1]~A[n-1],排序的过程是每次从无序表中取出一个元素,把它插入到有序表中的适当位置,使之成为一个新的有序表。这样经n-1次插入后,无序表变成空表,有序表就包含了全部n个元素,排序完毕。 技巧:在排序的过程中:将元素的比较和移动结合在一起。 void insertsort(int *a,int n) { int j;int x; for(int i = 1; i <= n-1; i++) { x = a[i]; for(j = i-1; j >= 0; j--) { if(a[j] > x) a[j + 1] = a[j]; else break; } a[j+1] = x; } } 希尔排序: 首先以的d1(0 int x, i,j,d; for(d = n/2; d >= 1; d /=2) { for(i = d; i < n; i++) { x = a[i]; for(j = i - d; j >= 0; j -= d) { if(a[j] > x) a[j + d] = a[j]; else break; } a[j + d] = x; } -23- 通信笔试宝典(第二版) } } 2.7.2 选择排序: z 直接选择排序 z 堆排序 直接选择排序:每次从待排序的区间中选择具有最小排序码的元素,把该元素与该区间的第一个元素交换位置。 void selectsort(int *a,int n) { int i,j,temp,p; for(i = 0; i < n; i++) { temp = i; for(j = i; j < n; j++) { if(a[j] < a[temp]) temp = j; } if(temp != i) { p = a[temp]; a[temp] = a[i]; a[i] = p; } } } 2.7.3 交换排序: z 冒泡排序 z 快速排序 冒泡排序:非常简单 快速排序: 首先从待排序区间(开始为A[0]~A[n-1],假定在A[n]元素的排序码域预先赋值为比所有排序码都大的一个值,称为哨岗),中选取一个元素(一般选择该区间第一个元素)作为比较的基准元素,通过从区间两端向中间顺序进行比较和交换。 2.7.4 归并排序: 2.8 字符串操作 -24- 通信笔试宝典(第二版) 3 嵌入式系统移植开发 3.1 Linux操作系统 3.2 ARM嵌入式应用系统开发 3.2.1 ARM体系处理器体系结构 1. RISC体系结构 RISC(Reduced Instruction Set Computer): 3.3 Linux驱动开发 在Linux操作系统下有两类主要的设备文件类型,一种是字符设备,另一种是块设备.字符设备和块设备的主要区别是:在对字符设备发出读/写请求时,实际的硬件I/O一般就紧接着发生了,块设备则不然,它利用一块系统内存作缓冲区,当用户进程对设备请求能满足用户的要求,就返回请求的数据,如果不能,就调用请求函数来进行实际的I/O操作.块设备是主要针对磁盘等慢速设备设计的,以免耗费过多的CPU时间来等待。 主设备号,标识设备类型。从设备号,标识同一类型(使用相同驱动程序)的设备的不同编号的设备。 3.4 如何编写一个Shell脚本 为什么要进行shell编程:使大量的任务自动化,shell擅长系统管理任务。 3.4.1 建立一个脚本 bash shell最常用。 1. 开始 #!/bin/sh 解析:#!这个符号用来告诉系统,它后面的参数是用执行该文件的程序。 2. 执行 编辑完成后,要执行该脚本,需要设置该文件的可执行性,如 chmod +x filename 3. 注释 以#号开头的一行表示注释。强烈建议使用注释。 4. 变量 所有的变量都由字符串组成,并且无需声明. 取出变量值可以在表示该变量的字符串前加$. 为了区别与一般的字符串,可以将变量用大括号括起来,如{变量名},表示取变量值。 处理数字表达式,需要expr。 由export关键字处理过的变量叫做环境变量。通常情况下只在登录脚本中使用环境变量。 -25- 通信笔试宝典(第二版) 3.4.2 shell命令与流程控制 shell脚本中使用的命令有三种:Unix命令、管道,重定向和backtick、以及流程控制。 1. unix命令 shell脚本中可以使用任意的unix命令,但有一些更常用,通常用来处理文件和文字操作。 常用命令语法及功能: echo \"some text\":将文字内容打印到屏幕上。 ls :列出文件列表信息。 wc -l filename :计算文件行数; wc -w filename :计算文件中的单词个数,word; wc -c filename :计算文件中的字符个数 cp sourcefile destfile& :文件拷贝 mv oldname newname :重命名文件或移动文件 rm file& :删除文件 grep 'pattern' filename& :在文件中搜索字符串'pattern' cut -b colnum file& :指定欲显示的文件内容范围,并将他们输出到标准输出设备。 cat filename:将filename的内容打印到标准输出设备上(屏幕)。 dirname file&:将file的文件夹路径打印出来。 head -n filename: print the first n rows characters of filename on the screen tail -n filename: awk:字段分割; 2. 管道,重定向和backtick (1) 管道(|):将一个命令的输出作为另一个命令的输入。 。 (2) 重定向:将命令的结果输出到文件,而不是标准输出(屏幕) > 写入文件,并覆盖旧文件; >> 加入到文件的末尾,保留旧文件的内容; :可以将一个命令的输出作为另外一个命令的一个命令行参数。 (3) 反短斜线(` `) 3. 流程控制 (1) if表达式 if...;then ... elif...;then ... else ... fi 通常用\"[ ]\"来表示条件测试,注意里面的空格很重要,不可或缺。 (2) case表达式 用来匹配一个给定的字符串,而不是数字。 case... in ...) do something here Esac -26- 通信笔试宝典(第二版) $1,$2,…$n,…$9表示传递给该程序的第n个参数值。 $*包含了所有输入的命令行参数。 $#表示输入参数的个数。 (3) select表达式 select表达式是一种bash的扩展应用,尤其擅长交互式应用,用户可以从一组不同的值中进行选择。 select var in... do break done 其功能是在in后面的一系列表达式中选择一个赋给var变量 (4) for表达式 for表达式类似与select表达式,用来查看一个字符串列表(字符串用空格分隔)然后将其赋给变量var。 for var in...;dow ... done (5) 引号,控制通配符和变量的扩展。 3.4.3 函数 每个程序的开始对函数进行声明和定义。 3.5 嵌入式程序员应该知道的10个基本问题 1 用#define声明一个常量,用以表明1年中有多少秒。 #define SECOND_PER_YEAR (60*60*24*365)UL 2 写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。 #define MIN(A,B) ((A) < (B)? (A):(B)) 3 预处理标识符#error的目的是什么? ???????? 4 嵌入式中经常用到无限循环,你如何用C编写死循环呢? while(1) {……} 5 用变量a给出下面的定义 (1) 一个整形数:int a; (2) 一个指向整形数的指针:int *a; (3) 一个指向指针的指针,它指向的指针是指向一个整数型:int **a; (4) 一个有10个整数的数组:int a[10]; (5) 一个有10个指针的数组,该指针指向一个整形数:int *a[10]; (6) 一个指向有10个整形数组的指针:int (*a)[10]; (7) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数:int (*a)(int); (8) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数:int (*a[10])(int); 6 关键字static的作用是什么? 能只能被本模块的其他所有函数调用,不能被模块外其他函数访问; (1) 本地全局变量, -27- 通信笔试宝典(第二版) (2) 在函数体内的static变量,在本次调用过程中维持其指不变。 7 关键字const的涵义? (1) 产生更紧凑的代码; 替代宏常量,在预编译阶段可以进行类型检测; 8 Volatile有什么涵义? 可能会被意想不到的改变,编译器不能假设这个变量值。 Volatile:可能有意向不到的改变,编译器不能假设这个变量值。 9 位操作,#define BIT3 (0x01<< 3) (1) 设置bit 3:a |= BIT3; (2) 清除bit 3:a&=~BIT3; 10 访问一绝对地址 int *ptr; ptr = (int *)0x67a9; *ptr = 0xaa55; 11 中断服务子程序(ISR),关键字_interrupt. (1) 中断服务子程序ISR不能返回一个值; (2) 中断服务子程序ISR不能传递参数; (3) 中断服务子程序应该短而有效,好像不支持浮点重入。 12 用一个C语言表达式判断一个数是否位2的N次幂。 答案:x == (((x ^ (~0x0)) + 1) & x)(按位取反加一后,等于自己) -28- 通信笔试宝典(第二版) 4 操作系统相关 4.1 基本概念 下图为操作系统与其他程序的关系 1系统调用:操作系统提供给开发人员的接口,可以使用操作系统的功能。 主要功能有: 设备管理;文件管理;进程管理;进程通信;存储管理等。 2 管态和目态 ♦ 管态(态、系统态):处理器运行系统程序; ♦ 目态(用户态、算态):处理器运行用户程序 (如果用户程序要使用操作系统的功能,需要触发中断,通过系统调用,从用户态转移到管态) 3 中断: ♦ 当某个时间发生后,终止CPU的现有程序,运行某个中断子程序 ♦ 中断是激活操作系统调用的惟一方法 ♦ 分类: 强迫性中断、自愿性中断 内中断、外中断 -29- 通信笔试宝典(第二版) 4.2 进程与线程 进程 ♦ 是程序中的一次执行(同一程序在不同数据中执行,为不同的进程),是 资源分配和保护的基本单位。 组成: ♦ 程序:(进程与程序存在区别) ♦ 数据 ♦ 进程控制块(PCB):包含了进程的描述信息和控制信息,是进程的动态 特性的集中反映。 进程的状态: ♦ 就绪态:一切就绪,只差处理器 ♦ 运行态:正使用处理器 ♦ 阻塞态(等待态):还等待某件事情的发生(输入输出);发生后,即可 进入就绪态。 ♦ 还可以细分出挂起态: 将进程移出主存,到磁盘映像中(虚拟存储设备),释放其占用的资 源 暂时不参与低级调度,需要重新调入主存才能参与低级调度 调度 运行 时间片 用完 I/O请求 就绪 I/O完成 阻塞 进程队列: 将同一状态的各进程的PCB排成队列。在调度时候使用。 -30- 通信笔试宝典(第二版) 引入线程的原因: 单线程进程并发粒度较低 线程 thread: ♦ 理解为进程中执行的一段程序片段, 在一个多任务环境下面的概念可以 帮助我们理解两者的差别。(进程内一个执行单元,可调度实体) ♦ 是资源调度和分派的基本单位。(进程是资源分配的基本单位) ♦ 线程的实现 用户级线程ULT 内核不知道多线程的存在,每次只调度一个线程; 内核级线程KLT 内核知道多线程存在。如果一个线程被阻塞,则可以调度另外一个线程,但切换开销较大。 混合式线程 线程的状态: 运行、就绪、等待态 挂起与终止态是进程级的状态 进程和线程关系: ♦ 线程是进程的一个组成部分。每个进程创建时通常只有一个线程,需要时 可创建其他线程。 ♦ 进程的多线程都在进程的地址空间活动。 ♦ 资源是分给进程的,不是分给线程的。线程在执行中需要资源时,可从进 程资源中划分。 -31- 通信笔试宝典(第二版) ♦ 处理机调度的基本单位是线程,线程之间竞争处理机。真正在CPU上运行 的是线程。 ♦ 线程在执行时,需要同步。 ♦ 进程间是的,内存空间上下文环境上,线程运行在进程空间中。 ♦ 同一进程所产生的线程共享同一内存空间。同一进程 中两段代码不能够同 时执行,除非引入线程。线程中占用的资源要小于进程所占用的资源。进程和线程都有优先级。 线程A 进程 控制块 PCB 线程B 线程控制块TCB 用户栈 核心栈 线程C 线程控制块TCB 用户栈 核心栈 线程控制块TCB 用户栈 核心栈 用户地址空间 4.3 并发进程 并发进程: ♦ 允许并发进程,可以提高系统效率 ♦ 关系: 竞争关系:可能引起死锁或者饥饿,需要通过临界区管理实现(互斥) 协作关系:需要同步 临界区管理: 并发进程中与共享变量有关的程序段(共享变量代表的资源称为临界资 源) 解决互斥问题 调度原则:无空等待、有空让进、择一而入、算法可行(不造成饥饿或 者死锁) 信号量 ♦ 表示资源实体的整型变量,通过信号量传送信号,通过P、V操作来发 送和接收信号 ♦ 分类: 记录型信号量 -32- 通信笔试宝典(第二版) 整型信号量 二元型信号量 ♦ 只能进行PV操作 PV操作(不同信号量中具体定义不同) ♦ 作用:可以解决同步与互斥问题 ♦ P操作:测试 ♦ V操作:增量 管程: 将与共享有关的操作集中到一起进行操作和控制,是一个软件模块,每次只循序一个进程进入其内(代表共享资源的数据结构和在其上的操作过程构成管程) 进程通信 ♦ 不同进程之间进行一些接触 ,相互协调工作 ♦ 进程间通信方式 信号 ♦ 又称软中断,通过发送一个指定信号来通知进程。 ♦ 与信号量存在差别。信号使用信号处理器来进行的信号量使用PV操 作实现同步与互斥,通过管程实现,只能传送简单信号,不能传送大量消息。 消息队列 ♦ 比较高级的一种进程间通信的方法。 ♦ 采用receive和send原语进行大量消息的传输 ♦ 分类 z 直接通信:直接发送给目标进程 z 间接通信:把消息发送到存放消息的缓冲区(信箱) 共享内存 最快捷、最有效 共享文件 通过管道实现,FIFO 线程间通信: ♦ 临界区 ♦ 互斥量 ♦ 信号量 ♦ 事件 多进程和多线程的区别 : -33- 通信笔试宝典(第二版) ♦ 子进程是父进程的复制品,子进程获得父进程的数据空间,堆和栈的复 制品 。 ♦ 线程相对于进程而言,线程是一个更加接近执行体的概念 ,可以于同进 程的其他线程共享数据,但拥有自己的栈空间,拥有的执行序列。两者都可以提高程序的并发度,提供程序执行效率和响应时间 ♦ 线程和进程在使用上各有优缺点,线程执行开销小,但不利于资源管理 和保护,而进程相反。线程适合于smp机器上运行,而进程则可以跨机器迁移。 ♦ 多进程时候每个进程都有自己的地址空间,address space 线程则共享地 址空间,所有的其他区别都是由此而来的。 ♦ 速度:线程所产生的速度快,通信快、切换快等 因为它们在同一地址空 间中,资源利用率:线程的资源利用率比较好。因为它们在同一地址空间内。 ♦ 同步问题:线程使用公共变量内存时需要使用同步机制,还是因为它们 在同一地址空间内 。 死锁 死锁就是两个或多个进程无止境地等候着永远不会成立的条件的一种系 统状态。 在两个或多个并发进程中,如果每个过程持有某中资源而又都等待着别 的进程释放它或他们现在白吃的资源,否则就不能向前推进。 死锁产生原因: ⒈系统资源不足 ⒉进程推进顺序非法 产生死锁的4个必要条件: ① 互斥条件 ② 不剥夺条件 ③ 部分分配 ④ 环路条件 解决死锁策略: ⒈采用静态分配方法来预防死锁(静态预防) ⒉采用有控分配方法来避免死锁(动态避免) ⒊当死锁发生时检测出死锁并设法修复 垃圾回收 垃圾回收器通常作为一个单独的低级别的线程运行 , 在不可预知的情况下 对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收 ,程序员 不能实时地 调用垃圾回收器对某个对象或所有对象进行垃圾回收。 分代复制 垃 -34- 通信笔试宝典(第二版) 圾回收 标记垃圾回收 增量垃圾回收、 4.4 处理器调度 处理器调度对象:(分为作业管理和进程管理) ♦ 作业:用户提交给操作系统的一个任务(具有提交、收容、执行、完成 四个作业步骤) ♦ 进程:完成一个任务的执行实体 分为三个级别 ♦ 高级调度 又称长程调度、作业调度,负责各作业进入调度队列。(按照一定算法, 将处于作业井中的作业放到内存中运行) 对应进程状态中的新建态和终止态 调度算法 FCFS SIF:最短作业有限 响应比最高优先(1 + 作业等待时间/作业估计执行时间) ♦ 中级调度 又称中程调度,负责阻塞控制等(负责阻塞队列、就绪队列的调度) 需要把进程的部分或者全部换到外存中,平衡负载(即虚拟内存) 对应挂起态 ♦ 低级调度 针对处理器调度,对应就绪态、等待态、运行态 负责从就绪队列中选择合适的进程占用处理器 常用调度算法 先来先服务 轮转调度 分级轮转法 优先数法 4.5 存储管理 存储器的等级 存储管理范围:寄存器、高速缓存(Cache)、主存储器、磁盘缓存 设备管理范围:固定磁盘、可移动存储介质 -35- 通信笔试宝典(第二版) 存储管理功能: 主存空间的分配与回收 静态存储分配 动态存储分配 地址转换与存储保护 将逻辑地址转化为物理地址 z 物理地址(内存地址) z 逻辑地址(相对地址):用户目标程序使用的地址单元 静态重定位 动态重定位 存储保护:避免其它程序的破坏 上下界存储保护 基址-限长存储保护 主存空间的共享 主存空间的扩充(虚拟存储) 对内存进行逻辑上的扩充 分区式(连续存储) 固定分区 可变分区 分页式 允许把一个作业存放到若干不相邻的分区中,减少内存碎片 -36- 通信笔试宝典(第二版) 原理: 页框:物理地址分成大小相同的区 存储分配时,用户地址在每个页框内是连续的,但在页框之间不是连续 的 页面:逻辑地址分成的大小相同的区 逻辑地址:页号和单元号(页内的地址) 地址转换:利用重定位寄存器实现逻辑地址到物理地址的转换 页表:各个页面重定位器的集合,用来记录程序页面和主存对应页框之间的 关系 绝对地址 = 块号 x 块长 + 单元号 页表控制器:整个系统只有一个页表控制器(只有占有CPU的作业才控 制页面控制器) 快表: 为提高访问速度,利用相联存储器(一种高速缓冲存储器)来存放最近 访问的部分页表 存放在高速缓存州官的页表即为快表 首先有MMU(地址转换机构)查询快表,如果查到,形成绝对地址; 否则,查询主存中的慢表,并将慢表的页面登记到快表中(替换机制) -37- 通信笔试宝典(第二版) 分段式 原理 按照程序模块,每块组合成一段,段内地址连续,段间地址不连续。(这 种地址结构需要编译程序支持,但对程序员是可见的) 逻辑地址 段号 + 段内地址 与分页区别: 分段长度可变,由程序结构决定,用户可见; 分页长度由系统决定,用户不可见 虚拟存储管理 “部分装入,部分对换“,为用户提供主存扩展,将当前使用的部分装入主 存,不用的部分放到辅存中,使用时再调入。 分类: 请求分页式、请求分段式、请求段页式 以请求分页为例 硬件支持――MMU(主存管理单元) 逻辑地址到物理地址转换 原理: 当需要执行某条指令或使用某个数据时,发现其不在主存中,就产生一 个缺页中断,系统从辅存中把所在页面调入内存。 执行步骤: MMU将逻辑地址分解为页号和页内地址 以页号为索引查找快表TLB -38- 通信笔试宝典(第二版) 如果命中,返回物理地址;否则,检查主存中页表,如果命中,返回物 理地址,将页表添加到TLB;否则,检查辅存,调入内存,修改页表。 页面装入策略 请页式调入 产生缺页中断,只调入请求的页面。 预调式调入 操作系统按照某种算法,预测进程可能访问的页面并调入主存 页面分配策略 清楚算法 请页式清除 预约式清除 页面替换策略 全局替换(进程之间) 局部替换(只局限在本进程内) 颠簸(抖动)现象: 某些页面被频繁调入和淘汰 缺页中断率 f = F/A = F/(F + S) 其中: S:成功访问的次数(页面在主存中) F:不成功的访问次数(缺页中断次数) 页面调度算法 随机页面替换 先进先出算法(FIFO算法) 最久未使用页面置换算法(LRU算法) 第二次机会页面替换 对FIFO策略的修正。最先进入主存的页面(队首页面),如果最近 还在使用,则作为一个新调入页面一样留在主存中(调到队尾) 时钟页面替换策略 利用循环队列构造FIFO队列(修改过和未修改页面有区别,未修改 清除,不需要写回辅存) 4.6 设备管理 设备分类: 存储设备、I/O设备 -39- 通信笔试宝典(第二版) 字符设备(如键盘)、块设备(如磁盘) 系统设备、用户设备 I/O控制方式 查询方式 中断方式 DMA方式 通道方式 驱动程序和设备控制器 设备控制器: 连接CPU和设备,接收CPU的指令,控制I/O设备,实现数据通 信 构成:设备名、设备属性、设备状态、设备地址、等待队列指针 设备驱动程序 实现逻辑设备到物理设备的转换。 发出I/O命令,启动相应的I/O设备,完成相应的I/O操作。 设备分配 设备性, 分为逻辑设备和物理设备,作业指定逻辑设备,设备管理来指定物理设备 分类 独占设备 z 被这个作业所独占使用,其他的任何作业不能使用,直到该作业 释放该设备为止 z 静态分配方式, 共享设备 z 指允许多个用户共同使用的设备 z 动态分配方式 虚拟设备 代替独享设备的那部分存储空间及有关的控制结构。 虚拟分配 虚拟分配 原理: 预输入:先将需要处理的数据输入到设备的部分存储区 适当时候,调度设备进行处理。 缓输出:结果保存到输出缓存,成批输出 (当进程中请求独享设备时,系统将共享设备的一部分存储空间分配给 -40- 通信笔试宝典(第二版) 它。进程与设备交换信息时,系统把要交换的信息存放在这部分存储空间,在适当的时候对信息作相应的处理。) 多个进程同时使用一独享设备,而对每一进程而言,都认为自己独占这一设 备,不过,该设备是逻辑上的设备。 优点 提高设备利用率 解决了高速CPU与低速设备的不匹配关系 增加多道程序的道数 实现――Spooling技术(假脱机技术) 通过共享设备来模拟独享设备 Spooling系统组成 输入井和输出井 输入缓冲区和输出缓冲区 输入进程和输出进程 优点: (1)提高了I/O速度。从对低速I/O设备进行的I/O操作变为对输入井或输出井的操作,如同脱机操作一样,提高了I/O速度,缓和了CPU与低速I/O设备速度不匹配的矛盾。 (2)设备并没有分配给任何进程。在输入井或输出井中,分配给进程的是一存储区和建立一张I/O请求表。 (3)实现了虚拟设备功能。 4.7 其他问题 -41- 通信笔试宝典(第二版) 5 通信网关键技术 5.1 常见问题 5.1.1 各种网络设备的区别 ①网卡: ♦ 负责计算机与电缆的连接, 功能: ♦ 数据的封装与解封; ♦ 链路管理; ♦ 编码译码; ♦ 网卡中固化了MAC地址(物理地址、硬件地址,6字节)。 ②集线器: 一种一对多的转发器,工作在物理层。可以使用集线器扩展局域网,但只有转发功能,不能将帧进行缓存 ③交换机: 工作在2层,按照MAC地址决定其转发端口,具有过滤帧的功能。交换机的功能体现出不仅仅是一个网桥的功能,而是多个网桥功能的集合。可以把网络系统划分成为更多的物理网段,这样使得整个网络系统具有更高的带宽。 ④网桥 工作在2层,根据MAC地址对收到的帧进行转发,也具有过滤帧的功能。 ⑤路由: 工作在IP层,根据IP地址选择合适的路径。 ⑥网关 网关(Gateway)就是一个网络连接到另一个网络的“关口”。网关(Gateway)又称网间连接器、协议转换器。网关在TCP层上以实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连。网关的结构也和路由器类似,不同的是IP层。网关既可以用于广域网互连,也可以用于局域网互连。 网关是 -42- 通信笔试宝典(第二版) 一种充当转换重任的计算机系统或设备。在使用不同的通信协议、数据格式或语言,甚至体系结构完全不同的两种系统之间,网关是一个翻译器。与网桥只是简单地传达信息不同,网关对收到的信息要重新打包,以适应目的系统的需求。同时,网关也可以提供过滤和安全功能。大多数网关运行在OSI 7层协议的顶层--应用层。 5.1.2 交换机和路由器的区别 a) 交换是指转发和过滤帧,是交换机的工作,它在OSI参考模型的第二层。 而路由是指网络线路当中非连接的链路,它是路由器的工作,在第三层。 b) 交换不需要IP,而路由需要; c) 交换机只是在一个特定网络工作,路由用来连接不同网络; d) 交换机可以接上不同主机,路由用来转发分组; e) 交换机用所在网络特定协议,路由使用统一IP协议; f) 第二层的技术和第三层的技术是不一样的。 g) VLAN是第二层的技术。控制广播,安全,灵活和可扩展性。 h) 第二层交换机和路由器的区别: i. 传统交换机从网桥发展而来,属于OSI第二层即数据链路层设备。它根据MAC地址寻址,通过站表选择路由,站表的建立和维护由交换机自动进行; ii. 路由器属于OSI第三层即网络层设备,它根据IP地址进行寻址,通过路由表路由协议产生。因特网的路由选择协议:内部网关协议IGP和外部网关协议EGP。 i) 第三层交换机和路由器的区别: i. 在第三层交换技术出现之前,几乎没有必要将路由功能器件和路由器区别开来,他们完全是相同的:提供路由功能正在路由器的工作,然而,现在第三层交换机完全能够执行传统路由器的大多数功能。 综上所述,交换机一般用于LAN-WAN的连接,交换机归于网桥,是数据链路层的设备,有些交换机也可实现第三层的交换。路由器用于WAN-WAN之间的连接,可以解决异性网络之间转发分组,作用于网络层。他们只是从一条线路上接受输入分组,然后向另一条线路转发。这两条线路可能分属于不同的网络,并采用不同协议。相比较而言,路由器的功能较交换机要强大,但速度相对也慢,价格昂贵,第三层交换机既有交换机线速转发报文能力,又有路由器良好的控制功能。 5.1.3 面向连接服务和无连接服务 面向连接服务:数据传输过程必须经过连接建立、连接维护与连接释放 -43- 通信笔试宝典(第二版) 的3个过程,(分组不需要携带目的结点的地址,传输可靠性好,协议复杂,通信效率不高。)(虚电路服务) TCP是种面向连接的、可靠的传输层协议(是一种面向连接的、可 靠的、基于字节流的运输层通信协议) 无连接服务:每个分组携带完整的目的结点地址,各分组传送。不 需建立连接、连接维护和连接释放3个过程,尽最大努力交付。(通信协议相对简单,通信效率高,可靠性不好)(数据报服务) IP协议是一种不可靠、无连接的数据报传送服务的协议 UDP是一种无连接的、不可靠的、基于包的传输协议 5.1.4 同步通信和异步通信 同步通信:通信双方必须先建立同步,即双方的时钟要调整到同一个频 率。收发双方不停地发送和接收连续的同步比特流。 异步通信:异步通信在发送字符时,所发送的字符之间的时间间隔可以 是任意的。当然,接收端必须时刻做好接收的准备(如果接收端主机的电源都没有加上,那么发送端发送字符就没有意义,因为接收端根本无法接收)。发送端可以在任意时刻开始发送字符,因此必须在每一个字符的开始和结束的地方加上标志,即加上开始位和停止位,以便使接收端能够正确地将每一个字符接收下来。异步通信的好处是通信设备简单、便宜,但传输效率较低(因为开始位和停止位的开销所占比例较大)。 异步通信也可以是以帧作为发送的单位。接收端必须随时做好接收帧的 准备。 5.1.5 OSI七层网络结构 1) 物理层:透明比特传输 2) 数据链路层: z 作用: 差错控制 排序 流量控制 z 负责网络结点间的线路上通过检查、流量控制和重发等手段,无 差错地传送以帧为单位的数据。在每一帧中带有同步,地址,差错控制以及流量控制等控制信息。 z 协议:ARQ、HDLC协议、PPP协议。 z 数据名称:数据帧(Frame) 3) 网络层: 功能:寻址;DNS;路由选择。 -44- 通信笔试宝典(第二版) 为了将数据分组从源送到目的地,网络层的任务是选择合适的路由和交 换节点,使源的传输层传下来的分组信息能够正确无误地按照地址找到目的地,并交付给相应的传输层,即完成网络的寻址功能。 数据名称:IP数据包(Packet) 4) 传输层。 作用:差错控制;拥塞控制。 传输层传输的单位是报文,当报文较长时将它分割成若干分组,然后交 换给网络层传输。 数据名称:数据段(Segment) 5) 会话层 6) 表示层 7) 应用层。 5.1.6 TCP/IP协议结构 TCP/IP协议是五层结构 ♦ 物理层 ♦ 网络接口层: 这是TCP/IP协议最低一层,包括多种逻辑链路控制和媒体访问协议。网络接口层的功能是接受IP数据报并通过特定的网络进行传输,或者从网络上接收物理帧,抽取出IP数据包并转发给网际层。 协议:SLIP(串行线Internet协议)、PPP(点到点协议) ♦ 网际层(IP): 包括IP、IMCP、ARP、RARP等协议。 该层负责相同或不相同网络中计算机之间的通信,主要处理数据包和路由。在IP层中,ARP协议主要用于将IP地址转换成物理地址,RARP协议用户将物理地址转换成IP地址,ICMP协议用于报告差错和传送控制信息。IP协议在TCP/IP中处于核心地位。IP协议可以进行IP数据包的分割和组装。 ♦ 传输层: 提供应用层进程间的逻辑通信。 该层提供TCP\\UDP两个协议,他们都建立在IP协议的基础上,其中TCP提供可靠的面向连接的服务,UDP提供简单的无连接的服务。 ♦ 应用层: Telnet、SMTP、DNS等协议。 5.1.7 网络中数据的名称 -45- 通信笔试宝典(第二版) 5.1.8 IP网络中的地址 ①IP地址 每一个主机都有惟一的地址,作为该主机在Internet上的唯一标志。我们称为IP地址(Internet Protocol Address)。它是一串4组由圆点分割的数字组成的,其中每一组数字都在0-256之间,如:0-255.0-255.0-255.0-255.0-255;如,202.202.96.33就是一个主机服务器的IP地址。 另外一种表示方式就是域名(DN)系统,需要DNS服务器将域名转换成数字地址,因此需要连接到DNS服务器,需要填写DNS服务器地址。 ②DNS地址 DNS地址是一个域名服务器地址,它负责把用户的网站地址解析成IP地址。如果这个服务器出现问题,那么你就可能上不了网了。(应用层程序域名系统DNS,实现网络设备名到IP地址的转换,专门运行该程序的设备称为域名服务器) 域名结构:几个点即为几级域名 三级域名.二级域名.顶级域名 顶级域名: 国家顶级域名.cn 国际顶级域名.Int 通用顶级域名:.org .net .edu 等 ③子网掩码 子网掩码不能单独存在,它必须结合IP地址一起使用。子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分。与IP地址相同,子网掩码的长度也是32位,左边是网络位,用二进制数字“1”表示;右边是主机位,用二进制数字“0”表示。1 的部分代表网络号,掩码为 0的部分代表主机号。其中 A类地址的默认子网掩码为 255.0.0.0;B类地址的默认子网掩码为 255.255.0.0;C类地址的默认子网掩码为:255.255.255.0 ④网关 网关实质上是一个网络通向其他网络的IP地址。如果网络A中的主机发现 -46- 通信笔试宝典(第二版) 数据包的目的主机不在本地网络中,就把数据包转发给它自己的网关,再由网关转发给网络B的网关,网络B的网关再转发给网络B的某个主机。网关的IP地址是具有路由功能的设备的IP地址。默认网关最后一位是1。 ⑤MAC地址 也叫硬件地址,是由48比特长(6字节),16进制的数字组成.0-23位是由厂家自己分配。MAC地址就如同我们身份证上的身份证号码,具有全球唯一性。在网络底层的物理传输过程中,是通过物理地址来识别主机的。 5.1.9 IPv6相关 在 Internet 协议版本 6 (IPv6) 中,地址的长度是 128 位。协议数据单元称为分组,不是数据报。 优势: 更大的地址空间 灵活的首部形式; 简化的协议; 允许对网络资源预分配。 使用Ipv4隧道技术,实现向Ipv6的过渡 以下是用来将 IPv6 地址表示为文本字符串的三种常规形式: (一)冒号十六进制形式。 这是首选形式 n:n:n:n:n:n:n:n。每个 n 都表示八个 16 位地址元素之一的十六进制值。例如: 3FFE:FFFF:7654:FEDA:1245:BA98:3210:4562. (二)压缩形式。 由于地址长度要求,地址包含由零组成的长字符串的情况十分常见。为了简化对这些地址的写入,可以使用压缩形式,在这一压缩形式中,多个 0 块的单个连续序列由双冒号符号 (::) 表示。此符号只能在地址中出现一次。 例如,多路广播地址 FFED:0:0:0:0:BA98:3210:4562 的压缩形式为 FFED::BA98:3210:4562。 (三)混合形式。 此形式组合 IPv4 和 IPv6 地址。在此情况下,地址格式为 n:n:n:n:n:n:d.d.d.d,其中每个 n 都表示六个 IPv6 高序位 16 位地址元素之一的 -47- 通信笔试宝典(第二版) 十六进制值,每个 d 都表示 IPv4 地址的十进制值。 5.1.10 TCP与UDP比较 UDP: ♦ 用户数据报协议,只是在IP层中加入了端口和差错控制功能 ♦ 面向无连接、不可靠、基于UDP数据报的 TCP: 运输控制协议,全双工可靠、按序、无丢失、无重复 面相连接的、可靠的、基于字节流的; 提供了运输控制功能: ♦ 流量控制:利用可变发送窗口的方式,由接收窗口控制发送窗口 ♦ 拥塞控制 慢启动:每出现一次超时,就将拥塞窗口降低1; 加速递减:每出现一次超时,就将拥塞窗口减半; 拥塞避免:当拥塞窗口增加到门限值后,将拥塞窗口指数增长降低为线 性,避免再次拥塞。 ♦ 重传机制: 超时没有收到ACK,就重传; 接到ACK,发送窗口才能移动。 ♦ 连接控制 5.1.11 TCP连接的建立和释放 TCP协议的连接建立需要通过三次握手实现: ♦ 客户端向服务器端发送连接请求报文,其中同步比特SYN设置为1,并且选 择一个序号J,作为以后传输的第一个数据字节的序号。 ♦ 服务器端收到后,发回确认报文,其中SYN也设为1,ACK中序号设为J+1, 同时为自己选择一个序号K。 ♦ 客户端收到以后,还需要对服务器端确认,序号为K+1。 -48- 通信笔试宝典(第二版) TCP连接释放过程: TCP连接释放过程需要四次握手。(TCP处于半关闭状态,全双工,需要两个方向上分别关闭) ♦ 一个TCP连接在收到一个释放请求FIN后,仍能发送数据。只有收到FIN 的一方在确认这个FIN之后,也发送一个FIN,并且得到先前发送FIN的一方的确认,两个方向上的连接才完全终止。 ♦ 客户端发送请求关闭报文 ♦ 服务器端发回确认报文,关闭一条连接,此时处于半关闭转台。 ♦ 服务器端向客户端发送请求关闭报文客户端返回确认报文。双向连接都关 闭。 5.2 其他问题 1.1号信令和7号信令有什么区别,我国某前广泛使用的是那一种? ♦ 1号信令:随路信令(信令和话音在一起),一般用于局端和用户主机 之间; ♦ 7号信令:称为公共信道信令。即以时分方式在一条高速数据链路上传 送一群话路信令的信令方式,与数据分开传输,通常用于局间。 2 简述电路交换和分组交换的区别及优缺点 数据网中有三种交换方式 -49- 通信笔试宝典(第二版) ♦ 电路交换 多用于电话网中,呼叫前建立专用链路,呼叫结束需要拆除。每个交换 节点是透明的。 可靠性较高,时延较低,利用率低。 ♦ 报文交换 不建立专用链路;以分组形式发送,在每个节点存储转发。 利用率较高,延迟较大。 ♦ 分组交换 结合以上两者的优点。以分组形式发送,存储转发,并对链路进行一些 控制。 利用率较高,延迟较小。 主要有两种方式: 数据报方式:每个交换节点对分组进行处理,每次路由可能不 同。 虚电路方式:呼叫也要经历链路的建立、传输、释放。在传输过程 中,路由都是一样的。 3 ♦ 协议数据单元PDU :对等层之间传输的数据单元 ♦ 服务数据单元SDU:层间传输的数据报。 4 .直接链接两个信令点的一组链路称作什么? PPP点到点连接协议,属于数据链路层 5 .接入网用的是什么接口? 6 .VoIP都用了那些协议? IP等协议,需要专门的IP电话网关,以减少时延,保证通话质量。 7 IP Phone的原理是什么? 在IP上传输语音数据报,IPV6 8 TCP/IP协议中端口有什么作用? ♦ 确定是哪个应用程序使用该协议 ♦ 可以使用一个端口与多个客户机建立连接。 9 ICMP是什么协议,处于哪一层? 答案:Internet控制报文协议,处于网络层(IP层)。 10 IP组播有那些好处? 答案:Internet上产生的许多新的应用,特别是高带宽的多媒体应用,带来了带宽的急剧消耗和网络拥挤问题。组播是一种允许一个或多个发送者(组播源) -50- 通信笔试宝典(第二版) 发送单一的数据包到多个接收者(一次的,同时的)的网络技术。组播可以大大的节省网络带宽,因为无论有多少个目标地址,在整个网络的任何一条链路上只传送单一的数据包。所以说组播技术的核心就是针对如何节约网络资源的前提下保证服务质量。 11 MTU 最大传输单元(Maximum Transmission Unit,MTU)是指一种通信协议的某一层上面所能通过的最大数据报大小(以字节为单位)。最大传输单元这个参数通常与通信接口有关(网络接口卡、串口等)。 因特网协议允许IP分片,这样就可以将数据报分成足够小的片段以通过那些最大传输单元小于该数据报原始大小的链路了。这一分片过程发生在IP层(OSI模型的第三层,即网络层),它使用的是将分组发送到链路上的网络接口的最大传输单元的值。原始分组的分片都被加上了标记,这样目的主机的IP层就能将分组重组成原始的数据报了。 在因特网协议中,一条因特网传输路径的“路径最大传输单元”被定义为从源地址到目的地址所经过“路径”上的所有IP跳的最大传输单元的最小值。或者从另外一个角度来看,就是无需进一步分片就能穿过这条“路径”的最大传输单元的最大值。 -51- 通信笔试宝典(第二版) 6 通信原理 6.1 通信系统的基本结构 信源编码 信道编码 调制器 发转换器 传输信道 收转换器 解调器 信道译码 信源译码 6.2 信道 编码信道 调制信道 信道特点 信道容量 6.3 模拟调制 调制作用: ♦ 适合信道传输;(将基带信号变为频带信号) ♦ 适于多路复用; ♦ 提高系统有效性和可靠性。 调制分类: ♦ 模拟调制(连续波调制) ♦ 脉冲编码调制(模数转换) ♦ 数字调制 模拟调制分类 ♦ 幅度调制(线性调制):AM、DSB、SSB、VSB; ♦ 角度调制(非线性调制):FM、PM 幅度调制 -52- 通信笔试宝典(第二版) ♦ 制度增益:输出信噪比与输入信噪比之比,表示了解调器的抗噪性 能。 ♦ DSB和SSB的抗噪性能相同 ♦ AM一般采用同步检测(相干解调)和包络检波器(非相干解调) 进行解调。 ♦ 包络检波器存在门限效应:当其输入信噪比降低到特定值以后,输 出信噪比就急剧恶化。(同步检测不存在)。这是由于其非线性解调所致。 频率调制 ♦ 高信噪比时,由于AM;也存在门限效应,信噪比低时,性能急剧恶化。 是由非线性解调引起的。 ♦ 鉴频法解调:使用鉴频器(一般采用锁相环路鉴频法) ♦ 锁相环原理:压控振荡器、鉴相器、环路滤波器组成。主要参数:锁相 范围、锁相速度和稳定性。主要用于调制解调、同步及频率合成等 ♦ 压控振荡器的输出经过采集并分频;和基准信号同时输入鉴相器; 鉴相器通过比较上述两个信号的频率差,然后输出一个直流脉冲电压; 控制VCO,使它的频率改变;这样经过一个很短的时间,VCO 的输出就会稳定于某一期望值。 FM调制过程 FM解调过程 -53- 通信笔试宝典(第二版) 6.4 数字基带 基带传输系统:不使用调制、解调器 频带传输系统:使用调制、解调器 常用数字基带信号 单极性码、双极性码、单极性归零码、双极性归零码等 基带传输的两个问题 ♦ 传输码型(线路码)的选择:原始信号编成适于传输的码 ♦ 基带脉冲的选择,电波形适宜在信道中传输 基带传输常用码型 ♦ AMI码:0不变,1交替变为+1、-1。缺点是长零问题 ♦ HDB3码:出现大于4的长零时,在AMI码基础上,将第四个0变 为与前一个1同极性的1或-1。 ♦ 双相码:1编成10,0编成01。 ♦ AMI码:1→11或00,0→01 ♦ 密勒码、PST码、nBmB码、4B3T码 码间干扰 ♦ 码间干扰的原因:信道不理想(多径衰落),导致的乘性噪声。与加性 噪声一起,是信道干扰的主要部分。 ♦ 无码间干扰的条件: h(t)在除t=0外的各抽样点上均为零,即 ♦ 奈奎斯特第一定律: 满足以下基带传输特性的信道没有码间干扰,其中H(w)是由发送滤波器、信道、接收滤波器共同组成的等效信道。 ⎧⎪1,k=0 h(t)=⎪ ⎨ ⎪0,else⎪⎩ 1 T ⎛π2πi⎞⎟⎜⎟w+C,w=≤ ∑⎜⎟⎟⎜T⎠Ti⎝ 理想情况,频带利用率达到2B/HZ,升余弦滚降只能达到1B/Hz。 ♦ 奈奎斯特第二定律: -54- 通信笔试宝典(第二版) 有控制地在某些码元的抽样时刻引入码间干扰,而在其余码元的抽样时刻无码间干扰,那么就能够使频带利用率达到理想水平(部分响应系统)。 部分响应系统: 预编码→相关编码→模2判决 眼图: 展开最大的地方反映最佳判决时刻,大小反映码间干扰的强弱。 均衡器: 在基带系统中插入一种可调或不可调的滤波器,减少码间干扰。(本质是 补偿信道响应) ♦ 频域均衡器: 用滤波器的频域特性补偿信道的频率特性,使其满足理想要求。 ♦ 时域均衡器: 采用依赖于信道状况的不同抽头系数的横向滤波器产生,有限长不能完全消除。 6.5 数字载波调制 一般采用正弦波调制,二进制时分类: ASK(线性) FSK(非线性) PSK(非线性) ASK(OOK) 解调:相干解调、非相干解调 功率谱由离散和连续部分组成,离散部分由载波分量产生,连续部 分由基带信号产生。 2FSK 键控法产生:由矩形脉冲序列控制不同的频率源 解调:相干、非相干、过零检测法、差分检波法。 2PSK(绝对移相方式) ♦ 存在倒π现象或者反向工作现象:如果因为某种原因,引起参考相位的 变化,则会导致恢复的错误 -55- 通信笔试宝典(第二版) 2DPSK(相对移相方式) ♦ 以前后相位差值表示基带数据(差分编码→PSK) 各种数字调制方式性能比较: ♦ PSK>同步检测DPSK>差分相干DPSK>相干FSK>非相干FSK>相干 OOK>非相干OOK 多进制数字调制系统 ♦ 有效性提高,但抗噪声性能差于二进制系统 ♦ QPSK、QDPSK、APK(振幅相位联合键控) QAM(正交振幅调制) ♦ 用两条的基带波形对两个相互正交的同频载波进行调制,将两个已 调信号并行在一条链路中传输。接收端分别解调出来。 ♦ 信号星座图、同相分量、正交分量 MSK(最小移频键控) ♦ FSK的改进,正交调制,信号波形相关系数为0; ♦ 相位是连续的 ♦ 解调:相干解调、非相干解调 ⎧⎪1⎪f1=fc+⎪⎪4Ts ♦ ⎪ ⎨ ⎪1⎪f2=fc−⎪⎪4Ts⎪⎩GMSK ♦ 在MSK前加一个高斯低通滤波器,抑制高频分量,加快频谱衰减,但 误码率提高了。 6.6 模拟信号数字传输 模拟信号的数字传输需要经过以下几步: ♦ 抽样:依据抽样定理,在时间上离散化; ♦ 量化:取值上离散化(将取值连续的抽样变为取值离散的抽样) ♦ 编码 抽样定律 ♦ 低通连续信号的抽样 -56- 通信笔试宝典(第二版) 最高频率为fH的低通信号,以T≤12fH(奈奎斯特间隔)的抽样间隔对其进行抽样,则可以完全恢复出原来信号。 ♦ 带通连续信号的抽样 带宽为B带通信号,以T≤12B的抽样间隔对其进行抽样,则可以完全恢复出原来信号。 脉冲调制 ♦ 与连续正弦波类似,时间上离散的脉冲串也可以作为载波。用基带信号 去改变脉冲串的参数(如幅度、宽度、位置等),有PAM、PPM、PDM等 PAM(脉冲振幅调制) ♦ 脉冲幅度随基带信号的变化而变化。(原理即是抽样定理) 量化 ♦ 用有限的离散电平表示模拟信号样值。 ♦ 均匀量化 量化间隔相同,Δv=(b−a)M。 弱信号的量噪比难以达到要求,信号动态范围受到较大。 ♦ 非均匀量化 根据信号不同区间来确定量化间隔。信号幅度大,量化间隔也大; 信号幅度小,量化间隔也小。 能够导致较高的平均信号量化噪声比;改善小信号时信号量化噪声 比。,扩大信号动态范围。 一般将信号进行非线性压扩后,再进行均匀量化。常用压缩率有: A压缩率(13折线逼近) μ压缩率(15折线逼近) PCM(脉冲编码调制) ♦ (此处编码属于信源编码范畴,将量化电平变换成代码) ♦ 常用二进制码型:自然二进制码、折叠二进制码(更好,简化编码进程) 13折线编码: ♦ 一位极性码+3位段落码(落在哪个电平区间中)+4位段内码(每个电 -57- 通信笔试宝典(第二版) 平区间都被均匀划分为16段) ♦ 电平=段落起点电平+段内码×该段量化间隔 DPCM(差分脉冲编码调制) DM增量调制 ♦ 存在过载现象 6.7 接收机 以某种最佳准则,从接收信号中最佳提取有用信号 最佳准则: 最小错误概率 最大似然准则 信噪比输出最大:匹配滤波器 6.8 信源编码 任务 消息序列变换为数字序列 压缩冗余度,提高编码效率,提高有效性 无失真信源编码 香农第一定理(无失真信源编码定理) 要做到无失真信源编码,变换每个信源符号所需要的最小r进制码符号数就是信源的熵;否则,不存在。 常见无失真编码方法: 香农编码:按照概率排序,按照概率计算码长,并确定码字 费诺编码:概率排序,二等分,编码 霍夫曼编码:概率排序,最小的两个分别附0/1,然后相加,重新排 序。 限失真信源编码(香农第三定理) 率失真函数为R(D),实际速率R大于R(D),则必然存在一种编码方法使得失真度小于D。(即R(D)是满足失真D条件下压缩的下限) -58- 通信笔试宝典(第二版) 6.9 信道编码 目的: 通过增加一定的冗余,提高信息传输的可靠性 干扰类型及对策 乘性干扰(码间串扰等)――均衡技术来解决 加性干扰(噪声等)――纠错编码 汉明距离: 两个码字中对应位,取值不同的个数。 最小汉明距离体现了抗噪声性能,需要越大越好 香农第二定律 在有扰信道中,只要信息传输速率R小于信道容量C,只要码长足够长, 就可以找到一种信道编码方法,使得译码错误概率任意小。 减少误码率的方法: 增大容量信道C 增加带宽B、增加功率P、降低噪声N 降低传输速率R:增加冗余来提高可靠性 增加码长 常见信道中编码: 线性分组码 循环码:BCH、RS码 卷积码 -59- 通信笔试宝典(第二版) 7 移动通信关键技术 7.1 无线信道特性 下图为衰落信道的具体分类关系: 衰落信道 ♦ 大尺度衰落 由于在大范围内移动而引起的平均信号能量的减少 路径损耗 信号平均能量随传播距离增加而耗散; 阴影衰落 由于传播环境中的地形起伏、建筑物及其他障碍物对电波的遮蔽引起。在均值基础上引起幅度变化,服从对数正态分布。 ♦ 小尺度衰落 是指信号的幅值、相位的动态变化。多径效应引起。(由于空间中存在折射、散射、反射、绕射等机制,发射信号可能要经过多个路径才能到达接收端。会引起多径衰落和闪烁。) 时延扩展 由于多径效应,到达接收端的信号会存在时延的差异,则接收信号 -60- 通信笔试宝典(第二版) 的脉冲宽度就扩展了。定义最大时延扩展στ,其倒数Bcoh定义为相干带宽(功率谱的第一零点带宽)。 如果发送信号带宽大于相干带宽,则零点除会出现深衰落,称为 频率选择性衰落; 否则,称为平坦衰落 会导致ISI 时变特性 移动台移动时,接收机收到的信号频率会发生变化,即多普勒频移 参数:最大多普勒频移和相干时间(前者倒数) 当基带信号的符号时间小于信道的相关时间时,在多个符号期 间,可以认为信号所经历的衰落是相同的,称为慢衰落(信道变化慢)。 如果基带信号的符号时间远大于信道的相关时间,信号在同一符 号时间内经历不同的衰落(不同chip之间所经历的衰落是不同的),这就是快衰落(信道变化快)。 TsστTcohTcohTsσDστBcohBsBcohσD瑞利衰落 一般,多径衰落的幅度服从瑞利分布。 抗衰落方法 ♦ 频率选择性衰落 均衡技术(补偿信道响应) -61- Bs 通信笔试宝典(第二版) 扩频技术 OFDM技术 ♦ 抗快衰落 调制技术、降低信号速率、编码和交织 ♦ 提高SNR 分集技术 7.2 扩频通信 1. 信号占用的带宽远远超出发送信息所需的最小带宽。 2. 用于扩频的信号与数据无关。 3. 接收端解扩(恢复原始信号)通过相关检测完成。 原理 发送端用伪噪声序列(码率远远大于信源速率)调制信息序列,此时得到的数据带宽大于原信息带宽,经信道到达接收端,再去掉伪噪声序列,译码得出原来信号。 分类 DS:直接序列扩频 直接用PN序列进行调制,解调(一次相乘调制,二次相乘解调) FH:跳频 信号载波频率随PN序列控制在一段频率内迅速跳变(频率跳变的范围远大于信号带宽) TH:跳时 信息码元分成多个时隙,PN码控制要传送的信息随机占用其中一个 混合 优点 z 降低信号能量密度(平均功率)-低截获概率 z 抑制干扰-抗干扰 z 提高时间分辨率-多址接入 PN序列 z PN信号实质上是收发端预知的确定性周期信号,具有随机信号的某些特性,简化了存储基准(SR)方式的实现 z PN序列应具备的随机特征 z 平衡特性:每个周期内的“0”、“1”数目近似相等 z 游程分布特性 z 相关特性(很容易与其时延形式区别,很容易与其他码字及时延形式区别) -62- 通信笔试宝典(第二版) z 易于实现:移位寄存器序列 z 由寄存器、模2加法器和反馈支路组成 z 特性:良好的自相关特性和丰富的频率分量 z M序列,Gold序列、m序列 DS系统 z 系统结构 发送端:先用PN序列对消息序列进行扩频,然后进行载波调制 接收端:先进行解调,然后用PN序列进行解扩 z 性能指标 处理增益 Gp= SNRoutW⎛S⎞⎛S⎞ = ⎜⎟=Gp⎜⎟ SNRinR⎝N⎠o⎝N⎠i FH系统 与FSK原理类似,一般与MFSK结合使用,但是其频率范围远远大于FSK(如果跳频越快,频率越宽,抗干扰越好) z 快跳频 z 慢跳频 同步 z 三种同步: 载波同步(解调) 位同步 序列同步(PN序列同步) z 获得序列同步的步骤 z 捕获:粗略对准,初始同步 相干、非相干 z 跟踪:精确对准,同步保持 延迟锁相环 抖动锁相环 多路复用与多址接入 -63- 通信笔试宝典(第二版) 多址方式 z SDMA 使用相同频率和时隙,但用波束指向不同用户,消除用户之间干扰 z FDMA 使用相同时隙,不同频率 z TDMA 使用相同频率,不同时隙依次发送 z CDMA 使用相同频率和时隙,依靠不同的码字来区分用户,如 z 上行链路采用PN序列区分用户 z 下行链路采用PN序列区分不同扇区和基站 z 下行链路采用Walsh码区分用户 z 两两完全正交 z 延迟相关特性不好 z OFDMA 与FDMA类似,但是每个用户分配不同子载波(可以是多个,与不同频段存在差别) 7.3 3G蜂窝移动通信系统 -- 通信笔试宝典(第二版) 下行链路 上行链路 传输方式 接入方式 小区内 干扰消除 cdma2000 连续导频 闭环功控 连续导频 闭环功控 码中码 闭环功控 连续导频 闭环功控 时隙导频 闭环功控 码中码 开环功控 多用户 FDD DS-CDMA 检测 多用户 FDD DS-CDMA 检测 DS-CDMA TDMA WCDMA TD-SCDMA TDD 联合检测 7.4 OFDM原理 OFDM技术有极高的频谱效率,并具有抗多径衰落、硬件实现简单等优点,因此已被公认为LTE及4G系统的核心技术。 OFDM技术属于多载波调制,也是一种无线环境下的高速传输技术。在宽带条件下,无线信道的频率响应曲线往往是非平坦的,而OFDM技术的主要思想就是在频域内将给定信道分割成许多正交子信道,在每个子信道上使用一个子载波进行传输,并且各子载波并行传输。这样,尽管总的信道在频域上是非平坦的,也就是具有频率选择性,但是每个子信道是相对平坦的,并且在每个子信道上进行的是窄带传输,信号带宽小于信道的相干带宽,因此可以大大消除子载波间的干扰。 OFDM调制就是将数据符号调制到若干个相互正交的子载波上,数据符号取自PSK符号或QAM符号组成的集合。假设子载波总数为N,一个OFDM符号的持续时间为T,Xi(i=0,1,2,…,N−1)表示第i个子载波上传输的数据符号,第i个子载波的中心频率为fc+iT(i=0,1,2,…,N−1),设矩形脉冲成形函数为 -65- 通信笔试宝典(第二版) ⎧⎪⎪1 rect(t)=⎨ ⎪0⎪⎪⎩ t≤T2t>T2 (1.1) 则起始时间为ts的OFDM符号等效基带信号可以表示为: N−1⎧⎛⎡⎤⎪T⎞i⎟⎪⎜⎢⎟Xirect⎜ts≤t≤ts+T⎪⎜t−ts−⎟exp⎢j2π(t−ts)⎥⎥∑⎪⎟ (1.2) x(t)=⎨i=0T2⎠⎝⎣⎦ ⎪⎪⎪⎪⎩ 0t 图 7-1 OFDM系统基本模型 图 7-1给出了OFDM系统基本模型的框图,其中,fi=fc+iT。OFDM系统中子载波间的正交性体现在: 1 T ∫ T exp(j2πff⎧⎪⎪1m=n0 mt)exp(−j2πnt)dt=⎨⎪⎪ (1.3) ⎩ 0m≠n因此,对第k个子载波进行解调,可在时间长度T内进行积分,即 Xˆ1ts+T⎡T⎢t−j2πk(t−t)⎤⎥⎧⎪⎪N−1⎨s⎢⎣T⎥⎦⎪⎪∑X⎡i⎤⎫⎪⎪k=t ∫expsiexp⎢j2π(t−ts)⎥⎬di=0⎢⎣T⎥⎪=1N−1ts+TT∑Xiexp⎡⎩⎢i−k ⎤⎦⎪⎭ (1.4) i=0∫tj2π(t−ts)⎥dt=Xks ⎢⎣T⎥⎦ 可以看到,对第k个子载波进行解调,可以正确地恢复出期望信号Xk。 -66- 通信笔试宝典(第二版) 占用带宽子载波间隔 图 7-2 OFDM系统各个子载波的频谱 子载波间的正交性还可以从频谱的角度理解。每个OFDM符号在周期T内包括多个子载波,其频谱可以看作是周期为T的矩形脉冲的频谱与一组位于各个子载波上的δ函数的卷积。矩形脉冲的频谱幅值为sinc(πfT)函数,这种函数的零点出现在1T的整数倍上,如图 7-2所示。每个子载波频谱的最大值处,所有其他子载波的频谱值恰好为0,因此可以在解调时从多个相互重叠的子载波符号中提取出各子载波符号,而不会受到其他子载波的干扰。由于子载波的频谱相互重叠,因此大大提高了频谱利用率。 OFDM系统的一个优点是可以利用DFT及其反变换来实现调制和解调,从而简化系统实现的复杂度,并且可以利用FFT及其反变换进一步简化运算,提高运算效率。为了叙述简洁,令ts=0,对信号x(t)以TN为周期进行抽样,则可以得到: xx(kTN)N=∑−1 X⎛2πik⎞⎟k=iexp⎜⎜j⎟0≤k≤N−1 (1.5) i=0 ⎜⎝N⎟⎟⎠,可以看出xk等效为对Xi进行IDFT运算。同样,在接收端,为了恢复出原始的数据符号Xi,可以对xk进行DFT变换: N−1 X= 1 ∑x⎛⎜⎜2iN kexp−jπik⎞⎟⎟,0≤i≤N−1 (1.6) k=0 ⎜⎝N⎟⎟⎠根据上述分析,OFDM系统的调制和解调可以分别由IDFT和DFT来代替,通过N点IDFT变换,把频域数据符号变换为时域数据符号,经过射频载波调制后,发送到无线信道中。其中每一个IDFT输出的数据符号都是由所有子载波信号经过叠加而生成的。在OFDM系统的具体实现时,可以采用IDFT/DFT的快速算法IFFT/FFT来实现,如图 7-3所示。 -67- 通信笔试宝典(第二版) 串/并转换串行输入数据信号映射IFFT并/串变换插入保护间隔D/A低通滤波上变频信道移去保护间隔低通滤波A/D下变频串行输出数据并/串转换信号映射均衡FFT串/并转换 图 7-3 基于IFFT/FFT的OFDM系统模型 7.5 MIMO原理 由于MIMO系统使用了多个发送天线和接收天线来传输无线信号,其容量较单天线发送和单天线接收的SISO无线通信系统有较大的提高错误!未找到引用源。错误!未找到引用源。,所以近年来得到了广泛的关注和研究,成为E3G和B3G移动通信系统的关键技术之一。 y1(t)s1(t)s2(t)y(t)y2(t)sN(t)s(t)yM(t) 天线是一种用来发射或接收电磁波的器件,它是任何无线电系统都不可缺少的基本组成部分。发射天线将传输线中的导行电磁波转换为“自由空间”波,接收天线则与此相反。因此可以说,正是由于使用了天线,才使得信息可以在不同地点之间通过电磁波传输,实现真正的无线通信,而无需任何连接设备。因此可以说,没有天线就无法实现无线通信,天线在无线电通信中的重要性显而易见。 多根接收天线和接收分集的使用可追溯到20世纪初的Marconi时代,早在1908年Marconi就提出使用多根接收天线来对抗无线信道的衰落。人们研究发现,多根天线构成的接收阵列可以有效地克服无线蜂窝系统中的共道干扰。到 -68- 通信笔试宝典(第二版) 20世纪70年代,由于数字信号处理技术得到了快速发展,这使得更多的关于天线阵列的自适应信号处理技术的实现成为可能,从而进一步提高了分集性能,降低了干扰。1994年,Paulraj和Kailath提出在发送端和接收端同时使用多根天线可增加无线信道的容量。1996年,Roy和Ottersten提出在基站使用多根天线可在同一信道上支持多个用户使用。接下来,Bell实验室在20世纪90年代中后期一系列研究成果的出台,对多天线系统的研究起了很大的推动作用,开创了无线通信的一场新的技术。 z MIMO系统特点 多天线系统在无线通信系统的发送端和接收端都安置多个天线。在发送端,二进制数据输入到发送处理模块中,在这里,输入信息进行编码、星座映射,可能还要进行一定的加权,然后送到各根发送天线上,经过上变频、滤波和放大后发送出去。在接收端,接收机将多根接收天线接收的信号进行解调、匹配滤波、接收处理和译码,以恢复原始数据。可见,多天线系统的出发点是将发送天线与接收天线相结合以改善每个用户的通信质量或者通信效率。 多天线系统的核心思想是空时信号处理,即在原来时间维的基础上,通过使用多根天线来增加空间维,从而实现信号处理,获得空间复用增益或空间分集增益。总之,多天线系统将多径无线信道与发射、接收视为一个整体进行优化,从而实现高的通信容量和频谱利用率。 z z z 信道容量 空间复用提高系统的频谱利用率 发送分集提高系统的传输可靠性 MIMO系统演进 由于多天线系统具有很多诱人的优点,因此它一经提出,就得到了广泛的关注。目前对它的研究可谓方兴未艾,对其基本理论、关键技术的研究正在全面展开,主要集中在多天线系统中的发送分集和空间复用、波束成形、空时编码、空时弥散码、定时同步以及信道估计等方面。 目前对于多天线系统的另一研究热点是宽带多天线系统,即MIMO-OFDM系统。OFDM技术利用串并变换和正交性将信道分成若干正交的窄带子信道,从时域看是展宽了OFDM符号的持续时间,变高速数据信号为并行的低速子数据流;从频域看是将频率选择性信道变为平衰落信道错误!未找到引用源。。而MIMO技术在平衰落信道上可显著提高信道容量,且实现复杂度不高。因此,将MIMO技术和OFDM技术相结合构成的MIMO-OFDM系统可以充分发挥MIMO技术和OFDM技术各自的优势,即通过OFDM调制把频率选择性多天线衰落信 -69- 通信笔试宝典(第二版) 道转换成一组并行的平坦衰落信道,再利用MIMO技术来提高系统信道容量。也正是基于此原因,MIMO-OFDM系统被视为下一代移动通信系统和未来宽带无线通信系统最具潜力的一种解决方案。 z 分布式MIMO 分布式天线系统(DAS: Distributed Antenna System)是分布式移动通信系统的核心部分,与传统蜂窝通信系统和集中式MIMO蜂窝系统相比,分布式移动通信系统具有如下特点: 扩大了覆盖面积,有利于空间资源的充分利用;降低了发射功率;适合于未来移动通信较高工作频点的要求;提高了信号的传输质量;提高了系统的工作效率。 z 预编码技术 在发送端对信号进行预处理对于采用空分多址的多用户下行链路是至关重要的。当发送端知道信道的有关信息时,对发送信号进行预编码可以给MIMO系统带来如下三个好处中的一个或多个:一、提高系统的传输速率,使其更加接近于MIMO系统的容量;二、提高系统的BER性能;三、简化接收算法,降低接收机的复杂度,特别是对于下行传输,可以降低移动台的功耗。 z OFDMA技术 OFDMA为每个用户提供一组子载波,每个子载波只分配给一个用户使用,用户选择使用信道条件较好的子载波。不同用户通过子载波频率进行区分,同时子载波分配方案在每个分配周期都可以灵活变化,真正实现了时域和频域资源的灵活分配。正是由于这些优点,OFDMA技术已经被3GPP LTE和WiMax所采用。 z 波束成型与SDMA技术 OFDMA-SDMA技术具备了OFDMA技术的多数优点。通过采用动态子载波分配技术,每个用户可以根据自己的信道状况选取信道质量最好的子载波,仍然可以取得多用户分集增益。在子载波分配完之后,OFDMA-SDMA系统也可以在每个子载波上采用自适应功率分配和可变速率传输,提高系统性能。通过多个用户共享同一个子载波,极大提高了系统的频谱利用率,这在频谱资源日趋紧张的移动通信系统中很有意义。LTE系统中已经采用了两用户共享频域资源的虚拟MIMO技术。但与OFDMA技术一个重要区别是,OFDMA-SDMA技术在每个子载波上引入SDMA,相同子载波上的不同用户就会产生相互干扰,即共道干扰。 -70- 通信笔试宝典(第二版) 7.6 TD-SCDMA系统关键技术 (一) TD-SCDMA网络结构模型 TD-SCDMA网络主要含有两个基本域:用户设备域和基本结构域。 z 用户设备域 移动设备域 主要完成无线传输和应用 用户业务识别单元 安全的鉴别用户的身份 z 基本结构域 进一步分为接入网域和核心网域。 接入网域(UTRAN) 由与接入技术相关的模块组成,向用户提供接入到核心网的机制。 无线网络子系统(RNS)组成,RNS与核心网之间通过Iu口连接。 RNS: 一个RNS包括一个RNC和一个或多个NodeB。 RNC与NodeB之间通过Iub接口通信 两个RNC之间通过Iur接口通信,用来传送RNC之间的控制信 令和用户数据。 核心网域 提供包括用户位置信息的管理、网络特性和业务的控制、信令和用户信息的传输机制等功能。 服务网域 原籍网域 传输网域 核心网在逻辑上还可以分为电路交换域、分组交换域和多媒体子系统。 -71- 通信笔试宝典(第二版) (二) 物理层技术简介 1 三种信道模式 逻辑信道(MAC层与RLC之间)、 传输信道(物理层与上层之间) 物理信道(数据发送) 2物理信道 物理信道由四层组成: 系统帧 无线帧 子帧 时隙/码 3 子帧的结构 -72- 通信笔试宝典(第二版) 4 物理层主要过程 信道编码与复用 扩频与调制 z 数据调制方式 QPSK、8PSK、16QAM z 扩频调制 扩频码进行扩频(OVSF码),区分用户 加扰码,区分小区 码字分配 z 扩频码(OVSF码) 又称信道化码,作用是在同一时隙中区分不同的用户。分配原则是若一个码字已经使用,其父系和下级码字就不能在同一时隙中使用(无法区分。这样由于每个物理信道的数据速率和扩频因子不同,导致一个时隙中可用码数也不同)。 z 上行同步码 上行导频时隙发送,在随机接入和切换前实现上行同步。 z 下行同步码 下行导频时隙发送,用于区分相邻小区,便于进行小区测量 -73- 通信笔试宝典(第二版) z 训练序列(midambles码) 又称中间码,不进行扩频和加扰。主要作用是信道估计、功率控制测量、上行同步保持和频率较正。 z 扰码 用来区分基站。 (三) 无线资源管理模块 TD-SCDMA系统的无线资源包括:码字、频率、时隙、空间(天线)资源。无线资源管理功能在RNC中实现。主要功能模块有: 功率控制模块 切换控制模块 接入控制模块 负载控制模块 分组调度模块 DCA模块 无线链路监测模块 资源管理模块 详细介绍 1 功率控制模块 维持链路质量前提下,尽可能小的消耗功率,以减少相互干扰和延长电池使用时间。 TD-SCDMA系统中功率控制算法需要考虑TDD、智能天线和多用户联合检测技术的影响。 主要有三种: 开环功率控制 通过测量接收到的导频信号的功率大小和有关信息,调整自己的发射功率。 外环功率控制 为内环功率控制提供动态准确的SIR目标值 内环功率控制 接收端测量的实际SIR与目标SIR进行比较,产生功率调整量TPC通知发 -74- 通信笔试宝典(第二版) 送端进行调整。 2 接入控制模块 处理新呼叫或越区切换呼叫,需要维持网络的稳定和已有用户的QoS。 TD-SCDMA系统是一个基于CDMA技术的系统,能够建立的最大呼叫数,不但受到CDMA的可用扩频码决定,同时也受限于用户之间的干扰。当新用户接入系统时,通信网络中原有连接的信号质量会下降。如果一个小区的新用户无限增加,小区覆盖范围会减少到系统预先规定的门限值之下,造成已经建立连接的服务质量不能得到有效保证。因此,接入控制机制的目的有两个:⑴保证当前无线网络资源能够满足接入用户要求的QOS,⑵保证新接入呼叫不影响网络内已经建立连接的QOS,或者说影响很小。 TD-SCDMA系统的接入控制技术主要分为2个步骤:第一个步骤是检验可用资源,决定用户接入的时隙,这一步骤可以通过动态信道分配技术来实现;第二个步骤是根据选定的时隙,确定在该时隙下是否能够接入系统。根据接入控制的原理,分别确定上行和下行链路的接入情形,只有在上行和下行链路都允许接入系统的前提下,才允许用户接入系统。 第二步中的接入控制: ♦ 基于连接的策略(基于正在进行的通话数),该策略容易实现,但不能 较好的用于干扰动态变化的环境。 ♦ 基于载干比的呼叫控制策略,这种算法假定在呼叫过程中SIR是动态 变化的,而实际上,由于功率控制的原因SIR在这一过程中是恒定不变的。 ♦ 基于干扰的接入控制策略(最常用) 基于干扰的接入控制算法通过估算接入一个新的用户后将会增加的干扰功率值来判断是否允许用户接入。接入前系统的总的干扰加上对新增用户估计的增加的干扰,两者之和与设定的干扰门限比较,如果大于门限值则拒绝用户接入;如果小于该值则允许用户接入。 3 负载控制 -75- 通信笔试宝典(第二版) 确保系统不过载,并维持系统稳定 过载识别 拥塞解决 4 分组调度 服务于分组数据业务 经典分组调度算法 分组调度需要考虑接入控制、切换控制、负载控制和功率控制的影响。 (四) DCA技术 动态信道分配技术一般分为慢速动态信道分配和快速动态信道分配。慢速DCA将无线信道分配至小区,用于上下行业务比例不对称时,调整各小区上下行时隙的比例。而快速DCA将信道分至业务,为申请接入的用户分配满足要求的无线资源,并根据系统状态对已分配的资源进行调整。 慢速DCA 依据小区内业务不对称性的变化,动态地划分上下行时隙,使时隙的上下行传输能力和业务上下行负载的比例关系相匹配,以获得最佳的频谱效率。 时隙划分:存在交叉时隙的问题 解决方案: ♦ 统一划分上下行时隙 ♦ 热点小区方案(现多采用) ♦ 不同划分方案(考虑上下行业务比例及交叉时隙的影响) 快速DCA: 快速DCA指系统为申请接入的用户分配无线信道资源,并根据系统状态对已分配的资源进行调整。快速DCA在实现时主要涉及到以下三个过程:信道选择、信道调整和资源整合。 (五) 多用户检测技术 1 原理 -76- 通信笔试宝典(第二版) CDMA系统的干扰源主要是MAI。 采用联合检测技术,将用户之间的干扰去除。根据接收到的训练序列进行信道估计,得到信道的冲激响应,加上已知的用户的扩频码,就可以达到估计用户原始信号的目的。 2 优点: 提高容量,增加用户数,降低UE发射功率,克服远近效应。 3 实现: 线性联合检测器法 解相关匹配滤波器法 迫零线性块均衡法 最小均方误差线性块均衡法 (六) 智能天线技术 1 原理 采用SDMA技术,利用信号在传输方向上的差别,将同频率或同时隙、同码道的信号区分开,最大限度利用有限的信道资源。 是指采用波束成型技术的自适应天线阵,自适应调整加权值,根据干扰、多径的情况,形成多个自适应波束,达到自适应改变天线方向图,自适应跟踪多个用户的目的。 w1w2wK 2 实现 (1)波达方向估计 -77- 通信笔试宝典(第二版) 最大似然DOA估计方法 基于子空间的DOA估计方法 (2)自适应波束成型 最佳性能准则 MMSE 最小二乘法 最大信噪比法 最大似然准则 非盲自适应算法 次优算法 盲自适应算法 3 优势 增加容量 增加覆盖范围 降低误码率 4 需要考虑智能天线对无线资源管理的影响 DCA 功率控制 分组调度 切换控制 (七) 接力切换 1 原理 利用智能天线和上行同步技术,对UE的距离和方位进行定位的基础上,判断目前UE是否移动到了可进行切换的相邻小区的附近区域。如果UE进入切换区域,则RNC通知相邻的基站做好切换准备。 结合了软切换的高成功率和硬切换的高信道利用率的特点。 需要准确知道用户的位置信息,包括UE的信号到达方向和UE与基站之间的距离。 DOA估计 -78- 通信笔试宝典(第二版) 通过上行同步时隙,利用上行同步技术,系统计算出上行信号传输的时间偏 移,进而计算UE与基站的距离。 2 实现 测量过程 UE周期性测量本小区和相邻小区的导频信号强度,发送给RNC。 判决过程 RNC根据UE测量信息,判断是否需要切换、如何进行切换。 执行过程 当前小区与目标小区进行信令交互,完成切换。 7.7 LTE系统关键技术 伴随GSM等移动网络在过去的二十年中的广泛普及,全球语音通信业务获得了巨大的成功。目前,全球的移动语音用户已超过了18亿。个人通信的迅猛发展极大地促使了个人通信设备的微型化和多样化,结合多媒体消息、在线游戏、视频点播、音乐下载和移动电视等数据业务的能力,大大满足了个人通信和娱乐的需求。随着PDA和笔记本电脑的发展普及,用户希望能够随时随地上网,一个新的市场——“宽带无线移动接入”正在兴起。宽带无线接入技术面向一个固定和移动通信融合的新市场,它可提供与宽带有线固定接入并行的宽带无线接入业务,支持移动应用。目前2.5G/3G手机移动数据业务和宽带无线接入业务是两个不同的市场段。宽带无线接入业务可以采用WiMAX(IEEE 802.16d/e)固定/移动宽带无线城域网技术,核心网是标准的IP网,其无线链路的物理层和MAC层的设计考虑了突发型的分组数据业务的要求,能够自适应无线信道环境,速率 -79- 通信笔试宝典(第二版) 可达几百Kbit/s甚至几十Mbit/s。手机数据业务基本是一个蜂窝移动通信网,下载速率在100kbit/s以下。 作为手机数据业务的3G系统在支持IP数据业务时频谱效率低,其面向连接固定带宽的结构不适应突发式IP数据业务的需求。为此,3GPP和3GPP2都认识到目前的系统提供互联网接入业务的局限性,试图在原来的体系框架内,在下行链路中采用分组接入技术,大幅度提高IP数据下载和流媒体速率。3GPP在R5系统中增加了高速下行分组接入技术(HSDPA),速率可以达到10Mbit/s以上,随后进一步在R6中增加高速上行分组接入技术(HSUPA),解决上行链路分组化问题,提高上行速率。进一步引入自适应波束成形和MIMO等天线阵处理技术,可将下行峰值速率提高到30Mbit/s左右,核心网也在向全IP网演化。 HSDPA和HSUPA被称为3.5G技术,属于中期演化技术,受原束缚较大,性能不够理想。3GPP发现在HSDPA和ITU部署的B3G之间存在一个空档,这正是WiMAX的目标。在一段时间内的宽带无线接入市场上,HSDPA、HSUPA对WiMAX的竞争将处于劣势。为了提高3G在新兴的宽带无线接入市场的竞争力,摆脱Qualcom的CDMA专利制约,需要发展LTE(Long Term Evolution)计划,以填补这一空档。为此,2004年11月,3GPP加拿大多伦多“UTRAN演进”会议收集了无线接入网R6版本之后的演进意见,在随后的全体会议上,“UTRA和UTRAN演进”研究项目LTE得到了二十六个组织的支持,并最终获得通过。基本思想是采用过去为B3G或4G发展的技术来发展LTE。 3GPP组织在LTE项目的工作,基本可以分为两个阶段:2005年3月到2006年6月为SI (Study Item)阶段,完成可行性研究报告;2006年6月到2007年6月为WI(Work Item)阶段,完成核心技术的规范工作。在2007年中期完成LTE相关标准制定(3GPP R7),在2008年或2009年推出商用产品。到目前为止,LTE项目的研究工作取得了一系列的重大进展,截至到2006年3月已完成或正在进行的内容包括:物理层接入方案,无线接口协议体系结构,RAN-CN功能划分与调整,及宏分集、射频的相关研究。 3GPP LTE项目的主要性能目标包括:在20MHz频谱带宽能够提供下行100Mbps、上行50Mbps的峰值速率;改善小区边缘用户的性能;提高小区容量;降低系统延迟,用户平面内部单向传输时延低于5ms,控制平面从睡眠状态到激活状态迁移时间低于50ms,从驻留状态到激活状态的迁移时间小于100ms;支持100Km半径的小区覆盖;能够为350Km/h高速移动用户提供大于100kbps的接入服务;因考虑到全球不同运营商的不同部署需求和与现有GSM、CDMA以及3G系统的共存与互通,3G LTE技术将支持更为灵活的带宽和频谱,可在1.25MHz、2.5MHz、5MHz、10MHz、15MHz、20MHz以及65MHz的带宽下,支持成对或非成对频谱,并可以与已有系统实现共站址。 -80- 通信笔试宝典(第二版) 为了实现3G LTE系统的上述目标性能,LTE采用全新的无线接入技术,下行采用OFDMA技术,上行采用SC-FDMA技术。3GPP LTE接入网在能够有效支持新的物理层传输技术的同时,还需要满足低时延、低复杂度和低成本的要求。原有的网络结构显然已无法满足要求,需要进行调整与演进。2006年3月的会议上,3GPP确定了E-UTRAN的结构,LTE系统核心网采用两层扁平网络架构,同时由WCDMA/HSPA阶段的NodeB、RNC、SGSN、GGSN四个主要网元,演进为增强型NodeB(eNB)和接入网关(aGW)两个主要网元,这种结构类似于典型的IP宽带网络结构,采用这种结构将对3GPP系统的体系架构产生深远的影响。eNodeB是在NodeB原有功能基础上,增加了RNC的物理层、MAC层、RRC、调度、接入控制、承载控制、移动性管理和inter-cell RRM等功能。aGW可以看作是一个边界节点,作为核心网的一部分。核心网同时采用全IP分布式结构,支持IMS、VoIP、SIP和Mobile IP等先进技术。 3GPP长期演进项目是近两年来3GPP启动的最大的新技术研发项目,该技术和3GPP 2AIE、WiMAX、以及IEEE802.20MB FDD/MBTDD等,具有某些“4G”特征,被看作“准4G”技术。在我国与LTE对应的计划被称为E3G,“863”计划中与B3G对应的Future计划被考虑用于发展E3G,参与LTE的发展工作。 LTE的优点:低时延、全分组和高数据率 关键技术:SC-FDMA传输机制(低峰均比,上行),HARQ和AMC等链路自适应技术,空间分集和虚拟MIMO等多天线技术,以及功率控制和小区间干扰协调等无线资源管理技术。 各模块的作用如下: TCP层:流量控制和拥塞控制功能 RLC层:ARQ,将包进行分段,暂时存储 RLC层的主要作用是:ARQ,将包进行分段,暂时存储,其包含收端和发端两部分,实现稍微有些差别。实现过程中收发两端分别维护一发送窗和接收窗, 以包的收发进行控制。 MAC层:调度指令、HARQ。 UE节点是上行数据的起始点,需要完成业务数据产生、处理和发送的整个流程。UE在发送数据之前需要与覆盖区内的eNodeB扇区建立连接。在发送数据的过程中,UE处于移动状态,相应的信道环境一直在动态变化。APPLICATION进程根据UE的属性设置获得该UE需要发送的业务,以及业务产生的时刻,并通知业务源。业务源产生的数据包,经过TCP/IP处理,到达包到达RLC层,RLC层模拟数据缓冲区对业务层的数据进行暂时存储,MAC层根据eNodeB的调度指令从RLC层的缓存队列中取出一定的数据量用于上行传输,RLC对缓冲 -81- 通信笔试宝典(第二版) 区内的包进行分段、级联和填充组成RLC PDU发送到MAC层,MAC再把RLC PDU封装复用为MAC PDU,传送失败的RLC PDU会被重传;PHY层确定上行物理信道的发射功率,将MAC层输出的数据包通过无线链路传递给eNodeB。 每个eNodeB管理3个扇区,每个扇区内分布有一定数目的UE。eNodeB根据UE的无线信道状况和缓冲队列情况(包括队列的余量和HOL)为这些UE分配无线资源,并将正确接收的上行数据分组发往aGW节点。eNodeB自下而上包括PHY层、MAC层和RLC层。来自UE的上行子帧首先通过无线接收机RX接收,并计算信噪比;然后在PHY层进行解调、HARQ软合并和解码,此外PHY层需要完成上行信道质量和邻小区的干扰水平的测量;子帧接着被传输到MAC层,MAC层首先由PHY的CRC结果反馈HARQ信息,MAC层还通过提取UE的调度信息和上行信道状况,不断调整资源块的分配,MAC层对MAC PDU作解复用操作,得到逻辑信道上的RLC PDU,然后传输给RLC层;RLC层将接收RLC PDU恢复成RLC SDU,并根据接收窗状况与UE RLC交互。解复用好的SDU经有线链路发送到aGW中去。 -82- 通信笔试宝典(第二版) 致谢 本文是在上一届胥进、沈沉沉等师兄师姐所留下来的材料的基础上,由作者添加了一些新的内容后,整理而成。在此对师兄师姐表示感谢。 感谢移动通信实验室与我一起找工作的谢波、钱文玲、唐苏文、刘宇飞等同学。正是得益于他们的帮助,作者在笔试准备过程中才能有所进步。 -83- 通信笔试宝典(第二版) 参考文献 [1] 谭浩强,《C语言程序设计》,清华大学出版社 [2] 钱能,《C++程序设计》,清华大学出版社 [3] 欧立奇等,《程序员面试宝典》,电子工业出版社 [4] 谢希仁,《计算机网络》,大连理工大学出版社 [5] 樊昌信等,《通信原理》,国防工业出版社 [6] 严蔚敏等,《数据结构》,清华大学出版社 [7] 孙钟秀,《操作系统》,高等教育出版社 [8] 吴伟陵等,《移动通信原理》,高等教育出版社 [9] 赵春明,《现代数字通信技术》课件 [10] 叶芝慧,《现代移动通信系统》课件 [11] 沈连丰,《信息论与编码》,科学出版社 [12] 李仲令等,《现代无线与移动通信技术》,科学出版社 [13] 陈明,《信息与通信工程中的随机过程》,科学出版社 [14] 朱长安,《基于LTE系统的TCP协议参数的优化》,东南大学硕士论文 [15] 胥进,《LTE UPA上行分组调度算法研究》,东南大学硕士论文 [16] 沈沉沉,《OFDMA系统自适应资源分配算法研究》,东南大学硕士论文 [17] 马守贵,《MIMO系统资源分配算法研究》,东南大学硕士论文 -84-
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- 7swz.com 版权所有 赣ICP备2024042798号-8
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务