欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

进程管理

程序员文章站 2022-05-13 11:20:07
...
  • CPU0环,用于内核进行操作,比如释放一个寄存器,用户程序使用的CPU3环,当需要和硬件交流的时候,就会调用内核来使用驱动程序,内核管理者系统上运行的每一个进程,当内核占据CPU时,其余应用程序就会进入排队等待,内核需要保存现场,内核通过内核数据结构保存着运行进程的每一个信息,包括 name,PPID,PID,执行到指令的条数,…内核保存这些进程数据是需要占据内存空间的;内核中的记录信息是和用户进程相互对应的;
  • 使用寄存器来装配指令时,并记录执行的条目和下一条指令的位置,当时间片耗尽时,或者指令执行完成,就会执行下一条指令;为了防止进程之间对于内存空间的占用,将内存分配成线性空间,内核占用一段空间,其余的进程都只认为内存中只有自己和内核,为了提高内存的利用率,使用页面技术将内存划分成页面,一次申请的只有页面数据,这些页面的使用数据保存在内核结构表中,这个结构表中记录页面是由哪个程序使用的;除了页面结构还有逻辑视图:

    • 进程的地址空间结构
      进程管理
  • forbidden:表示不允许进程空间使用的;
  • program text:表示程序文本段,这一段是只读段,也表示只读段指令数据;
  • intialized data (.data):表示初始化的数据,
  • unintialized data (.bss):表示没有初始化的数据;
  • runtime heap:根据实际的需要,不停的动态申请的空间称为堆内存
  • user stack:主要是用来存储本地变量的,函数运行时使用的变量;
  • Memory mapped region for shared libraries:程序运行时使用的动态库信息;
  • kernel code and data:内核代码和数据;
  • physical memory:表示物理内存;
  • process-specific data:进程特殊数据

    • 进程的状态
      进程管理
  • Ready:当获得所需要的资源后,就是可以执行的状态,
  • Excuting:程序执行状态,进程占据实际的CPU时长,正在运行的时间;
  • Uninterruptible:表示不可中断的睡眠,需要的资源没有满足,即使调度到CPU上面也没有意义;
  • Interruptible:可以中断的睡眠,指令执行完成,等待下一次执行的的中间时间;
  • Stopped:进程因为资源等原因,停止;
  • Zombie:表示僵死状态,表示僵尸进程,正常运行,并且结束,但是占据的内存不进行释放,是由于内核无法找到该进程所占用的资源的位置: 一种是可以回收的, 一种是不能进行回收的;

  • Linux的进程知识

  • CPU被某个进程占用时,网卡需要通信时,网卡上的芯片会向CPU发起DMA请求,CPU会立即终止当前进程,会开始处理网卡进程,将数据进行保存,然后比较进程之间的优先级关系,决定处理网卡进程还是以前正在处理的进程;当系统意外断电后,使用UPS电源时,内核会通知应用程序,进行系统保护,内核根据系统的优先级进行排队;

  • 任何一个进程都是Init的子进程;

  • 进程的优先级关系:
    • 进程是存在优先级关系的,进程的优先级0--->139,一共140个值,数值越小,进程的优先级越高,其中0--->99 :是由内核进行调整的, 100--->139:是用户可以进行控制的;
    • 进程的优先级越高:
      • 1.获得更多的CPU运行时间;
      • 2.更多获得运行机会;
      • 进程的nice:-20--->19,表示:100--->139,对于[普通用户仅仅可以调大自己的nice值,超级用户可以缩小进程的nice值;
  • 对于进程的PID号码是唯一的,即使进程退出,也不会被占用,对于/proc中的每一个目录对应的就是一个进程;
  • 进程号不一定是连续的,且每一个进程的PID是唯一的,即使进程已经结束,也不会释放,
    init进程的进程号永远为1,这里的文件,建议使用cat来查看;

  • 进程的查看

  • ps:
    • Process State:多种使用风格,System V风格(选项使用-引导),BSD风格;
    • -a:显示所有和终端有关的进程;
    • -u:用于显示是启动进程的用户,
    • -x:显示所有和终端无关的进程;
    • 进程可以分为和终端有关的进程:终端启动之后,会启动的进程;终端无关的进程:不登录用户就可以自动启动的进程;;
    • -e:显示所有线程;
    • -f:显示更加详细的信息;
    • []:表示是内核线程;
    • PRI:表示优先级;
    • -elF:
    • -o:用于指定显示那些字段,可以这样使用ps o pid,comm,ni;
  • ps输出信息的说明
    进程管理
    • USER:表示进程的用户;
    • PID:表示进程的PID号码;
    • %CPU:表示对于进程的占有率;
    • %MEM:表示进程对于内存的占有率;
    • STAT:
      • 表示进程状态
      • D:表示不可以中断的睡眠;
      • R:表示运行或者就绪;
      • S:表示可以中断的睡眠;
      • T:表示停止的进程;
      • <:表示高优先级的进程;
      • N:表示低优先级的进程;
      • l:表示多线程进程;
      • +:表示前台进程组中的进程,占据终端,从命令行输入;
      • s:表示会话进程的首进程;
  • ├─sshd───sshd───bash───pstree :这个进程被结束,所有的子进程都会被结束;
  • TTY:表示和哪个终端相关,表示是和终端无关的进程;
  • START:表示进程的启动时间;
  • TIME:表示运行时长,也就是占据CPU的时长;
  • COMMAND:表示哪个命令启动的进程;
  • 关于Mem的两个解释:
    • VSZ:的计算是包括共享库文件的大小的,包括栈数据和堆数据;
    • RSS:以上计算是不能包括共享库的也不包括可以被交换出去的空间,一般来说只有打开的文件可以被交换出去的,进程的指令,函数都是不能被交换出去的;
  • 关于CPU时长的两个解释:
    • 进程真正运行了多长时间;
    • 进程在CPU上面运行了多长时间
  • pstree :
  • 用于显示进程树;
    进程管理

  • pgrep:

  • 用于显示进程的相关信息,
  • -u:用于指定某个用户的相关信息,man文档写的还是很详细的;
Example 1: Find the process ID of the named daemon:

       unix$ pgrep -u root named
Example 2: Make syslog reread its configuration file:

       unix$ pkill -HUP syslogd

Example 3: Give detailed information on all xterm processes:

       unix$ ps -fp $(pgrep -d, -x xterm)

Example 4: Make all netscape processes run nicer:

       unix$ renice +4 ‘pgrep netscape‘
  • pidof:
    • find the process ID of a running program,主要用于查找进程的PID号码;
    • -s:用于只返回一个返回值pid;
  • top:
  • 按照进程使用资源的顺序来进行排序,按照一定的时间进行刷新;
  • display Linux tasks,
    进程管理
  • 13:21:23
    • 表示当前时间;
  • 23 min:
    • 表示运行时长,电脑启动到此刻的时长;
  • 1 users:
    • 表示登录系统的用户;
  • load average 0.00 0.00 0.00
    • 表示平均负载,三个数值表示平均队列长度,过去一分钟,五分钟,十五分钟的队列长度,长度越小CPU负载越低;
  • Tasks 72 total:
    • 表示一共包含72个进程
    • 1 running:表示两个运行状态;
    • 71 sleeping:表示71个睡眠进程
    • 0 stopped:表示处于Stopped进程的状态;
    • 0 zombie:表示处于僵尸状态的进程;
  • %Cpu(s) :
    • 默认显示的是多个CPU的平均值;按1可以显示多个CPU的使用情况;
    • 0.0% us : user用户空间的用户进程所占用的CPU的百分比;
    • 0.0% sy:system 内核空间的进程所占用的CPU的百分比;
    • 0.0% ni:nice调整nice值影响的CPU的比例;
    • 98.7% id:idoel表示空闲百分比;
    • 1.7% wa:wait:表示等待IO等各个进程所占的百分比;
    • 0.0% si:soft interrupt 表示软中断占据的CPU的百分比;
    • 0.0% st:stoled:表示被偷走的时间,虚拟化中有可能出现;
  • Mem:
    • 表示内存的使用情况:
      • 3762308 total:内存总数;
    • 146692 free:
      • 内存空闲数;
    • 1465452 used:
      • 内存已用数;
    • 2150164 buff/cache:
      • 表示缓冲,以及缓存;
  • swap :
    • 表示交换空间使用;
    • 821244 total:swap总数
    • 3004 free:swap使用的:
    • 1845364 avail Mem:swap可用的Mem;
  • PID:表示进程PID
  • USER:表示进程属主;
  • PR:表示进程优先级,RT:表示实时优先级;
  • NI:表示进程NICE值;
  • RES:表示进程的常驻内存集合;
  • SHR:表示共享内存的大小;
  • S:表示进程状态;
  • %CPU:CPU占用率;
  • %MEM:内存占用率;
  • TIME+:使用CPU的时长;
  • COMMAND:执行进程的命令;

  • top支持的交互式命令:

    • M:表示按照进程的内存占用率来进行排序的;;
    • P:表示按照CPU占用率的百分比进行排序;
    • T:表示按照累计时间进行排序
    • l:表示是否显示平均负载和启动时间;
    • t:是否显示进程和CPU状态相关信息;
    • m:表示是否显示内存信息;
    • c:是否显示完整的命令行信息;
    • q:表示退出top;
    • k:表示终止某个进程;
    • -d:用于指定刷新时长的;
    • -b:表示按照批处理模式进行刷新的;
    • -n #:表示显示多少批之后自动进行退出;
  • Linux支持的信号,以及常见一个信号的含义:
 1) SIGHUP   2) SIGINT   3) SIGQUIT  4) SIGILL   5) SIGTRAP
 6) SIGABRT  7) SIGBUS   8) SIGFPE   9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG  24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF 28) SIGWINCH    29) SIGIO   30) SIGPWR
31) SIGSYS  34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX    
  • 1.SIGHUP:表示进程不用重启,就可以重新读取配置文件,并让新的配置文件生效;
  • 2.SIGINT:表示中断,Ctrl+C表示中断一个前台进程;
  • 9.SIGKILL:表示立即杀死一个前台进程,表示强行杀死,容易损坏文件;
  • 15.SIGTERM:终止一个进程,提供时间处理子进程以及打开的资源等信息,这个是默认信号;
  • 给进程发送信号的方式:
    • 使用信号号码:kill -#;
    • 使用信号名称:kill -SIGKILL;
    • 信号名称的简写:kill -KILL;
  • killall:
    • 可以跟进程名,用于杀死一批进程;
  • 关于进程nice值的调整
  • 如果进程已经启动起来,使用renice值:renice Ni PID;
[root@server23 ~]#  pidof crond
1068
[root@server23 ~]# renice 3 1068
1068: old priority 0, new priority 3
[root@server23 ~]# renice -3 1068
1068: old priority 3, new priority -3
  • 在启动时,指定Nice
nice -n NI COMMAND
nice -n -3 ls
  • 进程前台和后台
  • 前台作业:占据了命令提示符;
  • 后台作业:启动之后,释放命令提示符,后符操作在系统的后台完成;
  • 进程由前台到后台COMMADN &将命令执行到后台,释放前台的资源;
  • 前台到后台的切换:
    • Ctrl+z:示将已经在前台的作业送完后台;
    • COMMAND &:表示让命令在后台执行;
    • fg用于降进程从后台移动到前台运行;
    • bg:后台的停止作业继续运行;
    • jobs:用于查看后台的所有作业,显示的号码是不同于进程号的;
      • +:表示默认被操作的作业;
      • -:命令将第二个被操作的作业;
  • 如果需要通过这种方式来终止某个进程,使用kill %jobsID,可以结束进程作业号码对应的进程;
  • vmstat:
  • 表示系统状态查看命令;
    进程管理
  • procs:
    • r:表示运行队列长度;
    • b:表示阻塞队列长度;
  • memory :
    • swapd:表示交换的大小;
    • free:表示空闲内存的大小;
    • buff:表示缓冲的大小;
    • cache:表示用于缓存的大小;
  • swap:
    • swapin :表示交换进入磁盘空间的;
    • swapon:表示交换出去的;
  • io :
    • blockin:表示磁盘块调入内存;
    • blockout:表示磁盘块调出内存;
  • system:
    • in:interput表示中断的个数;
    • cs :context switch:表示上下文切换的次数;
  • CPU :
    • us:用户空间占据的CPU百分比;
    • sy:内核空间占据的CPU百分比;
    • id:表示空闲百分比;
    • wa:表示等待IO;
    • st:表示被偷走的CPU资源;
  • uptime:
    • 用于显示top命令的第一行;
  • 如果需要查看某个进程具体的信息,首先得到进程的Pid,然后进入/proc 目录里面,进入对应的进程号码,可以得到对应的详细的信息;