cpu资源分配的先后顺序,就是指进程的优先权(priority)。
优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。
还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。
关于PRI 和 NI
用top命令更改已存在进程的nice
进入top后按“r”–>输入进程PID–>输入nice值
其他概念:
PATH : 指定命令的搜索路径
HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
SHELL : 当前Shell,它的值通常是/bin/bash。
查看环境变量的方法:
echo $NAME //NAME为环境变量的名字
将我们的程序所在路径加入环境变量PATH当中:
export PATH = $PATH:hello 程序所在路径
和环境变量相关的命令:
每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串
通过代码如何获取环境变量==>命令行第三个参数
#include
int main(int argc, char *argv[], char *env[])
{
int i = 0;
for(; env[i]; i++){
printf("%s\n", env[i]);
}
return 0;
}
通过系统调用获取或设置环境变量
#include
#include
int main()
{
printf("%s\n", getenv("PATH"));
return 0;
}
常用getenv和putenv函数来访问特定的环境变量。
环境变量通常是具有全局属性的
环境变量通常具有全局属性,可以被子进程继承下去
我们在学习知识的时候要学会问自己3个问题?1、是什么?2、为什么?3、怎么办?
做到知其然和知其所以然。
之前写过的C语言的博客,谈到过"程序地址空间",虽然这个说法是不对的,但是是为了为现在这个进程地址空间做铺垫的,
之前并没有内核空间。注意:代码区并不是从地址全零开始的。看下面的代码
创建子进程,在子进程中改变了全局变量的值。那么我们来看看运行结果:
我们发现g_val在父子进程的地址值是一样的,但是g_val的值却不一样,是不是很诡异?
问自己个问题:内存中同一个地址的值,被不同的进程读取,有可能是不同的值吗?进程地址空间是内存吗?
结论:
所以之前说的"程序地址空间"是不准确的,应该是进程地址空间。"
描述进程所占有资源的一张表,在操作系统内核中就是一个结构体,把地址空间划分成若干区域,来看下Linux内核的源码
unsigned long total_vm, locked_vm, shared_vm, exec_vm;
unsigned long stack_vm, reserved_vm, def_flags, nr_ptes;
unsigned long start_code, end_code, start_data, end_data;
unsigned long start_brk, brk, start_stack;
unsigned long arg_start, arg_end, env_start, env_end;
就划分了进程地址空间中的不同区域。
1 问大家一个问题:为什么代码是只读的,字符串是只读的,数据是可读可写的?
答:因为页表中有对应空间的访问权限,是可读的,可写的,还是可读可写的,就会限制进程对内存空间的访问。如果进程对只读数据进行写入,就会被OS终止,比如char * str = “chenzhihao”; *str = ‘C’;就会报错
2 因为有页表这样的映射关系存在,所以一个进程是不可能越界去访问到另一个进程的数据的,因为页表中就没有这种映射关系,那么进程内部的越界访问是有可能有的
1、进程按照地址空间 和 页表中的虚拟地址和实际物理内存地址的映射关系拿到在物理内存中的数据和代码,进程得以运行。
2、问题:每个进程都有一个进程地址空间,那么在系统中有很多的进程及其地址空间,那么要如何管理这些进程地址空间呢?
还是先描述再组织。
先描述:
在组织:
跟进程是强绑定的,在Linux源码里可以看出辣
mm_struct 结合页表完成映射
什么是进程谈谈你的理解?
答:进程是加载进内存的程序,有进程常见的数据结构(struct task_struct(进程控制块) && struct mm_struct(进程地址空间)) 和 代码数据构成,从冯诺依曼体系机构来理解的话:一个程序从硬盘加载进内存,操作系统(OS),要给这个进程创建task_struct和 mm_struct ,二者用指针关联起来,然后通过页表和物理内存建立映射关系,执行代码和数据。