进程
文章平均质量分 72
镜中月ss
这个作者很懒,什么都没留下…
展开
-
深入理解进程(七)——程序替换
深入理解进程(七)——程序替换 一、什么是程序替换? 用一个新的程序去替换一个进程正在调度的程序的信息。 二、程序替换的原理 进程运行一个程序时,我们需要将该程序加载到内存中,然后再通过该进程的虚拟地址空间利用页表映射到数据实际上存放的物理内存中,通过这样的方式,就实现了进程与程序之间的关联。如果我们此时将另一个程序加载到内存中,然后修改这种映射关系(也就是修改页表),那么进程就与这个新程序关联起来,那么该进程就不再执行原来的程序,而是会去执行这个新的程序。 三、程序替换的本质 本质上就是去替换一个进程pc原创 2021-02-05 16:51:33 · 749 阅读 · 0 评论 -
深入理解进程(六)——进程等待
一、进程等待的作用 父进程等待子进程退出,获取子进程的返回值,避免产生僵死进程。 二、如何实现进程等待 (1)wait函数 1. 函数原型: pid_t wait(int *status)该函数是一个阻塞函数,功能是等待任意一个子进程退出。 2. 参数说明: status:用于获取退出原因 3. 返回值: 返回值是退出的子进程的ID (2)waitpid函数 1. 函数原型: pid_t waitpid(pid_t pid,int* status,int options) 可以等待任意一个子进程退出或者等原创 2021-01-27 09:37:44 · 913 阅读 · 0 评论 -
深入理解进程(五)——进程终止
深入理解进程(四)进程终止 本篇介绍退出进程的三种常用方式:return、exit和_exit。 一、进程退出的三种常用方法 方式一:在main函数中调用return。 退出时会自动刷新缓冲区,将缓冲区中的数据写入文件中 方式二:调用exit函数。 函数原型:void exit(int status) 该函数是一个库函数,谁调用该函数那么谁就退出,并将status作为返回值返回给父进程。 方式三:调用_exit接口 函数原型:void _exit(int status) 该函数是一个系统调用接口,同样谁调用原创 2021-01-26 14:35:02 · 179 阅读 · 0 评论 -
深入理解进程(四)——进程创建
本篇文章主要介绍了与进程创建有关的两个函数fork和vfork,以及他们之间的区别 (1)fork函数 函数原型: pid_t fork()。该函数是通过复制父进程来创建子进程。 返回值: 调用一次fork函数却能够返回两个值。 在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。我们可以通过fork返回的值来判断当前进程是子进程还是父进程。 fork出错可能的原因 (1)当前的原创 2021-01-26 11:06:31 · 271 阅读 · 0 评论 -
深入理解进程(三)——由虚转实
深入理解进程(二)——由虚转实 上一篇对虚拟地址空间做了基本的介绍,这一篇介绍操作系统是如何将虚拟地址转换为物理地址的。 虚拟内存的管理主要是分为三种:分页、分段、段页。 分页式管理 首先要明白一些基本的知识: 虚拟地址: 也就是进程一般访问的地址,其实就是虚拟地址空间中的地址。它一般是由页号和页内地址组成。 物理地址: 数据真正存放的地址,一般是由操作系统来访问的。它一般是由块号和页内地址组成。 页表: 页号: 对应进程的哪一页 块号: 对应内存的哪一块 页表始址: 整个页表的开始位置 页表项长度: 一原创 2021-01-25 15:40:08 · 904 阅读 · 0 评论 -
深入理解进程(二)——虚拟地址空间
深入理解进程(一)——虚拟地址空间 一、为什么要有虚拟地址空间? 在谈论虚拟地址空间之前,大家要知道一个常识:程序在运行之前是要全部加载到内存中的。 假如现在有两个程序,一个大小为4M,一个大小为8M,而我们的内存大小为16M。首先我们运行4M大小的程序,将其加载到内存中,然后再运行8M大小的程序,同样将其加载到内存中,如下图所示: 那么这个时候我们还剩余4M的空间,此时如果我们想要再加载一个6M大小的程序,那么肯定就加载不了,因为内存不够,但是如果这个程序的优先级很高,那么操作系统就会把4M的程序原创 2021-01-22 15:21:50 · 771 阅读 · 0 评论