Linux多进程和多线程(一)-进程的概念和创建

进程

进程的概念

进程(Process)是操作系统对一个正在运行的程序的一种抽象。它是系统运行程序的最小单位,是资源分配和调度的基本单位。

进程的特点如下

  1. 进程是⼀个独⽴的可调度的活动, 由操作系统进⾏统⼀调度, 相应的任务会被调度到cpu 中进⾏执⾏
    在这里插入图片描述

  2. 进程⼀旦产⽣,则需要分配相关资源,同时进程是资源分配的最⼩单位
    在这里插入图片描述

进程和程序的区别

  • 程序是静态的,它是⼀些保存在磁盘上的指令的有序集合,没有任何执⾏的概念
  • 进程是⼀个动态的概念,它是程序执⾏的过程,包括了动态创建、调度和消亡的整个过程
  • 并⾏执⾏ : 表示多个任务能够同时执⾏,依赖于物理的⽀持,⽐如 cpu是4核⼼,则可以同时执⾏4个任务
  • 并发执⾏ : 在同⼀时间段有多个任务在同时执⾏,由操作系统调度算法来实现,⽐较典型的就是时间⽚轮转
    在这里插入图片描述

LINUX进程管理

在 Linux 系统中管理进程使⽤树型管理⽅式

  • 每个进程都需要与其他某⼀个进程建⽴ ⽗⼦关系, 对应的进程则叫做 ⽗进程
  • Linux 系统会为每个进程分配 id , 这个 id 作为当前进程的唯⼀标识, 当进程结束, 则会回收

进程的 id 与 ⽗进程的 id 分别可以通过 getpid() 与 getppid() 来获取

getpid()

#include <unistd.h>

pid_t getpid(void);

该函数用来获取当前进程的 id

getppid()

#include <unistd.h>

pid_t getppid(void);

该函数用来获取当前进程的⽗进程的 id

进程的地址空间

  • ⼀旦进程建⽴之后, 系统则要为这个进程分配相应的资源, ⼀般系统会为每个进程分配 4G 的地址空间

  • 在这里插入图片描述

  • 4G 的进程地址空间主要分为两部分:
    0 - 3G : ⽤户空间
    3G - 4G : 内核空间

  • ⽤户空间⼜具体分为如下区间

stack : 存放⾮静态的局部变量

heap : 动态申请的内存

.bss : 未初始化过的全局变量(包括初始化为 0 的, 未初始化过的静态变量 (包括初始化为 0)

.data : 初始化过并且值不为 0 的全局变量, 初始化过的不为 0 静态变量

.rodata : 只读变量(字符串之类)

.text : 程序⽂本段(包括函数,符号常量)

  • 当⽤户进程需要通过内核获取资源时, 会切换到内核态运⾏, 这时当前进程会使⽤内核空间的资源⽤户需要切换到内核态运⾏时, 主要是通过 系统调⽤

虚拟地址和物理地址

  • 虚拟地址 : 程序运行时使用的地址, 由操作系统管理, 程序只能通过虚拟地址访问内存
  • 物理地址 : 实际物理内存中存储数据的地址, 由硬件管理, 程序只能通过物理地址访问内存
  • 虚拟地址和物理地址的转换关系由操作系统完成, 程序只能通过虚拟地址访问内存
  • 虚拟地址空间和物理地址空间的映射关系由操作系统完成, 程序只能通过虚拟地址访问内存

在 cpu 中有⼀个硬件 MMU(内存管理单元) , 负责虚拟地址与物理地址的映射管理以
及虚拟地址访问
操作系统可以设置 MMU 中的映射内存段

在这里插入图片描述

在操作系统中使⽤虚拟地址空间主要是基于以下原因:
直接访问物理地址, 会导致地址空间没有隔离, 很容易导致数据被修改
通过虚拟地址空间可以实现每个进程地址空间都是独⽴的,操作系统会映射到不⽤的
物理地址区间,在访问时互不⼲扰.

进程状态管理

进程是动态过程,操作系统内核在管理整个动态过程时会使⽤了
状态机,

  • 给不同时间节点设计⼀个状态,通过状态来确定当前的过程进度
  • 在管理动态过程时,使⽤状态机是⼀种⾮常好的⽅式

进程的状态⼀般分为如下

  • 运⾏态 (TASK_RUNNING) : 此时进程或者正在运⾏,或者准备运⾏, 就绪或者正在进⾏都属于运⾏态
  • 睡眠态 () : 此时进程在等待⼀个事件的发⽣或某种系统资源
    • 可中断的睡眠 (TASK_INTERRUPT) : 可以被信号唤醒或者等待事件或者资源就绪
    • 不可中断的睡眠 (TASK_UNTERRUPT) : 只能等待特定的事件或者资源就绪
  • 停⽌态 (TASK_STOPPED) : 进程暂停接受某种处理。例如:gdb 调试断点信息处理。
  • 僵死态(TASK_ZOMBIE):进程已经结束但是还没有释放进程资源

在这里插入图片描述

进程相关命令

ps

参数:

  • -e 显示所有进程
  • -f 显示进程详细信息
  • -l 显示进程详细信息,包括线程信息
  • -u 显示指定用户的进程
  • -aux 显示所有进程,包括其他用户的进程
ps -aux
ps -ef | grep " 进程名 "  # 查找进程

top

实时显示系统中进程的运行状态

top [-] [d delay] [q] [c] [S] [s] [i] [n] [b]

选项:

  • d : 改变显示的更新速度,或是在交谈式指令列 (interactive command) 按 s
  • q : 没有任何延迟的显示速度,如果使⽤者是有 superuser 的权限,则 top 将会以最⾼的优先序执⾏
  • c : 切换显示模式,共有两种模式,⼀是只显示执⾏档的名称,另⼀种是显示完整的路径与名称
  • S : 累积模式,会将⼰完成或消失的⼦进程 (dead child process) 的 CPU time 累积起来
  • s : 安全模式,将交谈式指令取消, 避免潜在的危机
  • i : 不显示任何闲置 (idle) 或⽆⽤ (zombie) 的进程
  • n : 更新的次数,完成后将会退出 top
  • b : 批次档模式,搭配 “n” 参数⼀起使⽤,可以⽤来将 top 的结果输出到档案内

在这里插入图片描述

top - 14:34:29 up 7 days, 18:51, 1 user, load average: 1.00, 0.95, 0.61

  • top:名称
  • 14:34:29 :系统当前时间
  • up 7 days, 14:30:系统以及运⾏的时间,和 uptime 命令相等
  • 1 users:当前有 1 个⽤户在线
  • load average: 1.00, 0.95, 0.61:系统负载,即任务队列的平均⻓度。 三个数值分别为 1 分钟、5 分钟、15 分钟前到现在的平均值。

Tasks: 290 total, 2 running, 287 sleeping, 0 stopped, 1 zombie

  • Tasks:任务,也就是进程
  • 290 total:当前总共有 290 个任务,也就是 290 个进程
  • 2 running:2 个进程正在运⾏
  • 287 sleeping:263 个进程正在休眠
  • 0 stopped:0 个停⽌的进程
  • 1 zombie:1 个僵⼫进程

%Cpu(s): 51.0 us, 0.7 sy, 0.0 ni, 47.8 id, 0.0 wa, 0.0 hi, 0.5 si, 0.0 st

  • %Cpu(s):CPU 使⽤率
  • 51.0 us:⽤户空间占⽤ CPU 时间的百分⽐(⼤部分进程都运⾏在⽤户态,通常都是希望⽤户空间 CPU 越⾼越好)
  • 0.7 sy:内核空间占⽤ CPU 时间的百分⽐(Linux 内核态占⽤的 CPU 时间,系统 CPU 占⽤越⾼,表明系统某部分存在瓶颈。通常这个值越低越好)
  • 0.0 ni:占⽤ CPU 时间的百分⽐(ni 是 nice 的缩写,进程⽤户态的优先级,如果调整过优先级,那么展示的就是调整过 nice 值的进程消耗掉的 CPU 时间,如果系统中没有进程被调整过 nice 值,那么 ni 就显示为 0)
  • 47.8 id:空闲 CPU 占⽤率,等待进程运⾏
  • 0.0 wa:等待输⼊输出的 CPU 时间百分⽐(CPU 的处理速度是很快的,磁盘 IO 操作是⾮常慢的。wa 表示 CPU 在等待 IO 操作完成所花费的时间。系统不应该花费⼤量的时间来等待 IO操作,否则就说明 IO 存在瓶颈)
  • 0.0 hi:CPU 硬中断时间百分⽐(硬中断是硬盘、⽹卡等硬件设备发送给 CPU 的中断消息 )
  • 0.5 si:CPU 软中断时间百分⽐(软中断是由程序发出的中断 )
  • 0.0 st:被强制等待(involuntary wait)虚拟 CPU 的时间,此时 Hypervisor 在为另⼀个虚拟处理器服务。

MiB Mem : 3889.9 total, 366.0 free, 1535.2 used, 1988.6 buff/cache

  • MiB Mem:内存
  • 3889.9 total:物理内存总量
  • 366.0 free:空闲内存量
  • 1535.2 used:已使⽤的内存量
  • 1988.6 buff/cache:⽤作内核缓存的内存量

MiB Swap: 2048.0 total, 2035.2 free, 12.8 used. 2082.9 avail Mem

  • MiB Swap:交换空间(虚拟内存,当内存不⾜的时候,把⼀部分硬盘空间虚拟成内存使⽤)
  • 2048.0 total:交换区总量
  • 2035.2 free:空闲交换区总量
  • 12.8 used:使⽤的交换区总量
  • 2082.9 avail Mem:可⽤于启动⼀个新应⽤的内存(物理内存),和 free 不同,它计算的是可回收的 page cache 和 memory slab

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

  • PID:进程 id
  • USER:进程所有者
  • PR:进程的优先级,越⼩优先级越⾼
  • NI:nice 值,负值表示⾼优先级,正值表示低优先级
  • VIRT:进程使⽤的虚拟内存,单位是 kb
  • RES:进程使⽤的物理内存,单位 kb
  • SHR:进程使⽤的共享内存,单位 kb
  • S:进程状态(S 表示休眠,R 表示正在运⾏, Z 表示僵死状态,N 表示该进程优先值为负数,I 表示空闲状态)
  • %CPU:进程占⽤ CPU 时间的百分⽐
  • %MEM:进程占⽤内存的百分⽐
  • TIME+:进程实际运⾏的时间
  • COMMAND:进程的名称

pstree

显示进程树

在这里插入图片描述

kill

kill 命令是⽤于结束进程的命令或者⽤于显示相关信号

kill [选项] [参数]

选项:

  • -l : 显示信号名称
  • -s : 指定发送的信号
  • -a : 杀死进程组中的所有进程
  • -p : 杀死进程组中的进程,并将它们从进程组中剔除
  • -u : 指定用户
  • -signal : 发送指定的信号

参数:

  • 进程号: 要结束的进程号

进程的创建

并发和并行

  • 并发:多个任务在同⼀时间段被调度运行,⽐如同时有两个任务在运行,这就是并发。在有限的 cpu 核⼼的情况下(如只有⼀个 cpu 核⼼) , 利⽤快速交替 (时间⽚轮
    转) 执⾏来达到宏观上的同时执⾏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可能只会写BUG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值