并行与并发的区别?
并发:宏观上同时进行,微观上是异步执行的
并行:真正意义上的同时运行
计算机运行层面:
以单核CPU为例:它在同时运行多个程序,我们可以认为是并发执行
CPU在多个程序间快速切换执行,分配到某个程序的很小时间段,我们称为时间片
多核多线程CPU: 它在同时运行多个程序时,既有并发也有并行
进程简介
进程的概念首先是在20世纪60年代初期有 MIT 的Multics 分时系统和IBM的 TSS/360系统引入的,在40多年的发展中,人们对进程有过各种各样的定义,列举较为著名的几种。
进程是一个独立的可调度的活动(Cohen, Jofferson);
进程是一个抽象的实体,当它执行某个任务时,要分配和释放各种资源。(P.Denning)
进程是可以并行执行的计算单位(Madnick,Donovan)
本质:进程是程序的一次执行的过程,进程是程序执行和资源管理的最小单元。 在Linux环境下,每个正在运行的程序都称为进程
进程控制块(PCB)
进程是Linux 系统中调度和管理资源的单位,那系统如何描述和表示一个进程的变化呢,答案是通过进程控制块来实现的。
进程控制块内容
进程的描述信息(进程ID,进程状态…);
进程控制信息;(调度信息,时间片,优先级…)
进程的资源信息(内存资源,打开的文件,使用的定时器…)
Linux 系统中进程控制块中的每一项都是通过 task_struct 结构体来表示,
定义在 #include <linux/sched.h >头文件中的。
进程标识
既然进程是Linux 系统中基本的调度和管理资源的单位,那系统就需要能够唯一标识出每一个进程,才能更好的进行调度和管理的工作,Linux 系统是通过进程号(PID)来唯一的标识一个进程,
父进程标识号:当前进程的父进程的标识,(PPID)
PID 和 PPID 都是非零的正整数。
进程的四大特征
1.动态性: 进程它具有创建,运行,阻塞,消亡的过程,它是动态的
2.并发性: 同一时段多个进程同时在执行,
3.异步性: 多个进程不是齐头并进的(不是并行),而是有执行的先后顺序;对于单核CPU来说,某一刻只能运行一个进程
4.独立性: 每个进程都运行在自己的内存空间上,进制之间的内存互不影响
进程间通讯:两个独立的进程通过某种手段,让两个进程的数据互通
进程状态及其状态转换:
三种状态模型
五种状态模型(重点掌握)
七种状态模型
五种状态:
1.创建态
2.就绪态
3.运行态
4.阻塞态
5.终止态
说明:进程从运行态到终止态的过程中,处于已经运行完毕,但内存资源还没有被回收时称为僵尸态
在代码执行过程中,我们更建议父进程后结束
vfork创建的子进程会共享父进程的数据,并且子进程先于父进程执行;
当子进程执行完毕后,会进入到僵尸态,经过内存回收后,进入到了终止态,此时子进程才执行完毕并退出了
而父进程再想访问内存上的数据,已经被回收了,所以取到的是一个不确定的值
进程基本操作(进程创建)
fork
函数名:fork
头文件:#include <unistd.h>#include <sys/types.h>
函数原型:pid_t fork(void);
功能:创建子进程
参数说明:1.无
返回值:fork 函数的奇妙之处在于调用一次,返回两次,可能有3种不同的返回值:
父进程中,fork返回新创建的子进程的PID子进程中,fork返回0
出错:返回 -1,并将错误码存入 errno 中
vfork
函数名:vfork
头文件:#include <unistd.h>#include <sys/types.h>
函数原型:pid_t vfork(void);
功能:创建子进程
参数说明:1.无
返回值:fork 函数的奇妙之处在于调用一次,返回两次,可能有3种不同的返回值:
父进程中,fork返回新创建的子进程的PID子进程中,fork返回0
出错:返回 -1,并将错误码存入 errno 中
fork和vfork的区别:
1. fork ():子进程拷贝父进程的数据段,代码段
vfork ( ):子进程与父进程共享数据段
2. fork ()父子进程的执行次序不确定
vfork 保证子进程先运行,在调用exec 或exit 之前与父进程数据是共享的,在它调用exec
或exit 之后父进程才可能被调度运行。