赞
踩
生活中大部分的计算机,服务器都遵守冯诺依曼体系。
注:
任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。
操作系统包括:
操作系统是进行软硬件资源管理的软件
操作系统:
注:
补:
基本概念
课本概念:程序的一个执行实例,正在执行的程序等
内核观点:担当分配系统资源(CPU时间,内存)的实体。
描述进程-PCB
- 进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。称之为PCB(process control block),Linux操作系统下的PCB是: task_struct 。task_struct是PCB的一种
- 在Linux中描述进程的结构体叫做task_struct。
- task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息
task_ struct内容分类
- 标示符: 描述本进程的唯一标示符,用来区别其他进程。
- 状态: 任务状态,退出代码,退出信号等。
- 优先级: 相对于其他进程的优先级。
- 程序计数器: 程序中即将被执行的下一条指令的地址。
- 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
- 上下文数据: 进程执行时处理器的寄存器中的数据
- I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
- 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
- 其他信息
注:
总结:
补:
语法:
1. 创建子进程
理解fork:
2. fork有两个返回值
注:
总结:
R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。
S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠
D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。
Z(zombie)-僵尸进程:
R状态
S状态
T状态
Z状态
注:
状态与状态+的区别
eg
补:
kill命令
kill 命令用于删除执行中的程序或工作
语法:kill [-s <信息名称或编号>][程序] 或 kill [-l <信息编号>]
第一种:
第二种:
ps aux / ps axj 命令
补:D状态和Z状态用kill命令是杀不掉的
父进程先退出,子进程就称之为“孤儿进程”
注:
进程的优先级:
- cpu资源分配的先后顺序,就是指进程的优先权(priority)。
- 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。
- 还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能
注:
注:
注:
用top命令更改已存在进程的nice:
注:
- 用top命令更改已存在进程的nice,如果输入的值大于19,NI的值就是19;如果输入的值小于-20,NI的值就是-20。
- 无论怎么输入NI的值,最终PRI的值为[60,99]
- 竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级
- 独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰
- 并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行
- 并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发
注:
注:
#include <stdio.h> #include <unistd.h> #include <stdlib.h> int g_val = 0; int main() { pid_t id = fork(); if(id < 0) { perror("fork"); return 0; } else if(id == 0) { //child,子进程肯定先跑完,也就是子进程先修改,完成之后,父进程再读取 g_val=100; printf("child[%d]: %d : %p\n", getpid(), g_val, &g_val); } else { //parent sleep(3); printf("parent[%d]: %d : %p\n", getpid(), g_val, &g_val); } sleep(1); return 0; }
运行结果:
child[3046]: 100 : 0x80497e8
parent[3045]: 0 : 0x80497e8
父子进程中的g_val的地址竟然是一样的
注:
总结:
- 地址空间本质是进程看待内存的方式,是抽象出来的一个概念,内核struct mm_struct,这样的每一个进程,都认为自己独占系统内存资源
- 区域划分本质:将线性地址空间划分成为一个一个的area,[start,end]
- 虚拟地址本质:在[start,end] 之间的各个地址叫做虚拟地址
第一种情况:
第二种情况:
第三种情况:
注:
两个不同的进程虚拟地址可以完全一样
页表:
内存管理模块和进程管理模块是强耦合的
操作系统:进程管理、文件管理、内存管理、驱动管理
可执行程序,其本身就已经划分成为一个个的区域(.code、.data、.bss、.readonly……),这样划分便于程序链接,而代码在用编译器编译时是将数据和代码放在一起(便于生成可执行的)
页框:页框数=物理内存大小/每一个分配内存的大小(4KB),页框以4KB位单位
页帧:在磁盘一个个程序被划分成4KB大小的数据
页号:页表项的序号
执行顺序语句的过程:当前语句的起始地址+当前代码的长度(虚拟地址存放代码是存放在连续区域的)
虚拟地址空间不存在存放地址的功能,因此需要用户必须保存起来(避免内存泄露)
进程与程序的区别:
总结:
- 保护物理内存,不受到任何进程内的地址直接访问,方便进行合法性校验
- 将内存管理和进程管理进行解耦
- 让每个进程,以同样的方式来看待代码和数据
虚拟地址和物理地址之间是通过页表完成的映射关系
回答上面代码(为什么地址一样?)的问题
补:
TCB: 线程控制块
MMU:内存管理单元,一种负责处理中央处理器(CPU)的内存访问请求,功能包括虚拟地址到物理地址的转换(即 虚拟内存管理)、内存保护、中央处理器高速缓存的控制
CACHE: 高速缓存
DMA: 直接内存存取
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。