进程地址空间
什么是进程地址空间?
每个进程都有一个进程的地址空间,系统中可能存在多个进程,所以系统一定存在多个地址空间。
地址空间是如何被管理的呢?
答:先描述:地址空间本质是一个数据结构
struct mm_struct{}
再组织
为什么要有进程地址空间呢?
1.为了连续存储数据
2.封装性,保护数据,防止野指针等非法访问。
对于进程地址空间的理解:
进程地址空间不是物理内存,它是对物理内存的一种虚拟。
申请空间的本质:向内存索要空间,得到物理地址然后在特定区域申请没有被使用的虚拟地址,建立映射关系,返回虚拟地址即可。
进程的优先级
s=使用ps -l命令查看
UID:执行者的身份
PID:这个进程的代号
PPID:代表这个进程是由哪个进程发展衍生而来的,即这个该进程的父亲的代号
PRI(默认值是80):代表这个进程可被执行的优先级。其值越小优先级越高
NI(-20<=nice<=19):代表这个进程的nice值
PRI(new) = PRI(old)+nice (其中PRI(old)始终等于80)
使用top命令更改已存在进程的nice值
1.top
2.进入top后按”r“ -> 输入进程pid -> 输入nice值
进程的四个特性:
1.竞争性:系统进程数目众多,而CPU资源只有少量,甚至一个,所以进程之间是具有竞争性的。为了高效率完成任务,更合理竞争相关资源,便具有了优先级。
2.独立性:多进程运行,需要独享各种资源,多进程运行期间互不打扰
3.并行:多个进程在多个CPU下分别,同时进行运行,这称之为并行
4.并发:多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发。
进程的创建:
fork系统调用接口函数——pid_t id = fork();
1.如何理解进程的创建:创建进程,本质是系统多了一个进程,多了一个进程,系统则就要多一组管理进程的数据结构+该进程对应的代码和数据。
2.fork为什么会有两个返回值?
pid_t id = fork();
{//创建子进程;
//给子进程创建task_struct
return id;}
3.fork父子执行顺序和代码和数据复制的问题-初始
进程数据=代码+数据
父进程创建子进程的时候,代码是共享的,数据是个私自有一份(写实拷贝)
通过数据私有,显示进程的独立性。
代码是逻辑,一般是不可修改的,数据通常下即可读又可写。
父子进程谁先运行是由linux内核中的调度器来决定的。
读取退出信息 echo ¥? 最近一次命令运行的退出码
写时拷贝(本质是修改页表与物理内存的映射关系)
通常父子代码共享,父子在不写入时,数据也是共享的,当任意一方试图写入,便以写时拷贝的方式各自一份副本。
父子代码共享是因为代码不可被修改(只读权限)这个权限是由页表设置