精华内容
下载资源
问答
  • 题目描述模拟超市存包柜的存放物品和取出物品操作,存放物品时选择空储物格,然后分配密码即为存放完成;取出物品时,输入对应的密码,打开对应的箱门即为取出物品题目分析1.增加私有变量,练习私有变量的使用2.多...

    题目描述

    模拟超市存包柜的存放物品和取出物品操作,存放物品时选择空储物格,然后分配密码即为存放完成;取出物品时,输入对应的密码,打开对应的箱门即为取出物品

    题目分析

    1.增加私有变量,练习私有变量的使用

    2.多处需要进行数据类型转换,如int(),str()等

    3.字符串的拼接和截取,截取使用的是切片的方式

    4.密码采用了随机密码+位置码的方式,这样既能直接根据密码定位箱子位置,同时避免了随机生成的重复密码问题

    代码

    本次主要优化了check_cell()方法、save_goods()方法、get_goods_out()方法,其中get_goods_out()方法改动最大,取消了for循环,提高了查找性能。

    #!/usr/bin/python3

    #-*- coding:UTF-8 -*-

    import random

    '''

    模拟超市存包柜程序,设置100个箱子,存满即止

    每次存放物品之前从第一个箱子检测是否为空,遇到第一个为空的即可存入物品

    '''

    class Locker(object):

    def __init__(self):

    self._cell_num = 100

    self._use = 0

    self._surplus = self._cell_num

    self.cell = [0]*100

    def show_cell_detail(self):

    print(f"\n####################################\n总存包格数:总{self._cell_num}格,已用{self._use}格,剩余{self._surplus}格")

    def get_surplus(self):

    return self._surplus

    def check_cell(self):

    for i in range(0,100):

    position = "%02d"%(i) #将箱子位置统一格式化成2位数,不足的补0

    if self.cell[i] == 0:

    return position

    return -1

    #存放物品方法,先使用检查方法检查是否有空箱子,有空箱子即开门存物

    def save_goods(self):

    self.passwd = random.randint(10000,99999)

    self.cell_save = self.check_cell()

    self.passwd = str(self.passwd) + self.cell_save #将箱子位置加入密码中,密码最后两位数代表箱子位置,同时能够避免重复密码的问题

    self.cell_save = int(self.cell_save)

    self.cell[self.cell_save] = self.passwd

    print(self.cell[self.cell_save])

    self._use += 1

    self._surplus = self._cell_num - self._use

    print(f"{self.cell_save+1}号箱门已打开,您的密码是{self.cell[self.cell_save]}")

    #取出物品方法,输入密码,取出物品

    def get_goods_out(self,password):

    password = str(password)

    i = int(password[5:7]) #直接取密码最后两位定位箱子位置,避免循环查找消耗时间

    if self.cell[i] == password:

    print(password)

    self.cell[i] = 0

    self._surplus += 1

    self._use = self._cell_num - self._surplus

    return i

    return -1

    lock = Locker()

    #lock.check_cell()

    while True:

    lock.show_cell_detail()

    surplus = lock.get_surplus()

    operation = input("1-存放\n2-取出\n0-退出\n请输入对应操作:")

    if operation == "1":

    if surplus != 0:

    lock.save_goods()

    else:

    print("箱已存满,谢谢使用")

    break

    elif operation == "2":

    while True:

    password = input("请输入取件密码:")

    password = int(password)

    out_result = lock.get_goods_out(password)

    if out_result != -1:

    print(f"{out_result+1}号箱门已打开,密码已失效,请取出物品,关好箱门")

    break

    else:

    print("密码错误,请核对后再输入!")

    elif operation == "0":

    print("欢迎再次光临!")

    break

    else:

    print("请输入正确的操作!")

    continue

    展开全文
  • git 暂

    千次阅读 2020-12-22 10:54:23
    所谓的分支就是一个commit记录的引用如下图所示: 在这些分支上工作会产生各自的历史记录(commit记录)所谓的分支切换就是指的Head指针的切换以及暂区和工作区的一个还原,比如说我们现在当前Head指向的位置再...

    一、Git基本工作流程

    1.初始化一个仓库

    git  init

    git  clone

    git仓库分为两种情况:

    第一种是在现有项目或目录下导入所有文件到 Git 中; 第二种是从一个服务器克隆一个现有的 Git 仓库

    git  init  –bare  git 创建一个裸仓库

    2.git仓库有三个区域

    工作区working directory日常编辑代码的地方

    历史仓库history repository是commit指向的一个树形结构

    暂存区Staging area相当于是工作区与历史提交中间的缓存,它代表着是你要提交代码的一个工作状态,它维护的是一个虚拟的树形结构

    讲述完了git的区域,接下来讲解下git文件的状态,其实git的状态无外乎两种:已跟踪和未跟踪,已跟踪的文件说明的是被纳入版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后,它们的状态可能处于未修改,已修改或已放入暂存区。 工作目录中除已跟踪文件以外的所有其它文件都属于未跟踪文件,它们既不存在于上次快照的记录中,也没有放入暂存区。 初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态。

    讲解下文件变化周期,比如我们在项目中添加了一个文件a,这时候文件a处于的状态则是Untracked未跟踪状态,当我们git add的时候这时候就会将文件放到暂存区中这时候状态变为Stage,当我们commit这个暂存区的文件后这个文件就变成未修改状态,因为没有进行修改过了相对于版本控制中的文件,当我们修改了a文件后这时候从unmodified变成modified(修改状态),这是再git add的时候就会将修改的文件变成stage,放入暂存区用于等待commit。

    接下来就详细讲解下这些命令:

    往暂存区里面添加东西使用如下git指令

    git  add

    从暂存区提交到历史记录使用如下指令

    git  commit

    查看工作区和暂存区之间的区别,来确保提交时我们所需要的呢?

    git  status

    从暂存区里面删除内容

    git  rm

    工作区内重命名文件或者移动文件,然后再把他们添加到暂存区

    git  mv

    确保工作区内里面不需要的文件不被添加进去添加到暂存区和历史。

    .gitignore

    实例讲解:

    新建一个仓库

    git  init  git_init

    cd  git_init

    touch a             //新建a文件

    git  add  a   //将a添加到暂存区

    git status会显示我们要提交的内容a文件,这时候a两个文件都是Changes to be committed也就是待commit的状态。

    $ git status

    On branch master

    Changes to be committed:

    (use "git reset HEAD ..." to unstage)

    new file: a

    git  commit  -m  “initial commit”//提交a文件到版本控制中。

    touch b新建文件b

    git add b //将b放入暂存区中

    $ git status

    On branch master

    Changes to be committed:

    (use "git reset HEAD ..." to unstage)

    new file: b

    编辑一下a文件,这时候在调用git status

    $ git status

    On branch master

    Changes to be committed:

    (use "git reset HEAD ..." to unstage)

    modified: a

    new file: bb

    这时候a文件是出于修改状态,那么如果我们在进行修改a文件时候,在调用下git status会发生什么奇怪的事呢?let’s  go。

    $ git status

    On branch master

    Changes to be committed:

    (use "git reset HEAD ..." to unstage)

    modified: a

    new file: bb

    Changes not staged for commit:

    (use "git add ..." to update what will be committed)

    (use "git checkout -- ..." to discard changes in working directory)

    modified: a

    这时候我们会发现两个modified a,这是为什么呢?但是两个文件分别存在暂存区和非暂存区,实际上暂存区内只保存了git add的版本,而最新修改的一份没有提交到暂存区内还在工作区域中,所以我们会看到两个,如果这时候调用git commit的话就只会讲已经在暂存区的文件存入到版本控制中,而最新修改的那一次记录没有被提交。

    当然这里还提供了跳过暂存区的方法就是git commit –a –m“注释内容”可以直接跳过暂存区直接提交到记录里面去。

    将a移除整个项目

    git  rm  a

    清楚缓存中的内容,也就是已经暂存的文件

    git  rm  a  –cached

    给文件重命名将a文件名换成c

    git  mv  a  c

    二、Git暂存区

    假设工作区里面有这么一些文件如下图所示:

    在第一次add都还没有进行的时候,暂存区还没有被创建出来,当我们add的时候会创建一个暂存区出来(文件分开add产生两个数据对象),如下图所示:

    .git目录下面多了一个index的文件,那么这个index文件就是我们所说的暂存区的文件,那么每一条索引都是hash值表示以及它对应的文件名。每个索引还包含了他的文件模式权限还有status number来表示他的合并状态、时间戳等。每一个索引都是跟对象库的文件是对应的。比如说file.txt这里对应的是标号1,那么file2.txt对应的就是标号2(上图所示标号),这个index里面除了维护了索引之外还维护了提前计算好的tree对象的内容,也就是我们的顶层的目录tree以及folder的tree对象内容,当我们提交的时候他可以迅速的根据我们已经计算好的内容生成一个tree对象,然后添加到历史记录里面。

    当我们修改了file2.txt的时候,这时候git add到暂存区时,发现对象库里面新创了一个对象,那么暂存区的这条索引就被指向新对象的索引替换掉。这时候git暂存区又从新计算了下顶层目录tree对象的一个内容。当我们提交的时候我们直接使用已经计算好的内容创建好一个新的tree对象,生成一个commit对象将master分支上面的HEAD指针指向当前commit对象上去。如下图所示:

    这里的标号8指向的就是新生成的commit对象。

    三、Git本地分支与合并

    1.创建分支git branch

    2.给固定的commit做标记 git  tag

    3.分支之间进行切换 git  checkout

    4.切换分支之前保存本地修改 git  stash

    5.合并分支 git  merge

    例子创建一个分支名字叫test并切换到当前的分支上去。

    这时候分支的名称不再是master而是改变成为test分支。编辑下a文件用test分支进行提交

    切换到master分支上面我们看一下a的内容

    并没有test分支在a中添加的内容这时候我们切换分支时会使用我们分支上最新的一个提交来还原我们的暂存区和工作区内容,那么可以让我们在不同的分支之间独立的做自己的工作。

    git  log  –oneline  –decorate  –graph  –all

    我们可以看到提交的记录或提交这些提交的引用

    给第一个提交加一个名称tag

    git  tag  “v0”  f6699b3

    在查看下git  log  –oneline  –decorate  –graph  –all

    多了一个tag:v0使用git show v0查看下内容,这是打的tag是一个轻量级的只是一个固定的引用。

    而使用git tag –a的方式进行添加时会是一个tag对象,他有tag的属性,包括提交人时间等信息。

    Tag指向了一个提交commit

    Tag也可以使用checkout进行操作

    但是它当前的没有指向一个分支而是指向了一个commit,这时候就会出现一个问题就是我们切换分支的时候这一部分内容就有可能被遗弃掉,也就是说head引用直接指向了一个commit而不是一个分支名,checkout提供了针对当前commit新建一个分支的方法并切换到当前分支。

    git  checkout  -b  “ttt_v0”

    接下来切换master分支

    这时候会用的git  stash进行保存工作区,因为我们切换checkout的时候会覆盖掉当前的内容所以我们先将其保存起来。如果想要保存暂存区就可以使用-a来保存。

    Git  stash  save  -a   “stash1”

    这时候我们来查看下缓存区状态git  status的时候是很干净的如下图:

    下面我们切换到master分之下,在切换会ttt_v0下时我们要还原stash里面的内容

    会有一个stash的缓存内容存在,下面我们来恢复stash里面的内容,并将缓存区内容还原。

    git  stash   pop  –index  stash@{0}   这里的标记红色的表示stash里面的第0个stash

    我们会发现之前修改的a文件已经在暂存区内贮备提交了

    使用git  stash  apply  –index  stash@{0}这种方式时git stash list里面的内容是不会被清理掉的这里–index是恢复暂存区内容

    使用git  stash  drop  stash@{0}清除掉,如果不加stash@{0}引用的话他默认会清楚stash栈最上面的一个。

    清楚多个stash的时候使用git  stash  clear

    四、查看与对比历史记录

    1.git show

    2.git log

    3.git diff

    输入git  log  –oneline  –decorate  –graph  –all查看完整的历史示意图。

    git  log  -p常用的选项是 -p,用来显示每次提交的内容差异, 你也可以加上 -2 来仅显示最近两次提交:

    我们可以根据查看git  show  f6699b3的信息

    最新的一次提交可以用git  show  master 或者git  show  HEAD,也可以使用git  show  master^表示master分支的第一次提交master^2表示第二次提交

    通常我们会用git diff来回答两个问题:第一个就是当前做了什么还没有提交暂存区?第二个问题就是当前那些文件已经暂存了等待提交?

    git  diff 这个命令是查看当前工作区与暂存区快照的差异,也就是那些还没有暂存起来。

    图中显示的是暂存区和工作区的区别在于a文件被修改了添加了next edit file。请注意,git diff 本身只显示尚未暂存的改动,而不是自上次提交以来所做的所有改动。 所以有时候你一下子暂存了所有更新过的文件后,运行 git diff 后却什么也没有,就是这个原因。

    回顾:

    所谓的分支就是一个commit记录的引用如下图所示:

    在这些分支上工作会产生各自的历史记录(commit记录)所谓的分支切换就是指的Head指针的切换以及暂存区和工作区的一个还原,比如说我们现在当前Head指向的位置处再建两个分支之后他们所指向的commit都是同一个如下图所示:

    分支切换后如下图所示:

    而tag指向了一个固定的commit记录,如下图所示:

    分为两种一种是轻量级的一种是标签对象,主要区别就是轻量级的tag只是一个固定的连接,但是标签对象就是创建标签的时候会产生一个标签对象,这个标签对象存储在.git/object目录里面,tag对象里面包括对数据对象的指向,以及创建时间数据对象类型和创建人等信息。

    举个例子来说明一下分支切换以及合并:

    开始的状态是这样的,我们提交了三次commit后的示意图如下:

    当我们使用了git  branch test的时候,将会在当前位置处新建一个分支,分支的名称叫test,但是分支并没有切换依然是master分支(Head的指向)如下图所示:

    我们在master分支上面工作会产生master分支上面的commit记录如下图所示:

    这个时候我们是用git  checkout  test的时候HEAD指针就会指向test,并且还原暂存区和工作区内容。如下图所示:

    继续在test分支上面进行工作,会产生test对应分支上面的commit记录

    我们来说一下合并,合并分为两种一种是fast-farword  merge也就是说test所指向的commit记录他其实是master所指向的commit所衍生出来的如下图所示:

    蓝色部分是master分支,红色部分是master分支所衍生出来的分支。这时候我们在master分支上面进行合并git  merge  test不会产生新的commit记录出来,master分支指向test分支所指向的commit记录上去,然后把工作区和暂存区还原成了test的暂存区和工作区内容。如下图所示:

    另外一种就是non-fast-farword  merge也就是我们的三方合并。

    我们可以看到master指向的commit和test只想的commit有一个共同的父节点就是70e4d8这个节点。Master指向的commit和test指向的commit并没有一个衍生的关系,这时候我们在master分支上面git merge test,会生成一个新的commit来承载两个分支的历史内容

    五、结束语

    这篇文章非一天写完的我也是在学习的过程中总结,以及参考大婶们写的文章加自己的理解写成的,如果这里有些错的或者有雷同的请各位大神指点一二。小丁谢过,写一篇文章确实不容易,能支持的就支持下不能支持的就当没看过这篇文章就好了。写篇文章容易么?写完了还被移除首页,已经发了两篇了第一篇只是开始被移除了首页~看看这个给不给我移除首页吧~

    展开全文
  • 【原创】图解抓

    2021-05-13 01:37:01
    图解抓在研究 libpcap 和 PF_RING 时,在网上看到了很多相关示意图,然而各种图由于侧重不同,呈现的面貌也千差万别;本文就针对这些示意图进行一些总结性说明;由于水平有限,解释说明难免有所纰漏,望各路大神不...

    图解抓包

    在研究 libpcap 和 PF_RING 时,在网上看到了很多相关示意图,然而各种图由于侧重不同,呈现的面貌也千差万别;本文就针对这些示意图进行一些总结性说明;

    由于水平有限,解释说明难免有所纰漏,望各路大神不吝指教!!

    Linux 网络栈

    0818b9ca8b590ca3270a3433284dd417.png

    Libpcap 抓包系统模型

    0818b9ca8b590ca3270a3433284dd417.png

    上图为 libpcap 机制涉及的相关内容(简化);

    0818b9ca8b590ca3270a3433284dd417.png

    上图为 libpcap 机制涉及的相关内容(详细);

    0818b9ca8b590ca3270a3433284dd417.png

    上图标明基于 libpcap 的抓包工具和常规应用程序使用不同的包处理路径(注意:此处的 libpcap 是基于 PF_PACKET 的标准版本);

    0818b9ca8b590ca3270a3433284dd417.png

    这张图细化了 libpcap 的包处理路径(但没有明确指明 BPF 和 tap);

    0818b9ca8b590ca3270a3433284dd417.png

    0818b9ca8b590ca3270a3433284dd417.png

    0818b9ca8b590ca3270a3433284dd417.png

    以上三张图更加细化了 libpcap 的包处理路径,并明确给出了 libpcap 的组成部分有 BPF 和 tap ;但没有提及 libpcap 是在数据链路层上通过旁路进行的包处理,实际通过网络分接头(tap)从位于数据链路层的 NIC driver 中进行的数据包拷贝;

    0818b9ca8b590ca3270a3433284dd417.png

    上图描述了基于 BPF 和 ZC BPF 的标准 libpcap 实现是如何进行数据包读取的;

    数据包接收

    0818b9ca8b590ca3270a3433284dd417.png

    这张图给出了很多信息:

    可能导致丢包问题的两处缓冲区:Ring Buffer 和 poll_queue (per CPU);其中 poll_queue 的 size 由内核参数 net.core.netdev_max_backlog 决定,默认为 1000 ;

    数据包(由网卡驱动程序)通过 DMA 方式从 NIC Rx queue 拷贝到操作系统内核内存中(Ring Buffer 中保存的是内存索引);

    IRQ 和 softirq

    0818b9ca8b590ca3270a3433284dd417.png

    这张图提供的有用信息:

    图中 Poll List 即前图中的 Poll_queue (per CPU) ;

    Poll List 每个 CPU 一个,也称之为 backlog ,注意和图中 Socket backlog 进行区分;

    图中给出了 IP 层和 TCP 层的位置,以及两种类型 backlog 所处位置;

    0818b9ca8b590ca3270a3433284dd417.png

    上图给出了(单队列网卡)包处理相关的更多信息:

    物理层:NIC RX queue、NIC memory 和 NIC controller ;

    链路层:NIC driver、NAPI、Ring Buffer

    网络层:PF_PACKET

    数据包通过 DMA 方式从物理层 NIC RX queue 拷贝到操作系统内存中;

    NIC memory 中维护的是用于在 Ring Buffer 中进行位置定位的指针;而 Ring Buffer 中的内容为指向保存 DMA 拷贝包的操作系统内存的指针; NIC controller 通过 NIC memory 中的信息定位 Ring Buffer 的 head 位置,之后触发 IRQ 给 CPU0 ; CPU0 通过 NIC driver、NAPI 机制、PF_PACKET,以及 softirq 完成对操作系统内存中数据包的获取;

    0818b9ca8b590ca3270a3433284dd417.png

    多队列网卡与单队列网卡的差别:

    NIC memory 维护多个 Ring Buffer 的 head/tail 索引信息;

    链路层中包含多个 Ring Buffer(针对每个 RX queue 存在一个)

    PF_RING 相关

    0818b9ca8b590ca3270a3433284dd417.png

    硬件加速卡的实现:FPGA + NIC Memory Map 关键:专用、昂贵

    0818b9ca8b590ca3270a3433284dd417.png

    PF_RING DNA 对 Vanilla PF_RING 的改进:NIC NPU + NIC Memory Map 关键:常规 Commodity NIC 即可达到专用硬件加速卡效果;

    0818b9ca8b590ca3270a3433284dd417.png

    PF_RING Internals

    0818b9ca8b590ca3270a3433284dd417.png

    0818b9ca8b590ca3270a3433284dd417.png

    值得注意的一个细节:

    netif_receive_skb() 对应 NAPI

    netif_rx() 对应 No NAPI

    PF_RING Packet Journey

    0818b9ca8b590ca3270a3433284dd417.png

    0818b9ca8b590ca3270a3433284dd417.png

    libpcap v.s. PF_RING

    0818b9ca8b590ca3270a3433284dd417.png

    PF_RING 的地位和 PF_PACKET 是类似的,本质上都是向内核注册了一种 socket 类型;图中有一个地方画错了,即 Linux Network Stack 上方应该是非抓包的其它服务,如 telnet 和 tftp 等;

    0818b9ca8b590ca3270a3433284dd417.png

    基于 PF_PACKET 和 PF_RING 两种方式下的包处理路径对比:明显 PF_RING 路径更短;这也就是为何 PF_RING 速度更快,更不容易丢包的原因;

    另外,需要注意,Ethernet driver 和 Low-level packet reception 之间的 netif_rx()/netif_receive_skb() 分别对应了 No NAPI 和 NAPI ;而从 Ethernet driver 上进行包搬移操作的应该是之前提及的、作为 libpcap 组成部分之一的、网络分接头 tap ;

    PF_RING is a replacement for PF_PACKET that not only uses memory mapping instead of processing expensive buffer copies from kernel space to userspace, but it also uses ring buffers making to transportation in a more efficient way.

    NAPI v.s. TNAPI

    NAPI

    0818b9ca8b590ca3270a3433284dd417.png

    0818b9ca8b590ca3270a3433284dd417.png

    上面两图说明:传统的 NAPI + RSS 方案存在问题,即 NAPI 对多 RX queue 是顺序轮询的,并且在 driver 和用户应用的接口层存在 Merge & Split 等资源竞争问题;

    TNAPI

    0818b9ca8b590ca3270a3433284dd417.png

    上图说明:基于 TNAPI + PF_RING 解决了传统 NAPI 方案遇到的问题;

    0818b9ca8b590ca3270a3433284dd417.png

    0818b9ca8b590ca3270a3433284dd417.png

    libpcap (Packet Capture Library),即数据包捕获函数库,是 Unix/Linux 平台下的网络数据包捕获函数库。它是一个独立于系统的用户层包捕获的 API 接口,为底层网络监测提供了一个可移植的框架。

    libpcap 工作原理

    libpcap 主要由两部份组成:

    网络分接头(Network Tap)

    数据过滤器(Packet Filter)

    网络分接头从网络设备驱动程序(NIC driver)中收集数据拷贝,过滤器决定是否接收该数据包。Libpcap 利用 BSD Packet Filter (BPF) 算法对网卡接收到的链路层数据包进行过滤。

    BPF 算法的基本思想:在有 BPF 监听的网络中,网卡驱动将接收到的数据包复制一份交给 BPF 过滤器,过滤器根据用户定义的规则决定是否接收此数据包以及需要拷贝该数据包的哪些内容,然后将过滤后的数据交给与过滤器相关联的上层应用程序。

    libpcap 的包捕获机制:在数据链路层加一个旁路处理。当一个数据包到达网络接口时,libpcap 首先利用已经创建的类型为 PF_PACKET 的 Socket ,从位于链路层中的 NIC driver 中获得数据包的拷贝,再通过 Tap 函数将数据包发给 BPF 过滤器。BPF 过滤器根据用户已经定义好的过滤规则对数据包进行逐一匹配,匹配成功则放入内核缓冲区,进而传递给用户缓冲区,匹配失败则直接丢弃。如果没有设置过滤规则,所有数据包都将放入内核缓冲区,并传递给用户缓冲区。

    libpcap 的抓包框架

    pcap_lookupdev() 函数用于查找网络设备,返回可被 pcap_open_live() 函数调用的网络设备名指针。

    pcap_open_live() 函数用于打开网络设备,并且返回用于捕获网络数据包的数据包捕获描述字。对于此网络设备的操作都要基于此网络设备描述字。

    pcap_lookupnet() 函数获得指定网络设备的网络号和掩码。

    pcap_compile() 函数用于将用户制定的过滤策略编译到过滤程序中。

    pcap_setfilter() 函数用于设置过滤器。

    pcap_loop() 函数 pcap_dispatch() 函数用于捕获数据包,捕获后还可以进行处理,此外 pcap_next() 和 pcap_next_ex() 两个函数也可以用来捕获数据包。

    pcap_close() 函数用于关闭网络设备,释放资源。

    libpcap-mmap

    libpcap-mmap 是 libpcap 的一个改进版本,它们捕获数据包的结构相同。不同的地方主要有以下两点:

    libpcap 使用固定大小的存储缓冲器和保持缓冲器来完成数据包从内核缓冲区到用户缓冲区的传递,而 libpcap-mmap 设计了一个大小可以配置的循环缓冲器,允许用户程序和内核程序同时对该循环缓冲器的不同数据区域进行直接的读取。

    在 libpcap 中,当网卡接收到一个数据包之后,网卡驱动程序通过 DMA 方式调用系统函数 netif_rx() 将数据包从网卡(Rx queue)拷贝到核心态内存,应用程序想访问位于核心态内存的数据时,就必须将数据包从核心态内存中拷贝到用户态内存中(即两次拷贝问题),这种方式会占用了很多系统资源,降低数据包捕获的性能以及对数据包的处理能力。而 libpcap-mmap 采用 MMAP 技术,建立核心态内存和用户态内存的映射,将系统分配给网卡设备文件的核心态内存映射到一块用户态内存,这样应用程序就可以通过系统函数 recvfrom() 把数据包从网卡设备文件对应的核心态内存上直接传送到用户态内存;

    Libpcap is one of the more vastly open source library for packet capturing and uses by default PF_PACKET protocol in order to transfer the packets from the driver to the userspace.

    It is the de facto library that facilitates the packet transition from kernel onto the userspace is libpcap. It provides an API for the programmer to select the capturing interface (device) and gives the ability to compile Linux Packet Filters (LPF) into the kernel for selective packet capturing based on the 5 tuple (protocol, source/destination IP address and source/destination port).

    One important feature of PF_RING is the way it exchanges packets between user space and kernel: Monitoring applications usually access a library like libpcap to retrieve captured packets from the kernel. Libpcap is an abstraction from the operating systems’ capturing mechanisms and allows to run a capturing application on several operating systems without porting it to the special capturing architecture. Back in 2004, the then current libpcap version 0.9.8 used a copy operation to pass packets from the kernel to the user space on Linux. An unofficial patch against that libpcap version from Phil Woods existed, which replaced the copy operation by a shared memory area that was used to exchange packets between kernel and application. This modification will be called MMAP throughout the rest of the paper. PF RING uses a similar structure to exchange packets by default. Libpcap version 1.0.0, which was released in late 2008, is the first version that ships built-in shared memory (SHM) exchange support; hence the patch from Phil Woods is not longer necessary.

    展开全文
  • 的组词/解释:(形声。本义:生存;存在)同本义 [live;exist],存在也。――《尔雅》。注:“即在。”有天子。――《公羊传·隐公三年》虽乎人者。――《孟子·告子上》以其存心也。――《孟子·离娄下...

    存的组词/解释:

    (形声。本义:生存;存在)

    同本义 [live;exist]

    存,存在也。――《尔雅》。注:“存即在。”

    有天子存。――《公羊传·隐公三年》

    虽存乎人者。――《孟子·告子上》

    以其存心也。――《孟子·离娄下》

    召寇则无以存矣。――《吕氏春秋·应同》

    虽我之死,有子存焉。――《列子·汤问》

    而吾以捕蛇独存。――柳宗元《捕蛇者说》

    又如:存济(存活;活命);存殁(活着的和死去的)

    恤问,劳问 [comfort;console;soothe]

    存,恤问也。――《说文》

    无一介之使以存之。――《战国策·秦策》。注:“劳问也。”

    又如:存候(存问,问候);存问(

    存 cún

    ①思念:皆人思念~想之所致也。(王充《论衡·订鬼》)

    ②存在;生存:残~。

    ③储存;保存:封~。

    ④蓄积;聚集:小罐里~满了钱。

    ⑤储蓄:~折。

    ⑥寄存:~包处。

    ⑦保留:~疑(对疑难问题暂不做出决定)。

    ⑧结存;余留:库~。

    ⑨心里怀着(某种想法):不~任何希望。

    【存储】把数据送入到某个存贮设备中,使用时可以从那里取出这些数据。

    【存储器】能接收数据和保存数据,而且能根据命令提供这些数据的装置。按中央处理机能否直接读写分为内存储器和外存储器。

    【存储容量】一个功能完备的基本存储体所能汇集的位、字节或字的最大数量。位指一个二进制位(0或1),字节为8位,字为16位,如360k容量的软盘,其容量为360×1024个字节。

    【存储系统】包括存储控制器和存储部件。存储控制器用以实现取出由中央处理机所指定的操作码和地址,并据此向存储部件提出所有必要的选通信号和定时信号。

    【存而不论】把问题搁置起来暂不讨论。

    【存抚】安抚。

    【存款】存在银行中的钱。

    【存身】安身。

    【存亡继绝】使灭亡的国家复存,使断绝的后嗣再续。存、继:使复存,使继续。

    【存亡绝续】是生存还是灭亡,是继续发展,还是灭绝。形容形势万分危急,已到生死关头。绝:断绝。续:延续。

    【存现句】表示事物存在、出现或消失的句子。如、。

    【存疑】对疑难问题暂不做出处理或决定。

    【存在的辩证法】见【客观辩证法】。

    【存在主义】现代西方哲学中的一个非理性主义的主观唯心主义流派。本世纪20年代产生于德国,而后流行欧美其它国家,并且成为影响资本主义世界各阶层的哲学、文学、生活方式的思潮。存在主义把人的存在作为全部哲学的基础和出发点,认为人的存在是其它一切存在物的根据,没有人的存在,一切都会失去意义。主要代表人物为丹麦的克尔凯郭尔,德国的雅斯贝尔斯、海德格尔和法国的马塞尔、萨特等。又称实存主义或生存主义。

    【存折】银行、信用社等发给存款者作为存、取款凭证的小本子。

    展开全文
  • 首先添加guava依赖: com.google.guava&l ... 随机推荐 linux kernel 0.11 bootsect bootsect作用 ①将自己移动到0x90000 ②将setup从磁盘读到0x90200 ③将system从磁盘读到0x10000 寄存器 汇编代码中存在:...
  • -l 或 --one-file-system # 复制的文件或目录存放的文件系统,必须与tar指令执行时所的文件系统相同,否则不予复制。 -L 或 -tape-length= # 设置存放每体的容量,单位以1024 Bytes计算。 -m 或 --modification-...
  • CentOS 7基础教程之 RPM打包一、RPM打包的目的1、当目标机中不存在编译环境...2、当需要在目标机中安装多个软件或者增加多个文件时,可以将整体打成RPM,方便使用。二、RPM打包命令$cd ~ #进入home目录$ sudo yum...
  • apt是Debian系列的Linux操作系统的管理工具,最近的项目中使用了stretch Linux,它也是使用apt来进行管理的。apt工作原理apt采用集中式的软件仓库机制,将各式各样的软件分门别类的放在软件仓库之中,从而进行...
  • 使用频繁,多使用。 关卡资源:指定场景下使用的资源。特定关卡下使用的资源。使用频率低,甚至需要游戏等级达到一定等级之后才能使用。 根据Addressable系统的特性,我们大致可以将游戏的资源文件分两类: ...
  • UE4 打包之后Mesh没有材质问题

    千次阅读 2021-08-04 14:34:58
    确认你的材质所的路径是不是有中文3>确认你的资源是什么类型,再去对应材质的Usage是否匹配 前言 UE4在打包之后有时候会遇到Material丢失的问题,编辑器下运行是正常的,如果你也遇到了,那么可以在这里停留...
  • 一、Sklearn工具介绍scikit-learn,又写作sklearn,是一个开源的基于python语言的机器学习工具。它通过NumPy, SciPy和Matplotlib等python数值计算的库实现高效的算法应用,并且涵盖了几乎所有主流机器学习算法。...
  • 背包问题——01背包

    千次阅读 2021-02-07 12:13:50
    而其中的dp[ 8 - 3 ]就是图中第一行的紫色块,它的值为3,3+4=7, 7从此来,我们继续往前遍历,保证 dp 数组得到及时更新。 在经过多次 i 循环之后,在dp[ v ]即dp[ 8 ]得到结果10。 以上即为一个简单01背包问题...
  • wireshark抓分析【设置办法】

    千次阅读 2020-12-19 05:50:43
    很多小伙伴都遇到过wireshark抓分析的困惑吧,一些朋友看过网上零散的wireshark抓分析的处理方法,并没有完完全全明白wireshark抓分析是如何解决的,今天小编准备了简单的解决办法,只需要按照1:电脑安装...
  • 武汉:加快区块链证应用推广,加强区块链证体系建设 《意见》共分为五个部分,包含:加快培育区块链市场主体、着力提升区块链创新能力、扎实建设区块链服务平台、全面推动区块链应用示范、持续优化区块链发展...
  • 在Android的世界中,有一群落叫“管理”,要研究Android的管理机制,同样可以从以下几个角度来思考: 被管理的对象是什么? 管理者的职能是什么? 管理机制是如何运转的? 所谓Android,其实就是一种文件...
  • 在各种计算机中,运算器的结构虽然有区别,但必须包含如下几个基本部分,即加法器、通用寄存器、输入数据选择电路和输出数据控制...这是因为要将从主存储器中取出的参加运算的数据,立即送到加法器中进行处理还...
  • 软件的过滤器可筛选数据包,有利于网络数据包的分析。然而,实际场景,我们往往会抓取所有数据包,然后进行过滤分析。那么,如何从原始数据包中保存过滤之后的数据包呢?本期文章向各位小伙伴解锁。 仅保存原始...
  • Git的版本库里了很多东西,其中最重要的就是称为 stage(或者叫index)的 暂区,还有Git为我们自动创建的第一个 分支master,以及指向master的一个 指针叫HEAD。 教程(1)中提到把文件往Git版本库里添加的时候...
  • 多重背包问题大全(超详细)

    千次阅读 2021-03-23 17:22:50
    我们仔细看红框中的几组数据,找出他们的相似之! 观察第一组红框可以发现,f[9]的更新,需要f[7],f[5],f[3] 观察第二组红框可以发现,f[7]的更新,需要f[5],f[3],f[1] 同理f[5]需要f[1],f[3],更新f[3]需要f[1]。 重点...
  • 操作系统为磁盘外上所有空闲区建立一张空闲表,每个表项对应一个空闲区,空闲表中包含序号、空闲区的第一块号、空闲块的块数等信息。它适用于连续文件结构。 适合连续文件 创建文件步骤 分配磁盘空间 创建目录...
  • 1.情景展示 如何将表中的包含特殊字符的脏数据查出来? 2.instr()函数 语法: instr(string, ...删除脏数据 见文末推荐 写在最后 哪位大佬如若发现文章存在纰漏之或需要补充更多内容,欢迎留言!!! 相关推荐:
  • 1 git版本库文件内容 ...├── HEAD #指明当前所的分支 ├── config ├── description ├── hooks ├── objects #存放所有的git对象 │ ├── info │ └── pack └── refs #Git引用存储目录
  • python的模块化编程、import机制、管理、导入、模块导入、pip管理工具、交叉导入、python循环导入介绍
  • [java篇]和继承,组合

    多人点赞 2021-09-19 10:02:06
    初识java的小伙伴看到,肯定会想,?是挎在肩上的名贵包包吗?哈哈,博主开玩笑了,当然了在java中的。 引言: 假如说在公司的日常生产开发中,你建立了一个TestDemo.java文件,而你的同事也建立了一个...
  • huobi 提币到 metamask钱包看不到的问题

    千次阅读 热门讨论 2021-12-07 16:00:15
    解决方法 1、进入etherscan 在1输入自己的钱包地址,搜索就会显示自己的账号信息,不过这里来显示的是eth主网的信息,点击2可以跳到已经配置的Heco主网信息界面,如下: 2、获得Token Contract Address 点击1复制...
  • fildder抓ios

    2021-05-12 18:15:18
    九、信任证书设置(很必要): 点击设置 - 通用 - 关于本机 - (拉到最底部)证书信任设置 - 把红框的开关打开 - 点击继续 至此,ios配置完毕,可以抓取http和https的了; 题外篇: 如果安卓中不能抓取https的...
  • 注意下边有几行代码是依赖(最好现在提前完整复制一下,发给一个地方一下) 打开Eclipse 打开你创建的Maven工程,找到WebContent文件夹,里面有个pom.xml文件,点开 然后找到这两行 <depend..
  • (销售类型设置0=整售、1为散 售,当为0时计算总量要乘以商品信息中的进货规格)对于可能收到退货、放置损耗的情 况,需要增加一条退货、放置损耗信息,包括上述字段,信息都需要提交至仓库管理员审 批后才能更改...
  • 前言:Git作为一个版本管理工具,最核心组成思想是它的三个分区:工作区、暂区和工作区。 1. 工作区   Git的工作区也就是我们平时编辑代码的目录文件夹。...  所以暂区的作用是将要多个文件的多
  • 例如,如果在某一个文件中做了两修改,但只想要暂其中的一个而不是另一个,Git 会帮你轻松地完成。从交互式提示符中,输入 5 或 p(补丁)。Git 会询问你想要部分暂哪些文件;然后,对已选择文件的每一个部分...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 163,149
精华内容 65,259
关键字:

存包处