进程和作业

来自CloudWiki
跳转至: 导航搜索

程序与进程的关系

程序

保存在硬盘、光盘等介质中的可执行代码和数据

是静态保存的代码


进程

在CPU及内存中运行的程序代码

是动态执行的代码

父、子进程:每个进程可以创建一个或多个进程

进程的相关概念

进程的状态

Linux6-100.jpg

为了充分利用系统资源,linux系统将进程分为以下几种状态。

  • 运行状态,进程正在使用,CPU运行的状态,处于运行态的进程,又称为当前进程。
  • 就绪状态,进程已获得出CPU外运行所需的全部资源,一旦系统把CPU分配给他之后即可投入运行。
  • 等待状态,又称睡眠状态,进程,正在等待某个事件或某个资源。
  • 暂停状态又称挂起状态,进程需要接受某种特殊处理,而暂时停止运行。
  • 休眠状态进程主动暂时停止运行。
  • 进程僵死状态,进程的运行已经结束,但它的控制信息仍在系统中。
  • 终止状态:进程已经结束,系统正在回收资源。

进程的类型

linux系统的进程大体可分为交互进程,批处理进程和守护进程三种。

  • 交互式进程:有Shell通过执行程序所产生的进程,可以工作在前后台。
  • 批处理进程:对某对象进行批量的处理,与终端相关,是一个进程序列。
  • 守护进程,linux系统自动启动,工作在后台,用于监视特定服务。

关于批处理进程的更多介绍,请参见:https://baike.baidu.com/item/%E6%89%B9%E5%A4%84%E7%90%86/1448600

守护进程

1、守护进程也称为精灵进程(daemon),是运行在后台的一种特殊进程。它独立于控制终端并且周期性的执行某种任务或等待某些发生的事件。守护进程是一种很有用的进程。Linux的大多数服务器就是用守护进程实现的。比如:ftp服务器,ssh服务器,web服务器httpd等。同时,守护进程完成许多系统任务。比如,作业规划进程crond等。

2、Linux系统启动时会启动很多系统服务进程,这些系统服务进程没有控制终端,不能直接和用户交互。其他进程都是在用户登录或运行程序时创建,在运行结束或用户注销时终止,但是系统服务进程(守护进程)不受用户登录和注销的影响,它们一直运行着。这种进程有一个名称叫守护进程(daemon)。

3、用ps -axj命令查看系统中的进程。参数a表示不仅列当前用户的进程,也列出所有其他用户的进程;参数x表示不仅列出有控制终端的进程,也列出所有无控制终端的进程;参数j表示列出与作业控制相关的进程。

解释:

(1)凡是TPGID一栏写着-1的都是没有控制终端的进程,也就是守护进程。 (2)在COMMAND一列用[]括起来的名字表示内核线程,这些线程在内核里创建,没有用户控件代码,因此没有程序文件名和命令行,通常采用以k开头的名字,表示Kernel。 (3)init进程是所有文件的父进程,udevd负责维护/dev目录下的设备文件,acpid负责电源管理syslogd负责维护/var/log下的日志文件。 (4)守护进程采用以d结尾的名字,表示daemon。

创建守护进程

创建守护进程最关键的一步是调用setsid函数创建一个新的session,并且成为session leader。

参考链接:https://blog.csdn.net/m0_38121874/article/details/117788077

进程的优先级

在linux系统中,进程之间是竞争资源的关系,linux内核采用优先数调度算法来为进程分配cpu。

linux中进程优先级的取值范围是,-20至19之间的整数,取值越高,优先级越低,默认优先值为零,启动进程的普通用户只能降低进程优先级,超级用户不但可以降低优先级,也可以提高优先级。

查看进程优先级有两个办法:ps和top。top命令显示的NI列的值。或者可以使用ps -efl来查看,也是在ni列表示了进程的优先级。

首先用top或者ps -l查看进程会发现有PR(PRI) NI两个字段:NI 是优先值,是用户层面的概念, PR是进程的实际优先级, 是给内核(kernel)看(用)的。

一般情况下,PR=NI+20, 如果一个进程的优先级PR是20, 那么它的NI(nice)值就是20-20=0。

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                                    
    737 root      20   0  703356  15332   8728 S   0.3   0.4   0:00.03 uniagent                                                   
      1 root      20   0  172160  10368   8088 S   0.0   0.3   0:01.04 systemd                                                    
      2 root      20   0       0      0      0 S   0.0   0.0   0:00.00 kthreadd                                                   
      3 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_gp                                                     
      4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_par_gp                                                 
      6 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/0:0H-events_highpri                                
      7 root      20   0       0      0      0 I   0.0   0.0   0:00.01 kworker/0:1-cgroup_pidlist_destroy                         
      8 root      20   0       0      0      0 I   0.0   0.0   0:00.00 kworker/u4:0-flush-8:0  

作业

正在执行的一个或多个相关进程被称为作业.

一个作业可以包含一个或多个进程,比如当使用了管道和重定向命令时,该作业就包含了多个进程。

cat file |wc -l

作业可以分为两类,前台作业和后台作业,前台作业运行于前台,与用户交互进行交互操作,后台作业运行于后台,不直接与用户交互,但可以输出执行结果,在同一时刻,每个用户只能有一个前台作业。

一个正常运行的进程称之为作业,一个作业可以启动多个进程,例如作业ls -lrt | grep *.txt就启动了两个进程。

  • 进程和作业相关的命令主要有:kill、disown、wait、fg、bg、jobs
  • fg、bg、jobs只接受作业号为参数。
  • kill、disown、wait即可接受作业号为参数,又可接受进程号为参数。
  • jobs 命令显示了当前 shell 环境中已启动的作业状态。

参考:https://www.xp.cn/b.php/6931.html

进程的启动

手动启动

手工启动机,由用户在使用命令下输入要执行的程序来启动一个进程,手工启动,又可以分为前台启动和后台启动。用户输入Shell命令后直接按enter键,则启动前台进程,如果在输入Shell命令后,加上符号&再按enter键,则启动后台进程,此时进程在后台运行,是要可继续运行和处理其他程序。

前台启动:用户输入命令,直接执行程序

后台启动:在命令行尾加入“&”符号

[root@localhost ~]# cp /dev/cdrom mycd.iso &
[1] 28454

后台任务序号为1,PID号为28454

调度启动

调度启动是系统按照用户的时间设置,在特定的时间或者周期性的执行指定的进程。在对linux系统进行维护和管理的过程中,有时需要进行一些比较费时,而且占用资源较多的操作,为了不影响正常的服务,通常将其安排在深夜或其他空闲时间,用系统自动运行,此时就可以采用调度启动方式,事先设置好任务运行的时间,到时系统就会自动完成指定的操作。在linux中可以实现at调度,batch调度和cron调度。

使用at命令,设置在某个特定的时间,执行一次任务

使用crontab命令,设置按固定的周期(如每天、每周等)重复执行预先计划好的任务

返回 Linux基础