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

时间: 2024-08-27 07:15:30

Linux进阶之进程与线程的相关文章

linux学习之进程,线程和程序

                                                                                  程序.进程和线程的概念 1:程序和进程的差别 进程的出现最初是在UNIX下,用于表示多用户,多任务的操作系统环境下,应用程序在内存环境中基本执行单元的概念.进程是UNIX操作系统环境最基本的概念.是系统资源分配的最小单位.UNIX操作系统下的用户管理和资源分配等工作几乎都是操作系统通过对应用程序进程的控制实现的! 当使用c c++ j

Linux下的进程与线程(二)—— 信号

Linux进程之间的通信: 本文主要讨论信号问题. 在Linux下的进程与线程(一)中提到,调度器可以用中断的方式调度进程. 然而,进程是怎么知道自己需要被调度了呢?是内核通过向进程发送信号,进程才得以知道的. Linux系统的进程之间是通过信号来通信的. 程序员在Shell上显式地发送信号使用的是kill命令,原型如下: kill -sigid [-]pid 其中, sigid指示的是信号的id,pid前若有-,则pid代表的为进程组id,否则pid代表的为进程id kill函数也有相同的作用

linux查看某个进程的线程id(spid)

鉴于linux下线程的广泛使用 我们怎么查看某个进程拥有的线程id了 现在很多服务的设计 主进程->子进程->线程(比如mysql,varnish) 主进程负责侦听网络上的连接 并把连接发送给子进程 子进程派生线程去处理这些线程 mysql(父进程460,子进程863) 1 460 425 333 ? -1 S 0 0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/storage/mysql/backup --pid-file=/

Linux下查看进程和线程

在linux中查看线程数的三种方法 1.top -H 手册中说:-H : Threads toggle 加上这个选项启动top,top一行显示一个线程.否则,它一行显示一个进程. 2.ps xH 手册中说:H Show threads as if they were processes 这样可以查看所有存在的线程. 3.ps -mp <PID> 手册中说:m Show threads after processes 这样可以查看一个进程起的线程数. 查看进程 1. top 命令 top命令查看

linux中的进程和线程

应用程序:可以被操作系统执行的一组指令和参数的集合,是静态的,并存储在磁盘空间中: 进程:在操作系统中在运行程序后,处于运行状态的程序,是应用程序的一个执行过程,同时也是操作系统分配内存,cpu等系统资源的基本单位: 线程:进程中可以共享进程资源的一个执行单位: 一个应用程序可以对应多个进程,一个进程中可以有多个执行线程: 系统操作进程的方式主要是:创建进程,终止进程,已经控制进程间的通信和同步: 进程的创建过程: 1. 复制父进程的环境配置: 2. 在内核中建立进程结构: 3. 将创建好的进程

计算Linux系统和进程和线程的CPU及内存使用率(c++源码)

proc文件系统下的 /proc/stat, /proc/meminfo, /proc/<pid>/status, /proc/<pid>/stat 总的cpu时间totalCpuTime = user + nice+ system + idle + iowait + irq + softirq + stealstolen +  guest 进程的总Cpu时间processCpuTime = utime + stime + cutime + cstime 占用内存的计算方法:pme

Linux系统编程——进程和线程的区别与联系

在许多经典的操作系统教科书中,总是把进程定义为程序的执行实例,它并不执行什么, 只是维护应用程序所需的各种资源,而线程则是真正的执行实体. 为了让进程完成一定的工作,进程必须至少包含一个线程. 进程,直观点说,保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体,这个内存体有自己的地址空间,有自己的堆,上级挂靠单位是操作系统.操作系统会以进程为单位,分配系统资源,所以我们也说,进程是资源分配的最小单位.更多详情,请看<进程的介绍>. 线程存在与进程当中,是操作系统调度执行的最小单位.

linux下对进程与线程基本操作常用命令(转)

转载自:http://blog.csdn.net/eric41050808/article/details/9023285 1.ps命令功能:进程状态查询语法:ps [选项]常用选项:-a:显示所有用户进程 2.kill命令功能:发送信号.终止进程语法:kill [选项] [进程号]常用选项:-s:指定发送的信号-l:信号的名称列表-n:指定信号编号[-signalname]:包含信号名称前缀SIG的信号名 3.ipcs命令功能:显示进程通信状态,包括消息队列.共享内存.信号量(信号灯)语法:i

如何在 Linux 中统计一个进程的线程数

编译自:http://ask.xmodulo.com/number-of-threads-process-linux.html作者: Dan Nanni原创:LCTT https://linux.cn/article-6240-1.html译者: strugglingyouth本文地址:https://linux.cn/article-6240-1.html 2015-9-17 10:29    收藏: 5 问题: 我正在运行一个程序,它在运行时会派生出多个线程.我想知道程序在运行时会有多少线程