Linux进阶之进程与线程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux进阶之进程与线程相关的知识,希望对你有一定的参考价值。

一、进程与线程

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值之间有其对应关系,其关系如下图:

技术分享

本文出自 “vinsent” 博客,请务必保留此出处http://vinsent.blog.51cto.com/13116656/1962388

以上是关于Linux进阶之进程与线程的主要内容,如果未能解决你的问题,请参考以下文章

线程进阶之线程队列线程池和协程

python进阶之多线程(简单介绍协程)

[转帖]Linux系统进程的知识总结,进程与线程之间的纠葛...

网络编程进阶及并发编程

LINUX操作系统知识:进程与线程详解

linux套接字编程之多进程多线程练习