吴桥网站建设公司,医院网站建设思路,上海网站建设免,德阳定制建站网站建设报价进程概念
#xff08;冯诺依曼体系结构#xff0c;操作系统#xff0c;进程概念#xff0c;进程状态#xff0c;环境变量#xff0c;程序地址空间#xff09; 冯诺依曼体系结构#xff1a;#xff08;计算机硬件体系结构#xff09; 输入设备#xff0c;输出设备冯诺依曼体系结构操作系统进程概念进程状态环境变量程序地址空间 冯诺依曼体系结构计算机硬件体系结构 输入设备输出设备存储器运算器控制器CPU CPU想要处理数据要从内存中取出进行处理–CPU执行的一个程序首先要把程序从硬盘加载到内存 操作系统 本质一个软件程序 功能对计算机进行软硬件管理 目的让计算机更好用 完整的操作系统内核外部应用linux内核 各个操作系统厂商根据linux内核进行定制化开发然后加上自己封装的应用组成自己的操作系统RedhatDebian… 操作系统如何管理硬件 用户 库函数 系统调用接口 操作系统 硬件驱动 硬件 自上而下由操作系统进行串联 进程 运行中的程序是程序运行过程的动态描述这写描述在pcb-进程控制块中在linux下是一个task_struct结构体 操作系统管理和调度程序的运行是通过pcb来实现 pcb描述的信息标识符进程ID内存指针程序数据在内存中的地址程序计数器上下文数据切换cpu寄存器中的数据会保存下来这是其一进程状态io信息… 进程状态 状态标记了当前进程该如何被操作系统进行调度管理标识一个进程什么状态该做什莫事 课本上 就绪–准备好了拿到时间片就能运行 运行–CPU在处理获得CPU 阻塞–因为某些特殊原因暂时不能运行满足某种条件后被置为就绪状态拿到时间片可以运行 linux下进程状态 查看进程ps -aux | grep name 查看进程状态 ps -ef | grep name 查看进程的父进程 进程的六种状态 运行态–R正在被执行以及拿到时间片就能执行的进程正在运行或在运行队列中等待 可中断休眠–S因为某种运行条件不足暂时不能被调度运行的进程sleep(3),可以被kill -9 pid杀死 不可中断休眠态–D无法被中断阻塞只能等待阻塞的唤醒条件才能被调度执行不可被kill 停止态–T什么都不做但还活着可以被调度与休眠不同休眠是阻塞 僵尸态–Z进程退出运行但是资源没有被完全释放等待处理pcb中还保存其信息 创建子进程pid_t fork(void);–通过赋值调用进程父进程来创建一个新的进程子进程 返回值在父进程中返回值是子进程的pid大于0在子进程中返回0出错返回-1 在在系统的角度进程就是pcb咋linux下是task_struct 结构体 创建一个进程就是创建了一个task_struct 结构体也就是创建了pcb fork创建就是复制了父进程中大部分数据 它们都是进程平等关系不是子集关系 #includestdio.h
#includeunistd.h
int main()
{printf(hello\n);//如果没有换行就不会清空缓冲区那么下面fork子进程子进程会把缓冲区内容一块复制就会出现和父进程一样的输出hellobye有\n则只有bye会输出两次pid_t childfork();printf(bye\n);return 0;
} 僵尸进程子进程先于父进程退出为了保存退出原因退出后没有完全释放资源成为僵尸进程 危害资源泄露 避免进程等待等待子进程退出获取退出子进程的返回值释放子进程资源避免产生僵尸进程 僵尸进程存在的原因就是为了保存子进程退出原因给父进程看只要父进程获取了退出原因资源就会被释放 #includestdio.h
#includeunistd.h
#includestdlib.h
int main()
{int retfork();if(ret0){printf(child--%d\n,getpid());sleep(5);//子进程休眠五秒后退出但是父进程没有接受其返回值所以成为僵尸进程}else {printf(parent--%d\n,getpid());sleep(30);//让父进程休眠更长时间}return 0;
}
用ps查看进程
程序运行结果: 孤儿进程父进程先于子进程退出子进程成为孤儿进程 特性运行在后台父进程成为1号进程以前叫init进程现在是systemd fork创建子进程父子进程的运行顺序是不一定的在操作系统中进程按照异步方式运行按各自独立的、不可预知的速度向前推进 #includestdio.h
#includestdlib.h
#includeunistd.h
int main()
{int retfork();if(ret0){printf(我是子进程:pid%d\n,getpid());sleep(10);}else {printf(父进程:pid%d,3秒后退出\n,getpid());sleep(3);exit(0);}while(1){sleep(1);}return 0;
}
子进程的ppid为1状态为 1号进程systemd 孤儿进程会成为僵尸进程吗—不会变成僵尸进程会被1号进程收养 环境变量保存当前程序运行环境参数的变量 优点:即时生效让运行环境配置更加灵活通过环境变量可以给运行的程序传递数据 终端shell有两种变量环境变量有继承性、普通变量无 接口char* getenv(char* name); 指令env 查看所有环境变量 set 查看所有变量 echo 打印指定内容到终端 export 声明一个变量为环境变量 unset 删除变量 在程序中访问环境变量 1.getenv接口 2.main函数第三个参数 main(int agrc,char* argv[],char* env[]) 3.全局变量extern char**environ 并发独木桥多个人一次走一个轮换着走 并行更宽的桥可以多个人同时一起走 程序地址空间操作系统为每个进程描述的一个虚拟地址空间 内存地址对存储区域的编号以字节为单位 程序地址空间更应称作进程地址空间运行起来的程序才会占据内存 在一个进程中所访问到的所有变量地址都是一个虚拟地址并不是真正的物理地址存储虚拟地址经页表映射得到物理地址从而访问物理内存 虚拟地址空间是一个结构体linux下是mm_struct 系统通过mm_struct结构体向每个描述了一个虚拟的、连续的、完整的、线性的地址空间。 好处1.每个进程都要一个完整独立的虚拟地址空间贼地址可以随便使用不用担心冲突地址管理更加方便 2.通过页表映射可以随机存储在物理地址的任意位置实现数据离散式存储提高内存利用率 3.在进行页表映射后可以进行访问权限的控制 内存管理方式 分段式内存管理将一整个的地址空间划分为多个段代码段数据段栈区堆区… 作用更加利于编译器对于地址的管理 段表是一种数据结构其中描述的信息段号物理内存的一个起始地址 虚拟内存地址 段号偏移量通过段号找到段表项得到一块物理内存的起始地址起始地址偏移量实际物理地址 分页式内存管理将一整的地址空间划分为大量的小分页page当前一般默认4k字节一页 作用实现数据的离散存储提高内存利用率 页表页号物理内存地址起始缺页中断位访问权限位… 虚拟地址组成页号页内偏移 通过虚拟地址中的页号直到对应的页表项得到了一个物理内存块的起始地址加上页内偏移就是实际的访问位置不同的地方在于应用方向不同分段式利于地址管理分页式更倾向于碎片化管理提高内存利用率和内存访问控制 访问权限位标记当前地址能够进行什么样的操作 比如0号地址NULL不可读不可写对其进行解引用或修改会造成内存访问错误程序崩溃 比如const修饰的常变量只读代码段的所有地址都是只读 缺页中断当进程要访问一块内存时经过页表映射法先缺页中断为被置位意思是这个地址原先的数据现在不在内存中则会触发缺页中断。 内存交换一个程序运行就要占据大量内存内存有限耗尽时就无法进行任何操作内存交换就是将内存中的某些数据从内存中移出放到硬盘腾出内存空间 当访问数据刚好是刚被移出的数据就会发生缺页中断而当发生缺页中断时内存就又要重新进行内存置换。频繁的置换和缺页中断会造成性能大大降低硬盘吞吐量太小 内存置换算法 LRU–最久未使用 LFU–最少使用 交换分区的大小一般是内存的两倍无具体大小。