程的优先级
由于每个进程的任务所要消耗的资源量不同。所以要对进程进行分级制度。
为什么要有进程的优先级?
计算机只有一个cpu,采用了分时机制,让每个程序在cpu上运行很短的时间。这个时间非常短,人的感知无法仔细的观察到。切换时间片的时候,有的进程需要紧急处理,有的进程可以放一放。有的程序交互性强,如果不及时作出反应,那么人就会感觉计算机产生卡顿。进程的使用环境各有不同所以要求计算机的优先级使用要不同,优先级决定cou的优先使用权。让重要的进程先跑,显然是合理的。
Linux下的优先级
使用ps -l 命令可以查看各进程的优先级。
如图可以观察到,UID是这个进程执行者的身份。PID是进程的ID,PPID代表着其父进程的ID。PRI代表着这个程序优先级顺序,它的值越小代表着越要优先执行。NI代表着nice值。
PRI对进程的优先级管理。
在Linux下对优先级更改是通过nice值进行更改。
nice值的正负代表影响着 PRI。其更新公式如下:
PRI(新) = PRI(旧) + nice
调整NI值可以对优先级进行更改。
首先创建一个死循环程序,方便演示。
调整已存在的进程的prn就使用 renice -5 -p -3398
如果在开始执行进程钱指定nice值就使用 nice -n -5 ./loop
通过top修改已存在的进程
进入top后按住r进行修改。
其他进程特性
竞争性: 多个进程抢占一个cpu的资源。抢占内存资源。
独立:一个进程的终止或者崩溃不会对其他的程序造成影响。
多线程:多个进程同时进行,根据时间片的划分进行活动。
并发:多个进程切换调度运行。由于cpu的限制,每个进程只在cpu上运行很小一段时间。总体上多个进程同时前进。
环境变量
什么是环境变量?
环境变量定义了操作系统的相关运行环境和运行功能的变量。就像在使用c语言的#include<stido.h>,不用引入库的地址,依旧可以找到库在哪里。再比如使用java之前必须配置环境变量,不告诉系统java在哪里那么就无法利用java语法进行编译。
Linux下环境变量在哪里查看?
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
extern char ** environ;
int i;
for( i = 0; environ[i] != NULL; i++)
{
printf("env: %s \n",environ[i]);
}
return 0;
}
通过创建外部变量 extern char**verison 可以查看
#include<stdio.h>
#include<unistd.h>
int main( int argc, char *argv[], char *env[])
/* the thrid number is env */
{
int i = 0;
for( i = 0; env[i] != NULL; i++)
{
printf("env:[%s] \n",env[i]);
}
return 0;
}
通过使用main函数的参数来查看环境变量。
也可以直接输入shell命令 env查看环境变量。
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
printf("%s\n",getenv("PATH"));
return 0 ;
}
通过getenv(“变量名字”),可以访问特定的变量。
虚拟地址和物理地址
在代码段中的存储数据变量如何访问的呢?
我们知道在C语言有指针,指针指向的地址难道是物理地址吗?不是,是一个虚拟地址。真实的物理地址是不会划分给一个小程序的,毕竟内存是非常紧要的资源。如果不合理分配好,就会造成资源泄露。
地址是内存区域的编号。这是一个虚假的地址。指向一个虚拟的地址空间。虚拟地址空间是对内存区域的描述。在linux里 它是一个结构体,
typedef struct
{
max size;
code start;
code end
data start
data end
stack start
} MM_struct
MM_struct 最大的内存大小叫做MaxSize。
存在一个页表程序。这个程序记录了虚拟地址和物理地址的关系。并且具有访问控制功能。页表记录了要访问的地址属性。
fork()函数让一个进程,衍生出一个子进程。子进程复制父进程代码段,但是会开辟新的内存空间。这个内存空间开辟后,会再次创建新的存储空间,当然也会创建新的页表
pcb内部还有一个内存指针 ,它指向一个虚拟内存地址空间 ,叫做MM_struct,描述出虚拟的地址空间。