Robert Love 在 quora 上关于 Linux Kernel 的问答摘录之二

原创 2016年06月01日 23:55:35

入门Linux Kernel就是看的Robert Love所著的《linux kernel development》和 《linux system programming》,感觉真的是深入浅出娓娓道来。这几天在Quora上看到大神对 Linux Kernel 的一些回答,也是深有启发,特此将一些有意思的问题翻译过来。


(6)当Linux的一个进程占据了100%的CPU时,Linux调度器会做什么?这是不是意味着没有其他进程可以执行了?

在大多数系统上,CPU的使用率都只是一个估计。在Linux上,CPU的使用率 = 1 - idle进程的CPU占有率。如果idle进程在过去1000毫秒里运行了300毫秒,那么系统的CPU使用率就是70%。如果一个进程对CPU的使用率是100%,那么意味着这个进程在过去的N毫秒里运行了N毫秒,而idle进程没有运行过。

那么Linux调度器做了些什么呢?进程的CPU占有率100%已经达到了系统定义的上限。这意味着在Linux调度器选择这个进程运行且这个进程运行完后,Linux调度器又选择这个进程运行,如此重复下去。

那是不是意味着其他进程都不能执行了呢?。不管目前CPU占有率100%的进程在干什么,一个更高优先级的进程总是可以运行的。而即便是比这个进程优先级低的进程最终也会执行(除非当前进程为实时进程),因为Linux是所有进程共享CPU的。

我认为一个CPU占有率为100%的进程意味着系统当前的运行队列里只有这一个进程或许吧,除非该进程是实时进程。

同时我认为除非这个进程休眠或者退出,否则idle进程永远不会被调度。如果系统有一个任务正在执行,为什么要运行一个什么都不干的idle进程呢?


(7)“内核内存是不可换页(page-able)的”是什么意思?

“内核内存不可换页”是指内核拥有的内存是物理RAM,不可被换页到硬盘(swap分区)上。至于为什么内核内存不可换页,没有什么根本原因。大多数内核,包括Linux内核,都不会对内核内存进行换页操作,因为这样做的好处不足以抵消操作带来的复杂性。

内存仍然是按页划分的,每一页内存用结构体 struct page表示、


(8)干净内存和脏内存有什么区别?

当硬盘上的文件被加载到内存当中后,如果这部分内存的内容被更改了却还没来得及写回硬盘,导致内存中的数据和硬盘上的数据不同步,我们就说这样的内存是脏的。Linux有一种回写(writeback)机制,用来更新硬盘上的数据,从而保证二者同步。

如果硬盘上的数据和加载到内存中的数据是一致的,我们就说这块内存是干净的。


(9)Linux进程间可以共享内存吗?

现代系统共享内存一般都是通过线程来实现的,不过SystemV和POSIX都定义了共享内存的API,因此即便是不相关的进程也可以共享一部分内存。POSIX的API是:

int shm_open (constchar* name,int oflag,mode_t mode);

一次成功的shm_open()调用会返回一个内存区域的文件描述符。这块内存的名字是name,访问模式是oflag,权限是mode(如果是创建一块新的共享内存)。

oflag是和open()系统调用里差不多的标志位,比如有O_RDONLY(内存段只可写)或者O_RDWR(内存段可写可读)。

共享内存的一般形式是首先有一个进程通过shm_open()来创建一块名字为name的共享内存,然后通过ftruncate()来改变这块内存的大小,最后通过mmap()把它映射到自己的内存地址空间。

其他进程则可以通过shm_open()来打开这个名字叫name的共享内存,然后通过mmap()来得到这片共享内存的指针。


(10)Linux内核中高端内存和普通内存有什么区别?

高端内存是指不会永久性映射到内存地址空间的内存。低端内存刚好相反:内存一直会映射到内核的地址空间。

在一个理想的世界中,所有内存都是永久可映射的。但不幸的是,这种情况很难实现。高端内存最常用的例子就是32位intel处理器上使用的PAE(页地址扩展)技术。PAE允许32位的x86架构去寻超过32位的内存地址。在大多数情况下,PAE通过36位的物理地址空间来支持最高64GB的RAM。由于36>32,不是所有的内存都会被映射,这其中的差值就是高端内存。

“高端内存不能被内核映射”是不对的。高端内存可以被内核映射,但是这样做会有一些代价和限制。由于这些代价和限制,再加上Linux内核倾向于使用物理上连续的内存,内核只会在一些特定的场合使用高端内存。

由于用户空间的虚拟地址必须被显示映射,高端内存非常适用于用户空间。因此绝大多数的高端内存都是被用户程序使用的。

(如果你想在Linux内核当中找到高端内存的用法,用grep来查找__GFP_HIGHMEM和GFP_HIGHUSER,这两个标志表示要求分配高端内存。如果没有这些标志,所有的内核内存分配都只会返回低端内存。


经典模拟问题--摘花生 POJ-1928

经典模拟问题--摘花生 POJ-1928
  • linsheng9731
  • linsheng9731
  • 2014年04月18日 19:30
  • 1618

深度学习之《社交网络问答系统-问题重复检测任务》实现

quora duplicate questions:Semantic Question Matching with Deep Learning  本文参考了quora duplicate que...
  • hero_fantao
  • hero_fantao
  • 2017年04月05日 19:50
  • 1147

Uboot中driver驱动和linux内核驱动的区别

说明: 1.和下面论相关的帖子: http://www.crifan.com/records_in_the_uboot_201106_mmc_drive_the_process_of_po...
  • caoyicheng1
  • caoyicheng1
  • 2014年04月10日 17:26
  • 2829

Robert Love 在 quora 上关于 Linux Kernel 的问答摘录之三

(11)可以在一个程序中同时使用malloc()和brk()吗?这样做会有什么后果?(12)当一个不可抢占的内核运行在内核态时,如何处理定时器中断?内核是会忽略这个中断还是在定时器中断完成后重新进入原...
  • u010231104
  • u010231104
  • 2016年06月02日 20:36
  • 209

Robert Love 在 quora 上关于 Linux Kernel 的问答摘录之一

(1)什么是“SMP 安全”以及为什么linux kernel是SMP安全的?(2)如何查看系统在系统调用(system call)上所用的时间比例?(3)copy_to_user如何工作?(4)Li...
  • u010231104
  • u010231104
  • 2016年05月31日 20:39
  • 445

Robert Love 在 quora 上关于 Linux Kernel 的问答摘录之四

(16)Linux中的initramfs程序是什么?(17)什么是无滴答(tickless)内核?(18)为什么在已经有了内核缓存机制的情况下还需要标准I/O库提供的缓存机制?(19)当访问一个内存地...
  • u010231104
  • u010231104
  • 2016年06月12日 11:15
  • 154

linux kernel development robert love

  • 2012年03月05日 15:29
  • 4.96MB
  • 下载

Linux kernel 分析之二:main函数执行启动过程

内核是从哪里开始执行的呢?几乎任何一本Linux内核源代码分析的书都会给出详细的答案。不过,我试图从一个不同的角度(一个初学者的角度)来叙述,而不是一上来就给出答案。从熟悉的事物入手,慢慢接近陌生的事...
  • vanquishedzxl
  • vanquishedzxl
  • 2015年07月21日 21:30
  • 1902

Linux系统编程 中文版 Robert Love

  • 2016年04月13日 08:35
  • 28.78MB
  • 下载

Linux Kernel media框架(二)

Entities,pads and links 实体,垫和链接 ------------------------   -Entities - 实体 Entitiesare repres...
  • htjacky
  • htjacky
  • 2017年02月03日 15:16
  • 614
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Robert Love 在 quora 上关于 Linux Kernel 的问答摘录之二
举报原因:
原因补充:

(最多只允许输入30个字)