linux+shell编程 笔记 进程

来源:互联网 发布:淘宝买水果 编辑:程序博客网 时间:2024/05/21 08:36

1、创建进程:fork()函数。

调用产生一个新的进程,叫子进程;调用进程叫父进程。

 

2、查看进程:ps命令(详细请见:linux+shell编程 笔记 1

ps命令输出的是当前这个时间点上系统进程的状况。

如果想要查看系统一段时间进程的动态信息,可以使用top命令。top命令监控着一段时间内系统的运行状态,包括负载、cpu使用状况、内训状况和进程状况等。

top 主要分为两个画面,上面的画面为整个系统的资源使用状态,基本上总共有六行, 显示的内容依序是:

-----------------------------------------------------------------------------------------------------------------

第一行:当前系统时间、系统已连续运行的时间、目前上线人数、系统整体的负载(load)。 比较需要注意的是系统的负载,三个数据分别代表1,5,10分钟的平均负载。
补充:load average是linux系统中的load对当前cpu工作量的度量。

第二行:显示当前进程数。依次显示总共的进程数、正在运行的进程数、休眠的进程数、stop的进程数和进入zombie状态(僵尸)状态的进程数。正常的情况时zombie的进程数应该是0。

第三行:显示CPU的整体状态。
 us:用户空间占用CPU的百分比
 sy:内核空间占用CPU的百分比
 ni:改变过优先级的进程占用CPU的百分比
 id:空闲CPU百分比
 wa:IO等待占用CPU的百分比
 hi:硬中断占用CPU的百分比
 si:软中断占用CPU的百分比

第四行:内存的使用状态。
   total:物理内存总量
   used:被使用的内存量
   free:空闲内存量
   buffers:缓存的内存量

第五行:虚拟内存的使用状态。
   total:虚拟内存总量
   used:被使用的虚拟内存量
   free:空闲虚拟内存量
   cached:缓冲的的虚拟内存总量
对于内存监控,在top里要时刻监控第五航swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,说明物理内存不够用了。

第七行(第六行是上分割行):各进程的状态监控。
    PID:进程id
    USER:进程所有者
    PR:进程优先级
    NI:nice值。负值表示高优先级,正值表达优先级
    VIRT:进程使用的虚拟内存总量,单位kb
    RES:进程使用的、未被换出的物理内存大小,单位kb
    SHR:共享内存大小
    S:进程状态。D-不可中断的睡眠状态;R-运行;S-睡眠;T-停止;Z-僵尸进程
    %CPU:上次更新到现在的CPU时间占用百分比
    %MEM:进程使用的物理内存百分比
    TIME+:进程使用的CPU时间总计
    COMMAND:进程名称

 -----------------------------------------------------------------------------------------------------------------

top命令参数:

   -d:后面接秒数,就是数据更新的时间。默认是5秒
   -p:指定某些歌PID来进行观察检查
   -b:以批次的方式执行top命令
   -n :与-b搭配,意思是进行几次top操作

pstree:进程是树形结构的。可以通过pstree来打印这种结构。pstree指令用ASCII字符显示树状结构,清楚地表达程序间的相互关系。如果不指定程序识别码或用户名称,则把系统启动时的第一个程序视为基层,并显示之后的所有程序。弱指定用户名称,便会以隶属该用户的第一个程序当做基层,然后显示该用户的所有程序。
例如:pstree chengqinhui


3、进程的属性
进程包含如下内容:

      程序的读取上下文,表示了程序读取执行的状态; 
      程序当前的执行目录;
      程序服务的文件和目录;
      程序的访问权限;
      内存和其他分配给进程的系统资源;

linux中一个进程在内存里有3部分数据:数据段、堆栈段和代码段。代码段存放着程序代码;数据段存放着程序的全局变量、常数和动态数据分配的数据空间;堆栈段存放着子程序的返回地址、子程序的参数和程序的局部变量。


4、进程与任务调度

对linux shell而言,输入需要运行的程序的名称,执行一个程序,就启动了一个进程。每个进程都具有一个进程号,用于系统识别和调度进程。

前台运行的程序:对于前台启动运行的程序,shell会等待进程执行完毕,然后出现命令行提示符,从而输入下一个命令。在整个执行过程中,shell进程会一直等待前台启动的进程执行完毕,然后shell进程才会继续运行。

后台运行的程序:需要使进程在后台执行,方法是command &。&符号就告诉shell,即将执行的是一个后台进程。对应从后台启动的程序,shell不等待程序执行完毕。在shell进程启动子进程来运行后台进程后,shell进程继续运行。

----------------------------------------------

前后台进程的调度:中断一个前台进程,可以用Ctrl+C;中断一个后台进程,使用kill命令。前台进程和后台进程可以相互转换,在前台进程运行中,使用Ctrl+Z将进程挂起。键入bg命令,刚刚被挂起的进程再次开始运行,bg使得进程在后台执行;键入fg命令,则可以将后台进程转为前台运行。

fg:将后台中的命令调至前台运行。可以用fg pid来查看具体的命令

bg:将后台暂停的命令,变成继续执行(在后台执行)。可以用fg pid来查看具体的命令

jobs:查看当前有多少在后台运行的命令。【-l:显示更加详细的作业信息;】


5、linux用户态和内核态:

内核态与用户态是操作系统的两种运行级别,intel cpu提供Ring0-Ring3三种级别的运行模式。Ring0级别最高,Ring3最低。Linux使用Ring3级别运行用户态,Ring0作为核心态,没有Ring1和Ring2。运行于处理器核心态的代码不受任何的限制,可以自由地访问任何有效地址,进行直接端口访问。而运行于用户态的代码则要受到处理器的诸多检查,它们只能访问映射其地址空间的页表项中规定的在用户态下可访问页面的虚拟地址,且只能对任务状态段(TSS)中I/O许可位图中规定的可访问端口进行直接访问。

当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(0级) 内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。即此时处理器在特权级最低的(3级)用户代码中运行。

在内核态下cpu可以执行任何命令,在用户态下cpu只能执行非特权指令。当CPU处于内核态,可以随意进入用户态;当用户处于用户态时,用户从用户态切换到内核态只有在系统调用、异常和中断两种情况下发生,一般程序一开始都是运行于用户态,当程序需要使用系统资源时,就必须通过调用软中断进入内核态。  

6、linux信号

Ctrl+C产生的信号只能发给前台进程,shell可以同时运行一个前台进程和任意多个后台进程,只有前台进程才能接到想Ctrl+C这种控制键产生的信号。前台进程在运行过程中,用户随时按下Ctrl+C产生一个信号,也就是说该进程的用户空间代码执行到任何地方,都是可以接受到SIGINT信号而终止,所以信号相对于进程的控制是异步的。

kill -l:可以查看系统定义的信号列表。这些信号在signal.h中定义。

产生信号的条件:

1)用户在终端按下某些键,如Ctrl+z,终端驱动程序会发送信号给前台进程。

2)硬件异常产生信号,这些条件由硬件检测到并通知内核,然后内核向当前进程发送适当的信号。

3)一个进程调用kill(2)函数,可以发送信号给另外一个进程。

4)当内核检测到某种软件条件发生时,也可以通过信号通知进程。如闹钟超时。


7、linux的第一个进程 — init

init是Linux系统执行的第一个进程,pid为1,是系统所有进程的起点,主要用来执行一些开机初始化脚本和监视进程。Linux系统在完成内核引导以后,就开始运行init程序,init程序需要读取配置文件/etc/inittab。它描述了init程序怎样在特定的运行级别启动系统。

inittab配置文件每行的格式:id:runlevels:action:process

     id:1~2个字符,配置行的唯一标识,在配置文件中不能重复
     runlevels:配置行适用的运行级别,可以填入多个运行级别。
               0:关机
               1:单用户字符界面
               2:不具备网络文件系统功能的多用户字符界面
               3:具有网络功能的多用户字符界面
               4:保留
               5:具有网络功能的图形用户界面
               6:重启系统
     action:行为。
               respawn:启动并监视指定的process,若process终止则重启
               wait:执行指定的process,并等待执行完毕
               once:执行指定的process
               boot:不论在那个执行级别,系统启动时都执行指定的process
               bootwait:不论在那个执行级别,系统启动时都执行指定的process,且一直等待其执行完毕
               off:关闭任何操作,相当于忽略该配置行
               initdefault:系统启动后进入的执行级别,改行不需要指定process
               sysinit:不论在哪个执行等级,系统会在执行boot及bootwait之前执行指定的process
               powerwait:当系统的供电不足时,执行指定的process,且一直等待其执行完毕
               powerokwait:当系统的供电恢复正常时,执行指定的process,且一直等待其执行完毕
               powerfailnow:当系统的供电严重不足时,执行指定的process
               ctrlaltdel:当用户按下【Ctrl+Alt+Del】时执行的操作
               kbrequest:当用户按下特殊的组合键时,执行指定的process,此组合键需在keymaps文件中定义
     process:init指定的进程。


8、linux系统中管道的实现

管道是linux系统中连接不同工具的纽带,支持管道的程序被称为过滤器,数据流从过滤器的标准输入流入,经过处理后输出,通过管道输入下一个过滤器。

管道在本质上是一种文件,所不同的是:

1)管道是有大小的。管道是一个固定大小的缓冲区,4k字节。它不能像文件那样不加检验的增长。使用单个固定缓冲区也会带来问题,比如在写管道时可能变满,当这种情况发生时,随后对管道的write()调用将默认地被阻塞,等待某些数据被读取,以便腾出足够的空间供write()调用写。

2)读取进程也可能工作的比写进程快。当所有当前进程数据已被读取时,管道变空。当这种情况发生时,一个随后的read()调用将默认地被阻塞,等待某些数据被写入,这解决了read()调用返回文件结束的问题。


9、调度系统任务

调度任务的方式主要分为通过cronat两种,cron用于调度重复性系统任务;at用于调度只执行一次的系统任务。

cron 介绍:
-----------------------------------------------------------------------------------------------------------------------------------

1、crontab文件介绍:cron守护进程会根据在每个crontab文件中找到的命令来调度系统任务。crontab文件由命令组成,每个命令占据一行,这些命令将以固定间隔执行。每行开头包含日期和时间信息,以告知cron守护进程何时执行命令。

2、cron守护进程调度:cron守护进程可管理crontab命令的自动调度,它会检查/var/spool/cron/crontab目录中是否存在crontab文件。cron守护进程会检查新的crontab文件,阅读文件中的时间,在指定的时间执行相应的命令。

3、显示crontab文件:crontab -l  。显示当前用户的crontab任务。

4、crontab文件项语法:每个命令的前5个字段指定时间,分别是分钟、小时、月中某日、月份和星期中某日(0-6)。由空格来分割每个字段;可设置多个值,采用逗号分割;连字符指定某一个范围的值;星号是通配符,表示所有值。

5、创建和编辑crontab文件:
----------------------------------------------------------------------------------------------------------------------------------

原创粉丝点击