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


目录
相关文章
|
1天前
|
存储 安全 Linux
【Linux】详解进程通信中信号量的本质&&同步和互斥的概念&&临界资源和临界区的概念
【Linux】详解进程通信中信号量的本质&&同步和互斥的概念&&临界资源和临界区的概念
|
1天前
|
消息中间件 算法 Linux
【Linux】详解如何利用共享内存实现进程间通信
【Linux】详解如何利用共享内存实现进程间通信
|
1天前
|
Linux
【Linux】命名管道的创建方法&&基于命名管道的两个进程通信的实现
【Linux】命名管道的创建方法&&基于命名管道的两个进程通信的实现
|
1天前
|
Linux
【Linux】匿名管道实现简单进程池
【Linux】匿名管道实现简单进程池
|
1天前
|
Linux
【Linux】进程通信之匿名管道通信
【Linux】进程通信之匿名管道通信
|
1天前
|
Linux C++
【Linux】详解进程程序替换
【Linux】详解进程程序替换
|
2天前
|
存储 Linux Shell
Linux:进程等待 & 进程替换
Linux:进程等待 & 进程替换
27 9
|
2天前
|
存储 Linux C语言
Linux:进程创建 & 进程终止
Linux:进程创建 & 进程终止
24 6
|
2天前
|
存储 安全 Linux
Linux:进程地址空间
Linux:进程地址空间
20 10
|
2天前
|
存储 弹性计算 Linux
Linux:进程调度
Linux:进程调度
20 7