标签: linux-kernel

内核空间和用户空间有什么区别?

内核空间和用户空间有什么区别?内核空间,内核线程,内核进程和内核堆栈是否意味着相同的事情?另外,为什么我们需要这种区别?

operating-system kernel terminology linux-kernel

134
推荐指数
7
解决办法
11万
查看次数

当我们定义宏时,do while(0)有什么用?

可能重复:
C/C++宏中的Do-while和if-else语句

我正在阅读linux内核,我发现了很多像这样的宏:

#define INIT_LIST_HEAD(ptr) do { \
    (ptr)->next = (ptr); (ptr)->prev = (ptr); \
} while (0)
Run Code Online (Sandbox Code Playgroud)

为什么他们使用这个而不是简单地在{}中定义它?

c macros linux-kernel

125
推荐指数
2
解决办法
5万
查看次数

IOCTL Linux设备驱动程序

任何人都可以解释我,

  1. 什么是IOCTL
  2. 它是干什么用的?
  3. 我怎么用呢?
  4. 为什么我不能定义执行相同工作的新功能IOCTL

linux ioctl driver linux-device-driver linux-kernel

122
推荐指数
2
解决办法
10万
查看次数

vmalloc和kmalloc有什么区别?

我已经google了一下,发现大多数人都主张使用kmalloc,因为你可以保证获得连续的物理内存块.但是,kmalloc如果找不到您想要的连续物理块,它似乎也会失败.
拥有一块连续的内存块有什么好处?具体来说,为什么我需要在系统调用中拥有连续的物理内存块?我有什么理由不能使用吗? 最后,如果我在处理系统调用期间分配内存,我应该指定吗?系统调用是在原​​子上下文中执行的吗?vmalloc
GFP_ATOMIC

GFP_ATOMIC
分配是高优先级的,不会睡眠.这是在中断处理程序,下半部分和其他无法睡眠的情况下使用的标志.

GFP_KERNEL 这是正常分配,可能会阻止.这是在安全睡眠时在进程上下文代码中使用的标志.

c linux-kernel vmalloc kmalloc

107
推荐指数
5
解决办法
10万
查看次数

如果指向的文件被移动,那么Linux上的打开文件句柄会发生什么

如果指向文件同时获得Linux上的打开文件句柄会发生什么:

  • 搬走了 - >文件句柄是否保持有效?
  • 已删除 - >这是否会导致EBADF,表明文件句柄无效?
  • 替换为新文件 - >文件句柄是否指向此新文件?
  • 替换为新文件的硬链接 - >我的文件是否处理"关注"此链接?
  • 替换为新文件的软链接 - >我的文件句柄现在是否触及此软链接文件?

为什么我问这样的问题:我使用的是热插拔硬件(如USB设备等).可能发生的是,设备(及其/ dev /文件)被用户或另一个Gremlin重新附加.

处理这个问题的最佳做法是什么?

linux file-io file linux-kernel systems-programming

96
推荐指数
3
解决办法
4万
查看次数

在新的Linux内核中,上下文切换速度要慢得多

我们希望将服务器上的操作系统从Ubuntu 10.04 LTS升级到Ubuntu 12.04 LTS.不幸的是,似乎运行已经变为可运行的线程的延迟从2.6内核到3.2内核显着增加.事实上,我们得到的延迟数字很难相信.

让我对测试更加具体.我们有一个运行两个线程的程序.第一个线程获取当前时间(使用RDTSC以滴答为单位),然后每秒发送一次条件变量.第二个线程等待条件变量并在发出信号时唤醒.然后它获取当前时间(使用RDTSC以滴答为单位).计算第二个线程中的时间与第一个线程中的时间之间的差异,并在控制台上显示.在此之后,第二个线程再次等待条件变量.大约第二次通过后,第一个线程将再次发出信号.

因此,简而言之,我们得到一个线程,通过条件可变延迟测量一次一次地进行线程通信.

在内核2.6.32中,这种延迟大约为2.8-3.5 us,这是合理的.在内核3.2.0中,这种延迟已经增加到大约40-100 us.我已经排除了两台主机之间硬件的任何差异.它们运行在相同的硬件上(双插槽X5687 {Westmere-EP}处理器,运行频率为3.6 GHz,具有超线程,speedtep和所有C状态关闭).测试应用程序更改线程的亲和力以在同一套接字的独立物理核心上运行它们(即,第一个线程在Core 0上运行,第二个线程在Core 1上运行),因此没有线程的弹跳套接字之间的核心或弹跳/通信.

两台主机之间的唯一区别是,一台运行Ubuntu 10.04 LTS,内核为2.6.32-28(快速上下文切换盒),另一台运行最新的Ubuntu 12.04 LTS,内核为3.2.0-23(缓慢的上下文)开关盒).所有BIOS设置和硬件都相同.

内核是否有任何变化可以解释线程被安排运行多长时间的这种荒谬的减速?

更新: 如果您想在主机和Linux版本上运行测试,我已将代码发布到pastebin供您阅读.编译:

g++ -O3 -o test_latency test_latency.cpp -lpthread
Run Code Online (Sandbox Code Playgroud)

运行(假设您至少有一个双核盒子):

./test_latency 0 1 # Thread 1 on Core 0 and Thread 2 on Core 1
Run Code Online (Sandbox Code Playgroud)

更新2:经过大量内核参数搜索,内核更改和个人研究的帖子后,我已经找出了问题所在并已发布解决方案作为这个问题的答案.

linux multithreading kernel linux-kernel ubuntu-12.04

96
推荐指数
2
解决办法
5万
查看次数

如何避免来自mongodb的transparent_hugepage/defrag警告?

我收到mongodb关于THP的以下警告

2015-03-06T21:01:15.526-0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2015-03-06T21:01:15.526-0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
Run Code Online (Sandbox Code Playgroud)

但我确实设法手动关闭了THP

frederick@UbuntuVirtual:~$ cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
frederick@UbuntuVirtual:~$ cat /sys/kernel/mm/transparent_hugepage/defrag
always madvise [never]
Run Code Online (Sandbox Code Playgroud)

我加入的伎俩transparent_hugepage=never,以GRUB_CMDLINE_LINUX_DEFAULT/etc/default/grub和添加

if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
   echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
Run Code Online (Sandbox Code Playgroud)

/etc/rc.local

我怎么能避免警告?

linux linux-kernel mongodb

95
推荐指数
6
解决办法
6万
查看次数

内核堆栈和用户空间堆栈

内核堆栈和用户堆栈之间有什么区别?为什么要使用内核堆栈?如果在ISR中声明了局部变量,那么它将被存储在哪里?每个进程都有自己的内核堆栈吗?然后这两个堆栈之间的进程如何协调?

linux linux-device-driver linux-kernel

94
推荐指数
3
解决办法
5万
查看次数

如何通过将其内存存储到磁盘并在以后恢复它来"休眠"Linux中的进程?

是否有可能在Linux中"休眠"一个进程?就像笔记本电脑中的"休眠"一样,我会将进程使用的所有内存写入磁盘,释放内存.然后,我可以"恢复过程",即从内存中读取所有数据并将其放回RAM中,我可以继续我的过程吗?

linux linux-kernel

93
推荐指数
8
解决办法
2万
查看次数

如果线程共享相同的PID,它们如何识别?

我有一个与Linux中的线程实现相关的查询.

Linux没有明确的线程支持.在用户空间中,我们可能使用线程库(如NPTL)来创建线程.现在,如果我们使用NPTL,它支持1:1映射.

内核将使用该clone()函数来实现线程.

假设我创建了4个线程.那意味着:

  • 将会有4个task_struct.
  • 在内部task_struct,将根据克隆的参数提供共享资源(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND).

现在我有以下查询:

  1. 4个线程是否具有相同的PID?如果有人可以详细说明,如何共享PID.
  2. 如何识别不同的线程; 是否有一些TID(线程ID)概念?

multithreading pid linux-kernel

91
推荐指数
2
解决办法
5万
查看次数