Linux进程(二)

简介: Linux进程

进程优先级


基本概念


CPU资源分配的先后顺序就是进程的优先权,优先权存在的原因是因为CPU资源有限,


查看系统进程


83d630357e70b1a1ed50036ede4bc00e_419f3be12c15436a89a868f014c3404a.png


  1. UID:执行者身份
  2. PID:进程代号
  3. PPID:父进程代号
  4. PRI:进程的优先级,值越小优先级越高
  5. NI:进程的nice值

PRI && NI


PRI,是进程的优先级,其值越小进程的优先级越高;NI,nice值,表示进程优先级的修正数值;PRI值越小越先被执行,加入NI之后,PRI(new)=PRI(old)+nice,PRI(old)值为80;调整优先级的也就是调整nice值;nice的取值范围是(-20,19)


top命令更改已存在进程的nice


  1. sudo top
  2. r->输入PID->输入待修改的nice值


将nice修改为-10,结果如下


316baae7d4ca25e54b7bee2bf89dc2bb_99b2264f1eaa40de8e21de0e700be0fe.png


其他概念


竞争性:系统进程数目众多,而CPU只有少量,甚至1个,所以进程之间具有竞争性;为了高效完成任务,更合理地竞争相关资源,便具有了优先级

独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰

并行:多个进程在多个CPU下,同时进行运行,称之为并行

并发:多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发


环境变量


基本概念


环境变量,操作系统为了满足不同的应用环境,而预先在系统内设置了一大批全局变量,这些变量在整个系统中可以被其他进程访问


环境变量是指在操作系统中用来指定操作系统运行环境的参数,通常具有特殊用途,在系统中具有全局特性


如果要执行一个程序或指令,需要先找到,然后再执行


举个栗子:


aa91b607bcf4acfac294e1acf5129d7b_4a021631fd394ceb9e89fc2bec006b2a.png


执行mytest.c,需要先进行make指令,然后在当前的目录中执行程序


5ce50ba6420148e97fad9e3facb4f97c_aec3a1ea284c4c10afa6c58964fc07f9.png

8746297b6be3d6aed9285ed715210f45_83c3f5de7e784b3eb8044118dd8d678c.png


从上面的指令行中会发现一个疑问:为什么在最后执行程序时,是./后加路径;而在执行ll指令时前面却什么都不加,并且二者都是可执行程序,这是为什么呢???


Linux操作系统安装指令的路径中所包含的指令,一般是在默认搜索路径下进行的,默认情况下不需要加任何有关路径; ./代表当前路径,是为了让系统找到程序,并执行它


可以将./test指令也放到系统安装指令中,这样其也会变成默认的

sudo cp 指令 /usr/bin


d72f68c7a32e0a7eeb87d37982e32c5a_e2b22170c638430bade7516be669f6dc.png


通常不建议这样操作,可能会污染系统的指令池


建议采取环境变量PATH的方式,系统之所以可以找到指令,是因为PATH是系统的命令搜索路径:


6c51efd17fbb98f41bfcba5057afa4c2_6790b00f7c4e404ea5061edbe262c184.png


每个:之间的是系统默认的搜索路径,指令会先在第一条路径中寻找,找不到换下一条路径,依次类推


将指令放到默认搜索路径中: export PATH=$PATH:指令所在路径


04b176ea61c0fa7434f1986e5192de08_5c4a58990a854c30b720b68a8c214f52.png


常见环境变量


PATH:指定命令的搜索路径

55e480f9b44df068708a3de5c15d237e_6d159eaa4d1e4d90921c9a6fcc943381.png

上面便是系统默认的搜索路径


HOME:指定用户的工作目录(登录Linux时默认的目录)


415941974c3a56402181ae97406e6f08_088f7486584e4455afa06526c37904e5.png


USER:标识当前Linux用户

4c16785e7b2841750a3603ef39ea18ea_c45fcb6a48ac4f66a8522fe91a798004.png

这里通过指令来获取的Linux用户,接下来尝试使用函数来获取Linux用户

char *getenv(const char *name);

13720b3c5e66dc457d017f0225b361a0_a7cfb30a1fb441eca3f5616d2f7e73fa.png

该函数可以搜索环境变量,返回指向变量的指针

6fcf48146d8e83ed394e9b0e339b7d1b_483410db9fc042049de5e21fd190c355.png

3af93ef9a959218d0fe95e1703523ab3_33bb1dac079e4426b637d316b0a2f043.png

USER最大的意义是:可以表示当前Linux的使用用户;将上面的代码进行修改,进一步体现USER的意义


4ad7b427621f025593b85271b75c7124_302b6dbad90642be9ac111759e692ec7.png

8c4971314568d9760f4b6ac4a0ac4b8a_0bdd3b9dff2f4ba4802994462e010050.png


程序本身就是进程,mycmd也会变成进程并且是程序的子进程;环境变量具有全局属性,所以mycmd会继承USER的属性


SHELL:命令行解释器,当前shell,值为 /bin/bash


环境变量相关命令


echo:显示环境变量值

export:设置新的环境变量

env:显示所有环境变量

unser:清除环境变量

set:显示本地定义的shell变量和环境变量


查看环境变量


指令获取


echo $name //name 环境变量名称


eb6bd879b5d1a043d14d20184eae4a46_808cc9d707024f2db46930dd0e9e082e.png


为什么同样是显示环境变量,第一个可以,第二个却不行呢???

其实是因为,val并不是环境变量,而是本地变量,所以第二个并不会打印;也可以采用上面指令的方式进行验证


0d1e59e26fb600c3fdfdc727fce44d39_92d7560fce4c4881ac2536afe5281071.png

aa85465b39b8593e244f55476c8a105a_120ef51b9fd94434851d681ebf07201d.png


既然val不是环境变量,那就将其转化为环境变量;export val


f378de785a93ada5fbea493f55d6cfcf_3268a30e2e03495eaf070060e9f0d33a.png


./mycmd,就是进程;bash就是一个系统进程, ./mycmd也就是它的子进程,由于环境变量具有全局性,也就继承了bash的环境变量

val=1,本质是本地变量,只能在当前进程内有效


环境变量的组织方式


4b0f8891a4bf05ab9b24ada912033afa_8bed1f321e2141c19be9783edaa9bf88.png


命令行参数


cce8351bee84b7f5a86e51c6aa9d0eeb_5dd0e295fb5f44bf953040f3f6d2faf7.png

36f720b06a57a2f5e1a8289a58d835fa_3728f18ca0694f758f106b60cdfbb2b0.png

argc表示命令行中指令的个数;char *argv[]是指针数组,用来指向命令行中的数组


0a44beec18bdd59654dba9570dce83e3_2f2711dd17e84d5fba19bc3b854fe76a.png


对代码进一步更改


4f230196a5ae5c8c21f18aea7877c86d_80679f668aa74a81aaa43c5c8288619f.png3eee930d95ca1d6425ea9a4c4f1eba47_2bf9259094f64e46a699d6d70fa2ff40.png


再次观察是不是与指令后加选项一模一样,本质上就是这样的


通过代码获取环境变量


采用命令行方式获取环境变量


cb4fb73395e21af36293633e9c7782f2_19d9239b50834e32a8400540d47bcdac.png


这里的 char*env[]指针数组指向的不是命令行,反而是系统中的环境变量,通过指针可以将全部环境变量打印出来

结果如下:

b4186c295df98eca065be483693cfbcc_5bbe9c054f0b4f599f18eac39130cf05.png


目录
相关文章
|
存储 Linux API
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
在计算机系统的底层架构中,操作系统肩负着资源管理与任务调度的重任。当我们启动各类应用程序时,其背后复杂的运作机制便悄然展开。程序,作为静态的指令集合,如何在系统中实现动态执行?本文带你一探究竟!
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
本文旨在探讨Linux操作系统中的进程管理机制,包括进程的创建、执行、调度和终止等环节。通过对Linux内核中相关模块的分析,揭示其高效的进程管理策略,为开发者提供优化程序性能和资源利用率的参考。
471 32
|
并行计算 Linux
Linux内核中的线程和进程实现详解
了解进程和线程如何工作,可以帮助我们更好地编写程序,充分利用多核CPU,实现并行计算,提高系统的响应速度和计算效能。记住,适当平衡进程和线程的使用,既要拥有独立空间的'兄弟',也需要在'家庭'中分享和并行的成员。对于这个世界,现在,你应该有一个全新的认识。
394 67
|
11月前
|
Web App开发 Linux 程序员
获取和理解Linux进程以及其PID的基础知识。
总的来说,理解Linux进程及其PID需要我们明白,进程就如同汽车,负责执行任务,而PID则是独特的车牌号,为我们提供了管理的便利。知道这个,我们就可以更好地理解和操作Linux系统,甚至通过对进程的有效管理,让系统运行得更加顺畅。
304 16
|
11月前
|
Unix Linux
对于Linux的进程概念以及进程状态的理解和解析
现在,我们已经了解了Linux进程的基础知识和进程状态的理解了。这就像我们理解了城市中行人的行走和行为模式!希望这个形象的例子能帮助我们更好地理解这个重要的概念,并在实际应用中发挥作用。
213 20
|
10月前
|
监控 Shell Linux
Linux进程控制(详细讲解)
进程等待是系统通过调用特定的接口(如waitwaitpid)来实现的。来进行对子进程状态检测与回收的功能。
227 0
|
10月前
|
存储 负载均衡 算法
Linux2.6内核进程调度队列
本篇文章是Linux进程系列中的最后一篇文章,本来是想放在上一篇文章的结尾的,但是想了想还是单独写一篇文章吧,虽然说这部分内容是比较难的,所有一般来说是简单的提及带过的,但是为了让大家对进程有更深的理解与认识,还是看了一些别人的文章,然后学习了学习,然后对此做了总结,尽可能详细的介绍明白。最后推荐一篇文章Linux的进程优先级 NI 和 PR - 简书。
297 0
|
10月前
|
存储 Linux Shell
Linux进程概念-详细版(二)
在Linux进程概念-详细版(一)中我们解释了什么是进程,以及进程的各种状态,已经对进程有了一定的认识,那么这篇文章将会继续补全上篇文章剩余没有说到的,进程优先级,环境变量,程序地址空间,进程地址空间,以及调度队列。
178 0
|
10月前
|
Linux 调度 C语言
Linux进程概念-详细版(一)
子进程与父进程代码共享,其子进程直接用父进程的代码,其自己本身无代码,所以子进程无法改动代码,平时所说的修改是修改的数据。为什么要创建子进程:为了让其父子进程执行不同的代码块。子进程的数据相对于父进程是会进行写时拷贝(COW)。
240 0
|
存储 网络协议 Linux
【Linux】进程IO|系统调用|open|write|文件描述符fd|封装|理解一切皆文件
本文详细介绍了Linux中的进程IO与系统调用,包括 `open`、`write`、`read`和 `close`函数及其用法,解释了文件描述符(fd)的概念,并深入探讨了Linux中的“一切皆文件”思想。这种设计极大地简化了系统编程,使得处理不同类型的IO设备变得更加一致和简单。通过本文的学习,您应该能够更好地理解和应用Linux中的进程IO操作,提高系统编程的效率和能力。
607 34

热门文章

最新文章