Linux Day06

目录

一、printf输出问题

二、复制进程fork

2.1进程

2.2   pid_t fork(void);

 注意:

2.3逻辑地址和物理地址

2.4写时拷贝技术


 

一、printf输出问题

printf 函数并不会直接将数据输出到屏幕,而是先放到缓冲区中,只有一下三种情况满
足,才会输出到屏幕。
1) 缓冲区满
2) 强制刷新缓冲区 fflush
3) 程序结束时
Linux Day06_第1张图片

会出现很长时间后系统打印出hello字符

解决:

1.在hello后面+\n,可以起到强制刷新的作用

2.加上fflush(stdout),强制刷新

二、复制进程fork

2.1进程

进程是一个正在运行的程序;

每个进程都有一个进程控制块,PCB

进程控制块是一个用结构体struct task_struct 实现的

2.2   pid_t fork(void);

函数返回类型 pid_t 实质是 int 类型
fork 函数会新生成一个进程,调用 fork 函数的进程为父进程,新生成的进程为子进程。
在父进程中返回子进程的 pid,在子进程中返回 0,失败返回-1。
Linux Day06_第2张图片
结果:
Linux Day06_第3张图片

 Linux Day06_第4张图片

 getpid()获取当前进程的pid

getppid()获取当前进程的父进程

 在第10行代码执行后,分成子进程和父进程,两个同时进行

Linux Day06_第5张图片

 注意:

程序在运行到fork完,将父进程复制一份成为子进程,整个空间都复制了

2.3逻辑地址和物理地址

当我们把n的值和地址打印后会发现一个很神奇的东西

Linux Day06_第6张图片

 运行结果:

Linux Day06_第7张图片

 不同的n打印的地址是相同的!!!

 地址:偏移量

Linux Day06_第8张图片

 

   父进程的1和子进程的4都是0号逻辑页但是他们物理页不同

举个栗子:

操场排队,你在第三排的第三个位置,这个时候你实际所在位置是操场的东南角的A区,第二天的时候,你在操场的西北角B区,但是你还在你们队伍的第三排第三个位置,

这里的第三排第三个位置是逻辑地址,而操场实际位置就是你的物理地址。每次物理地址不同但是你的逻辑地址一般是不变的。

Linux Day06_第9张图片

这时这个n我们就能解释了,他两的偏移量是一样的所以逻辑地址是一样的,都是0x7fff21153c44

但是他两所处空间不同,一个在父进程页面,一个在子进程页面,物理地址不同

2.4写时拷贝技术

写时拷贝:父进程和子进程是同一个逻辑地址,但不是同一个物理地址 一般子进程的pid号是父进程的pid+1
父进程和子进程刚开始是公用同一个物理地址的,但当页内容发生改变时,才会将父进程的内容复制一份给子进程,改变的页表信息独立一个物理地址,页表其余没变的页表信息和父进程一样

Linux Day06_第10张图片

 当父子进程有一点不同则就需要复制,但是内容一样时,系统为了优化,节省空间,就不需要拷贝了,进而大大提升效率。

你可能感兴趣的:(linux,运维,服务器)