读书笔记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状态的进程拒绝接受信号,所以无法被杀死