缓冲区
为什么会有缓冲区的存在?
屏幕是一个硬件设备,是由操作系统来管理的,因此printf打印的时候需要调用操作系统的接口才能完成,这个时候我们需要从用户态切换到内核态,这个开销是比较大的.
当printf的时候,会把内容先放入缓冲区中,缓冲区刷新后打印在屏幕上
刷新条件
printf将内容先写入到缓冲区中,缓冲区刷新到界面(屏幕)上的条件是:
(1)缓冲区放满
(2)缓冲区未满,强制刷新缓冲区到屏幕(方法一:\n;方法二:主动刷新:fflush(stdout));
(3)程序结束时,自动刷新缓冲区:exit方法;
三者满足一点即可
fork
PCB和PID:
PCB:进程控制块(进程描述符),进程控制块是用一个结构体struct task_struct来实现;
PID:进程唯一的标识符,相当于人的身份证,通过这个判断是不是一个进程
进程的状态:
就绪,阻塞,运行
fork如何复制进程:
fork是把已有的进程复制一份,当然把PCB也复制了一份,然后申请一个PID,子进程的PID=父进程的PID+1;
fork时是连缓冲区也会复制的
fork的时机:
fork产生的这个子进程不是从头开始执行的,而是从fork之后开始执行的,就是说fork下面的代码子进程才开始执行,具体的是说从返回值这里子进程开始执行,子进程不会再fork了,所以不会出现子进程再去fork产生一个子进程的问题.
也就是说:从返回值这里开始,父进程返回子进程的PID,子进程返回0;
如果要得到进程PID,可调用getpid,若要得到父进程PID,调用getppid
通过做题理解
1.此时打印几个A?
答案:6个,此时有\n,打印缓冲区立即刷新。
i=0时,fork一下,父进程创建子进程,各打印一个A
i=1时,fork一下,原来的父进程再次fork一个子进程,第一次fork的子进程也会fork一个子进程
此时共有4个进程,各打印一次A,4个A
所以共有2+4=6个A
2.若打印改成printf("A"),打印几个A?
注意:此时去掉/n,不会立即刷新缓冲区了
答案:8个A
i=0时,fork创建一个进程各打印一个A,此时缓冲区不刷新,屏幕上是没有A的
i=1时此时执行第10行,fork时
共有4个进程,缓冲区也会复制
此时再执行11行,打印A
之后仍不刷新缓冲区,屏幕没有打印A
直到执行到13行,exit时才会刷新缓冲区,打印出8个A
即: