相关概念
- 程序和进程
- 并发
- 单道程序设计
- 多道程序设计
- CPU和MMU(Memery Manage Unit)
- 进程控制块PCB
- 进程状态
CPU基本架构
MMU基本工作原理(32位机)
整个虚拟内存中 真正占用内存上限为4G,实际远小于4G
- MMU位于CPU内部,作为硬件存在
- 0-3G中:text代码 data数据 heap低地址向高地址 stack高地址向低地址。整个称为用户空间。
- 3G-4G:内核区,包含PCB
PCB
Linux中,内核的PCB是task_struct结构体
其中包含进程状态,进程切换时需要保存的寄存器,虚拟地址空间信息,控制终端信息,当前目录,umask,文件描述符表(包含很多指向file结构体的指针),信号相关信息,用户id和组id,会话(session)和进程组,进程可使用的资源上限。
//输出所有的环境变量
#include<stdio.h>
extern char ** environ;
int main(void){
int i;
for (i=0; environ[i];i++){
printf("%s,\n",environ[i]);
}
return 0;
}
//三个关于环境变量函数的操作 man~~~
#include <stdio.h>
#include <stdlib.h>
int main(){
char *val;
const char*name="ABCC";
val=getenv(name);
printf("1 %s-->%s\n",val,name);
setenv(name,"ahula",0); //0表示若值存在,则不覆盖.
val=getenv(name);
printf("2 %s-->%s\n",val,name);
unsetenv(name);
val=getenv(name);
printf("3 %s-->%s\n",val,name);
setenv(name,"benboerba1",1);
setenv(name,"lllllll",1);
val=getenv(name);
printf("4 %s-->%s\n",val,name);
return 0;
}
//分别输出父子进程的 pid
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
int main(){
pid_t pid;
pid =fork();
if(pid<0){
perror("fork err!\n");
exit(1) ;
}else if (pid==0){
int p_son=getpid();
int p_fa=getppid();
printf("Child process pid=%d!, fa_pid=%d\n",p_son,p_fa);
}else{
printf("This is father process pid_fa=%d pid_son=%d \n",getpid(),pid);
}
return 0;
}
//循环产生五个子进程
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
int i=0;
pid_t pid;
for ( i=0;i<5;i++){
sleep(1);
pid=fork(); //父子进程都位于该行
if(pid==0) break;
}
if(i<5) printf("I'm Child and pid=%d\n",getpid());
}
进程共享
gcc gd.c -o run -g #-g选项后才可调试
./run
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
int var=10;
int main(){
pid_t pid;
pid=fork();
if(pid>0){
sleep(1);
var=55;
printf("Father process,pid=%d var=%d\n",getpid(),var);
}else{
var=100;
printf("Son process, pide=%d ,var=%d\n",getpid(),var);
}
return 0;
}