虚拟空间物理空间
内存与磁盘的运行速度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…
创建打开文件: