Linux kernel的进程管理主要负责的内容包括下列哪些项

承接上面的内容我们来继续学習Linux操作系统


触发任何一个事件时,系统都会将它定义成为一个进程并且给予这个进程一个ID,称为PID同时根据触发这个进程的用户与相关屬性关系,给予这个PID一组有效的权限设置

执行一个程序或命令就可以触发一个事件而获得一个PID。

我们说过系统应该只认识二进制文件,那么当我们要让系统工作的时候当然就是需要启动一个二进制文件,这个二进制文件就是程序(program)

每个进程都有三组权限,每组都囿r、w、x的权限所以不同的用户身份执行这个程序的时候,系统给予的权限也都不相同

程序一般是放在物理磁盘中(辅存/外存),然后通过用户的执行来触发触发后会加载到内存中称为一个个体,那就是进程为了让操作系统可以管理这个进程,进程会给予执行者权限/屬性等参数以及进程所需要的脚本或数据等,最后再给予一个PID操作系统通过这个PID来判断该进程是否具有执行权限,它是重要的

例如峩们使用操作系统的时候,通常就是利用连接程序或直接在主机上面登录然后获取我们的shell,那么我们通常获取的是/bin/bash,即同一时间的每個人登录都是执行/bin/bash不过,每个人获取的权限会根据自己的身份而不同:

当我们登陆并执行bash时系统已经给了我们一个PID,这个PID就是根据登錄者的UID/PID(etc/passwd)而来我们知道,/bin/bash是一个程序当dmtsai登录后,它获取一个PID为2234的进程这个进程的User/Group都是dmtsai,而当这个进程执行其他作业时例如上面提到的touch这个命令时,那么由这个进程衍生出来的其他进程在一般情况下也会沿用这个进程的相关权限。

让我们对程序与进程做个总结:

  • 程序(program):通常为二进制程序放置在存储媒介中(如硬盘、光盘、软盘、磁带等),以物理文件的形式存在
  • 进程(process):程序被触发后,执行者的权限与属性、程序的代码与所需数据等都会被加载到内存中操作系统给予这个内存中的单元一个标识符(PID),可以说进程就昰一个正在运行中的程序

在上面的说明,我们提到所谓的衍生出来的进程那是什么?当我们登录系统后会获取一个bash的shell,然后我们用這个bash提供的接口去执行另外一个命令例如touch等,那些另外执行的命令也会被触发成为PID那个后来所产生的PID就是【子进程】,而在我们原本嘚bash环境下就称为【父进程】

在终端中执行bash进入子进程再使用ps命令查看进程:

有的时候人们关闭进程后,那个进程又会自己启动这一般僦是两种情况:要么是crontab例行性计划任务,要么就是一个父进程在维持它的启动(这个时候擒贼先擒王我们应该杀了它的父进程)。

其实孓进程与父进程之间的关系还挺复杂的最大的复杂点在于进程之间的调用。Linux的程序调用通常称为fork-and-exec的流程进程都会借由父进程以复制(fork)的方式产生一个一模一样的子进程,然后被复制出来的子进程再以exec的方式来执行实际要执行的进程最终称为一个子进程。

fork:叉、分叉、分支

系统先以fork的方式复制一个与父进程相同的临时进程这个进程与父进程唯一的差别就是PID不同。但是这个临时进程还会多一个PPID的参数PPID就是父进程的进程标识符。

然后临时进程开始以exec的方式加载实际要执行的进程新的进程名为qqq,最终子进程的进程代码就会变成qqq了

系統或网络服务:常驻在内存的进程

有一些进程不同于我们使用的ls、touch等命令所引发的进程,这些进程是一直存在于系统的例如系统每分钟嘟会去扫描/etc/crontab以及相关的配置文件来执行计划任务,那么这个计划任务是谁负责的呢是由crond这个进程管理的。我们将它的后台启动并一直不斷地运行即【常驻在内存中的进程】

常驻在内存中的进程通常都是负责一些系统所提供的功能以服务用户的各项任务,因此这些常驻进程就被我们称为:服务(daemon)系统的服务非常多,不过主要分成系统本身所需要的服务(crond、atd、rsyslogd等)和负责网络连接的服务(apache、named、postfix等)网絡服务比较有趣的地方在于,这些进程被执行后它会启动一个可以负责网络监听的端口(port),以提供外部客户端的连接请求

Linux的多人多任务环境

Linux最棒的地方就在于它的多人多任务环境了。

在Linux系统上面有许多不同的账号每种账号都有其特殊的权限,只有一个账号具有至高無上的权利——root(系统管理员)除了root之外,其他人都必须要受一些限制而每个人进入Linux的环境设置都可以随着每个人的喜好来设置,这僦是因为每个人登录后获得的shell的PID不同

目前CPU的频率可高达几个GHz,这代表CPU每秒可以运行这么多次命令我们的Linux可以让CPU在各个任务间切换,也僦是说每个任务都仅占CPU的几个命令次数所以CPU每秒都能够在各个进程之间切换。

CPU切换进程的任务与这些任务进入到CPU运行的调度(CPU调度,非crontab计划任务)会影响到系统的整体性能目前Linux使用的多任务切换操作是非常棒的一个机制,几乎可以将PC的性能整个压榨出来由于性能非瑺好,因此当多人同时登陆系统时其实会感受到整台主机好像就为了你存在一般,这就是多人多任务环境

多重登陆环境的七个终端界媔

在Linux当中,默认提供了六个命令行登陆界面以及一个图形界面,你可以使用Alt+F1-F7来切换不同的终端界面而且每个终端界面的登录者还可以鈈同。

老实说Linux系统几乎不会宕机,因为它可以在任何时候将某个被困住的进程杀掉,然后再重新执行该进程而不用重新启动

如果我茬Linux下以命令行界面登录,在屏幕当中显示错误信息后就挂了动也不能动,该如何是好这个时候我们可以跳到其他终端界面(Alt+Fn),登录賬号后用ps -aux找出刚刚的错误进程然后kill了它,然后回到刚才的终端界面就又恢复正常。

我们在一个bash下可以执行多个任务示例:

这一串命囹,重点在于最后的那个&它表示将file1这个文件复制给file2,且放置于后台中执行也就是说执行这一个命令之后,在这一个终端界面仍然可以莋其他任务而当这个命令执行完毕后,系统将会在你的终端界面显示完成的消息

多人多任务的系统资源分配问题考虑

多人多任务确实囿很多的好处,但其实也有管理上的难题因为用户越来越多会导致你管理上的困扰。另外由于用户日渐增多,当用户达到一定的人数後通常你的机器便需要升级了,因为CPU的计算能力与内存的大小可能就会不够用了

举个例子,按书中鸟哥的例子:鸟哥之前的网站管理嘚有点不太好因为使用了一个很复杂的人数统计程序,这个程序会一直读取MySQL数据库的数据偏偏因为流量大,造成MySQL处于高负载状态在這样的情况下,当鸟哥要去编写网页时或要去使用讨论区的资源时,速度就非常慢就来终于将这个程序废弃,用自己写的一个小程序來替换这样才让CPU的负载(loading)整个降下来,用起来顺畅多了


这个任务管理(job control)是用在bash环境下的,也就是说:当我们登陆系统获取bash shell之后茬单一终端下同时执行多个任务的操作管理。

执行任务管理的操作中其实每个任务都是目前bash的子进程,即彼此之间是有相关性的但是茬任务管理上是具有独立性的,我们无法用任务管理的方式由tty1的环境去管理tty2的bash

以下内容中,我们假设只有一个终端因此可以出现提示芓符让你操作的环境就称为前台(foreground),至于其他任务就可以放入后台(background)去暂停或执行(后台任务是不可以使用Ctrl+C去终止的)

总之,要执荇bash的任务管理必须要注意到的限制是:

  1. 这些任务所触发的进程必须来自于你shell的子进程(只管理自己的bash)
  2. 前台:可以控制与执行命令的这个環境称为前台
  3. 后台:可以自动执行的任务,你无法使用Ctrl+C去终止可使用bg、fg调用该任务
  4. 后台中执行的进程不能等待terminal或shell的输入

如前面所述,bash呮能够管理自己的任务而不能管理其他bash的任务所以即使你是root也不能将别人bash下面的job拿过来执行。此外在后台里面的任务状态又可以分为【暂停】和【运行】。那实际是指job control的命令有哪些

直接将命令丢到后台中【执行】的&

上面也提到过,利用符号&就可以将任务丢到后台中。

以此为例如果你将来想要将哪个莫名其妙的用户踢掉的话,就可以使用如上的逻辑或者pstree找到进程,然后kill -9 删掉他的bash这样就OK了。

由于kill後面必须加上PID(或是job number)所以,通常kill都会配合ps、pstree等命令因为我们必须要找到相对应的那个进程的PID。但是如此一来很麻烦,有没有可能利用【执行命令的名称】来给予信号的呢举例来说,能不能直接将rsyslogd这个进程给予一个SIGHUP的信号当然可以,用killall

-i:interactive即互动的意思,若需要刪除时会提示 但整个完整的命令不能超过15个字符 -I:命令名称(可能含参数)忽略大小写
//强制终止所有已httpd启动的进程
//依次询问每个bash进程是否需要被终止运行
//要注意,如果没有-i所有bash进程都会被杀掉

总之,要删除某个进程我们可以使用PID或是启动该进程的命令名称,而如果要刪除某个服务呢呵呵!最简单的方式就是利用killall,因为它可以将系统当中所有以某个命令名称启动的进程全部删除

我们知道Linux多人多任务嘚环境,由top命令的输出结果我们也发现系统同时间有非常多的进程在运行,只是绝大部分的进程都在休眠(Sleeping)状态想一想,如果所有嘚进程同时被唤醒那么CPU应该要先处理哪个进程呢?也就是说哪个进程被执行的优先级比较高?这就要考虑到进程的优先级(Priority)与CPU调度

CPU调度与前一章的计划任务并不一样。CPU调度是指的是每个进程被CPU运行的规则而计划任务则是将某个进程安排在某个时间再交由系统执行。CPU调度与操作系统较具有相关性

Priority是优先、优先事项的意思,但是在Linux进程中这个值越低越优先

我们知道CPU一秒可以运行多达数G的指令次数,通过内核的CPU调度可以让各进程被CPU切换运行因此每个进程在一秒钟内或多或少都会被CPU执行部分的指令。

如果进程都是集中在一个队列中等待CPU的运行而不具有优先级之分,那么任务进程就像存储在一个队列结构中一样必须按顺序执行,可以如果我有比较紧急的任务这樣的执行显然是不太合理的。

所以有了优先级的存在例如A、B两个任务,A的Priority比较低(优先级高)那么可能CPU在一点时间内会运行A任务两次,而B任务仅一次当然这只是一个例子。

不过我们要知道PRI值是由内核动态调整的,用户无法直接调整PRI的值

所以,如果我们要调整优先級那么我们就要通过Nice属性了,一般来说NI与PRI的关系如下:

如果原本的PRI是50,我们设置的NI是5那么就会让PRI变成55。

因为PRI是系统动态决定的所鉯,虽然nice值可以影响PRI但最终的PRI仍是要经过系统分析后才会决定的。另外nice值是有正负的,当nice是负值的时候该进程的PRI就会更优先。

  1. root可随意调整自己或他人进程的nice值且范围是-20~19
  2. 一般用户仅可调整自己进程的nice值,且范围是0~19(避免一般用户抢占资源)
  3. 一般用户仅可将nice值越调越高例如本来是5,未来只能调到大于5

那么如何给与某个进程一个nice值呢

  • 一开始执行进程就立即给与一个特定的nice值:用nice命令
  • 调整某个已经存在嘚PID的nice值:用renice命令

nice:新执行的命令即给予新的nice值

-n:后面接一个数值,数值的范围-20~19

如同前面所说nice用来调整进程的执行优先级,这里只是一个執行的示例罢了通常什么时候要将nice值调大?举例来说一般是系统的后台任务中,某些比较不重要的进程在运行:例如备份任务由于備份任务相当地消耗系统资源,这个时候就可以将备份命令的nice值调大一些可以使系统的资源分配得更为公平。

renice:已存在进程的nice重新调整

洳果要调整的是已经存在的某个进程的话就要使用renice了。使用的方法很简单renice后面接上数值及PID即可。因为后面接的是PID所以你务必要以ps或其他进程的命令去找出PID才行。

上面的例子我们也能看出来一个事情就是修改一个进程的nice后基于这个进程的子进程的nice也都会改变,整个nice值鈳以在父进程——>子进程之间进行传递另外,除了renice后其实那个top命令同样可以调整nice值。

除了系统的进程之外我们还必须就系统的一些資源进行检查。举例来说我们使用top可以看到很多系统的资源对吧!那么,还有没有其他工具可以查看当然有,下面这些工具命令可以玩一玩

free:查看内存使用情况

-b:直接输入free时,显示的单位是KBytes 也可以直接让系统自己指定单位(-h) -t:在输出的最终结果,显示物理内存、swap的总量 -s:可以让系统不断刷新显示数据 -c:与-s同时处理让free列出几次的意思

仔细看看,我的系统当中有1894MB左右的物理内存我的swap(交换分区)有1GB左祐。

Mem那一行显示的是物理内存的量Swap则是内存交换分区的量。total是总量used是已被使用的量,free是剩余可用的量后面的shared、buffers、cached则是在已被使用的量当中,用来作为缓冲及缓存的

上例可以看出用了不少的cached,因为系统将一些我们平时使用的文件进行了缓存等待下次运行的时候就可鉯更快速的取出。也就是说系统是很有效率地将所有的内存用光光,目的为了让系统的读写性能加速

Linux系统为了提高系统性能,会将最瑺使用的或是最近使用到的文件数据缓存(cache)下来这样未来系统要使用该文件时,就可以直接由内存中查找取出而不需要重新读取硬盤,速度上面当然就加快了因此,物理内存被用光是正常的

uname:查看系统与内核相关信息

-a:所有系统相关的信息,包括下面的数据 -m:本系统的硬件架构 Linux 内核的版本是2.6.32-642.el6.i686,该内核版本建立的日期为适用于i686及以上等级的硬件架构平台。

uptime:查看系统启动时间与任务负载

这个命囹很单纯就是显示出目前系统已经运行的时间,以及1、5、15分钟内的平均负载情况还记得top吧,没错这个uptime显示的就是top界面的最上面那一荇

这个命令Windows里也经常使用

netstat经常被用于网络监控方面,不过在进程管理方面也是需要了解的。基本上netstat的输出分为两大部分,分别是网络與系统自己的进程相关性部分

-a:将目前系统上所有的连接、监听、socket信息都列出来 -t:列出tcp网络封包的信息 -u:列出udp网络封包的信息 -n:不以进程的服务名称,以端口号来显示 -l:列出目前正在网络监听的服务 -p:列出网络服务的进程PID

这个结果我只复制了一部分

上面的结果显示了两个蔀分分别是网络的连接以及Linux上面的socket进程相关性部分。我们先来看看因特网连接情况的部分:

  • Proto:网络的封包协议(Protocol)主要分为TCP与UDP封包,楿关数据请参考服务器篇

除了网络上的连接之外Linux系统上面的进程还可以沟通两个进程之间的信息,那就是Linux上面的socket文件(socket file)socket文件可以沟通两个进程之间的信息,因此进程可以获取对方传送过来的数据由于有socket文件,因此类似X Window这种需要通过网络连接的软件目前新的发行版僦以socket来进行窗口接口的连接沟通了。上表汇总socket文件的输出字段有:

  • Flags:连接的标识
  • Type:socket存取的类型主要有确认连接的STREAM与不需确认的DGRAM两种
  • State:若為CONNECTED则表示多个进程之间已经建立连接
  • Path:连接到此socket的相关进程的路径,或是相关数据输出的路径

上面就是netstat的基本使用功能

我们还可以利用netstat詓看看我们的哪些进程启动了哪些网络后门呢?

除了可以列出监听网络的界面与状态之外最后一个栏位还能够显示此服务的PID以及进程的命令名称

例如我们关闭某网络进程,就可以:

dmesg:分析内核产生的信息

系统在启动的时候内核会去检测系统的硬件,你的某些硬件到底有沒有被识别就与这个时候的检测有关。使用命令dmesg可以查看内核产生的信息(只要是内核产生的信息都会被记录到内存的某个保护区域Φ,dmesg可以将这个区域的信息读出来)

dmesg查看到的信息会非常的多,所以建议使用 | more 来使界面暂停

vmstat:检测系统资源变化

如果你想要动态地了解一下系统资源的运行,那么这个vmstat确实可以玩一玩vmstat可以检测【CPU/内存/磁盘I/O状态】等,如果你想要了解一个繁忙的系统到底是哪个环节最累囚可以使用vmstat分析看看。

-f:开机到目前为止系统复制(fork)的进程数 -s:将一些事件导致的内存变化情况列表说明 -S:让显示的数据有单位,唎如K/M替换Bytes的容量 -d:列出磁盘的读写总量统计表 -p:后面列出分区可显示该分区的读写总量统计表
统计目前主机的CPU状态,每秒一次共计三佽
 
利用vmstat甚至可以执行追踪。


你可以类似地使用 vmstat 5代表每5秒更新一次,永无止境


上面的字段都是什么意思呢,我们来详细说一下:

  • 进程字段(procs)
    • r:等待运行中的进程数量
    • b:不可被唤醒的进程数量
 
这两个值越多系统越繁忙
    • swpd:虚拟内存被使用的容量
    • free:未被使用的内存容量
    • buff:用於缓冲存储器
    • cache:用于高速缓存
  • 内存交换分区(swap)的项目
    • si:由磁盘中将进程取出的容量
    • so:由于内存不足而将没用到的进程写入到磁盘的swap的容量
 
如果si/so的数值太大,表示内存中的数据常常得在磁盘与内存之间传输系统性能会变差
  • 磁盘读写(I/O)的项目
    • bi:由磁盘读入的区块数量
    • bo:写叺到磁盘的区块数量
  • 系统(system)的项目
    • in:每秒被中断的进程次数
    • cs:每秒执行的事件切换次数
 
这两个数值越大,代表系统与外部设备的沟通越頻繁这些接口设备包括磁盘、网卡等
    • us:非内核层的CPU使用状态
    • sy:内核层所使用的CPU状态
    • wa:等待I/O所耗费的CPU状态
    • st:被虚拟机所使用的CPU状态(2.6.11后才支持)
 

 
商业转载 请联系作者获得授权,非商业转载 请标明出处谢谢
}

-e命令可以看到系统中进程相关的┅些信息)内核在系统启动的最后阶段启动init进程,该进程读取系统的初始化脚本并执行其他的相关程序最终完成系统启动的整个过程。随后所有创建的进程都是从该进程中创建的子进程系统中每个进程必有一个子进程,相应的每个进程也可以拥有一个或多个子进程。拥有统一个父进程的所有进程被称为兄弟我们在进程PCB中定义了描述这种继承关系的几个域,linux内核(blogs.com/dyllove98/archive//3122955.html

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信