进程
进程
并行和并发:

时间片:cpu分给某一个进程的处理时间,一旦这个时间到了,那么进程就会回归就绪态。
进程状态。
进程状态转换:
创建一个进程:
#include<stdio.h> #include <sys/types.h> #include <unistd.h> int main(){ int num=0;//说明进程之间的处理是分开的,也就是这个num在父进程和子进程中更改,两者互不干扰 pid_t pid = fork(); //判断是父进程还是子进程: if(pid>0){ //如果大于零,则说明返回的是父进程的进程号: printf("%d",pid); printf("我是父进程pid:%d,ppid:%d\n",getpid(),getppid()); num+=10; printf("parent num:%d\n",num); sleep(1); } else if(pid==0) { printf("son num:%d",num); printf("我是子进程pid:%d,ppid:%d\n",getpid(),getppid()); } else{ printf("创建失败"); }
//这里父子进程都会执行,因为没有写进判断内部 for(int i=0;i<5;i++){ printf("%d执行了该语句\n",getpid()); sleep(1); } return 0; }
结果:
父子进程的说明:
子进程会在fork()函数之后开始执行
首先当我们通过fork()函数创建一个新进程的时候,其实是内核拷贝了一份地址虚拟空间,两个虚拟地址空间其实是一样的,但是内核区的pid和ppid是不一样的,main函数的父进程是该终端源(因为终端本身就是一个进程),而创建的子进程其实是在这个父进程的下面,而父进程又是在终端的下面,
其次子进程其实是拷贝了父进程,但是子进程和父进程其实是共同用一份内存,只有当父子进程尝试去改变它的时候,才会复制这个地址空间,这个很重要。
也就是读时共享,写时复制

浙公网安备 33010602011771号