wap网站乱码,上海自贸区注册公司的条件,山西工程项目视频制作公司,淄博瓷砖网站建设中企动力进程概念
进程是什么#xff1a; 表面上来说进程是程序的一个执行实例#xff0c;或者是一个正在执行的程序等#xff0c;从操作系统的角度来说#xff0c;程序运行需要将代码数据加载到内存中#xff0c;由于在操作系统中运行了很多的程序#xff0c;操作系统就必须去管…进程概念
进程是什么 表面上来说进程是程序的一个执行实例或者是一个正在执行的程序等从操作系统的角度来说程序运行需要将代码数据加载到内存中由于在操作系统中运行了很多的程序操作系统就必须去管理这些运行的程序先描述再组织所以在操作系统的层面的进程就是操作系统对一个运行的程序的描述。这个描述信息就是PCB进程控制块在Linux中这个PCB有一个专属的名称task_struct结构体。task_struct是Linux内核的一种数据结构他会被装载到RAM里并且包含着进程的信息。 pcb中的描述信息
内存指针包括程序代码和进程相关的数据的指针还有和其他进程共享的内存块的指针。
程序计数器程序中即将被执行的下一条指针的地址。
上下文数据进程执行时处理器的寄存器中的数据。
标识符PID描述本进程的唯一标识符用来区别其他的进程。
进程状态任务状态退出代码、退出信号等。
进程优先级决定了cpu给进程分布分配资源的优先级
记账信息处理器时间总和使用的时钟数总和时间限制、记账号等。
IO信息包括显示的I/O请求分配给进程I/O设备和被进程使用的文件列表。
CPU分时机制 对程序运行处理进行切换调度处理时间片cpu在每个程序上所运行的这段时间
查看进程
s -aux | grep 进程名
cd / - cd /proc -cd 进程ID创建进程
创建子进程的意义
分摊任务处理压力让子进程完成其他任务提高稳定性 操作系统通过写时拷贝技术来创建子进程也就是说通过复制父进程创建子进程子进程初始时与父进程指向同一块物理内存区域当内存数据发生改变时为了保证进程之间的独立性操作系统会为子进程重新开辟一段物理内存空间并且更新子进程的页表。 复制操作系统通过复制父进程创建子进程因此父子进程数据独有但是代码共享 返回值对于父进程来说fork返回的是子进程的pid创建子进程失败返回-1对于子进程来说fork的返回值是0
用户通过fork的返回值不同对父子进程进程运行流程进行分流
#includeiostream
#includestring
#includepthread.h
#include unistd.h
#includevector
using namespace std;int main()
{//pid_t fork(void)//创建一个子进程父进程返回子进程的pid,子进程返回0pid_t pid fork();if(pid 0){cout fork error endl;return -1;}else if(pid 0){cout ----I am child---- getpid() endl;}else{cout ----I am parent---- getpid() endl; }return 0;
}
进程状态
运行、就绪、阻塞
R运行状态但是并不意味着进程一定在运行中它表明进程要么是在运行要么是在运行队列里
S睡眠状态意味着进程在等待事件完成可中断休眠能够被唤醒的状态
D磁盘休眠状态不可中断休眠要通过特定的条件才能被唤醒
T停止状态可以通过发送SIGSTOP信号给进程来停止这个被暂停的进程可以通过发送SIGCONT信号继续运行。
X死亡状态这个状态只是一个返回状态不会再任务列表中看到这个状态。
僵尸进程
处于僵尸状态的进程会造成内存泄漏
僵尸进程产生的原因 子进程先于父进程退出因为要保留推出原因所以操作系统不能直接释放所有资源通知父进程获取退出原因允许操作系统释放资源但是父进程没有关注这个通知导致子进程退出后无法释放所有资源处于僵死状态称为僵尸进程。
如何避免进程等待
处理方式退出父进程
孤儿进程
父进程先于子进程退出子进程成为孤儿进程运行在后台父进程成为1号进程 守护进程/精灵进程特殊的孤儿进程一个进程的父进程先于他推出后成为孤儿进程他会脱离各种会话和终端影响将之前的所有联系取消
环境变量
存储系统运行环境参数的变量
查看环境变量 env set echo
设置环境变量 export
删除环境变量 unset
常见环境变量 HOME PWD SHELL PATH
环境变量特性 全局特性继承 当前shell终端下所运行的进程能够获取到当前终端所有的环境变量但是获取不到普通变量
环境变量在代码中的获取
通过函数 char* getenvchar* name
main的第三个参数 int main(int argc, char* argv[], char* env[])环境变量的使用场景 通常是父进程通过给子进程设置环境变量达到向子进程传递数据的功能。
程序地址空间 内存地址就是内存区域的一个编号变量就是一块内存地址的别名。
虚拟地址 虚拟地址空间实际上是一个结构体 mm_struct这个结构体给进程描述了一块完整连续的虚拟地址空间但是在物理内存中有可能是不连续的。
struct mm_struct
{ulong men_size;//内存大小ulong code_start;//代码段的起始位置ulong code_end;//代码段的结束位置
};每个进程都会有一份自己的程序地址空间。并且每个程序都需要一块连续的地址空间。操作系统对每个运行起来的程序都会建立一块虚拟的地址空间给进程描述一块虚假的内存空间每一个变量都有一个虚拟的地址但是这个虚拟的地址无法存储数据还是要存储到物理内存中这时就有一个页表它主要时做映射将变量通过映射映射到物理内存中这块物理内存存放的就是变量的值子进程复制了父进程而创建也就是说子进程和父进程有着相同的虚拟地址空间和页表在他的初始化全局这段空间中也有着和父进程相同的变量也通过页表映射一块物理内存空间这块物理内存空在开始的时候是相同的但是当子进程要修改这块内存中的数据的时候为了保证进程之间的独立性操作系统会通过写时拷贝技术为子进程重新开辟一段块物理内存空间所以说地址相同说的是他们的虚拟地址相同。 我们所看到的程序地址空间实际上是一个虚拟地址空间实际上是通过操作系统通过mm_struct这个结构体为进程描述的一个空间因此有时候也称作内存描述符。
为什么要有虚拟地址空间 进程通过访问虚拟地址进而获取变量数据最终还是要去访问物理内存因为数据是存储在物理内存中的在虚拟地址和物理地址之间通过页表进行地址映射将虚拟地址转换得到物理地址进而访问物理内存区域。通过映射之后物理地址可就不一定是连续的了通过这种映射转换的方式实现数据的离散存储提高了内存的利用率。页表中不但记录了虚拟地址和物理地址的映射关系还记录了这块地址的属性实现内存的访问控制。
为什么进程要独立 进程应该具有独立性因为独立才更加稳定
虚拟地址空间和页表有什么用
提高内存利用率增加内存访问控制保持进程独立性
页表是如何将虚拟地址转换到物理地址 一共有三种常见的内存管理方式分段式、分页式和段页式 分段式内存管理
内存地址构成段号段内偏移 段表有很多的段项
物理段的起始地址 分段式物理地址获取方法通过地址中的段号去段表中找到段表项通过段表项中的物理起始地址加上地址中的段内偏移获取到物理地址
分页式内存管理
内存地址的构成页号 页内偏移
页表中有很多页表项 分页式物理地址获取方法通过地址中的页号去页表中找到页表项通过页表项中的物理页号加上页内偏移获取到物理地址
段页式内存管理 内存地址段号段内页号页内偏移 段表向中包含段内页表起始地址 段内页表中包含物理页号
段页式物理地址获取方法通过段号在段表中找到段表项通过段表项中的段内页表地址找到段内页表通过地址中的段内页号在段内也表中找到页表项通过页表项中的物理页号与页内偏移组成物理地址。
内存置换算法
内存中只有4G但是想处理5G的数据怎么办
swap分区也叫交换内存内存不够时将内存中的数据置换到交换分区中腾出内存处理数据
置换算法 FIFO先进先出核心原则就是如果一个数据最先进入缓存区则因该最早淘汰掉 LFU最近最少频率未使用。基于访问次数。 LRU最近最久未处理基于访问时间。