进程相关的基本知识

发布于:2024-12-07 ⋅ 阅读:(162) ⋅ 点赞:(0)

进程的基本概念

进程的定义:进程是内存中正在执行的程序,具有独立性和并发性,是资源分配和调度的基本单位。

进程描述-PCB

操作系统管理大量的数据的方法都是:先描述再组织
对于大量的进程也是如此,PCB就是描述进程各种属性信息而创建出的结构体,操作系统对进程的管理实际上是针对PCB进行管理。
而对于Linux系统,它的PCB叫做task_struct,里面包含进程的所有属性。这些PCB都被以一种或多种数据结构的形式组织起来,操作系统依此来进行进程管理。

task_struct的一些关键组成部分:

  • 标示符(PID): 描述本进程的唯一标示符,用来区别其他进程。
  • 进程状态: 描述进程当前的状态,如运行、就绪、阻塞等。
  • 优先级:决定进程调度顺序的优先级。
  • 程序计数器:程序中即将被执行的下一条指令的地址。
  • 内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。
  • 上下文数据:进程执行时处理器的寄存器中的数据。
  • I/O状态信息:记录进程的I/O请求和状态。
  • 内存管理信息:包括进程的内存布局、页表等,用于管理进程的虚拟地址空间。
  • 其他信息

查看进程

#include <unistd.h>
pid_t getpid(void);
//获取当前进程的PID
//返回值:成功返回进程的PID,失败返回-1,并设置errno指示错误

pid_t getppid(void);
//获取当前进程父进程的PID

ps axj | grep命令:

ps -axj | grep [进程名]   #列出所有包含指定进程名的进程
ps -axj | grep [PID]     #列出特定PID的进程
ps -axj | grep [用户名]   #列出指定用户下所有的进程

进程状态

在这里插入图片描述
这是宏观上所有操作系统进程状态的描述图,细化到每个不同的操作系统会存在部分差异。

Linux中的进程状态

在 Linux 系统中,进程可以处于多种状态,这些状态描述了进程在生命周期中的不同活动阶段。一些常见的进程状态及其含义:

• R运行状态(Running):进程正在运行或者在运行队列中等待 CPU 时间。

• S睡眠状态(Sleeping):进程不在运行,而在等待某个事件或资源。大多数进程大部分时间都处于这个状态(可中断)。

• D不可中断睡眠状态(Uninterruptible Sleep):进程因为某些原因(如等待物理 I/O、正在将数据写入磁盘)而无法被中断。

• T停止状态(Stopped):进程已被停止,通常是因为接收到了停止信号(如 SIGSTOP)。

• t跟踪/停止状态(Traced/Stopped):进程被调试器或某些信号停止,等待进一步的调试指令。

• Z僵尸状态(Zombie):进程已经完成执行,但其父进程还没有回收其资源(如通过wait()系统调用)。僵尸进程需要被父进程回收,否则会占用系统资源。

• 就绪(Ready):进程已准备好运行,正在等待被调度器选中以获取 CPU 时间。

• 阻塞(Blocked):进程因为等待 I/O 操作或其他阻塞事件而暂停执行。

• 挂起(Suspended):进程已被暂时挂起,通常是因为接收到了挂起信号(如 SIGTSTP)。

孤儿进程:
孤儿进程是指在其父进程执行完成或被终止后仍继续运行的一类进程。孤儿进程会被进程号为1的init进程“收养”,init进程会等待这些孤儿进程终止并回收资源。

进程优先级

进程的优先级:CPU资源分配的先后顺序。

进程优先级的决定:

  • PRI:代表这个进程可被执行的优先级,其值越小越早被执行。
  • NI:代表这个进程的nice值,取值范围[-20,19]。(nice值算是进程优先级的修正数据)

进程的优先级公式:PRI(new) = PRI(old) + nice值

进程优先级的修改

在 Linux 系统中,top命令提供了一个交互式界面,允许用户实时查看和管理系统进程。其中一项功能就是修改进程的 nice 值,即进程的优先级。

修改进程的 nice 值

• 启动top命令:打开终端并输入top命令,进入top界面。

• 选择进程:在top界面中,使用键盘上下箭头键选择你想要修改 nice 值的进程。

• 修改 nice 值:按下r键(代表"renice")。

• 输入你想要设置的 nice 值。Nice 值的范围通常是从-20(最高优先级)到 19(最低优先级)。普通用户只能降低进程的优先级(提高 nice 值),而 root 用户可以提高或降低进程的优先级。

• 按下回车键确认。

注意事项:
• 权限要求:只有进程的所有者或者 root 用户(具有 sudo 权限)才能修改进程的 nice 值。
• 进程状态:进程必须是可中断的(即处于运行状态或可中断的睡眠状态),才能修改其 nice 值。
• 系统负载:在高负载情况下,修改 nice 值可能不会立即反映在进程的调度上。

环境变量

环境变量是操作系统中用于定义或存储系统配置参数的变量,它们在程序运行时可以被访问和使用。

环境变量可以被操作系统、已运行的程序或用户会话设置和修改。它们通常用于以下目的:
• 配置程序:为程序提供必要的配置信息,如文件路径、系统资源位置等。
• 传递参数:在程序启动时传递参数,如用户ID、系统权限等。
• 系统状态:反映系统的状态或配置,如语言设置、时区等。
• 用户偏好:存储用户偏好设置,如界面主题、字体大小等。

环境变量的类型:
• 系统环境变量:由操作系统设置和管理,对所有用户和程序都有效。
• 用户环境变量:特定于某个用户,通常在用户的配置文件中设置,如.bashrc.profile
• 程序环境变量:由程序在运行时设置,只对当前程序有效。

常见的环境变量:

PATH:定义了系统搜索可执行文件的目录路径。

HOME:用户的主目录路径。

LANGLANGUAGE:定义了默认的语言和字符编码。

USERLOGNAME:当前登录用户的用户名。

SHELL:用户使用的shell类型。

TMPDIR:临时文件存储的目录。

DISPLAY:图形界面的显示环境变量,常用于X Window系统。

和环境变量相关的命令

printenv   #打印所有的环境变量
printenv VARIABLE_NAME   #打印指定的环境变量

env   #显示所有环境变量
echo $VARIABLE_NAME   #显示某个环境变量

export VARIABLE_NAME=value   #设置环境变量

unset VARIABLE_NAME   #删除环境变量

获取环境变量的方法

getenv()获取环境变量:

char* getenv(const char* name);
// 成功返回指向该环境变量值的指针,未找到返回NULL

命令行参数获取环境变量:

int main(int argc, char* argv[], char* env())
{}

argc (Argument Count):它代表命令行中传递给程序的参数个数,包括程序名本身。它的值是一个整数,当只有一个参数(即程序名)时,argc为1。

argv (Argument Vector):这是一个字符串数组,每个元素对应于命令行中的一个参数。数组的第一个元素argv[0]总是指向程序自身的名称,其余元素 argv[1] 到 argv[argc-1] 则是传递给程序的具体参数。

示例:ls -a -l

  • argc代表命令行参数的个数,不包括程序名本身。例如,ls -a -l 这个命令就有 3个参数(忽略第一个空字符的程序名):ls, -a, 和 -l。
  • argv 是一个字符串数组,每个元素对应一个命令行参数,第一个元素(argv[0])通常是程序名。对于上述的 ls -a -l,argv数组将是:[“ls”, “-a”, “-l”]。

environ全局变量:

#include <unistd.h>
extern char **environ;  //environ定义在其他库中,要用extern来链接

补充知识:本地变量和内建命令

本地变量: 本地变量只会在本BASH内有效,不会被子进程继承。

内建命令: bash不创建子进程,而是自己亲自执行的命令,类似于bash调用了自己写的,或者系统提供的函数。