无标题文档
wdCP系统 (介绍,功能特性,运行环境,安装说明,演示,常见问题,使用教程) wdCDN系统 (介绍,功能特性,运行环境,安装说明,演示,常见问题,使用手册)
wdOS系统 (介绍,功能特性,运行环境,安装说明,演示,常见问题,使用教程) wdDNS系统 (介绍,功能特性,运行环境,安装说明,演示,常见问题,使用手册)
注册 发贴 提问 回复-必看必看 wddns免费智能 DNS 开通 本地或虚拟机使 用wdcp 一键包在mysql编 译时"卡住"
【300G高防】双线 无视攻击 wdcp官方技术支持/服务 阿里云8折优惠券 无敌云 腾讯云优惠中,现注册更有260代金额券赠送
返回列表 发帖
提问三步曲: 提问先看教程/FAQ索引(wdcp,wdcp_v3,一键包)及搜索,会让你更快解决问题
1 提供详细,如系统版本,wdcp版本,软件版本等及错误的详细信息,贴上论坛或截图发论坛
2 做过哪些操作或改动设置等

温馨提示:信息不详,很可能会没人理你!论坛有教程说明的,也可能没人理!因为,你懂的

[分享] Linux内核

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


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


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


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


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


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


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


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


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


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


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


●核心底层的硬件控制负责处理中断以及与机器通信。

本帖最后由 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命令),从而引起立即调度。

TOP

本帖最后由 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

TOP

返回列表