linux 浅析进程

一:理论知识

1:在了解linux进程之前,我们先来了解了解shell脚本在执行命令的过程,

shell也是一个程序,它与其他程
序最大的不同是:它的目的是执行其他程序,而不是从事计算,绘图,存储等等具体事务。分析一下shell的工作原理有助于破除shell的神秘感,更好的
掌握shell命令。以ls -l *.c 为例

  • 1、shell不断询问是否有键盘输入,用户以enter结束键盘输入后,shell程序以空格为分隔符,得到"ls","-l","*.c",三个字符串。
  • 2、
    shell发现第三个字符串包含"*"通配符,就会在当前路径(或指定路径)下搜索满足这个通配符的文件。有bar.c和foo.c两个文件,然后展开成
    {"ls","-l","bar.c","foo.c"}四个字符串,并保存在argv这个二维字符数组中,并赋值argc为4。
  • 3、
    shell然后搜索PATH这个全局变量保存的路径,寻找一个叫"ls"的命令。如果存在,则fork()一个子进程,调用exec()加载运行ls命
    令。ls的main(int argc, string ** argv)函数的参数就是从shell那里得来的。若不存在就会提示用户"command
    not found"。
  • 4、ls程序执行后,会分析argc和argv,"-l"表示这是一个选项开关,表明用户想得到文件的详细信息,并把这个开关量保存,以便最后输出的时候选择信息的格式。
  • 5、ls执行完既定的步骤后,退出并返回退出码,若成功则返回0,否则根据错误的不同返回不同的非零数字。
  • 6、shell在得到成功退出码后,继续等待用户输入

参考hjx5200的文档

如上:命令在执行过程中,
命令-->二进制文件--->运行---->作相应的加载--->得出结论   在此过程中,所记录的东西会产生进程;

2.进程:系统没有干完的活  即cpu未完成的工作,正在运行的程序  类型:程序进程/服务进程(eg:apache)常驻在内存中  一个程序运行时至少产生一个进程

在内核看来,进程是一个个实体,内核必须在它们之间共享各种计算机资源。对于像内存这样的受限资源来说,内核一开始会为进程分配一定数量的资源,并在进程的生命周期内,统筹该进程和整个系统对资源的需求,对这一分配进行调整。程序终止时,内核会释放所有此类资源,供其他进程重新使用。其他资源(如
CPU、网络带宽等)等属于可再生资源,但必须在所有进程间平等共享。

3.进程管理的作用:
判断服务器的健康状态
查看系统中的所有进程
杀死进程

4:进程的内存布局

逻辑上将一个进程划分为以下几个部分(也称为段)

文本 :程序的指令。

数据 :程序使用的静态变量。

堆     :程序可从该区域动态分配额外内存。

栈     :随机数调用、返回而增减的一片内存,用于为局部变量和函数调用链接信息分配存储空间。

5:创建进程和执行程序

进程可使用系统调用fork()来创建一个新进程。调用fork()的进程被称为父进程,新创建的进程则被称为子进程。内核通过对父进程的复制来创
建子进程。子进程从父进程处继承数据段、栈段以及堆段的副本后,可以修改这些内容,不会影响父进程的“原版”内容。(在内存中被标记为只读的程序文本段则
由父、子进程共享)

然后,子进程要么去执行与父进程共享代码中的另一组不同函数,或者,更为常见的情况是使用系统调用execve()去加载并执行一个全新程序。execve()会销毁现有的文本段、数据段、栈段及堆段,并根据新程序的代码,创建新段来替换它们。

6:进程ID和父进程ID

每一进程都有一个唯一的整数型进程标识符(PID).此外,每一进程还具有一个父进程标识符(PPID)属性,用以标识请求内核创建自己的进程。

7:进程终止和终止状态

可使用以下两种方式之一来终止一个进程:其一,进程可使用_exit(
)系统调用(或相关的exit()库函数),请求退出;其二,向进程传递信号,将其"杀死”。无论以何种方式退出,进程都会生成“终止状态”,一个非负小
整数,可供父进程的wait()系统调用检测。在调用_exit()的情况下,进程会指明自己的终止状态。若由信号来“杀死”进程,则会根据导致进程“死
亡”的信号类型来设置进程的终止状态。(有时会将传递进_exit()的参数称为进程的“退出状态”,以示与终止状态有所不同,后者要第指传递给
_exit()的参数值,要么表示“杀死”进程的信号。)

根据 惯例,终止状态为0表示进程“功成身退”,非0则表示有错误发生。大多数shell会将前一执行程序的终止状态保存于shell变量$?中。

二:进程的状态

1:system Monitor(命令打开:)中状态:status:1:sleeping(要使用时可以被唤醒)  
                                                                                      2:running
                                                                                      3:stop(不可以自动唤醒 可以手动唤醒,cpu可以将此处所使用的信息传递给进程)

2.状态切换:系统回收cpu上缓存信息资源/使用某些程序

3.系统资源:硬盘 cpu 内存    
cpu一级缓存(直接可以用)

二级缓存

内存(需要去取)如果内存中资源被回收,则进程关闭

4:ps 默认查看所处shell处产生的进程

三:进程所涉及的一些命令

####1.ps命令####
ps
    a    ##关于当前环境的所有进程
    x    ##与当前环境无关的所有进程
    f    ##显示进程从属关系
    e    ##显示进程调用环境工具的详细信息
    l    ##长列表显示进程的详细信息
    u    ##显示进程的用户信息

加-和不加-的区别:
ps aux   #查看系统中所有进程,使用BSD操作系统格式
ps -le   #    查看系统中所有进程 ,使用linux操作格式

ps aux

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
user:该进程由哪个用户产生
pid:进程的id号
%cpu:该进程占用cpu资源的百分比
%mem:该进程占有物理内存百分比
VSZ:该进程占用虚拟内存的大小
RSS:该进程占用实际内存的大小
tty:该进程在哪个终端进行tty1-tty7代表本地控制台,pts/0-255代表虚拟终端
状态:

R:运行
S:睡眠
T:停止状态
s:包含子进程
+:位于后台

ps ax -o %cpu,%mem,user,group,comm,nice,pid    ##指定显示进程的某些信息
%cpu    ##显示进程cpu负载
%mem    ##显示进程内存负载
user    ##进程用户
group    ##进程组
comm    ##进程名称
nice    ##进程优先级
pid    ##进程的id

ps ax -o %cpu,comm --sort <+|-%cpu > <+|-%mem>    ##按照进程信息排序
+    ##正序
-    ##倒序
%cpu    ##cpu负载排序
%mem    ##内存负载
####2.环境中进程的前后台调用####
jobs        ##查看被打入环境后台的进程
ctrl+z        ##把占用终端的进程打入后台
fg        ##把后台进程调回前台
bg        ##把后台暂停的进程运行
comm &        ##让命令直接在后台运行
###7.top命令####
top        ##监控系统负载工具

top 和 ps 区别
##ps看到的是命令执行瞬间的进程信息,top可以持续的监视
##ps只是查看进程,而top还可以监控系统性能,如平均负载,cpu,内存
##top可以直接操作进程,如改变优先级(命令r)和关闭进程(命令k)

时间: 2024-11-01 21:59:39

linux 浅析进程的相关文章

浅析Linux计算机进程地址空间与内核装载ELF

简介: 本文基于Linux?系统对进程创建与加载进行分析,文中实现了Linux库函数fork.exec,剖析内核态执行过程,并进一步展示进程创建过程中进程控制块字段变化信息及ELF文件加载过程. 一.初识Linux进程                                                                                                                                            

转:linux守护进程的启动方法

Linux 守护进程的启动方法 作者: 阮一峰 日期: 2016年2月28日 "守护进程"(daemon)就是一直在后台运行的进程(daemon). 本文介绍如何将一个 Web 应用,启动为守护进程. 一.问题的由来 Web应用写好后,下一件事就是启动,让它一直在后台运行. 这并不容易.举例来说,下面是一个最简单的Node应用server.js,只有6行. var http = require('http'); http.createServer(function(req, res)

Linux之进程管理及Shell脚本

使用!来调用过往命令 !! 重复执行上一条指令 !a 重复执行上一条以a为首的指令 !nubmer 重复执行上一条在history表中记录号码为number的指令 !-number重复执行前第number条指令 ailas abc='cd xxxxxxxxxxx/xxxxxxxx/xxxxxxxxxxxxx' unalias abc " "将一串字符当成字符串来看,可以转译特殊字符 ' '将一串字符当成字符串来看,无法转译特殊字符 ·能够返回命令执行的结果 echo `uname -a

linux守护进程

#include <iostream>#include <unistd.h>//#include "curl/curl.h"#include "app_curl.h"#include "youtube_package.h"#include "CAutoMail.h"#include <fcntl.h>#include <signal.h>#include <unistd.h

C#开发Linux守护进程

C#开发Linux守护进程 Linux守护进程是Linux的后台服务进程,相当于Windows服务,对于为Linux开发服务程序的朋友来说,Linux守护进程相关技术是必不可少的,因为这个技术不仅仅是为了开发守护进程,还可以拓展到多进程,父子进程文件描述符共享,父子进程通讯.控制等方面,是实现Linux大型服务的基础技术之一. 去年我也曾写了一篇关于守护进程的帖子,名字叫<.NET跨平台实践:用C#开发Linux守护进程>,这篇文章的的确确实现了一个Daemon,不过,它有一个弱点,不能运行多

.NET跨平台实践:用C#开发Linux守护进程

Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作. 一句话,为Linux开发与控制台无关的,需要在后台长时间不间断运行的“服务程序”,Daemon技术是非常重要的. Daemon程序一般用c/c++开发.不过,我今天要讲的,不是怎么用c/c++开发daemon,而是用C#! 一,创建Daemon程序: 用VS新建一个控制台项目,假设名称是MyDaemon,输入下

Linux 守护进程和超级守护进程(xinetd)

一 .Linux守护进程 Linux 服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户.提供这些服务的程序是由运行在后台的守护进程来执行的. 守护进程是生存期长的一种进程.它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件.他们常常在系统引导装入时启动,在系统关闭时终止. linux系统有很多守护进程,大多数服务器都是用守护进程实现的.同时,守护进程完成许多系统任务,比如,作 业规划进程crond.打印进程lqd等.有

Linux内核------进程的基本知识

进程: 传统上,Linux操作系统下运行的应用程序,服务器和其他程序都称为进程.当然进程不仅仅表示一段处于执行期的可执行代码,还包括其他资源,例如打开的文件,挂起的信号和内核内部数据等.其实还有个概念叫,线程或者说轻量级进程,不过在Linux中线程和进程其实是类似的.可以把线程看做和其他进程共享某些数据和资源的进程. 进程的表示: 通常进程是由一个叫task_struct的结构表示的,或者叫进程描述符(process descriptor).它包含了内核管理进程的所有信息.task_struct

Linux基础--进程管理相关命令介绍(2)

本文主要介绍了Linux中进程管理的相关命令,涉及到的主要命令有top,vmstat等. (1)top ①功能:用来查看CPU,内存以及进程的状态. ②用例: ③相关注释: load average表示负载,三个数值分别表示第1分钟,第5分钟,第10分钟 Cpu中us表示用户空间程序占用百分比,sy表示内核模式占用百分比,ni表示调整NICE值所占用的    CPU百分比,id表示CPU的空闲比例,wa表示等待磁盘IO完成所占用的时间比例,hi表示硬件中断占     据的百分比,si表示软中断所