小编jas*_*foo的帖子

在Linux内核中,为什么下半部分无法获取互斥锁?

我正在阅读Linux内核开发,并对互斥锁和信号量之间的差异感到困惑.

作者说:

中断处理程序或下半部分无法获取互斥锁

我知道互斥锁可能会导致睡眠,并且中断处理程序不会在任何特定的进程上下文中运行,因此不允许使用互斥锁或信号量.但是下半部分可以用工作队列实现,它可以睡觉.

那么,为什么下半部分无法获得互斥量呢?简单和效率是关注在这里还是其他什么?

linux synchronization mutex linux-kernel

7
推荐指数
1
解决办法
2811
查看次数

我们如何优化ArrayList上的插入?

事实上,这是几天前提出的一个面试问题.

面试官要我表达之间的区别ArrayListLinkedList,并要求以优化插入操作ArrayList,换句话说,重新实现add(int index, E element),当然还有复杂get(int index)的操作都可以牺牲.

我的答案是将数组分成k个子数组并更新一个计数数组,表示相应子数组中已有的元素数.并且每个子数组的内存都以预期的初始大小动态分配.当我需要将数据插入时ArrayList,我可以先找到一个子数组,然后在一个小数组中进行操作.如果插入不是太频繁或索引是均匀分布的,插入的时间复杂度可以是O(log(k) + n/k + k)平均的,这log(k)意味着我们应该首先在计数数组的和数组上使用二进制搜索来定位子数组,n/k用于数据移动甚至是内存重新分配,k代表sum数组的更新.

我相信有更好的解决方案.我确实需要一些建议,谢谢!

java algorithm

7
推荐指数
1
解决办法
440
查看次数

如何防止内核将数据包传递到网络层?

网卡接收的帧将由驱动程序处理,然后由Linux内核传递给协议栈的上层.

有没有一种简单的方法可以防止内核将数据包传递到网络层?这样我就可以从数据链路层接收帧并自己处理所有数据包(也许应用程序层程序会被重写)?

我认为重新编译内核是必要的,如果这是通过修改softirq中的代码或netif_rx或每个cpu的列表队列中的函数来完成的?

事实上,有些同学和我正在尝试在用户空间中实现TCP/IP协议栈的简化版本以进行练习,我们刚刚开始.我正在阅读一些书籍,如UNP,APUE2,TC​​P/IP插图v1,v2,Linux网络架构,linux源代码等.我还有其他一些问题,我是否需要发布另一个问题?

sockets linux

6
推荐指数
1
解决办法
873
查看次数

如果一台计算机更改了我们要发送数据的IP地址,TCP/IP应该怎么办?

当我们发送数据的计算机突然改变其IP地址时,TCP/IP协议栈的标准行为是什么?发生这种情况时,我们系统中的ARP表已过期,但此IP的条目没有超时?

有没有办法发现新的IP-mac映射,或者我们只是丢弃排队的数据并返回错误?

sockets linux tcp-ip

1
推荐指数
1
解决办法
1513
查看次数

当我们使用tcpdump捕获我们发出的数据包时,如何计算TCP的校验和

我试图生成一系列数据包来模拟TCP 3路握手程序,我的第一步是捕获真正的连接数据包,并尝试从同一台机器重新发送相同的数据包,但它不起作用首先.

最后我发现用tcpdump捕获的数据包并不是我的计算机发出的数据包,TCP的校验和字段发生了变化,这让我想到即使TCP校验和不正确也可以建立tcp连接.

所以我的问题是如何计算校验和字段?它是由tcpdump还是硬件修改的?为什么会改变?这是tcpdump的错误吗?或者是因为省略了计算.

以下是我从主机和虚拟机器上捕获的屏幕截图,你可以看到在不同的机器上捕获的相同数据包除了TCP校验和之外都是相同的.

并且小窗口是我的虚拟机,我使用命令"ssh 10.82.25.138"从主机生成这些数据包

在此输入图像描述

linux nic checksum tcp tcpdump

1
推荐指数
1
解决办法
9670
查看次数