进程回顾
上一次讲了进程的 并发和并行区别 并且举列说明了
1 并发 强调是的 同个时间段 发生了 不同事件 因为cpu 读取太快了 所以我们看到以为是同时发生的 其实不是
2 并 行 强调 同个时间点 不同事件发生 互不影响。
我们 继续往下学
一 进程状态
1 挂起 和终止态
挂起 理解为关机, 终止就就是 xxx 了(芭比q了), 初始就是开始状态。
1 运行态 睡眠后就是挂起
2 终止得到执行资格 就是xxx了
2 就绪态 和运行态
1 就绪就是准备的意思
2 cpu 都会有 选择 进程 的 资格
3 只有 cpu有执行的权利
4 进程只有 被选择 的资格
5 每次进程 结束, cpu的选择都会发生改变
6 cpu 是主动的 进程是被动的 等待被选中。
二 进程创建
1 fork 函数
当我们调用了frok 函数之后 父进程会克隆出 一个子进程
先直接上代码
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main(int argc,char *argv[])
{
pid_t t;
t=fork();
if(t>0)//大于O 父进程
{
printf("father pid is %d\n",getpid());
}
else if(t==0)//等于0 子进程
{
printf("father pid is %d ppid is %d \n",getpid(),getppid());
}
return 0;
}
子进程打印 当前pid 和它的父进程 pid
父进程打印 当前pid
为什么 有些 正常按顺序 有些却不是
1 因为 main 也是一个进程 shell命令行也是一个进程
2 main shell有时候会和父进制和子进程抢占资源
所以才会导致这种现象出现
3 有时候看到并不是 父进程 先打印的而是子进程 先打印的
还是并发原理 因为cpu读取太快了 所以看到可能并不是你想的
2 父进程和子进程执行的时间段
在调用 fork 函数之后
1 fork 会克隆出子进程
2 并且会拷贝出一块属于子进程的区域
3 fork 之后 父进程停止执行
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main(int argc,char *argv[])
{
pid_t t;
int i;
for(i=0;i<3;i++)
{
printf("*********i=%d\n",i);
}
t=fork();
if(t>0)
{
printf("father pid is %d\n",getpid());
}
else if(t==0)
{
printf("father pid is %d ppid is %d \n",getpid(),getppid());
}
for(i=0;i<4;i++)
{
printf("i=%d\n",i);
}
return 0;
}
前后加了for 循环 打印不同内容 证明一下
现象 1
现象 2
出现 现象 1 现象2 原因
为什么第一个for 每次只跑一次 ????
为什么父进程也打印对应的后面的for循环了????
1 父进程是从 main开始执行的 到了fork 就停止了
2 子进程执行之后就会打印后面的for 和if里面内容
3 子进程会抢占父进程资源 所以假象认为是父进程执行了
其实是子进程在跑父进程的内容 并且输出了
2 3 就会导致 打印了两次 后面的 for 循环内容
先讲这么多 大家要稳住呀。