Linux系统编程:step1

一、程序和进程
1、程序和进程
(1)程序:二进制文件,占用的磁盘空间(未运行的,躺在磁盘中)
(2)进程:一个启动的程序(启动之后,程序就和磁盘没有关系了),所有的数据都在内存中,需要占用更多的系统资源(CPU,物理内存),例如:一个剧本(未拍摄,那可以看成程序),要把这个剧本的内容呈现出来(那就是进程),需要演员、道具,场地等(也就是电脑中的系统资源) 。需要各个系统资源之间交互 。
2、并发和并行
(1)并发:并不是某一个时间点的概念,是一个时间段的概念,常说的高并发服务器,说的是在一短时间内,处理的请求数(例如:1秒内处理的请求个数) 。
例如:一个咖啡机(一个CPU),有100个人去打咖啡,1分钟只能打一杯咖啡,我们需要在1分钟之内让所有的人都能取到咖啡,那么采用的算法就是每人有0.6秒的时间取咖啡,虽然没打满,但是取到了咖啡,只有按照同样的方法进行下去,这就是一个高并发的例子 。人相当于请求 。
cpu在某一时间点只能处理一个进程,为了能并发处理,CPU会把一个时间段切割成一系列的时间碎片,分给不同的进程使用(有点像时分通信),一句话就是切割时间 。
(2)并行
上图所示,由一个咖啡机变成了两台,也就是增加了一个CPU,用户看到的是并发量变大了,实际上是增加了处理器 。例如:淘宝后台服务器提供服务,是通过许多的服务器进行并行提供服务 。
小结:每个进程只能在某一时间段获取CPU,所有的进程都是轮循的获取CPU,一个进程不会独占CPU 。
3、pcb
进程控制块(block)
作用:存在于内核当中,用来维护进程的相关信息,Linux内核PCB是结构体,也就是一个类型,里面有需要保存的信息(与C++里面面向对象编程如出一辙) 。
重点部分:
二、进程控制(关键)
进程控制:讲的就是如何建立进程
程序a.out 编程进程,去shell进程中执行 ./a.out 变为子进程
【Linux系统编程:step1】Q:如何让一个父进程创建一个子进程?
A:int fork(void)
fork(叉子),子进程相当于父进程的一个拷贝,也就是子进程和父进程地址空间一样,也就是上图中除内核的其他部分完全一样 。也就是用户区一样 。但是内核区不一样,因为内核区中保存了PCB,而PCB中中保存的进程id是不一样的,所以,子、父进程不同的就是进程id不一样 。
fork不同之处:有两个返回值,一个进程变为两个进程之后,因为拷贝,两个进程的地址空间是一样的,数据完全一样,在代码段.text中,父子进程都有一个fork,所以都有一个返回值,父进程就返回子进程的一个id,子进程就返回0,所以就有了两个返回值 。
上图所示,父进程中fork之后,其实就拷贝了拥有相同代码的子进程(右边),但是是在父进程中fork的所以pid得到的是子进程的id,而在子进程中,由于没有fork,所以返回的pid是0,以此区分子进程和父进程 。也就是返回值是由不同的进程出来的,拷贝之后就有两个了 。
问题:
Q1:fork函数的返回值 A1:两个,pid>0 父进程的返回值,pid == 0, 子进程的返回值
Q2:子进程创建成功后,代码的执行位置?
A2:正如上面所示,子进程从非灰色部分开始执行,而父进程从头到尾执行 。父进程执行到了那,子进程就从那开始执行 。
Q3:父子进程的执行顺序?
A3:不一定,谁抢到CPU,谁执行 。
Q4:如何区分父子进程?
A4:通过fork的返回值 。
#include#include