- 博客(55)
- 收藏
- 关注
原创 网际控制报文协议ICMP
在互联网中主机的数量远大于路由器的数量,出于效率的考虑,这些主机不和连接在网络上的路由器定期交换路由信息。 从源主机向目的主机发送一连串的IP数据报,数据报中封装的是无法交付的UDP用户数据报(使用了非法端口)。把收到的需要进行差错报告的IP数据报的首部和数据字段的前8个字节提取出来,作为ICMP报文的数据字段。 这样,源主机达到了自己的目的,因为这些路由器和最后目的主机发来的ICMP报文正好给出了源主机想知道的路由信息:到达目的主机所经过的路由器的IP 地址,以及到达其中的每一个路由器的往返时间。
2023-11-01 13:44:20 554
原创 IP层转发分组的过程
假如转发表中有A、B两个前缀匹配,它们是由一个更大的地址块(假设为C)划分而来,C划分了四个子网,其中A包含了一个,B包含了三个,为了压缩转发表的空间,减少查找转发表的时间,B采用了路由聚合,这时转发表中就只有两项A、B。 为了解决这个为题,在采用CIDR编址时,如果一个分组在转发表中可以找到多个匹配的前缀,那么就应当选择前缀最长的一个作为匹配前缀。 为了更有效的查找,通常是把CIDR的转发表存放在一种层次的数据结构,然后自上而下的按层次查找,最常用的就是。在进行查找时,只要能与唯一前缀匹配就行。
2023-10-31 15:23:36 737
原创 网际协议IP
IP地址放在IP数据报的首部,IP数据报在数据链路层被封装成帧,而MAC地址则放在MAC帧的首部,所以数据链路层是看不见数据报的IP地址的,是依靠MAC地址传送的。IP软件在存储器中维护一个计数器,每产生一个数据报,计数器就加1,但这并不是为了按序接收的问题,因为IP本身就是无连接的,而是为了在分片时,给每个分片的标识字段赋值,相同字段值的数据报片就能重装为原来的数据报。 一个大的地址块往往包含很多小的地址块,所以在路由器的转发表中利用一个大的地址代替许多小的地址,这种方法称为。
2023-10-30 15:02:04 1458 7
原创 Factory-Method
定义一个用于创建对象的接口(纯虚基类),让子类决定实例化哪一个类。Factory使得一个类的实例化延迟(目的:解耦, 手段:虚函数)到子类。注:自定义1个纯虚工厂基类,其中有个虚方法,它返回我们想要的具体对象,具体实现由具体的工厂子类(工厂子类继承纯虚工厂父类)实现。
2023-10-11 22:44:47 152
原创 Bridge
将抽象部分(业务功能)与实现部分(平台实现)分离,使它们都可以独立地变化。桥接模式具有结构目的并适用于对象,因此它处理对象的组合。delete ib;return 0;/**/Bridge模式使用“对象间的组合关系。
2023-10-09 20:07:17 80
原创 Decorator
动态(组合)地给一个对象增加一些额外的职责。就增加功能而言,Decorator模式比生成子类(继承)更为灵活(消除重复代码 & 减少子类个数)。public:// ...public:// ...class Decorator : public Component // is-a 为了完善接口规范private:// has-a 为了将来具体的实现public:// ...public:// ...public:// ...int main()
2023-10-08 22:29:10 661
原创 虚拟局域网
如果X1的VLAN-10中的A要与X2的VLAN-10中的C通信,X1查到C并没有连接本交换机,于是插入VLAN标签,否则X2也不知道交给哪个VLAN。 如果X1的VLAN-10中的两台主机A,B要通信,X1能根据A发出的帧首部的目的MAC地址识别出B属于本交换机的VLAN-10,因此制只做简单转发,也不需要插入标签。每一个VLAN的帧都有一个明确的标识符,指明发送这个帧的计算机属于哪个VLAN。 例如一个单位的财务部门,他们的信息是需要保密的,如果和许多部门共享一个局域网,这可不利于信息安全。
2023-10-04 17:06:23 350
原创 扩展的以太网
光纤的时延小、带宽很宽,这样很容易就能使主机和几公里外的集线器相连,如果使用多个集线器,就可以连接成覆盖更大范围的多级星形结构的以太网。 假设有两台交换机相连,交换机1中的A想与交换机2中的B通信,A发送出去的帧会在交换机1内广播,当通过与交换机2相连的端口到达交换机2后,又会进行广播,然后通过与交换机1相连的另一个端口后到达交换机1后又进行广播…因此,如果连接在以太网交换机上的两台主机,同时向另一台主机发送,,那么当这台主机的端口繁忙时,发送帧的这两台主机的端口会把收到的帧暂存一下,以后再发送出去。
2023-10-04 15:12:11 267
原创 以太网的MAC层
当数据字段的长度小于46字节时,MAC子层就会在数据字段后面加入整数字节的填充字段,以保证以太网的MAC帧的长度不小于64字节。IP协议的首部有一个总长度字段,当其大于等于46那么就没有填充,否则得出来的差值就是填充字段字节数。一个站在刚开始接收MAC帧时,由于适配器的时钟尚未与到达的比特流达成同步,因此MAC帧的最前面的若干位就无法接收,导致变为无用帧。定义为10101011,前六位和前同步码作用一样,最后连续的11告诉接收端适配器:”MAC帧来了,注意接收“。,减去首部尾部的18字节就得到了46字节。
2023-10-04 11:37:58 146
原创 使用广播信道的数据链路层
适配器和局域网之间的通信是通过电缆或双绞线以串行传输方式进行的,而适配器和计算机之间的通信通过计算机主板上的IO总线以并行传输方式进行的。因此,以太网提供的服务是尽最大努力的交付,即不可靠的交付。 使用集线器的以太网在逻辑上仍是一个总现网,各站共享逻辑上的总线,使用的还是CSMA/CD协议(具体说是各站中的适配器执行CSMA/CD协议)。为了在这种广播的方式下实现一对一通信,我们可以想到给每个计算机唯一的地址,在数据帧的首部写明接收站的地址,当与适配器中的地址一致时才接收,否则就丢弃。
2023-10-02 20:20:31 159
原创 点对点协议PPP
需要强调的是,MTU是数据链路层的帧可以载荷的数据部分的最大长度,而不是帧的总长度。例如,串行的(一次只发送一个比特)或并行的(一次并行地发送多个比特),同步的或异步的,低速的或高速的,电的或光的,交换的(动态的)或非交换(静态的)点对点链路。 在接收端收到一个帧时,先找到标志字段F以确定帧的边界,然后再对其中的比特流进行扫描,发现5个连续的1时就把其后的0删掉。PPP 协议必须规定特殊的字符作为帧定界符(即标志一个帧的开始和结束的字符),以便使接收端从收到的比特流中能准确地找出帧的开始和结束位置。
2023-10-02 15:40:32 118
原创 信道复用技术
当使用时分复用系统传送计算机数据时,由于计算机数据的突发性质,一个用户对已经分配到的子信道的利用率一般是不高的。虽然统计时分复用的输出线路上的数据率小于各输入线路数据率的总和,但从平均的角度来看,这二者是平衡的。由于 STDM 帧中的时隙并不是固定地分配给某个用户的,因此在每个时隙中还必须有用户的地址信息,这是统计时分复用必须有的和不可避免的一些开销。 假设由N路信号要在一个信道中传送,可以通过调制的方法,把各路信号分别搬到合适的频率位置,使彼此之间不产生干扰,各路信号就在所分配的信道中传送。
2023-10-01 22:10:14 250
原创 Observer
定义对象间的一种一对多(变化)的依赖关系,以便当一个对象(Subject)的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。
2023-10-01 14:11:42 96
原创 物理层下的传输媒体
距离太长就要加放大器以便将衰减了的信号放大到合适的数值(模拟传输时),或者加上中继器以便对失真了的数字信号进行整形(数字传输时)。 局域网问世后,为了传送计算级网络中的高速数据,为了提高双绞线的抗电磁干扰的能力以及减少电缆内不同双绞线对之间的串扰,可以采用增加双绞线的绞合度以及增加电磁屏蔽的方法,于是陆续出现了不同的双绞线。由于外导体屏蔽层的作用,同轴电缆具有很好的抗干扰特性,被广泛应用于传输较高速率的数据。MHz的量级,因此一个光纤通信系统的传输带宽远远大于目前其他各种传输媒体的带宽。
2023-10-01 09:10:05 329
原创 Strategy
定义一系列算法,把它们一个个封装起来,并且使它们可互相替换(变化)。该模式使得算法可独立于使用它的客户程序(稳定)而变化(扩展,子类化)CN_Tax,US_Tax,DE_Tax,FR_Tax //如果要添加一个国家,就需要做出更改public://如果只在中国使用,那么下面的代码也将被装载到代码段,但是不被使用。对应上面说到的“有时候支持不使用的算法也是一个性能负担”else if (tax == FR_Tax){ //相应的计算方法也要更改//...//....
2023-09-30 19:45:42 86
原创 TempleteMethod
定义一个操作中的算法的骨架 (稳定),而将一些步骤延迟 (变化)到子类中。Template Method使得子类可以不改变 (复用)一个算法的结构即可重定义(override 重写)该算法的某些特定步骤。在基类实现稳定的模板方法,变化的部分可以通过晚绑定(虚函数->函数指针)由子类实现(多态)。public:protected://变化的由子类override来实现 也可以不是纯虚public:int main()delete tm;return 0;/*
2023-09-30 14:32:24 202
原创 设计模式概述
高层模块(稳定)不应该依赖于低层模块(变化),二者都应该依赖于抽象(稳定)。抽象(稳定)不应该依赖于实现细节(变化),实现细节应该依赖于抽象(稳定)。
2023-09-30 14:28:31 232
原创 磁盘调度策略
磁盘共400磁道,若磁头的当前位置为100,磁头正向磁道号增加方向移动,现有一磁盘读写请求队列,23,376,205,132,19,61,190,398,29,4,18,40。有访问请求时,向一个方向扫描并处理请求,在移动方向上没有磁盘请求时,立刻返回到最小磁道号,以减少等待时间。它的优点是简单易实现,但可能导致长的寻道等待时间,因为它无法考虑请求的物理位置。 没有访问请求时,磁头不动,有访问时磁头来回扫描,每次选择磁头移动方向上最近的访问请求,若移动方向上没有请求了,则改变方向,向反方向扫描。
2023-09-28 21:45:42 240
原创 虚拟存储技术
允许分配给一个进程的页帧在该进程的生命周期中不断地发生变化。 例如有一个由很长的程序和很多的数据组成的进程,在任何一段很短的时间内,执行的程序和访问的数据都很少,在被挂起或换出前只使用一小部分进程块,那么为该进程装入太多的块就造成了很大的浪费。 为页面设置访问计数器,页面每访问一次,对应的计数器加1.淘汰页面时,选择访问计数器的值最小的页面淘汰,同时将所有的计数器清零。 对于固定分配策略,一旦在进程的执行过程中发生缺页,必然发生页面替换,且淘汰的必然是该进程本身的一个在主存中的页面。
2023-09-28 17:20:58 110
原创 存储管理方案
存储管理是对主存(内存)的管理,其中一大任务就是对虚拟内存管理,OS必须提供一种很好的策略来实现内存管理,使CPU尽量处于忙的状态,最大限度的降低内存读写对性能的影响。
2023-09-28 14:04:19 114
原创 进程的死锁
采用抢占资源分配策略:进程在运行过程中根据需要逐个提出资源请求,当一个已经占有了某些资源的进程又提出新的资源请求而未得到满足时,则必须释放它已获得全部资源而进入阻塞状态,待以后需要时再重新申请。一次申请完成进程所有需要的资源(把所有资源进行打包,用一把锁来代表,拿到这把锁就等于拿到了所有资源),资源没有满足前不让它运行,一旦开始运行就一直归它所有,但有不足:。由于资源的占用往往是互斥的,因此当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了死锁。
2023-09-22 23:28:37 188
原创 线程同步方式
为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起,一般线程睡入条件变量,伴随着解锁动作,而线程从条件变量醒来时,伴随着加锁功能,如果加锁失败线程会进入阻塞状态而不是睡眠。 在多线程编程里面,一些敏感数据不允许被多个线程同时访问,此时就使用同步访问技术,保证数据在任何时刻,最多有一个线程访问,以保证数据的完整性。 所谓的原子操作就是不可被拆分的操作,对于多线程对全局变量进行操作时,就再也不用再线程锁了。 同一进程内的多个线程之间,除了栈内存是独立的,其他资源全部共享。速度快、不会产生死锁。
2023-09-20 22:51:41 41
原创 Linux线程管理
不会,从表面看,当子线程还在执行而主线程执行到main函数最后一行代码,主线程就会执行main函数中显式或隐式(没写return编译器编译时会自动补上)的return语句,在main函数中执行return语句,就相当于执行exit函数,会导致整个进程一起结束(线程也就全部结束)。可以调用pthread_exit(NULL)让主线程先结束而不是让主线程掉用return结束整个进程,这样子线程就可以继续执行。同步方式(非分离状态):创建线程之后主线程调用pthread_join函数等待其终止,并释放线程资源。
2023-09-19 23:08:05 121
原创 Linux进程通信
它用于进程间通信的XSI-IPC内核对象,就是像匿名管道、文件内核对象一样,使用XSI方式进行进程间通信时,系统会在内核中创建一个XSI-IPC内核对象,让需要通信的进程共同访问。 在内核中开辟一内存,可以让其它进程的虚拟地址与它进行映射,这样就达到多个进程共享一块内存的目的,当一个进程向这块内存写数据时,其它进程也都可以读取到,这样就达到了通信的目的。 读写:一个进程只负责写入数据,另一个进程只负责读取数据,只要负责读的进程使用的是最新即可,这是单向通信的模式。
2023-09-18 23:08:45 45
原创 Linux信号管理
信号是UNIX、类UNIX以及其他POSIX兼容的操作系统中,进程间通讯的一种有限制的方式。它是一种异步的通知机制,用来提醒进程一个事件已经发生。 当一个信号发送给一个进程,操作系统中断了进程正常的执行、控制流程,此时,任何非原子操作都将被中断。如果进程定义了信号的处理函数,那么它将被执行,否则就执行默认动作。# 执行kill -l命令可以显示出当前系统可能产生的所有信号 一种专门存储信号的数据类型sigset_t,有128个字节,每个字节代表一个信号。
2023-09-18 11:40:34 70
原创 Linux文件系统
在操作系统的内核中定义了一系列内核函数,供应用程序调用,但是为了操作系统的安全,这些函数不能被直接调用,而是向应用程序提供了一系列API,应用程序调用API切换到内核态调用内核函数就是系统调用。 系统调用负责把应用程序的请求传给内核,调用相应的内核函数完成所需的处理,然后将处理结果返回给应用程序。 UNIX/Linux大分部的系统功能是通过系统调用实现的,这些系统调用被封装成了C函数的形式,但它们并不是真正的函数。
2023-09-17 23:03:23 40
原创 Linux内存管理
虚拟内存是操作系统内核为了对进程地址空间进行管理( process address space management)而精心设计的一个逻辑意义上的内存空间概念。 在32位系统下,操作系统规定每个进程拥有4G的虚拟内存,但这4G的内存空间并不能直接使用,也就是操作系统给进程画的饼,当进程真的需要使用内存来存储数据时,操作系统会把一部分的虚拟内存与物理内存进行映射,映射后的虚拟内存才能正常使用。
2023-09-15 23:23:18 57
原创 Linux库文件
库文件是计算机上的一类文件,提供给使用者一些开箱即用的全局变量、函数、结构、联合、枚举或类,它是若干个目标文件的集合,也可以对源码进行保密。库文件分为静态库和动态库,静态库和动态库的区别体现在程序的链接阶段和执行阶段。 当一个模块不会再发生改变,并且执行速度有一些要求,适合把它封装成静态库。 随着计算机性能的不断提升,弥补了动态库运行速度慢的缺点,再加上它能节约内存、更新方便,最主要的是计算机硬件一直在升级,所以就导致大多数代码需要不断的升级,因此我们大多数情况下把模块封装成动态库。。
2023-09-14 23:38:27 42
原创 Linux环境变量
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置、系统文件夹位置等。 环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。例如操作系统中的path环境变量【配过Windows环境变量对path应该很熟悉了】,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到path中指定的路径去找。用户通过设置环境变量,来更好的运行程序。
2023-09-14 22:41:13 38
原创 处理器调度算法
当运行进程因某种原因(如超时或等待I/O)需要放弃CPU时,进程调度程序将进行进程的CPU现场信息,保存到该进程PCB的CPU状态保护区。将选中进程保存在PCB的CPU现场信息送入CPU的各寄存器,然后将CPU的使用权交给选中的进程,使它从上次中断运行的断点处恢复正常运行。只有当优先级高的就绪队列中的所有进程全部运行完毕或等待I/O操作而没有进程运行时,才把处理机分配给低优先级就绪队列中的进程。s不变,w越大R越大—>长进程等待足够长的时间后,R值足够大,可以越过短进程运行,所以也就不会被饿死了。
2023-09-13 23:23:21 426
原创 处理器管理基本概念
又称作业调度或宏观调度,即按一定的调度算法把外存上处于后备作业队列中的作业调入内存,为它们分配所需的资源并创建进程,然后将新创建的进程插入到系统的就绪队列中。又称交换调度,功能是在内存使用紧张的情况下,将内存中暂时无法运行的进程挂起,即由内存调至外存(换出),使外存上具备运行条件的就绪进程能够及时进入内存运行。在抢占方式下,可以通过剥夺处理器所有权的方式,暂停当前进程的运行,满足更紧急进程的处理要求。又称进程调度或微观调度,功能是按照一定的调度算法将CPU分派给就绪队列中的某个进程。
2023-09-12 23:59:01 136
原创 计算机网络--概述
有三大类大家很熟悉的网络,即电信网络、有线电视网络和计算机网络。按照最初的服务分工,电信网络向用户提供电话、电报及传真等服务;有线电视网络向用户传送各种电视节目;计算机网络则使用户能够在计算机之间传送数据文件。这三种网络在信息化过程中都起着十分重要的作用,但其中发展最快并起着核心作用的则是计算机网络。 随着技术的发展,电信网络和有线电视网络都逐渐融入了现代计算机网络的技术,扩大了原有的服务范围,而计算机网络也能够向用户提供电话通信、视频通信以及传送视频节目的服务。
2023-09-09 14:08:01 40
原创 Linux进程管理
函数调用后父子进程各自继续运行,其先后顺序不确定,并且子进程会复制父进程的data、bss、heap、stack、IO缓冲区,共享父进程的代码段、文件表(子进程有权访问父进程所有的文件描述符,只要把文件描述符告诉他),继承父进程的信号处理方式。如果pgid为0,表示将pid所属的进程加入到其父进程的进程组中,如果该父进程不存在,则将创建一个新的进程组。进程ID在任何时刻都是唯一的,但可以重用,当一个进程结束时,其进程ID就可以被分配其它新创建的进程。函数可以获取一个进程的进程组ID。
2023-09-09 11:02:49 48 1
原创 进程的基本概念
对于进程的定义,有多种不同的说法:传统的进程定义:一个正在执行的程序计算机中正在运行的程序的一个实例可以分配给处理器并由处理器执行的一个实体有若干线程、一个当前状态和一组相关的系统资源所刻画的活动单元这些说法都对,但引入线程后,第四种说法显得更为贴切大多数情况下我们是这样定义的:是程序在给定数据集合上的一次执行过程,是系统进行资源分配和调度运行的独立单位。系统进程:系统进行软硬件资源管理的进程,其相互关系由操作系统负责协调,是系统资源的实际享有者。
2023-09-08 20:52:56 63 1
原创 十大排序算法
归并排序需要一块额外的空间,用于存储合并的结果,它的时间复杂度与快速、堆相同,但是在排序过程中没有进行数据交换,而直接数据拷贝,因此节约了大量的数据交换的时间,但也耗费了额外的内存,所以它是一个典型的用空间换取时间的排序算法。 使用这种方式排序的优点是不需要对待排序的数据进行比较、交换,所以它的排序速度要比普通排序快的多,但局限性很大,只能对整型数据排序,并且对正负数还有要求,还需要额外的内存空间。 先根据数据个位的大小对数据进行排序,然后再对排序结果的十位进行排序,然后百位、千位…
2023-08-24 22:52:42 51 1
原创 查找算法-C
在查找数据时需要进行一系列的比较运算,无论是顺序查找、二分查找,都是建立在比较的基础上的,但最理想的查找算法是不经过任何比较,一次存取就能查找到数据,那么就需要在存储位置和它的关键字之间建立一个确定的对应关系,使每个关键字和数据中的唯一的存储位置相对应。 以上是很简单的一个例子,但是可以看出其局限性,比如如果数据范围变为0~1000000,那么这样构建出来的哈希表可能很大,那么就得重新设计哈希函数,但是这样算出来的结果也可能出现重复,因此设计出合适的哈希函数、解决冲突问题是哈希表和哈希查找的关键。
2023-08-23 22:48:44 41
原创 树和二叉树
删除节点时,首先需要找到待删除的节点。如果待删除的节点有两个子节点,可以找到其右子树中的最小节点,即右子树中的最左节点,将其值复制到待删除节点,并删除该最小节点。结点的子树称为该结点的孩子,而该结点是孩子结点的双亲,拥有共同双亲的结点互为兄弟,从双亲结点往上,直到根结点都称为孩子结点的祖先结点,以某结点为根的子树中的任一结点都被称为该结点的子孙。 若一棵树的层数为k,它前k-1层的总结点数是2^(k-1)-1(前k-1层是满二叉树),第k层的结点按照从左往右的顺序排列,则这棵树就是完全二叉树。
2023-08-17 23:19:40 47 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人