WDlinux官方论坛's Archiver

marquis 发表于 2013-5-20 22:24

Linux内核

[size=4][color=#ff0000]Linux系统大致可分为三层:[/color][/size]
[size=3]靠近硬件的底层是内核,即Linux操作系统常驻内存部分。[/size]
[size=3]中间层是内核之外的shell层,即操作系统的系统程序部分。[/size]
[size=3]最高层是应用层,即用户程序部分 [/size]
[size=3]
[/size]
[size=4][color=#ff0000]Linux有两种不同的含义[/color][/size]
[size=3]严格技术角度:指的时开放源代码的Unix类操作系统的内核[/size]
[size=3]一般意义:指以Linux内核为基础的操作系统,包括内核、系统工具、完整的开发环境和应用[/size]
[size=3]
[/size]
[size=4][color=#ff0000]kernel时操作系统的核心程序,由几个不同逻辑功能部分组成:[/color][/size]
[size=3]向外部提供对计算机设备的核心管理及调用,负责对计算机资源的抽象、分配和共享[/size]
[size=3]代码分为两部分:[/size]
[size=3]内核所在的地址空间称作内核空间[/size]
[size=3]其他应用程序称为外部管理程序,大部分是对外围设备进行管理和界面操作,外部管理程序和用户进程所占据的地址空间成为外部空间[/size]
[size=3]
[/size]
[size=4][color=#ff0000]Unix内核用C语言写成[/color][/size]
[size=3]单一内核:所有的操作系统功能均被封装在内核中,与外部程序处于不同的地址空间。外部程序智能通过功能调用来访问内核[/size]
[size=3]微内核:内核只提供最基本、最核心的一部分操作,如创建和删除任务、中断管理、进程管理、存储器管理、进程间通信等,而其他功能如文件系统、网络协议栈则在内核外操作。[/size]
[size=3]
[/size]
[size=4][color=#ff0000]微内核特点:[/color][/size]
[size=3]使操作系统具有良好的灵活性[/size]
[size=3]操作系统内部结构简单清晰[/size]
[size=3]程序代码维护十分方便[/size]
[size=3]体现了面向对象式软件的结构特征[/size]
[size=3]
[/size]
[size=4][color=#ff0000]但是:Linux内核采用单一内核[/color][/size]
[size=3]原因:[/size]注重效率
[size=3]Linux将代码执行效率作为操作系统第一要务[/size]
[size=3]Linux内核的程序员都是世界各地的黑客,比起结构的清晰,更注重功能的强大和高效率的代码[/size]
[size=3]特点:[/size]每个功能部件不能轻易拆除
[size=3]
[/size]
[size=4][color=#ff0000]从结构上看,Linux操作系统是采用单块结构的操作系统。[/color][/size]
[size=4][color=#ff0000]一般说来,可以将操作系统划分为内核和系统程序两部分。[/color][/size]
[size=3]
[/size]
[size=4][color=#ff0000]进程控制系统用于进程管理、进程同步、进程通信、进程调度和内存管理等。[/color][/size]
[size=3]
[/size]
[size=3]●内存管理控制内存分配与回收。[/size]
[size=3]
[/size]
[size=3]●文件系统管理文件、分配文件空间、管理空闲空间、控制对文件的访问并为用户检索数据。[/size]
[size=3]
[/size]
[size=3]●Linux系统支持三种类型的硬件设备:字符设备、块设备和网络设备。[/size]
[size=3]
[/size]
[size=3]●核心底层的硬件控制负责处理中断以及与机器通信。[/size]

marquis 发表于 2013-5-20 22:24

[i=s] 本帖最后由 marquis 于 2013-5-20 23:03 编辑 [/i]

[size=4][color=#ff0000]5.2  进 程 管 理[/color][/size]
[size=4][color=#ff0000]1.进程及其状态[/color][/size]
[size=3]简单说来,进程就是程序的一次执行过程。[/size]
[size=3]进程至少要有三种基本状态。这三种基本状态是:运行态、就绪态和封锁态(或等待态)。[/size]
[size=3]进程的状态可依据一定的条件和原因而变化 [/size]
[size=3][attach]2987[/attach]
[/size]
[size=3]运行状态:指当前进程已分配CPOU,它是程序正在处理器上执行的状态。在一般单一CPU机制中,任何时刻处于运行状态的进程至多只有一个。[/size]
[size=3]就绪状态:指进程已具备运行条件,但因为其他进程正占用CPU,所以暂时不能运行而等待分配CPU资源的状态。处于该状态的进程可以有多个。[/size]
[size=3]封锁状态:只进程因等待某种事件发生(如等待某一输入、输出操作完成,等待其他进程发来的信号等)而暂时不能运行的状体。处于封锁状态的进程尚不具备运行条件。也成为不可运行状态或挂起状态。可以有多个。[/size]

[size=4][color=#ff0000]2.Linux进程状态[/color][/size]
[size=3][attach]2989[/attach]
[/size]
[size=4][color=#ff0000]3.进程的模式和类型[/color][/size]
[size=3]在Linux系统中,进程的执行模式划分为用户模式和内核模式[/size]
[size=3]按照进程的功能和运行的程序来分,进程划分为两大类:一类是系统进程,另一类是用户进程 [/size]
[size=3][attach]2990[/attach]
[/size]
[size=4][color=#ff0000]4.Linux线程[/color][/size]
[size=3]Linux把线程定义为进程的“执行上下文” [/size]
[size=3]具有一段可执行的程序、专用的系统堆栈空间、私有的“线程控制块”(即thread_struct数据结构) [/size]
[size=3]缺少自己的存储空间 [/size]
[size=3]
[/size]
[size=4][color=#ff0000]5.2.2  进程的结构[/color][/size]
[size=4][color=#ff0000]1.task_struct结构[/color][/size]
[size=3]task_struct结构包含下列几方面的信息:[/size]
[size=3]    ·进程状态[/size]
[size=3]    ·调度信息 [/size]
[size=3]    ·标志符(PID)[/size]
[size=3]    ·内部进程通讯(信号、管道、信号量等)[/size]
[size=3]    ·链接信息(指向父进程、兄弟进程、子进程的指针)[/size]
[size=3]    ·时间和计时器(记录进程的创建时间和运行所占用的 [/size]
[size=3]                           CPU时间)[/size]
[size=3]    ·文件系统[/size]
[size=3]    ·虚拟内存[/size]
[size=3]    ·处理器信息[/size]

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

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

[size=4][color=#ff0000]2.进程的等待[/color][/size]
[size=3]父进程可用系统调用wait3( )等待它的任一个子进程终止,也可以用系统调用wait4( )等待某个特定的子进程终止。[/size]

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

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

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

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

[size=4][color=#ff0000]5.2.4  进程调度[/color][/size]
[size=3]进程调度机制主要涉及到调度方式、调度时机和调度策略[/size]
[size=4][color=#ff0000]1.调度方式[/color][/size]
[size=3]基本上采用“抢占式优先级”方式 [/size]

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

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

marquis 发表于 2013-5-20 22:26

[i=s] 本帖最后由 marquis 于 2013-5-20 23:18 编辑 [/i]

[size=4][color=#ff0000]5.2.5  shell基本工作原理[/color][/size][size=3] [/size]
[size=3]它不属于内核部分,而是在核心之外,以用户态方式运行。其基本功能是解释并执行用户打入的各种命令,实现用户与Linux核心的接口。[/size]
[size=3][attach]2993[/attach]
[/size]
[size=3]后面是本章节的实例部分。请各位同学自己把代码敲到计算机里面,并进行编译、运行。[/size]
[size=3]编译的工具为计算机自带的gcc工具[/size]

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

[size=4][color=#ff0000]进程标识号[/color][/size]
[size=3]进程的两个知名属性:进程号(Process ID, PID)和父进程号(Parent Process ID,PPID)[/size]
[size=3]PID/PPID都为整数,唯一标识一个进程[/size]
[size=3]所有的进程有个共同的祖先:pid=1的进程,即init进程[/size]
[size=3][attach]2994[/attach]
[/size]
[size=4][color=#ff0000]Real和effective标识号[/color][/size]
[size=3]进程的属性[/size]
[size=3][attach]2995[/attach]
[/size]
[size=3][attach]2996[/attach]
[/size]
[size=4][color=#ff0000]用户和用户组的信息[/color][/size]
[size=3]getlogin()函数返回用户的登录名[/size]
[size=3]getpwname()函数以上面的函数返回值为参数,从/etc/passwd文件中返回该登录名的所有信息。[/size]
[size=3]#include <unistd.h>[/size]
[size=3]char *getlogin(void)[/size]
[size=3]#include <pwd.h>[/size]
[size=3]struct passwd *getpwnam(const char *name)[/size]
[size=3][attach]2997[/attach]
[/size]
[size=4][color=#ff0000]使用system创建进程[/color][/size]
[size=3]system函数原型如下:[/size]
[size=3]#include <stdlib.h>[/size]
[size=3]int system(const char *string)[/size]
[size=3]它通过把system传递给/bin/sh –c来执行 string所指定的命令,string中可以包含选项和参数,接着整个命令行(/bin/sh –c string)又传递给系统调用execve(随后介绍)。如果没有/bin/sh,system返回127,如果出现其他错误,则返回-1;如果至此那个成功则返回string的代码[/size]
[size=3][attach]2998[/attach]
[/size]
[size=4][color=#ff0000]Fork系统调用创建进程[/color][/size]
[size=3]fork调用创建一个新进程[/size]
[size=3]语法:[/size]
[size=3]#include <unistd.h>[/size]
[size=3]pid_t  fork(void)[/size]
[size=3]如果fork成功,就向父进程返回子进程的pid,并向子进程返回0.[/size]
[size=3]fork创建的新进程是和父进程(出了pid和ppid)一样的副本,包括真实有效的UID,GID,进程组和会话ID、环境、资源限制、打开的文件以及共享的进程段[/size]
[size=3]父进程和子进程之间有一点区别。子进程没有继承父进程的超时设置(使用alarm调用)、父进程的文件锁、或者未决信号。[/size]
[attach]2999[/attach]

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.