Board logo

标题: [分享] Linux内核 [打印本页]

作者: marquis    时间: 2013-5-20 22:24     标题: Linux内核

Linux系统大致可分为三层:
靠近硬件的底层是内核,即Linux操作系统常驻内存部分。
中间层是内核之外的shell层,即操作系统的系统程序部分。
最高层是应用层,即用户程序部分


Linux有两种不同的含义
严格技术角度:指的时开放源代码的Unix类操作系统的内核
一般意义:指以Linux内核为基础的操作系统,包括内核、系统工具、完整的开发环境和应用


kernel时操作系统的核心程序,由几个不同逻辑功能部分组成:
向外部提供对计算机设备的核心管理及调用,负责对计算机资源的抽象、分配和共享
代码分为两部分:
内核所在的地址空间称作内核空间
其他应用程序称为外部管理程序,大部分是对外围设备进行管理和界面操作,外部管理程序和用户进程所占据的地址空间成为外部空间


Unix内核用C语言写成
单一内核:所有的操作系统功能均被封装在内核中,与外部程序处于不同的地址空间。外部程序智能通过功能调用来访问内核
微内核:内核只提供最基本、最核心的一部分操作,如创建和删除任务、中断管理、进程管理、存储器管理、进程间通信等,而其他功能如文件系统、网络协议栈则在内核外操作。


微内核特点:
使操作系统具有良好的灵活性
操作系统内部结构简单清晰
程序代码维护十分方便
体现了面向对象式软件的结构特征


但是:Linux内核采用单一内核
原因:注重效率
Linux将代码执行效率作为操作系统第一要务
Linux内核的程序员都是世界各地的黑客,比起结构的清晰,更注重功能的强大和高效率的代码
特点:每个功能部件不能轻易拆除


从结构上看,Linux操作系统是采用单块结构的操作系统。
一般说来,可以将操作系统划分为内核和系统程序两部分。


进程控制系统用于进程管理、进程同步、进程通信、进程调度和内存管理等。


●内存管理控制内存分配与回收。


●文件系统管理文件、分配文件空间、管理空闲空间、控制对文件的访问并为用户检索数据。


●Linux系统支持三种类型的硬件设备:字符设备、块设备和网络设备。


●核心底层的硬件控制负责处理中断以及与机器通信。
作者: marquis    时间: 2013-5-20 22:24

本帖最后由 marquis 于 2013-5-20 23:03 编辑

5.2  进 程 管 理
1.进程及其状态
简单说来,进程就是程序的一次执行过程。
进程至少要有三种基本状态。这三种基本状态是:运行态、就绪态和封锁态(或等待态)。
进程的状态可依据一定的条件和原因而变化
图片10.png

运行状态:指当前进程已分配CPOU,它是程序正在处理器上执行的状态。在一般单一CPU机制中,任何时刻处于运行状态的进程至多只有一个。
就绪状态:指进程已具备运行条件,但因为其他进程正占用CPU,所以暂时不能运行而等待分配CPU资源的状态。处于该状态的进程可以有多个。
封锁状态:只进程因等待某种事件发生(如等待某一输入、输出操作完成,等待其他进程发来的信号等)而暂时不能运行的状体。处于封锁状态的进程尚不具备运行条件。也成为不可运行状态或挂起状态。可以有多个。

2.Linux进程状态
图片11.png

3.进程的模式和类型
在Linux系统中,进程的执行模式划分为用户模式和内核模式
按照进程的功能和运行的程序来分,进程划分为两大类:一类是系统进程,另一类是用户进程
图片14.png

4.Linux线程
Linux把线程定义为进程的“执行上下文”
具有一段可执行的程序、专用的系统堆栈空间、私有的“线程控制块”(即thread_struct数据结构)
缺少自己的存储空间


5.2.2  进程的结构
1.task_struct结构
task_struct结构包含下列几方面的信息:
    ·进程状态
    ·调度信息
    ·标志符(PID)
    ·内部进程通讯(信号、管道、信号量等)
    ·链接信息(指向父进程、兄弟进程、子进程的指针)
    ·时间和计时器(记录进程的创建时间和运行所占用的
                           CPU时间)
    ·文件系统
    ·虚拟内存
    ·处理器信息

2.进程系统堆栈
每个进程都有一个系统堆栈,用来保存中断现场信息和进程进入内核模式后执行子程序(函数)嵌套调用的返回现场信息。
每个进程的系统堆栈和task_struct数据结构之间存在紧密联系,因而二者物理存储空间也连在一起
系统堆栈的大小静态确定,用户堆栈可在运行时动态扩展
图片13.png


5.2.3  对进程的操作
1.进程的创建
各个进程构成了树形的进程族系
内核在引导并完成了基本的初始化以后,就有了系统的第一个进程(即初始化进程,实际上是内核线程)。除此之外,所有其他的进程和内核线程都由这个原始进程或其子孙进程所创建。
除初始化进程外,其他进程都是用系统调用fork( )和clone( )创建的。
fork( )是全部复制 ,而clone( ) 有选择地复制

2.进程的等待
父进程可用系统调用wait3( )等待它的任一个子进程终止,也可以用系统调用wait4( )等待某个特定的子进程终止。

wait3( )算法如下:
(1)如果父进程没有子进程,则出错返回。
(2)如果发现有一个终止的子进程,则取出子进程的进程号,把子进程的CPU使用时间等加到父进程上,释放子进程占用的task_struct和系统空间堆栈,以供新进程使用。
(3)如果发现有子进程,但都不处于终止态,则父进程睡眠,等待由相应的信号唤醒。

3.进程的终止
进程可使用系统调用exit( )终止自己
其实现算法如下:
(1)撤消所有的信号量。
(2)释放其所有的资源,包括存储空间、已打开的文件、工作目录、信号处理表等。
(3)置进程状态为“终止态”(TASK_ZOMBIE)。
(4)向它的父进程发送子进程终止的信号。
(5)执行进程调度。

4.进程映像的更换
改换进程映像的工作很复杂,是由系统调用execve( )实现的,它用一个可执行文件的副本来覆盖该进程的内存空间。

ELF可执行文件格式示意图
图片15.png

execve( )系统调用的基本算法如下:
(1)验证文件的可执行性,即用户
        有权执行它。
(2)读文件头,检查它是一个可装入模块。
(3)释放原有的内存空间。
(4)按照可执行文件的要求分配新的内存空间,并装入内存

5.2.4  进程调度
进程调度机制主要涉及到调度方式、调度时机和调度策略
1.调度方式
基本上采用“抢占式优先级”方式

2.调度策略——三种不同的调度策略
SCHED_FIFO——短实时进程,对时间性要求比较强
SCHED_RR——较长时间的实时进程,对应“时间片轮转法”
SCHED_OTHER——交互式的分时进程,这类进程的优先权取决于两个因素:一个因素是进程剩余时间配额;另一个是进程的优先数nice ——优先数越小,其优先级越高
后台进程的优先级低于任何交互(前台)进程的优先级

3.调度时机
(1)当前进程调用系统调用nanosleep( )或者pause( ),使自己进入睡眠状态,主动让出一段时间的CPU使用权。
(2)进程终止,永久地放弃对CPU的使用。
(3)在时钟中断处理程序执行过程中,发现当前进程连续运行的时间过长。
(4)当唤醒一个睡眠进程时,发现被唤醒的进程比当前进程更有资格运行。
(5)一个进程通过执行系统调用来改变调度策略或者降低自身的优先权(如nice命令),从而引起立即调度。

图片附件: 图片10.png (2013-5-20 22:30, 31.57 KB) / 下载次数 6098
http://wdlinux.cn/bbs/attachment.php?aid=2987&k=e5ac1ae09a0a80acc21196521f98d539&t=1732550100&sid=UY5r58



图片附件: 图片11.png (2013-5-20 22:35, 103.41 KB) / 下载次数 6143
http://wdlinux.cn/bbs/attachment.php?aid=2989&k=2c3fc4bb93f0833e478147921918e3b8&t=1732550100&sid=UY5r58



图片附件: 图片14.png (2013-5-20 22:36, 39.28 KB) / 下载次数 6079
http://wdlinux.cn/bbs/attachment.php?aid=2990&k=ee6aa86f780dc556d17739db32adcd7d&t=1732550100&sid=UY5r58



图片附件: 图片13.png (2013-5-20 22:37, 37.16 KB) / 下载次数 6064
http://wdlinux.cn/bbs/attachment.php?aid=2991&k=f495f69327a28af5379d2a6fda9f5aaa&t=1732550100&sid=UY5r58



图片附件: 图片15.png (2013-5-20 22:49, 16.32 KB) / 下载次数 5896
http://wdlinux.cn/bbs/attachment.php?aid=2992&k=7ba11e1e965ab10e526f5529d632d1f4&t=1732550100&sid=UY5r58


作者: marquis    时间: 2013-5-20 22:26

本帖最后由 marquis 于 2013-5-20 23:18 编辑

5.2.5  shell基本工作原理
它不属于内核部分,而是在核心之外,以用户态方式运行。其基本功能是解释并执行用户打入的各种命令,实现用户与Linux核心的接口。
图片17.png

后面是本章节的实例部分。请各位同学自己把代码敲到计算机里面,并进行编译、运行。
编译的工具为计算机自带的gcc工具

进程属性
进程的组成元素
程序的当前上下文(context),它是程序当前执行的状态
程序的当前执行目录
程序访问的文件和目录
程序的信任状态,或者叫做访问权限
内存和其他分配给进程的资源

进程标识号
进程的两个知名属性:进程号(Process ID, PID)和父进程号(Parent Process ID,PPID)
PID/PPID都为整数,唯一标识一个进程
所有的进程有个共同的祖先:pid=1的进程,即init进程
图片18.jpg

Real和effective标识号
进程的属性
图片19.png

图片20.jpg

用户和用户组的信息
getlogin()函数返回用户的登录名
getpwname()函数以上面的函数返回值为参数,从/etc/passwd文件中返回该登录名的所有信息。
#include <unistd.h>
char *getlogin(void)
#include <pwd.h>
struct passwd *getpwnam(const char *name)
图片21.jpg

使用system创建进程
system函数原型如下:
#include <stdlib.h>
int system(const char *string)
它通过把system传递给/bin/sh –c来执行 string所指定的命令,string中可以包含选项和参数,接着整个命令行(/bin/sh –c string)又传递给系统调用execve(随后介绍)。如果没有/bin/sh,system返回127,如果出现其他错误,则返回-1;如果至此那个成功则返回string的代码
图片22.jpg

Fork系统调用创建进程
fork调用创建一个新进程
语法:
#include <unistd.h>
pid_t  fork(void)
如果fork成功,就向父进程返回子进程的pid,并向子进程返回0.
fork创建的新进程是和父进程(出了pid和ppid)一样的副本,包括真实有效的UID,GID,进程组和会话ID、环境、资源限制、打开的文件以及共享的进程段
父进程和子进程之间有一点区别。子进程没有继承父进程的超时设置(使用alarm调用)、父进程的文件锁、或者未决信号。
图片23.jpg

图片附件: 图片17.png (2013-5-20 23:15, 82.58 KB) / 下载次数 6043
http://wdlinux.cn/bbs/attachment.php?aid=2993&k=ca243b9f1768b5094a39c310c2b46cb7&t=1732550100&sid=UY5r58



图片附件: 图片18.jpg (2013-5-20 23:15, 30.09 KB) / 下载次数 6037
http://wdlinux.cn/bbs/attachment.php?aid=2994&k=16c65321aca60b1f6fc2321255a03bb1&t=1732550100&sid=UY5r58



图片附件: 图片19.png (2013-5-20 23:15, 33.11 KB) / 下载次数 6050
http://wdlinux.cn/bbs/attachment.php?aid=2995&k=b9a90bf7f590d59eefec8f8cad172457&t=1732550100&sid=UY5r58



图片附件: 图片20.jpg (2013-5-20 23:15, 40.85 KB) / 下载次数 6117
http://wdlinux.cn/bbs/attachment.php?aid=2996&k=4bd306821b3e59dc155acd9503c1aa54&t=1732550100&sid=UY5r58



图片附件: 图片21.jpg (2013-5-20 23:15, 37.21 KB) / 下载次数 6049
http://wdlinux.cn/bbs/attachment.php?aid=2997&k=77fd7d7b4cc78d06905b814a77818fe6&t=1732550100&sid=UY5r58



图片附件: 图片22.jpg (2013-5-20 23:15, 26.75 KB) / 下载次数 6033
http://wdlinux.cn/bbs/attachment.php?aid=2998&k=53cf6bd7f4b4d2ac3ffa926907787054&t=1732550100&sid=UY5r58



图片附件: 图片23.jpg (2013-5-20 23:15, 28.56 KB) / 下载次数 6059
http://wdlinux.cn/bbs/attachment.php?aid=2999&k=fb133821598eb34cc94de9596aad733c&t=1732550100&sid=UY5r58






欢迎光临 WDlinux官方论坛 (http://wdlinux.cn/bbs/) Powered by Discuz! 7.2