一、进程与线程
1、进程(Process):是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调
度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行
实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描
述,进程是程序的实体。-----------百度百科
在Linux中进程是运行中的程序的一个副本,是被载入内存的一个指令集合,使用进程ID(PID)来标记
各个进程。我们可使用echo $$来查看当前程序的进程号。
[ [email protected] ~ ]#echo $$ # 获取当前bash的进程号 3267 [ [email protected] ~ ]# [ [email protected] ~ ]#pstree -p systemd(1)─┬─NetworkManager(520)─┬─dhclient(623) │ ├─{NetworkManager}(531) │ └─{NetworkManager}(533) ...中间省略... ├─sshd(935)───sshd(3263)───bash(3267)───pstree(7269) ├─systemd-journal(361) ---|--- ├─systemd-logind(496) # 通过pstree验证,和echo $$的结果一样 ├─systemd-udevd(380) ├─tuned(920)─┬─{tuned}(1105) │ ├─{tuned}(1109) │ ├─{tuned}(1111) │ └─{tuned}(1116) └─vmtoolsd(495) [ [email protected] ~ ]#
- 进程得到的权限,是对应之执行者的权限,除了SUID、SGID等权限。
- 进程是动态概念,有生命周期;可附加SUI、SGID等权限。
- 进程号随机分配( 进程号唯一标识一个进程;一个inode唯一标识一个磁盘文件 )。
- 在 CentOS 6 及之前的系统中第一个进程为:init;CentOS 7 中第一个进程为:systemd。
2、守护进程
守护进程(daemon)是一类在后台运行的特殊进程,用于执行特定的系统任务。很多守护进程在系统引导
的时候启动,并且一直运行直到系统关闭。另一些只在需要的时候才启动,完成任务后就自动结束。
用户使守护进程独立于所有终端是因为,在守护进程从一个终端启动的情况下,这同一个终端可能被其
他的用户使用。
守护进程没有控制终端,因此当某些情况发生时,不管是一般的报告性信息,还是需由管理员处理的紧
急信息,都需要以某种方式输出。Syslog 函数就是输出这些信息的标准方法,它把信息发送给 syslogd
守护进程。例如我们用来监控某些非独立服务的程序xinetd,他就是一个超级守护进程,用来管理系统
的的非独立守护进程(瞬时守护进程),这些非独立进程通常情况是处于关闭状态,由xinetd进程来监
控,如果有人使用相关的服务,则唤醒这些非独立守护进程,进行工作。我们可使用chkconfig来查看。
[[email protected] ~]# yum install xinetd # 我用的是最小化安装,自动不安装xinetd服务 [[email protected] ~]# chkconfig auditd 0:off 1:off 2:on 3:on 4:on 5:on 6:off # 独立服务 autofs 0:off 1:off 2:on 3:on 4:on 5:on 6:off blk-availability 0:off 1:on 2:on 3:on 4:on 5:on 6:off ...中间省略 xinetd based services: # 下面的服务全是非独立服务,由xinetd来代为管理 chargen-dgram: off chargen-stream: off daytime-dgram: off daytime-stream: off discard-dgram: off discard-stream: off echo-dgram: off echo-stream: off tcpmux-server: off time-dgram: off time-stream: off [[email protected] ~]# chkconfig --add crond # 添独立服务是添加不到xinetd中的
NOTE:我们每次新添加(chkconfig --add server_name)一个服务或者删除(chkconfig --del server_name)一个服务后,我们必须重启xinetd服务(service restart xinetd)。
3、线程
有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由
线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立
调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与
同属一个进程的其它线程共享进程所拥有的全部资源。
一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。
有线程,那么就有多线程的说法。线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可
调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。在单个程序中同
时运行多个线程完成不同的工作,称为多线程。线程共享整个程序的内存资源;但是也存在一个线程出
故障,影响其他线程,争夺资源。为了避免这种争夺资源的情况,系统加入了锁 fork()机制clone()
机制。通常采用写时复制的原则:
在Linux中我们通过pstree能看到线程通常在进程树中表现为"{ thread_name }"形式。
[ [email protected] ~ ]#yum -y install httpd &>/dev/null [ [email protected] ~ ]#pstree -p systemd(1)─┬─NetworkManager(520)─┬─dhclient(623) │ ├─{NetworkManager}(531) # NetworkManager开启的多线程 │ └─{NetworkManager}(533) ├─atd(509) ├─auditd(471)───{auditd}(482) ├─automount(929)─┬─{automount}(930) │ ├─{automount}(931) │ ├─{automount}(948) │ └─{automount}(960) ├─crond(506) ├─dbus-daemon(492)───{dbus-daemon}(493) ├─firewalld(515)───{firewalld}(619) ├─httpd(7491)─┬─httpd(7494) # httpd服务开启的多个进程 │ ├─httpd(7495) │ ├─httpd(7496) │ ├─httpd(7497) │ └─httpd(7498) ...后面省略... [ [email protected] ~ ]#
4、线程与进程的关系
- 一个进程可包含多个线程;
- 每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身;
- 地址空间和其它资源(如打开文件):进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。
- 通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。
- 调度和切换:线程上下文切换比进程上下文切换要快得多。
- 在多线程OS中,进程不是一个可执行的实体。
二、进程优先级
有时我们面临着很多选择,同一时间有许多事情要办,那么我们总会有选择性的去执行,先做什么后做什么,这就是一种优先级,同样的作为一个高速运转的计算机而言,有序的优先级约定显得异常重要。
优先级(priority)是一种约定,优先级高的先做,优先级低的后做。优先级是计算机分时操作系统在处
理多个作业程序时,决定各个作业程序接受系统资源的优先等级的参数。优先级是计算机操作系统给任
务指定的优先等级。它决定任务在使用资源时的优先次序。给设备指定的优先等级。它决定设备在提出
中断请求时,得到处理机响应的先后次序。任务调度优先级主要是指任务被调度运行时的优先级,主要
与任务本身的优先级和调度算法有关。特别在实时系统中,任务调度优先级反应了一个任务重要性与紧
迫性。-------百度百科
1、系统优先级
进程优先级起作用的方式从发明以来基本没有什么变化,无论是只有一个cpu的时代,还是多核cpu时
代,都是通过控制进程占用cpu时间的长短来实现的。就是说在同一个调度周期中,优先级高的进程占用
的时间长些,而优先级低的进程占用的短些。在Linux系统中系统优先级的范围为 0-139 共 140 及等级
;其值越小则优先级越高 ;CentOS 6之后为 系统优先级的范围变成了0-98。
2、实时优先级
实时优先级又称动态优先级,其的范围是0-99;其值越大,优先级越高;动态优先级不能人为调整,系
统自己调度。
3、静态优先级
- 静态优先级又称非实时优先级:通常用nice值表示;
- nice值所在范围对应系统优先级的 100-139 ;其值为:-20~19;
- 进程默认启动时的nice值为0,优先级为120;
- 只有根用户才能降低nice值(提高优先性);
- nice 优先级 其值越小则优先级越高;
4、三种优先级的关系
系统优先级、实时优先级、nice值之间有其对应关系,其关系如下图: