读书笔记2013-2 Linux内核设计与实现A

《Linux内核设计与实现》

简介

这本书不是想Linux源码剖析那样一行行分析Linux源代码的书,而是从Linux历史,Linux哲学,Linux设计原理和原则,计算机硬件相关知识,编译安装内核实战等多方面多角度讲述和Linux相关的方方面面。从中学到的更多的不单内核的源代码,而是Linux的哲学。建议所有从事Linux相关工作的猿都要读一下,读完之后,很多东西都变得容易理解,知其然,知其所以然。
如果没有读过《深入理解计算机》类似的图书,建议和《深入理解计算机》一起阅读。
有条件的话建议阅读英文版。

笔记和摘要A

From the beginning to Chapter "The Linux Scheduling Implementation"

1. 有名的Unix哲学--do one thing and do it well.

因为Unix系统创建进程所需时间很短,并且Unix提供简单且健壮的IPC(进程间通信手段),所以设计Unix时可以设计一个个实现单一功能的小程序,并且很方便的将他们组合起来实现很强大的功能,大大提高了程序的通用性和复用性。

2. MMU--Memory Management Unit

MMU是一个专门用于管理内存的硬件,负责完成虚拟内存和物理内存间的转换。通常,它被设计为CPU的一部分,但它也可以以独立硬件的形式出现。
除了管理虚拟内存外,MMU还负责内存保护,为每个进程分配单独的进程空间,CPU高速缓存控制,Bus总线仲裁以及存储体转换(尤其在8位系统上)等工作。

3.如何加快编译Linux内核的速度: make-j32

通过加参数-j来使用多线程来并行编译内核。一般为一个cpu配两个作业任务,所以如果你的服务器的cpu是16核的,则可以指定-j32

4.内核态和用户态的区别

  • 内核态的代码不能访问标准C的库函数或者外部的头文件
  • 内核态的代码依照GNU C标准来编写
  • 内核态的代码没有像用户态那样的防止内存泄露的机制
  • 不能简单的执行浮点型的计算
  • 每个内核态的进程只有一个很小的固定大小的栈(在x86的机器上,一般是4k或8k)
  • 由于内核中有异步中断,是抢占式分配cpu,支持SMP,异步和并行操作主要在内核态完成(没太看懂这段:Because the kernel has asynchronous interrupts,is preemptive,and supports SMP,synchronization and concurrency are major concerns within the kernel.)
  • 对于内核态程序来说,可移植性很重要。

5.进程与线程

进程就是执行中的程序。但不仅仅指程序的源代码,还包括打开的文件、接收到的信号、处理器状态、内存地址空间、执行中的线程、全局变量等。
线程是处理器调度的最小单位。Linux使用一种独特的方式来实现线程:线程与进程没有明显区别,线程就是一种特殊的进程--它们能够与其他进程共享如地址空间等资源。
对进程来说,有两个虚拟化:虚拟内存和虚拟处理器。通过进程调度机制,为每个进程分配独立的虚拟内存和虚拟存储器,所以从进程的角度来看,它们都任务自己独占整个机器。

6.进程描述符

系统用process identification (PID)来标识每个进程。PID其实就是一int型的数字,为了向后兼容,这个数字最大是2的32,768(15次方),这个值记录在<linux/threads.h>里,编译时可以修改。这个值的大小限制着能够同时运行的进程的个数。尽管这个值对于普通desktop来说,足够用了,但对于大的服务器来说,可能不够用。这种情况时管理员可以通过/proc/sys/kernel/pid_max。
在内核中,通常是通过一个指向存储任务信息的结构体task_struct的指针来获取任务信息。
由于x86系统的计算机只有很少的寄存器,所以与大多数体系结构的计算机直接把一些信息存到不同的寄存器里不同,x86系统的计算机将这些信息存到栈里面。

7.进程的状态

进程的状态只可能是下面5种中的一种

  • TASK_RUNNING
  • TASK_INTERRUPTIBLE
  • TASK_UNINTERRUPTIBLE
  • TASK_TRACED
  • TASK_STOPPED

处在TASK_UNINTERRUPTIBLE状态的进程拒绝接受信号,所以无法被杀死

读书笔记2013-2 Linux内核设计与实现A的更多相关文章

  1. 【读书笔记】《Linux内核设计与实现》进程管理与进程调度

    大学跟老师做嵌入式项目,写过I2C的设备驱动,但对Linux内核的了解也仅限于此.Android系统许多导致root的漏洞都是内核中的,研究起来很有趣,但看相关的分析文章总感觉隔着一层窗户纸,不能完全 ...

  2. 《Linux内核设计与实现》读书笔记 第一章 Linux内核简介

    一.相关历史 1. Unix内核的特点 简洁:仅提供系统调用并有一个非常明确的设计目的 抽象:几乎所有东西都被当做文件 可移植性:使用C语言编写,使得其在各种硬件体系架构面前都具备令人惊异的移植能力 ...

  3. 【读书笔记::深入理解linux内核】内存寻址【转】

    转自:http://www.cnblogs.com/likeyiyy/p/3837272.html 我对linux高端内存的错误理解都是从这篇文章得来的,这篇文章里讲的 物理地址 = 逻辑地址 – 0 ...

  4. 【读书笔记::深入理解linux内核】内存寻址

    我对linux高端内存的错误理解都是从这篇文章得来的,这篇文章里讲的 物理地址 = 逻辑地址 – 0xC0000000:这是内核地址空间的地址转换关系. 这句话瞬间让我惊呆了,根据我的CPU的知识,开 ...

  5. LINUX内核设计与实现第三周读书笔记

    LINUX内核设计与实现第三周读书笔记 第一章 LINUX内核简介 1.1 Unix的历史 1969年的夏天,贝尔实验室的程序员们在一台PDR-7型机上实现了Unix这个全新的操作系统. 1973年, ...

  6. 《Linux内核设计与实现》读书笔记(十七)- 设备与模块

    本章主要讨论与linux的设备驱动和设备管理的相关的4个内核成分,设备类型,模块,内核对象,sysfs. 主要内容: 设备类型 内核模块 内核对象 sysfs 总结 1. 设备类型 linux中主要由 ...

  7. 《Linux内核设计与实现》读书笔记(十二)- 内存管理【转】

    转自:http://www.cnblogs.com/wang_yb/archive/2013/05/23/3095907.html 内核的内存使用不像用户空间那样随意,内核的内存出现错误时也只有靠自己 ...

  8. 《Linux内核设计与实现》读书笔记(十一)- 定时器和时间管理【转】

    转自:http://www.cnblogs.com/wang_yb/archive/2013/05/10/3070373.html 系统中有很多与时间相关的程序(比如定期执行的任务,某一时间执行的任务 ...

  9. 《Linux内核设计与实现》读书笔记 - 目录 (完结)

    读完这本书回过头才发现, 第一篇笔记居然是 2012年8月发的, 将近一年半的时间才看完这本书(汗!!!). 为了方便以后查看, 做个<Linux内核设计与实现>读书笔记 的目录: < ...

  10. 《Linux内核设计与实现》读书笔记(十九)- 可移植性

    linux内核的移植性非常好, 目前的内核也支持非常多的体系结构(有20多个). 但是刚开始时, linux也只支持 intel i386 架构, 从 v1.2版开始支持 Digital Alpha, ...

随机推荐

  1. AngularJS 2.0 学习

    前提: 下载和安装node.js 和 npm. https://nodejs.org/en/download/ npm安装 需要自己google 安装好之后,可以在cmd窗口中查看安装的版本 node ...

  2. 关于从request对象中获取路径的问题

    从request对象中获取路径的问题:例如: 项目名为:tmall_web     请求的servlet名为:loginServlet 示例代码如下: @Override protected void ...

  3. 基于selenium+java的12306自动抢票

    import java.util.concurrent.TimeUnit; import org.openqa.selenium.By;import org.openqa.selenium.Keys; ...

  4. qemu编译

    符号说明 $ 表示在用户模式下执行命令 # 表示在root模式下执行命令 ### 表示注释用于解释接下来一条命令的作用 更新环境源 设置阿里源 $ sudo mv /etc/yum.repos.d/C ...

  5. 检查浏览器是否有此插件如flash

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. codevs 1086 栈(Catalan数)

    题目描述 Description 栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表. 栈有两种最重要的操作,即pop(从栈顶弹出一个元素)和push(将一个元素进栈). ...

  7. PJzhang:子域名发掘工具Sublist3r

    猫宁!!! 参考链接:https://www.freebuf.com/sectool/90584.html 作者上一次更新是2018年10月16日了,sublist3r中融合有另外一个子域名爆破工具S ...

  8. 笔记-迎难而上之Java基础进阶3

    统计字符串中每一个不同的字符 import java.util.*; //统计字符串每一个字符出现的字数 public class StringDemo{ public static void mai ...

  9. 爬虫(ProxyHandler)——代理

    工具:python3 步骤: 1)使用ProxyHandler()构建httpproxy_handler对象 2)使用build_opener(httpproxy_handler)构建opener 3 ...

  10. jquery自定义组件开发

    jquery的组件已经有很多,但是有可能找不到符合我们需求的组件,所以我们可以动手自己封装一个jquery组件. 第一步要知道封装jquery组件的基本语法 (function ($) { $.fn. ...