【僵尸进程和文件系统调用】

虚拟空间物理空间

内存与磁盘的运行速度1:20
x86 32位 4G–> 物理内存:寻址能力4G
4G供内核1G,用户态的3G,
虚拟空间4G,虚拟空间可以通过页表映射到物理内存上,理论上可以通过虚拟空间将物理内存占满,但是实际上是占不满的。因为跑个程序一般占几十个页面,也就是几十K,所以3~4个G一般占不完。(虚拟内存实际上是不存在的)
页表信息在哪查看?
一个进程的信息都在PCB中保存,所以一个进程的页表信息也在PCB中保存,(一个进程的创建先出现PID,接着才会出现进程实体。一个进程的结束,进程实体先消失,紧接着PID才会消失)。

僵尸进程

僵尸进程产生

僵尸进程:子进程先于父进程结束,父进程没有回收子进程,子进程进入僵尸进程。子进程的退出,父进程未获取子进程的退出码,所以子进程进入僵尸进程。
僵尸进程代码举例:

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main(){
int n=0;
char *s=NULL;
pid_t pid=fork();
if(pid==0){//子进程
n=3;
s="child";
}else{//父进程
n=7;
s="parent";
}
for(int i=0;i<n;i++){
printf("pid=%d,ppid=%d,s=%s\n",getpid(),getppid(),s);//getpid()获取当前进程pid,getppid()获取当前进程父进程的pid
sleep(1);
}
return 0;
}

通过ps命令查看
在这里插入图片描述

僵尸进程的解决

子进程结束之后父进程获取子进程的退出码便不会出现僵尸进程。
父进程通过wait命令等待子进程结束之后获取子进程的退出码然后父进程运行。
代码:
在这里插入图片描述

孤儿进程

孤儿进程:父进程先于子进程结束,子进程的父进程由init进程接管子进程。
代码举例:

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main(){
int n=0;
char *s=NULL;
pid_t pid=fork();
if(pid==0){//子进程
n=7;
s="child";
}else{//父进程
n=3;
s="parent";
}
for(int i=0;i<n;i++){
printf("pid=%d,ppid=%d,s=%s\n",getpid(),getppid(),s);//getpid()获取当前进程pid,getppid()获取当前进程父进程的pid
sleep(1);
}
return 0;
}

ps -f命令查看
在这里插入图片描述

文件系统调用

程序调用库函数,比如./main程序调用printf库函数,也就是系统调用wrinte,需要从用户空间嵌入内核空间,取得内核支持,从而打印到屏幕(硬件设备)上。
也有一部分函数不需要内核的支持比如:strlen …strcmp…

创建打开文件:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

*闲鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值