计算机系统:进程
计算机系统角度的进程
记得之前在暑假留校的时候学习了进程线程等概念,当时对于很多概念理解很模糊。比如同步异步并发并行等等,理解的有些偏颇。
这学期我学习了计算机系统之后,对有一些概念有了新的认识,所以决定再重新梳理一下这些知识
操作系统的基本特征:并发、共享、虚拟、异步
1. 并发与并行
- 并行性:两个或多个时间在同一时刻发生
- 并发性:两个或多个时间在同一时间间隔内发生
这两个性质的本质其实是同一件事情的不同角度:几个事件在很短的时间里交替执行(微观),如:程序A执行了3ms,程序B执行了2ms,程序C执行了3ms,这三个程序在这8ms中是交替进行的,但对于1s的时间段来说(宏观),三个程序都执行并结束了。宏观感受上我们说它是并行执行的。
2.进程的引入
引入进程这个概念后,操作系统得以并发执行作业。
- 所谓进程,是指系统中能独立运行并作为资源分配的基本单位,它是由一组机器指令、数据和堆栈等组成的,是一个能独立运行的活动实体。
函数fork
一个现有的进程可以调用fork函数创建一个新进程
#include <unistd.h>
pid_d fork(void);
返回值:子进程返回0,父进程返回子进程ID;若出错,返回-1
fork调用一次返回两次。
子进程返回0:一个子进程只会有一个父进程,所以子进程总是可以调用getppid来获得父进程ID(内核交换进程的ID为0,所以一个子进程ID不可能为0)。
父进程返回创建子进程的ID:因为一个进程的子进程可以有多个,并且没有一个函数使一个进程可以获得所有子进程进程的ID。
子进程和父进程继续执行fork调用之后的指令。
子进程是父进程的副本。例如,获得父进程的:
- 数据空间
- 堆和栈的副本
- … …
因为是副本所以不共享这些存储部分。但是:
父进程和子进程共享正文段也就是上图的test segment
注: 缓冲区在fork之前如果没有被刷新,子进程会有一个副本,进程终止时,缓冲区的内容会被写到相应的文件中。(父进程与子进程各有一个)