代码改变世界

《深入理解Linux内核》学习笔记-第一章

2011-08-26 01:11  Aga.J  阅读(704)  评论(0编辑  收藏  举报

第一章 绪论

(1) 类Unix操作系统采用“进程/内核”的模式,每个进程都自以为它是系统中唯一的进程,可独占操作系统所提供的服务,只要进程发出系统调用,硬件就会把特权模式由用户态转变为内核态,然后进程开始执行一个内核过程,这个过程的执行被局限于一个非常小的内核范围内,一旦请求被满足,内核过程迫使返回用户态,进程执行下一条指令

(2) Unix文件是以一列字节组成的信息载体,内核不解释文件内容

(3) unix的每个进程都有一个当前的工作目录,它属于进程执行上下文,标志出进程所用的当前目录

(4) Unix文件类型包括:普通文件,目录,符号链接,块设备文件,字符设备文件,管道,命名管道,套接字

(5) 除了“设备和特殊文件”外,每个文件都由一列字节组成,不包括任何控制信息,如文件长度EOF等,这些信息被存放在一个叫做inode的数据结构中,每个文件都有这样一个结构,文件系统就是靠他来识别一个文件,inode记录了文件类型,hard link个数,文件长度,设备标识符,inode号,UID,权限等等

(6) open(path,flag,mode)该系统调用会创建一个“打开文件对象”,并返回一个文件描述符。其中“打开文件对象”包括:执行内核内存区的缓冲区指针(缓冲要拷贝过来的文件的数据),offset域,指向进程允许调用的一些内核函数的指针(同一个打开的文件对象可以由多个文件描述符来标识)

(7) 注意 设备文件和命名管道文件,fifo只能顺序访问

(8) 用户态和内核态的切换条件
1: 用户态进程发出“系统调用”

2:用户态进程执行,发送定时中断,调度程序在内核态被激活

3:用户态进程执行,硬件发出中断请求

(9) linux内核可重入即 几个进程可以同时在内核态下执行。

提供可重入的一种方式是编写函数来似的这些函数只能访问局部变量,不能改变全局数据结构,这种函数称为“可重入函数”,内核也可以包含“非可重入函数”,主要是利用加锁机制保证一次只有一个进程执行一个非重入函数。

(10) 如何同步内核控制路径?防止数据不一致

1:使用非抢占内核(最简单的方式)

这种情况下,进程在内核态时不可以被任意挂起。

2:关中断(锁)

单处理器机器上,在进入临界区之前必须禁止产生所有的硬件中断,离开临界区时再允许中断发生,但是这可能造成关中断时间过长使得硬件冻结(多处理器情况不适用)

3:信号量

这种方式对单处理器和多处理器都有效,访问内核数据结构前必须先检查该信号量,它只有两种动作,up down,访问数据前先进行down操作,计数器减去一,如果现在计数器小于0那么就等待,如果大于等于0则可以访问,完成数据访问后要记得对信号量进行up操作

(11) 除了适用系统预留的“信号”来完成“同步或者通信”,还可以使用

1:信号量

2:消息队列

3:共享内存

这三种方式都以一种结构的形式在系统中出现,内核把他们都作为IPC资源来实现,例如要获取共享内存资源则可以使用shmget

(12) 已经终止的进程称为zombie进程,进程停留在这个状态知道父亲执行了wait,子进程的信息在wait执行前仍保留在内存中,我们要注意将由价值的东西留下,没有价值的子进行信息要及时销毁,如果父进程比子进程更早的退出,那么这时候要靠init这个特殊进程来管理该子进程。