简介
结点和链路
通常习惯上,网络通信中涉及的两个端主机和路由器被视为结点,而它们之间的网络被视为链路。数据链路层控制了如何使用两个结点之间的传输介质。
链路分为点对点链路和广播链路。在点对点链路中,链路专供给两个设备使用;在广播链路中,链路在几对设备之间共享。
两个子层
数据链路层通常被分为两个子层:数据链路控制和介质访问控制。数据链路控制子层处理点对点链路和广播链路的共有问题,而介质访问控制子层只处理广播链路的特定问题。
"> ">
通常习惯上,网络通信中涉及的两个端主机和路由器被视为结点,而它们之间的网络被视为链路。数据链路层控制了如何使用两个结点之间的传输介质。
链路分为点对点链路和广播链路。在点对点链路中,链路专供给两个设备使用;在广播链路中,链路在几对设备之间共享。
数据链路层通常被分为两个子层:数据链路控制和介质访问控制。数据链路控制子层处理点对点链路和广播链路的共有问题,而介质访问控制子层只处理广播链路的特定问题。
传输层位于应用层和网络层之间,它在两个应用层之间提供进程到进程的通信,两个进程分别位于本地和远程主机上。
注意:网络层负责的是计算机层次的通信(即主机到主机),但是网络层协议只是把报文传递到目的计算机。由于报文需要递交给正确的进程,而这一部分正是传输层负责的部分。
机器学习是近20多年兴起的一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。机器学习算法是一类从数据中自动分析获得规律,并利用规律对未知数据进行预测的算法。因为学习算法中涉及了大量的统计学理论,机器学习与统计推断学联系尤为密切,也被称为统计学习。
目前,机器学习技术已经渗透进各种不同的领域,例如手机上的垃圾短信过滤、淘宝主页上的商品推荐、银行的智能客服机器人、AlphaGo能够学会下围棋,等等。而且可以预见的是,随着芯片算力以及人类产生数据量的快速增长,这一技术在自动驾驶、生物医药、工业4.0等等领域将会得到更加广泛的应用。
那么,究竟如何定义机器学习?关于机器学习的定义有多种不同的表达方法,比如:
一个标准设备包含两部分重要组件:其中一部分是向系统其他部分展示的硬件接口,用于让系统软件控制它的操作;另一部分是它的内部结构,包含设备相关的特定实现,负责具体实现设备展示给系统的抽象接口。标准设备的示意图如下所示:
从图中可以看出,一个设备接口包括3个寄存器:一个可以读取并查看当前设备状态的状态寄存器、一个通知设备执行某个具体任务的命令寄存器、和一个用于将数据传给设备或是从设备接收数据的数据寄存器。通过读写这些寄存器,操作系统可以控制设备的行为。
如果一个逻辑流的执行在时间上与另一个流重叠,称为并发流,这两个流被称为并发地运行。多个流并发执行的一般现象被简称为并发。在多线程的并发执行中,由于这些线程会共享地址空间,这就带来了一些必须要处理的问题。
备注—并发(concurrent)与并行(parallel):
在计算机系统中,只要两个任务在时间上重叠就被称为并发,这一概念并不关心任务如何具体地被执行,与执行这些任务的处理器核数或者是计算机数无关。并发主要关注的是任务的抽象调度,相当于是站在任务安排者视角看到的东西。
并行是并发的一个真子集,指的是两个流并发地运行在不同的处理器核或者计算机上。并行关注的是任务的实际执行,相当于是站在任务执行者视角的概念。
一个操作系统内部同时运行着多个进程,这些进程之间采用时分共享的方式来使用硬件。对于CPU来说,时分共享是通过让一个进程全部占用CPU运行一段时间,在进程切换的时候通过上下文切换来完成;但是对于内存来说,如果采用这种方式,在进程切换的时候需要将物理内存中当前所有的内容保存到磁盘中去,并从磁盘中读取另一个进程的物理内存数据到物理内存中。根据计算机组成原理的知识,磁盘与物理内存之间的数据传输是很慢的。因此,操作系统的做法是在进程切换的时候仍然将进程信息放在物理内存中,也就意味着许多程序在同一时刻共享着物理内存。
但是这种做法又对操作系统有了新的要求,人们不希望一个进程可以读取甚至修改其他进程使用的物理内存。因此,操作系统使用了虚拟内存(Virtual Memory)的概念,对物理内存进行了抽象,通过这种抽象所形成的地址集合被叫做虚拟地址空间(Virtual Address Space)。相应地,一个物理内存所对应的地址集合被称为物理地址空间。一个进程的虚拟地址空间是运行中的程序看到的系统中的内存,它包含了这个程序的所有内存状态,包括程序代码、栈、堆等部分。为了给进程提供保护,每个进程都有着自己独立的虚拟地址空间,但是不同进程的虚拟内存可能会共享使用部分物理内存,从而实现数据共享。
在操作系统中,常常同时运行着许多个进程,对于现代操作系统来说可能会有上百个进程同时运行(Windows可查看任务管理器,Linux系统为top或ps命令)。但是实际上只有少量的物理CPU可用,操作系统通过虚拟化CPU提供了几乎有无数个CPU可用的假象。
OpenSSL是一个C语言实现的,功能丰富且自包含的安全工具箱,提供的主要功能包括SSL协议实现、加密解密算法、非对称算法的密钥生成、数字证书验证等。
OpenSSL Manual: https://www.openssl.org/docs/man1.1.1/man7/
在linux系统下面,可以使用apt-get命令安装OpenSSL和libssl-dev(这个必须安装,包含了lib和header等信息,安装之后才能在c/cpp程序中使用OpenSSL的函数)。
如果是简单地对文件做一些加密或者哈希等操作,只需要在命令行中执行openssl ……就可以,结果会直接打印在命令行内。
如果在c/cpp程序中使用了OpenSSL函数,编译的时候使用这一命令:g++ test.cpp -lssl -lcrypto,后两个编译选项是为了在编译的时候将OpenSSL的函数库链接进去。
对于一些简单的函数,用内联函数替换。即:将代码中调用函数的步骤用函数体填充。这样就减少了调用函数的开销。
消除循环的低效率。循环中可能存在需要执行多次,但是每次的计算结果都不变的表达式。此时可以把这一表达式移动到循环体之外。例如循环体的结束条件中,有时是以一个字符串的大小作为判据的。如果字符串的大小不变,那么不必每次调用strlen()函数,只需要在开始的时候调用一次即可。
一个编写良好的计算机程序常常具有较好的局部性,它们倾向于引用最近引用过的数据项,或是引用与它们相邻的数据项。这种倾向性被称为局部性原理。通常一个局部性良好的程序比局部性差的程序运行地更快。
局部性分为两种: