进程指标
进程与线程
进程是程序的一次动态执行,它对应着从代码加载、执行至执行完毕的一个完整的过程,是一个动态的实体,它有自己的生命周期。它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被撤销。线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。
➢一个线程只能属于一个进程,而一个进程可以有多个(至少有一个)线程。➢进程作为资源分配的最小单位,资源是分配给进程的,同一进程的所有线程共享该进程的所有资源。➢真正在处理机上运行的是线程。进程与线程的区别如下所述。➢调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位。➢并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行。➢拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源。➢系统开销:在创建或撤销进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤销线程时的开销。
进程的状态
每个进程都有自己的状态,显示进程中当前发生的事情,进程执行时进程状态会发生改变。可能的状态如下所述。➢运行状态:在这个状态中,进程正在CPU中执行,或者在运行队列(runqueue)中等待运行。➢停止状态:进程由于特定的信号(如SIGINT、SIGSTOP)而挂起就会处于这个状态,等待恢复信号,如SINCONT。➢可中断的等待状态:这类进程处于阻塞状态,一旦达到某种条件,就会变为运行状态。同时该状态的进程也会由于接收到信号而被提前唤醒进入到运行状态。➢不中断的等待状态:与“可中断的等待状态”含义基本类似,唯一不同的是处于这个状态的进程对信号不做响应。不中断的等待状态最典型的例子是进程等待磁盘I/O操作。➢僵尸状态:也就是僵尸进程,每个进程在结束后都会处于僵尸状态,等待父进程调用进而释放资源,处于该状态的进程已经结束,但是它的父进程还没有释放其系统资源。
一个僵尸进程产生的过程是:父进程调用fork()创建子进程后,子进程运行直至其终止,它立即从内存中移除,但进程描述符仍然保留在内存中(进程描述符占有极少的内存空间)。子进程的状态变成EXIT_ZOMBIE,并且向父进程发送SIGCHLD信号,父进程此时应该调用wait()系统调用来获取子进程的退出状态以及其他的信息。在wait()调用之后,僵尸进程就完全从内存中移除了。因此一个僵尸进程存在于其终止到父进程调用wait()函数这个时间之间,一般很快就消失了,但如果编程不合理,父进程就不会调用wait()等系统调用来收集僵尸进程,那么这些进程会一直存在内存中。最后形成一直滞留的僵尸进程。
内存指标
在Linux操作系统中,无论是系统内核,还是应用程序,都不能直接使用物理内存和逻辑内存,要使用这些内存,需要通过一个映射机制来实现。也就是说,Linux操作系统会把所有内存(包含物理内存和逻辑内存)都映射成虚拟内存,这样,应用程序在使用内存时,就需要向Linux内核请求一个特定大小的内存映射,并且收到一个虚拟内存的映射。这个申请到的虚拟内存不一定全部是物理内存的映射,还可能包含由磁盘上的交换空间映射来的内存。
如果在进程请求指定数量的内存页时没有可用的内存页,内核就会尝试释放特定的内存页给新的请求使用。这个过程叫作内存回收。其中,kswapd内核线程负责页面回收。
磁盘指标
➢dirty_background_ratio:表示当脏页面所占的百分比(相对于所有可用内存,即空闲内存页+可回收内存页)达到dirty_background_ratio时,write调用会唤醒内核的flusher线程开始回写脏页面数据,直到脏页面比例低于此值。➢dirty_background_bytes:当脏页面所占的内存数量超过dirty_background_bytes时,内核的flusher线程开始回写脏页面。➢dirty_expire_interval:该数值以(1/100)s为单位,它描述超时多久的数据将被周期性执行的pdflush线程写出。➢dirty_ratio:脏页面所占的百分比(相对于所有可用内存,即空闲内存页+可回收内存页)达到dirty_ratio时,write调用会唤醒内核的flusher线程开始回写脏页面数据,直到脏页面比例低于此值。注意write调用此时会阻塞。➢dirty_writeback_centisecs:设置flusher内核线程唤醒的间隔,此线程用于将脏页面回写到磁盘,单位是(1/100)s。
➢dirty_expire_centisecs:脏数据的过期时间超过该时间后,内核的flusher线程被唤醒时,会将脏数据回写到磁盘上,单位是(1/100)s。
