程序 : 程序指的是一系列有逻辑, 有顺序结构的指令.
进程 : 进程从两个角度来说:
1 用户角度: 进程从用户角度来说就是运行中的程序
2 操作系统的角度: 进程是操作系统对运行中程序的描述信息, 叫做进程描述符(程序控制块)简称PCB
PCB : 在Linux下PCB指的是在内核中的task_struct 结构体, 这个结构体中包含的就是相关程序的基本信息
task_struct的基本信息如下:
1 程序计时器: 程序中即将被执行的下一条指令的地址
2 上下文数据: 进程执行时处理器的寄存器中的数据
3 内存指针: 包括程序相关代码和进程相关数据的指针, 还有和其他进程共享的内存块的指针
4 记账信息: 可能包括处理器的时间总和, 使用的时钟总和, 时间限制,记账号等
5 进程的状态: 任务状态, 退出代码 退出信号等
6 优先级: 相对于其他进程的优先级
7 进程标识符PID: 描述本进程的唯一标识符,用来区别其他进程
查看进程的指令
**ps aux 或者 ps -ef **配合 |grep使用, 来查看所有进程或者单个进程的基本信息
![Linux----进程概念_第1张图片](http://img.e-com-net.com/image/info3/59da9c42d23244c7bf89651563cf19b9.png)
进程创建
通过 fork() 实现一个进程的创建
fork()接口的实现原理是子进程通过复制父进程PCB中大部分的数据创建自己的PCB(内存指针,上下文数据,程序计数器) . 因此两个父子进程代码共享, 数据独有
返回值:判断是否创建进程成功, 分流父子进程
父进程: 返回的是子进程的 pid > 0
子进程: 返回的是0;
僵尸进程
僵尸进程时处于僵死态的进程
产生原因 : 父进程先于子进程退出 , 退出原因(返回值)保存在PCB中, 操作系统检测到进程退出后, 通知父进程, 但是父进程可能并没有关注子进程的退出, 这时候操作系统不能随意释放子进程的资源(因为父进程会孤关注子进程的死亡原因), 因此子进程就处于退出但是资源并没有完全释放的状态(僵死状态)
危害: 资源泄露, 新进程无法创建
解决方法 : 杀死父进程(退出原因的保存已经毫无意义)
孤儿进程
父进程先于子进程退出 (父进程退出后子进程会跑到后台运行) ,子进程被init进程收养 , 到后台运行.
优先级
优先级指的是一个层序划分–决定CPU资源的优先分配权
查看指令 : ps -l
PRI: PRI的值越小代表优先级越高
在Linux下优先级的调整是通过设置nice值进行的: PIR(new)=PIR(old)+nice
nice的取值范围为-20~19, 一共40个级别(进程的nice值不是进程的优先级.,但是他影响进程的优先级)
指令 :无锡妇科医院××× http://wapyyk.39.net/wx/zonghe/fc96e.html
程序启动前修改nice值 nice -n 5 ./test
调整已经存在的进程 renice -5 -p 5200 //调整进程pid为5200的进程
进程的竞争性: 进程之间具有竞争性, 竞争资源
进程的独立性: 进程之间应具备独立性, 保证进程稳定性
并发: 进程在CPU上切换调度运行
并行: CPU资源足够, 进程就可以同时运行
虚拟地址空间和页表(分页式管理)
C / C++中的地址都是由虚拟地址空间, 虚拟地址空间在内核中就是一个结构体
mm_struct
通过虚拟地址访问;
物理地址与虚拟地址都是分页式的内存管理 页号 : 变量在虚拟地址中对应的存储位置(因为地址大小是10的20次方 , 所以页号的大小一共有20位), 因此一个虚拟地址中的前20位就是这个变量所对应的页号. 页内偏移 : 因为一个页面的大小是 4k 的,所以在一个页面上会存储多个变量的信息 . 而虚拟地址剩下的位就是存的这个变量在这个页面上的位置 页表(存储的就是页面信息) : 因此页表也很大, 也是从0开始排布 假设虚拟地址的页面为1, 则他指向也标志中1号页面的位置, 而页表中1号位置中所存储的就是这个虚拟地址的访问权限以及物理地址的页面页号 , 再将虚拟地址的页内偏移物理页面页号相结合 , 最后形成物理地址