进程

线程和进程的区别?

线程是指进程内的一个执行单元,也是进程内的可调度实体.

与进程的区别:

(1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;

(2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源

(3)线程是处理器调度的基本单位,但进程不是.

(4)二者均可并发执行.

b.通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。

c.调度和切换:线程上下文切换比进程上下文切换要快得多。

d.在多线程OS中,进程不是一个可执行的实体。

 

进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:

简而言之,一个程序至少有一个进程,一个进程至少有一个线程.

线程的划分尺度小于进程,使得多线程程序的并发性高。

另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.

线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.

一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.

 

 

我们主要是看看进程出问题,导致应用受损

 

什么进程?当一个程序或者应用跑起来了,我们认为就会产生一个进程,因为应用在执行的过程当中,一定会有至少一个进程,来维护一些相关的操作;所以有的人会说:进程就是程序的动态运行;也就是说如果一个程序,它停止了,不管是怎么停的,要么是以外终止的或者是正常退出的,那进程也会随之释放掉;程序在运行的过程中会产生进程,开发人员一般会写进程,通过进程来做一些分布式操作,工作需要的一些事情;对于进程来说,我们在系统当中,我们能看到的进程有两类,一类叫父进程,一类是子进程;

 

一个程序可能对应多个进程

Apache跑起来默认会有9个进程:

第一个就是其他8个父进程

父进程的主要作用就是用来启动子进程的,还有一个作用就是给子进程回收资源,当一个子进程释放掉的时候,他所有运行过程当中占用的资源是需要父进程为它回收的;如果程序有问题或者操作过程当中内存被污染了等一些原因,可能会导致进程崩溃或者是意外退出;正常情况下会被父进程回收资源;也就是子进程资源会被父进程回收;如果父进程意外终止,那子进程就无法退出的时候被父进程回收资源;就会导致一些情况:例如:僵尸进程,父进程无法回收子进程的一些资源;如果父进程终止,谁会回收子进程?会被系统当中的第一个进程接管;这个进程叫init;由于它是启动的第一个进程,说白了它就是所有进程的父进程

 

子进程是靠父进程起起来的

对于一些事情来讲,父进程还应该做一件事情;那就是去监视子进程,如果子进程被干掉,父进程会负责再起一个子进程;有的时候很多进程还可以互相监视,一个被干掉,另一个负责把它在给起来;;如果一些开发人员写的程序不明显找不到进程,我们就通过审计日志追踪它,找到它

 

ps:负责查看进程的相关属性

ps有两种参数:aux和elf

ps 参数:

aux

-elf

其实这两组参数显示出来的结果是大同小异的,只是格式上有点不同;

# ps aux #查看进程属性

# ps aux |wc -l #查看进程数量

 

[root@server ~]# ps aux |more

USER        PID %CPU %MEM    VSZ   RSS   TTY      STAT START   TIME COMMAND

root          1  0.0      0.1  19356  1356    ?        Ss   11:17   0:01 /sbin/init

解释:

USER: 运行进程的用户;也就是谁运行的进程;进程的所有者

PID: 进程ID;也就是进程的编号

%CPU: CPU占用率;该进程所占用的处理器资源

%MEM:   内存占用率;该进程所占用的内存资源

VSZ:     占用虚拟内存;虚拟内存所占用的大小

RSS: 占用实际内存;实际内存所占用的大小(跟内存共享数据有关)

TTY: 进程运行的终端;显示该进程所对应的程序,是在哪个终端执行;显示终端编号

有时候很多进程是问号状态就是系统自己调用产生的状态,它不依赖任何终端

STAT:用来描述进程的状态

      R     运行

      S     可中断睡眠 Sleep

      D     不可中断睡眠

      T     停止的进程

      Z     僵尸进程,就是停不掉,重启不了,杀不死;它也不工作;多数情况下是因为父进程没有了导致的,其实也不一定;有的情况下父进程没有了,被init接管;这个是由程序定的,就看程序写的是不是考虑周全;在工作的过程当中,一旦碰到这种情况,有时候很麻烦,解决它的方法就是重启,因为一重启,所有进程都会初始化,这是最直接的方法,要不然进程是杀不死的;服务是重启不了;僵尸进程不容易被发现

      X      kill #被终止的进程

这些属于常用的状态

所谓的中断睡眠和不可中断睡眠:就是拿常用的现象就是屏保就是可中断睡眠,一旦运行,就休眠;很多程序中断;随便按一个键就打断了它的运行

不可中断睡眠就是一旦睡了,就不会在醒了

  Ss   s进程的领导者,父进程

START: 进程的启动时间

TIME: 进程占用CPU的总时间

COMMAND: 进程文件,进程名

例如:装一个服务

# yum -y install httpd     #一旦它起来,默认会起9个进程;一个父进程,8个子进程

# service httpd restart

# ps axo user,pid,ppid,%mem,command |grep httpd 这是使用自定义字段调出来,就是把不要的筛选出来

user:用户名,pid:自己的ID,ppid:父进程的ID,%mem:内存占有资源;父进程的父进程的就是init

//查看进程树

# pstree   -p   #显示进程pid(也可以查看进程的父进程,用来通过树状结构描述进程的关系)

==动态top(查看、管理进程)

top:以动态的方式来显示进程属性

什么情况下会平分资源呢?如果服务器是比较忙的情况下,后启动的那个进程会跟最后一个进程所占用的处理器去平分资源

top:可以做进程的统计

# top -d 1      -d:指定刷新间隔(默认3秒)

# top -d 1 -p 10126 -p:查看指定进程的动态信息(默认谁高显示谁)

# top -d 1 -p `pgrep sshd`  命令替换(有时候我们不知道它的pid是什么?或者它的pid怎么变)`pgrep sshd` 这是执行引用,把结果反馈给,这个命令是用来显示pid的

# top -d 1 -p $(pgrep sshd)   #命令替换 它的用法和# top -d 1 -p `pgrep sshd`用法一样;它俩之能查看一个,不能同时查看多个

# top -d 1 -u apache -u:查看指定用户的进程

# top -b -n 2 > top.txt 将2次top信息写入到文件(因为top风格是每隔几秒变一次,刷过就没有了,我们希望把它保留下来做分期)

top默认是按综合排序的

按下M 按内存的使用排序

按下P 按CPU使用排序

按下N 以PID的大小排序

按下R 对排序进行反转

按下1 显示所有CPU的负载

按下z 彩色

查看僵尸进程:# ps aux | grep Z     #ps aux可以在所有进程里面去找

 

接下来讲进程的优先级:

进程的优先级有什么用呢?默认情况下用户启动的进程,优先级都是一样的;优先级比较高的进程占用的资源就会多一点;由于用户启动的进程优先级都是一样的,所以说需求一样的,它会平分资源;我们可以通过调整优先级来实现一些需求

 

如果出现了僵尸进程,出现了报警的话,我们可以报警;或者是监控某一个服务,无法运行了,就可以报警;对于报警的系统来讲,它也相当于应用,它在启动的过程当中报警;我们最不希望看到的就是系统资源耗尽,连报警都发不出去,所以一般情况下,我们会把报警的进程优先级给调高一点;因为默认情况下,每一个进程的优先级的用户启动的情况下都是相同的,优先级调高了,在发生问题的情况下,系统资源耗尽的情况下,报警的消息能够发出去,如果发不出去,服务器可能会宕机

 

如果细分的话,优先级分为系统优先级和实施优先级

什么叫做系统优先级?就是系统在运行过程当中,每一个启动的程序,每一个进程所自带的优先级,是程序决定的;这是系统内部优先级;实施和系统优先级我们都认为是系统内部优先级,那么对于系统来讲的话,内部有一个启动的优先级;我们用户空间,是无法直接对系统内部优先级进行调整的;用户不能直接修改系统优先级,最多能够影响优先级;

 

调度算法将进程优先级分为100个(第一行)

real-time实时进程优先级占了99个(1~99) 99最高  实时优先级数字固定

nice level 在全部100个中占1位,这1位分为40个,19最低,-20最高  nice-level优先级不固定

在top中PR字段显示的是优先级,负数代表实时进程或者RT也代表实时进程,0~39代表nice level

 

shell管理进程

设置或调整进程的优先级(nice值)

如何通过nice去影响系统优先级

[root@localhost ~]# nice -n -5 sleep 6000 & //程序运行时设置优先级

-5:指定优先级       sleep:6000 &:程序 #在启动程序的时侯使用nice直接来启动

[root@localhost ~]# sleep 7000 &

[3] 10089

[root@localhost ~]# ps axo command,pid,nice |grep sleep

当一个程序已经启动了一个想重新定义优先级:默认优先级既不高也不低,想重新定义优先级,我们就用renice

[root@localhost ~]# renice -20 10089 //对已运行的进程设置新的优先级

10089: old priority 0, new priority -20  #10089指的是pid

越接近0,优先级越高

====给进程发送信号====

[root@localhost ~]# kill -l //列出所有支持的信号  显示系统当中的64种信号

编号 信号名

1) SIGHUP 重启

2) SIGINT ^C  释放进程占用的资源

9) SIGKILL 强制终止  不释放进程占用的资源(尽量不要用它去杀死进程,因为在系统会造成很多垃圾文件,不收尸;有时候也可以用)

15) SIGTERM 终止(正常退出,干净),缺省信号,伪装正常结束进程

18) SIGCONT 继续

19) SIGSTOP 暂停^Z

以上15不行用2,2不行用9

 

     管理网络进程

netstat:常用参数有两种,一种是

an:显示当前主机下的所有端口和连接状态;an是包含udp和tcp了

另外一种是:tnlp:

# netstat -tnlp     //查看正在监听的,且使用tcp协议的进程

-t   tcp协议

-u  udp协议

-l   listen

-p  PID/Program name

-n  不反解,不将IP地址解析为主机名,不将端口号解析成协议名(80 ---> http)#这里的反解是端口号和名字的对应关系

-a  包括监听端口和和我进行通信的端口

在每个服务器上面常用的端口都对应了它的名字,哪个服务用什么端口,系统下面有个文件叫/etc/services;里面从23行开始就固定了它常用的

# netstat -an |grep :5900    //查看5900端口连接的状态,an选项是查看所有于查询端口建立链接的ip 端口

   proc文件系统

proc虚拟文件系统:存的是 内核、进程动态运行的状态信息;有和进程相关的数据

   作业控制

进程前台、后台

前台:对于我们启用一个程序来讲,一般情况下,我们习惯启动方法就是在前台运行,所谓的前台运行就是在我们当前终端下能够看到它的运行和运行情况

后台:后台是看不到上述那些的,不会直接在前台终端下执行的,系统很多进程都是在后台运行的

^z 或者kill -19 pid:将前台程序调到后台,是属于暂停状态;

想继续前台输出,后台运行就点击kill -18 pid

&后台运行,前台输出结果 等于1,前台运行;2,^z 挂起到后台;3,kill -18 pid继续运行

jobs   查看后台作业,只能查看本终端和当前用户后台作业

Fg[%]:前台输出前台运行 可以执行Ctrl+c和Ctrl+z

Bg[%]  :后台运行前台输出  不可以执行Ctrl+c和Ctrl+z

kill PID

kill %后台作业号 #这种分环境,如果没有前台输出是可以结束后台的;如果有前台输出就选择kill PID来结束后台

[root@localhost ~]# sleep 3000 & //运行程序(时),让其在后台执行

[root@localhost ~]# sleep 4000 //^z,将前台的程序挂起(暂停)到后台

[2]+  Stopped                sleep 4000

 

[root@localhost ~]# jobs //查看后台作业

[1]-  Running                 sleep 3000 &

[2]+ Stopped               sleep 4000

 

[root@localhost ~]# bg %2 //让作业2在后台运行

[root@localhost ~]# fg %1     //将作业1调回到前台

[root@localhost ~]# kill %1 //kill 1,杀死PID为1的进程

扩展:

注意事项:

[root@localhost ~]# gedit &

[root@localhost ~]# nohup gedit & //该进程在运行时,不依赖于任何终端;用于长时间运行的程序,如备份,exit退出

posted @ 2017-06-02 15:26  青牛怪  阅读(114)  评论(0编辑  收藏  举报