linux中adrtd是什么进程,Linux 进程

0.基本知识:

程序是适合计算机处理的一系列的指令。默认为静态程序。

微观上串行,而宏观上并行的程序被称为并发程序。是逻辑上的并行,具备动态性、制约性、并发性三个特色。

并发程序的存在是进程产生的直接缘由,通常状况下进程存在于多道程序环境中,是操做系统直接处理的

实体。

1. 进程是什么

进程(process)的概念最先是由美国麻省理工学院的 J.H.Sallexer 于1966年提出的,是现代操做系统最基本、最重要的概念。进程的引入很好的描述了程序的执行过程和并发行为。

定义:

进程是并发程序的一次执行过程,进程是具备必定独立功能的程序关于某个数据集合的一次运行过程。

进程的本质:

1.进程的存在必然须要程序的存在。进程和程序不是一一对应的。

2.进程是系统中独立存在的实体。 它对应特殊的描述结构并有申请、使用、释放资源的资格。

3.进程的并发特性经过对资源的竞争来体现,进程的动态特性经过状态来描述。进程的逻辑形态和物理形态不一样,逻辑上进程只不过是一系列信息的说明,物理上却占用着系统的各类资源。

4.进程和数据相关,但它不是数据,在它的存在过程当中要对数据进行处理。

进程做为构成系统的基本细胞,不只是

系统内部独立运行的实体,并且是

独立竞争资源的基本实体。

进程既然是运行中的

程序,则一定

有0它的

开始和

结束。对于Linux系统来讲,新进程由fork()与execve()等系统调用开始,而后执行,直到它们下达exit()系统调用为止。在这里,fork()、execve()、exit()都是linux提供给C语言的控制进程的接口。

Linux是一个多用户多任务的操做系统。多用户是指

多个用户能够在同一时间使用同一个linux系统;多任务是指在Linux下能够

同时执行多个任务,更详细的说,linux采用了分时管理的方法,全部的任务都放在一个队列中,操做系统根据每一个任务的优先级为每一个任务分配合适的时间片,每一个时间片很短,用户根本感受不到是多个任务在运行,从而使全部的任务共同分享系统资源,所以linux能够在一个任务还未执行完时,暂时挂起此任务,又去执行另外一个任务,过一段时间之后再回来处理这个任务,直到这个任务完成,才从任务队列中去除。

进程之间的切换:CPU在一个时间点只能处理一个进程,多个进程时,CPU的作法是先用极短的时间处理一个进程,而后将这个进程搁置,将CPU的资源让给其余进程执行。这个极短的时间称为时间片。时间片很短(一般只有几微秒),而且切换很迅速。

关于时间片的调度,在操做系统内核中,有个模块称之为

调度器(scheduler),它负责

管理进程的执行和切换。调度算法会根据进程的优先级决定哪一个进程去执行。Linux的进程都有优先级,nice和renice命令能够调整进程的优先级。

2.进程的分类

按照

进程的功能和运行的程序分类,进程可划分为

两大类:

(1)

系统进程:完成操做系统功能的进程成为系统进程。能够执行内存资源分配和进程切换等管理工做;并且,此类进程的运行不受用户的干预,即便是root用户也不能干预系统进程的运行。

(2)

用户进程:完成用户功能的进程成为用户进程。 经过

执行用户程序、应用程序或内核以外的系统程序而产生的进程,此类进程能够在用户的控制下运行或关闭。

针对用户进程,又能够分为交互进程、批处理进程和守护进程三类。

-

交互进程:由一个shell终端启动的进程,在执行过程当中,须要与用户进行交互操做,能够运行于前台,也能够运行在后台。

linux操做系统中,有一种特殊的进程称为终端进程,这是系统为每个终端机所创建的进程,当用户经过终或者端机访问主机时,

系统就是在这个终端进程的控制下运行的。 用户经过命令或者其余形式要求计算机完成必定的工做时,终端进程就将这些命令生成一些新的子进程让其独立并发的运行,运行完毕后又被终端进程撤销。

-

批处理进程:该进程是一个

进程集合,

负责按顺序启动其余的进程。此类进程没必要与用户交互, 所以常常在后台运行. 由于这样的进程没必要很快响应, 所以常受到调度程序的怠慢。

- 守护进程:守护进程是一直运行的一种进程,常常在linux系统启动时启动,在系统关闭时终止。它们独立于控制终端而且周期性的执行某种任务或等待处理某些发生的事件。例如httpd进程,一直处于运行状态,等待用户的访问。还有常常用的crond进程,这个进程相似与windows的计划任务,能够周期性的执行用户设定的某些任务。

3. 建立进程

fork()函数是Linux下产生新进程的系统调用,fork意即“分叉”,用来描述: 一个进程在运行中,若是使用了fork()函数,就产生了另外一个进程,因而进程就“分叉”了。

本系统调用产生一个新的进程,叫子进程,调用进程叫父进程。

4. 查看进程

在Linux系统中,除了第一个进程(0号进程),其余进程都会有一个或多个子进程,因此进程是树形结构(pstree查看)。

进程编号 0 一般被称为kernel、sched或swapper,而进程编号 1  称为init。 init 是全部进程的父进程或祖先进程。

在系统中,对于过早消亡(die)的进程,它的父进程会被从新指定为init。

在关机时,进程的退出是根据ID由大到小的顺序依次执行,init进程结束后,系统便终止。

PS(process status) 命令用于查看系统正在运行的进程。(某一个时间点上)

ps aux (FreeBSD风格)  ps -elf(System V)风格

ps 命令说明:

USER进程的拥有者

PID进程的ID值。进程的ID值自0开始,每遇到一个新进程就加一。

PPID父进程的ID。

%CPU进程占用CPU百分比。

%MEM占用内存的百分比。

VSZ进程占用的虚拟内存大小(bytes字节(包含code+data+stack) )

WCHAN正在等待的进程资源

NI进程的nice值,优先级。(优先级的范围是从-20(最大优先级)到19(最小优先级)。)

RSS驻留内存集

TTY终端ID

STAT进程状态

START进程启动的时间

TIME进程消耗CPU的时间

COMMAND进程名称和参数

stat显示的进程状态信息:

D不可中断的睡眠状态(一般是I/O进程),收到信号不会被唤醒。

R正在运行的或运行队列中等待的(可运行)

S可中断睡眠状态(休眠中,受阻。在等待中断的到来或某个信号均可以将其唤醒转换到就绪状态)

T暂停状态,当进程收到SIGSTOP、SIGTSTP、SIGTTIN或SIGTTOU时,就会进入暂停状态。

W进入内存交换(从内核2.6开始无效)

X死掉的进程

Z僵尸进程,进程已终止,但进程描述符存在,直到父进程调用wait()系统调用后释放

N优先级低的进程

L有些页被锁进内存(实时和定制的IO)

s进程的领导者(在它之下有子进程)

l多线程进程(使用CLONE_THREAD函数创造)

+位于后台的进程

- top 系统实时进程信息

top详解链接:

5. 进程的属性

一个进程是一个程序的一次执行过程(有开始有结束),程序是静态的,它是保存在磁盘上的可执行代码和数据集合,进程是一个动态的概念。

程序是一个进程指令的集合,它能够启用一个或多个进程,同时,程序只占用磁盘空间,而不占用系统运行资源,而进程仅仅占用系统内存空间,是动态的、可变的,关闭进程,占用的内存资源随之释放。

一个进程由以下元素构成:

- 程序的读取上下文,它表示程序读取执行的状态。

- 程序

当前的执行目录

- 程序服务的文件和目录

- 程序的访问权限

- 内存和其它分配给进程的

系统资源

Linux一个进程在内存中由3部分数据:

数据段、堆栈段、代码段。

- 代码段: 存放了程序代码的数据。(多个进程运行同一个程序时使用同一个代码段)

- 数据段: 存放程序的

全局变量、常数及动态分配的数据空间。

- 堆栈段: 存放子程序的

返回地址、

子程序的参数及程序的局部变量。堆栈段包括在

进程控制块(Process Control Block)中。

PCB处于进程核心堆栈的底部,无需额外分配空间。

6.Linux 系统的进程状态:

用户状态    进程在用户状态下运行的状态(进程在执行用户本身的代码)

内核状态    进程在内核状态下运行的状态(进程在内核代码中运行)

内存中

就绪  进程没有执行,但处于就绪状态,只要内核调度它,就能够执行

内存中

睡眠  进程正在睡眠,而且进程存储在内存中,尚未被交换到swap

就绪且换入  进程处于就绪状态,可是必须把它换入内存,内核才能再次

调度它运行

睡眠且换出  进程正在睡眠,且被换出内存

被抢先

进程从内核状态返回用户状态时,内核抢先它作了上下文切换,调度了另外一个进程,原先那个进程就处于被抢先状态。(在内核状态下的进程不能被其余进程抢占)

建立状态    进程刚被建立。该进程存在,但既不是就绪状态,也不是睡眠状态。这个状态是除了进程0之外的全部进程的最初状态。

僵死状态(zombie) 进程调用exit结束,

进程再也不存在,可是进程表项中仍有记录(进程描述符存在),该记录可由父进程收集。

一个进程在其生存周期内,处于一组不一样的状态下,称为进程状态。进程状态保存在进程任务结构的state字段中。

fab91f9da6cc037d4a30df5a8552d1e7.png        

0b3b367fe66e402b97835fac.html

解释:

运行状态(TASK_RUNNING)

指进程正在被CPU执行,或者已经准备就绪(在运行队列中等待,没有被CPU执行,也称为就绪运行状态),随时可由调度程序执行,则称该进程处于运行状态(running)。该状态下有三种状况:用户运行态、内核运行态、就绪态。

- 就绪态:当系统资源已经可用时,进程就被唤醒而进入准备运行状态。

可中断睡眠状态(TASK_INTERRUPTIBIE)

进程正在等待系统资源的一种状态,称其处于睡眠等待状态。可中断睡眠状态是指能够被中断的睡眠等待状态。当系统产生一个中断或者释放了进程正在等待的资源时,或者进程收到一个信号,

均可以唤醒进程转换到就绪状态(可运行状态)。

不可中断睡眠状态(TASK_UNINTERRUPTIBIE)

指不能够被中断的睡眠等待状态,不能够被收到的信号唤醒,只有被wake_up()函数唤醒时,才能够转换到可运行的就绪状态。处在该状态下的进程一般须要不受干扰的等待,或者所等待的事件很快发生。

暂停状态(TASK_STOPPED)

当进程收到信号

SIGSTOP、SIGTSTP、SIGTTIN或SIGTTOU时,就会进入暂停状态。能够向其发送SIGCONT信号,让进程转换

到可运行状态。

僵死状态(TASK_ZOMBIE)

进程已经中止,但其父进程尚未调用wait()询问其状态的进程处于僵死状态。(僵死进程的

任务数据结构信息(PCB信息)还须要保留着,一旦父进程调用wait(),取得其信息,这些数据结构信息就会被释放。)

7.进程的切换:

当一个进程的时间片用完时,系统就会使用

调度程序强制切换到其余的进程去执行。

当进程在

内核态执行时,

须要等待系统的某个资源时,此进程就会调用 sleep_on() 或 interruptible_sleep_on()就进入睡眠状态(

TASK_INTERRUPTIBIE 或

TASK_UN

INTERRUPTIBIE

),自愿放弃CPU的使用权,而让调度程序去执行其余进程。

只有当进程从 “内核运行态” 转移到 “睡眠状 态” 时,内核才会进行

进程切换操做。

在内核态下运行的进程不能被其它进程抢占,并且一个进程不能改变另外一个进程的状态。为了不进程切换时形成的内核数据错误,内核在执行临界区代码时会禁止一切中断。

8.linux 进程与任务调度

Linux提供了许多系统调用函数,用于对进程进行控制,如fork()函数,建立一个新进程; wait()函数,进程等待;exit()函数,进程的自我终止;kill()函数,进程删除;getpid()函数,获取进程的ID;getppid()函数,获取进程之父进程ID等。 这些原语均可以在Linux提供给用户的界面shell上运行。 另外,在Linux中,还有前台进程和后台进程的概念。

在Linux系统中,每一个进程都有一个进程号(PID),用于系统识别和

调度进程。

启动一个进程有两个主要途径:

手工启动 和 调度启动。

- 调度启动是事先设置,根据用户要求自行启动。

- 手工启动进程是由用户输入命令,直接启动一个进程。

手工启动的进程分两种:前台进程 和 后台进程。

(1)前台进程:指运行时在标准输出设备上能看见其运行结果的进程,通常运行单挑命令时,多采用前台方式。

shell执行前台进程的格式: command

对于前台启动的进程,shell会等待进程执行完毕。

(2)后台进程:指运行时看不见运行结果的进程。

shell执行前台进程的格式: command &

对于前台启动的进程,shell并不等待进程执行完毕。

先后台进程调度:

终止进程:

-前台:Ctrl+c

-后台:kill(向内核发送一个系统操做信号和进程的PID,而后内核就能够中止该进程)

前台进程转后台:

Ctrl+z  暂停进程,而后 bg 命令,将

当前进程转入后台

后台转前台:

fg (将

当前进程转入前台)

多个后台进程的调度方法:

shell 中有两个以上的后台进程同时运行,须要用到 jobs 命令,将一个特定的后台进程带到前台。

jobs 命令是用来判断全部被挂起(中止)的进程、后台做业进程号,以及哪个是当前进程。

[root@web1~]#jobs # 列出当前被挂起的进程&后台进程

[1]Stoppedsleep101

[2]Stoppedsleep102

[3]-Stoppedsleep103

[4]+Stoppedsleep104

[root@web1 ~]# bg # bg 将当前进程(+标识)带入后台

[4]+ sleep 104 &

[4] Done sleep 104

[root@web1~]#jobs-l # 第二列为PID

[1]21224中止sleep101

[2]21225中止sleep102

[3]-21226中止sleep103

[4]+21235中止sleep104

[root@web1~]#bg%2 # 将做业号为2的进程带入后台

[2]sleep102&

[root@web1~]#jobs

[1]Stoppedsleep101

[2]Donesleep102

[3]-Stoppedsleep103

[4]+Stoppedsleep104

[root@web1 ~]# bg %1 %2 %3

[1] sleep 100 &

[2] sleep 101 &

[3]- sleep 102 &

[root@web1 ~]# jobs

[1] Running sleep 100 &

[2] Running sleep 101 &

[3]- Running sleep 102 &

[4]+ Stopped sleep 103

jobs  显示当前会话的做业状态

输出四列:

+ 标志当前进程

- 标志前一个进程

3745ad721cc4fe07422fc9e6d5460056.png

93cfb3b828cee6bde0d37322b518c566.png

0b3b367fe66e402b97835fac.html

0b3b367fe66e402b97835fac.html

bg 默认将当前进程带入后台

eg.

bg%n1%n2%n2将指定做业号的进程带入后台

kill%n终止指定做业号的进程

做业号能够与 wait fg kill bg 等命令一块儿使用,只要在做业号前加上%前缀。

Linux 的任务调度方式:

crontab 和 at

crontab是调度重复性的系统任务;at是在特定时间调用单个系统任务。

9. 利用 pstree 监控系统进程

pstree 命令以树形结构显示程序和进程之间的关系,使用格式以下:

pstree [-a|-c|-n|-p|-u|-l] [-h|-H 进程号]

[进程号 | 用户]

Childthreads of a process are found under the parent process and are shown with the process nameincurly braces(花括号).

e.g.

icecast2---13*[{icecast2}]

显示进程树。

-a显示命令行参数,即显示启动每一个进程对应的完整指令,包含启动进程的路径、参数等等。

-c不压缩雷同的子树,即显示父进程和子进程(若是存在的话)

-h高亮显示当前进程及其祖先

-H进程号高亮显示"进程号"指定的进程当及其祖先

-l不截断长行

-n输出按进程号排序

-p显示进程号;隐含 -c

-u显示进程对应的用户名

进程号从指定的"进程号"开始显示进程树,缺省是1(init)

用户仅显示从该"用户"的进程开始的进程树

pstree清楚的显示了程序和进程之间的关系,若是不指定进程的PID号,或者不指定用户名称,则将以init进程为根进程,显示系统的全部程序和进程信息,若指定用户或PID,则将以用户或PID为根进程,显示用户或PID对应的全部程序和进程。

[root@web1~]#pstree-h

init─┬─ManagementAgent───2*[{ManagementAgen}]

├─VGAuthService

├─atd

├─crond

├─dnsmasq

├─httpd───5*[httpd]

├─ksmtuned───sleep

├─libvirtd───10*[{libvirtd}]

├─6*[mingetty]

├─mysqld_safe───mysqld───9*[{mysqld}]

├─named───4*[{named}]

├─pure-ftpd

├─rpc.idmapd

├─rpc.mountd

├─rpc.rquotad

├─rpcbind

├─rsyslogd───3*[{rsyslogd}]

├─smbd───smbd

├─sshd───sshd───bash───pstree

├─udevd───2*[udevd]

├─vmtoolsd───{vmtoolsd}

├─vmware-vmblock-───3*[{vmware-vmblock}]

└─vsftpd

例如:

(1)若是想知道

某个用户都启动了那些进程的话,pstree 用户名  就能够实现:

[root@web1~]#pstree mysql // 显示mysql用户启动了那些进程

mysqld───9*[{mysqld}] // 输出显示 mysqld 进程拥有9个子进程

详细的包含子进程的信息以下:

[root@web1~]#pstree-c-p mysql // 包含进程号,31265 下面工 9 个 子进程

mysqld(31265)─┬─{mysqld}(31267)

├─{mysqld}(31268)

├─{mysqld}(31269)

├─{mysqld}(31270)

├─{mysqld}(31274)

├─{mysqld}(31275)

├─{mysqld}(31276)

├─{mysqld}(31277)

└─{mysqld}(31278)

(2) 也能够经过指定的PID查看对应的进程信息。

[root@web1~]#pstree31747-c-p

httpd(31747)─┬─httpd(31748)

├─httpd(31749)

├─httpd(31750)

├─httpd(31751)

└─httpd(31752)

(3) 显示启动时的参数等信息

[root@web1~]#pstree31747-a-c-p

httpd,31747-k start

├─httpd,31748-k start

├─httpd,31749-k start

├─httpd,31750-k start

├─httpd,31751-k start

└─httpd,31752-k start

10. 经过 lsof 监控系统进程

lsof - list open files

lsof全名list opene files,也就是列举系统中已经被打开的文件,

经过lsof,咱们就能够根据文件找到对应的进程信息,也能够根据进程信息找到进程打开的文件。

lsof指令功能强大,这里介绍“-c,-g,-p,-i”这四个最经常使用参数的使用。更详细的介绍请参看man lsof。

(1)

lsof filename  显示使用filename文件的进程

若是想知道某个特定文件有那个进程使用,能够用  lsof filename 方式获得,例如:

[root@web1~]#lsof/var/log/messages

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

rsyslogd1461root1wREG8,3321741948875/var/log/messages

能够得知,/var/log/messages文件是由 进程rsyslogd在使用

(2)

lsof -c 进程名  显示进程如今打开的文件

例如:

[root@web1~]#lsof-c mysqld|head-10

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

mysqld_sa31149root cwd DIR8,34096815718/usr/local/mysql

mysqld_sa31149root rtd DIR8,340962/

mysqld_sa31149root txt REG8,3904872130567/bin/bash

mysqld_sa31149root mem REG8,399154480786050/usr/lib/locale/locale-archive

mysqld_sa31149root mem REG8,31921176652830/lib64/libc-2.12.so

mysqld_sa31149root mem REG8,319536652836/lib64/libdl-2.12.so

mysqld_sa31149root mem REG8,3135896652872/lib64/libtinfo.so.5.7

mysqld_sa31149root mem REG8,3154528652823/lib64/ld-2.12.so

mysqld_sa31149root mem REG8,326060786308/usr/lib64/gconv/gconv-modules.cache

上例显示了mysqld进程打开的文件信息,

FD列表显示

文件描述符,

TYPE列显示

文件的类型,

SIZE列显示

文件的大小,

NODE列显示

本地文件的node码,

NAME列显示

文件的全路径或挂载点。

(3)

lsof -g 进程号  显示指定的进程组打开的文件状况

例如:

[root@web1~]#lsof-g31747|head-10

COMMAND PID PGID USER FD TYPE DEVICE SIZE/OFF NODE NAME

httpd3174731747root cwd DIR8,340962/

httpd3174731747root rtd DIR8,340962/

httpd3174731747root txt REG8,32130662949131/usr/local/apache2/bin/httpd

httpd3174731747root mem REG8,31857772923397/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/mongo.so

httpd3174731747root mem REG8,31463666948869/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/redis.so

httpd3174731747root mem REG8,399154480786050/usr/lib/locale/locale-archive

httpd3174731747root mem REG8,365928652846/lib64/libnss_files-2.12.so

httpd3174731747root mem REG8,3122040652904/lib64/libselinux.so.1

httpd3174731747root mem REG8,3110960652856/lib64/libresolv-2.12.so

....

....

httpd 31752 31747 daemon mem REG 8,3 183080 652944 /lib64/libpcre.so.0.0.1

httpd 31752 31747 daemon mem REG 8,3 596272 652838 /lib64/libm-2.12.so

httpd 31752 31747 daemon mem REG 8,3 154528 652823 /lib64/ld-2.12.so

httpd 31752 31747 daemon DEL REG 0,4 261274 /dev/zero

httpd 31752 31747 daemon 0r CHR 1,3 0t0 4549 /dev/null

httpd 31752 31747 daemon 1w CHR 1,3 0t0 4549 /dev/null

httpd 31752 31747 daemon 2w REG 8,3 7375 951180 /usr/local/apache2/logs/error_log

httpd 31752 31747 daemon 3u sock 0,6 0t0 261254 can't identify protocol

httpd 31752 31747 daemon 4u IPv6 261255 0t0 TCP *:http (LISTEN)

httpd 31752 31747 daemon 5r FIFO 0,8 0t0 261270 pipe

httpd 31752 31747 daemon 6w FIFO 0,8 0t0 261270 pipe

httpd 31752 31747 daemon 7w REG 8,3 4877 951374 /usr/local/apache2/logs/dummy-hos t.example.com-error_log

httpd 31752 31747 daemon 8w REG 8,3 1997 951181 /usr/local/apache2/logs/access_lo g

httpd 31752 31747 daemon 9w REG 8,3 3482 951777 /usr/local/apache2/logs/dummy-hos t.example.com-access_log

httpd 31752 31747 daemon 10u REG 0,9 0 4547 [eventpoll]

其中,PGID列表示

进程组的ID编号。

上面输出,显示了httpd

程序当前打开的全部文件、设备、套接字等

(4)

lsof -p  pid号  经过进程号显示程序打开的全部文件及相关进程,例如,想知道init进程打开了哪些文件的话,能够执行“lsof -p  1”命令,输出结果以下:

[root@web1~]#lsof-p1

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

init1root cwd DIR8,340962/

init1root rtd DIR8,340962/

init1root txt REG8,3150352261165/sbin/init

init1root mem REG8,365928652846/lib64/libnss_files-2.12.so

init1root mem REG8,31921176652830/lib64/libc-2.12.so

init1root mem REG8,390880652945/lib64/libgcc_s-4.4.7-20120601.so.1

init1root mem REG8,343880652858/lib64/librt-2.12.so

init1root mem REG8,3142640652854/lib64/libpthread-2.12.so

init1root mem REG8,3265728652881/lib64/libdbus-1.so.3.4.0

init1root mem REG8,339896652964/lib64/libnih-dbus.so.1.0.0

init1root mem REG8,3101920652966/lib64/libnih.so.1.0.0

init1root mem REG8,3154528652823/lib64/ld-2.12.so

init1root0uCHR1,30t04549/dev/null

init1root1uCHR1,30t04549/dev/null

init1root2uCHR1,30t04549/dev/null

init1root3rFIFO0,80t07796pipe

init1root4wFIFO0,80t07796pipe

init1root5rDIR0,1001inotify

init1root6rDIR0,1001inotify

init1root7uunix0xffff8800376954400t07797@/com/ubuntu/upstart

(5)

lsof -i

经过监听指定的协议、端口、主机等信息,显示符合条件的进程信息

lsof-iaddress:[46][proto][@host|addr][:{service_list|port_list}] // 紧挨着

46:4表明IPv4,6表明IPv6。

protocol:传输协议,能够是TCP或UDP。

hostname:主机名称或者IP地址。

service:进程的服务名,例如nfs、ssh、ftp等。

port:系统中服务对应的端口号。例如http服务默认对应80,ssh服务默认对应22等等。

例如:

查看系统中 tcp 协议对应的80端口的

进程信息

[root@web1~]#lsof-i tcp:80

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

httpd31747root4uIPv62612550t0TCP*:http(LISTEN)

httpd31748daemon4uIPv62612550t0TCP*:http(LISTEN)

httpd31749daemon4uIPv62612550t0TCP*:http(LISTEN)

httpd31750daemon4uIPv62612550t0TCP*:http(LISTEN)

httpd31751daemon4uIPv62612550t0TCP*:http(LISTEN)

httpd31752daemon4uIPv62612550t0TCP*:http(LISTEN)

udp协议 53端口的信息

[root@web1~]#lsof-i udp@127.0.0.1:53

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

named1553named512uIPv4113980t0UDP localhost:domain

小结:经过lsof命令可以清楚的了解

进程和文件的对应关系。

11. Linux中进程控制

为了让 Linux 来管理系统中的进程,

每一个进程的 PCB 用一个 task_struct 数据结构来表示。数组 task 包含指向系统中全部 task_struct 结构的指针。 系统中的最大进程数目受 task 数组大小的限制,默认值通常为512. 建立进程时,Linux 将从内存中分配一个 task_struct 结构并将其加入 task 数组。 当前运行进程的结构用 current 指针来指示。 另外,系统中全部的进程都用一个双向链表链接起来,而它们的根是 init 进程的 task_struct 数据结构。 这个链表被Linux核心用来寻找系统中全部的进程,它对全部进程控制命令提供了支持。

全部进程

部分时间运行于用户模式,

部分时间运行于系统模式。 如何支持这些模式,底层硬件的实现各不相同。用户模式的权限比系统模式的权限小得多。 进程经过

系统调用切换到系统模式继续执行,此时核心为进程而执行。

系统启动时老是处于核心模式,此时只有一个进程: 初始化进程。像全部进程同样,初始化进程也有一个由堆栈、寄存器等表示的机器状态。 当系统中有其余进程被建立运行时,这样信息将被存储在初始化进程的 task_struct 结构中。

在系统初始化的最后,初始化进程启动一个核心进程(init),而后保留在 idle 状态。  若是没有任何事要作,调度管理器将运行 idle 进程。 idle 进程是惟一不是动态分配 task_struct 的进程,它对 task_struct 在核心构造时静态定义为 init_task。

因为 init 是系统第一个真正的进程,因此 init 核心进程的标识符为1。 它

负责完成系统的一些初始化设置任务,以及执行系统初始化程序,这些初始化程序程序依赖于具体的系统。 系统中全部进程都是从 init 核心进程中派生出来。

当用户登陆到系统时,进程 1 为用户建立一个 shell 进程,

用户在 shell 下建立的进程通常都是 shell 的子进程,所以 shell 是 该用户全部进程的父进程。 当用户注销时,该进程也被撤销。

进程的终止:

每一个进程退出时都调用了 exit(0),这是进程的正常终止。 在正常终止时,exit()函数返回进程

结束状态。在子进程调用 exit()后,

子进程的结束状态会返回给系统内核,由内核根据状态字生成终止状态,供父进程在wait()中读取数据。若子进程结束后,

父进程并无读取子进程的终止状态,则

系统将子进程的终止状态置为“僵死”,并保留子进程的进程控制块等信息,等父进程读取信息后,系统才完全释放子进程的进程控制块。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值