一.进程的基本概念
一.定义
进程是一个程序执行的过程(也可以说是正在运行的程序),是系统分配资源的基本单位,由cpu对各个进程指挥调度,在单核cpu的情况下,各个进程可以通过一定规则在cpu上并发运行。
二.PCB块
1.PCB是一个结构体(对应的结构体为task_struct),全名是process control block
(进程控制块)/print circuit board;
2.一个进程运行就有对应的一块pcb块,它记录着运行程序的所有信息和状态
3.pcb中包含着:
PID—进程标识符(区分进程用的是ID号)
chdir—当前工作路径
umask 0002--合适的权限
fds—进程打开的文件列表
signal—信号相关设置 处理异步io:
用户id,组id:记录谁运行的,与权限有关
进程资源的上限(ulimit -a,显示资源上限);
三.进程和程序的区别
1.程序是静态的,存储在硬盘中代码,数据的集合;
2.进程是动态,程序执行的过程,包括进程的创建、调度、消亡;
.c ----> a.out-----> process(pid)
3. (1)程序是永存,进程是暂时的
(2)进程有程序状态的变化,程序没有
(3)进程可以并发,程序无并发
(4)进程与进程会存在竞争计算机的资源
(5)一个程序可以运行多次,变成多个进程;一个进程可以运行一个或多个程序
二.内存空间
(1)code(代码段):只读特性
(2)data(数据段):可读可写;装全局变量、静态变量(带初值)(bss:未初始化变量)
(3)heap(堆区):可读可写;动态内存空间,程序员使用malloc申请
(4)Map/share(映射/共享区):只读;外部代码共享过来
(5)Stack 8M(栈):可读可写;最大不超过8M
3.虚拟地址空间共4G:0~ 3G,是进程的空间,3G~4G是内核的空间
4.虚拟内存/地址 :透明、隔离、权限
5.映射表
(1)映射表将虚拟内存的地址转换为物理内存的地址;
(2)映射表通常由页表(Page Table)组成,它记录了虚拟地址到物理地址的映射关
系;
(3)一个页面大小通常为4k(4036字节);
三.进程的状态
1.基本操作系统三个操作状态:就绪→执行态→阻塞(等待,睡眠)
就绪状态:进程已经准备好执行,所有的资源都已分配,只等待CPU时间执行
2.linux中的状态:运行态,睡眠态,僵尸,暂停态;
Linux进程状态及转换关系:
3.进程的分类
1.交互式进程
2.批处理进程 (shell脚本)(批量执行一次命令)
3. 守护进程(程序走起来不需要输入,eg:杀毒类软件、启动输入法)
4.进程的作用
1.并发性:允许多个进程同时运行,提高了CPU利用率和系统响应速度;
2.稳定性:如果一个进程发生错误,通常不会影响到其他进程,这提高了系统的稳定性;
5.进程的调度
1.调度器通过调度策略来决定哪个进程先运行;
2.内核主要功能之一就是完成进程调度, 硬件,bios,io,文件系统,驱动;
3.调度算法:other(常规默认的),idle,rr,fifo 先来先服务 短任务优先 优先级 时间片轮转
4.扩展
(1)分时操作系统:Linux、Windows(尽量在规定时间内完成)
(2)实时操作系统:rt_thread ucos(规定时间内必须完成)
5.进程上下文切换:就是值指调度器要切换CPU给另一个进程的时候,要保存当前进
程的状态,然后加载打开一个新的进程这样的一个过程。
6.宏观并行:在一个时间段多个任务和进程是同时进行的
7.微观串行:在一个时间点只能一条一条指令执行
四.进程的相关命令
1、ps aux
主要看进程号、进程状态
查看进程相关信息:(PROCESS STATE CODES)
(1)就绪态、运行态 —— R
(2)睡眠态、等待态
可唤醒等待态 ——S
不可唤醒等待态 ——D
(3)停止态 ——T
(4)僵尸态 ——Z(5)结束态
2、top
根据CPU占用率查看进程相关信息(3秒刷一下)
PR NI 表示优先级
数字越小代表优先级越高
3、kill和killall
kill -2 PID 15
其中PID为接受者,终端为发送者
发送信号+PID对应的进程,默认接收者关闭killall -9 进程名(强制关闭)
发送信号 进程名对应的所有进程
killall a.out
4.fork()函数
pid_t fork();
1.特点:
(1)一次调用,会返回两次;
(2)子进程先运行和是父进程先进程,顺序不确定;
(3)变量不共享(虚拟隔离机制);
(4)子进程复制父进程的0到3g空间和父进程内核中的PCB,但id号不同(子的id比父大)。
2.功能:
3.通过该函数可以从当前进程中克隆一个同名新进程;
(2)克隆的进程称为子进程,原有的进程称为 父进程;
(3)子进程是父进程的完全拷贝;
(4)子进程的执行过程是从fork函数之后执行;
(5)子进程与父进程具有相同的代码逻辑。
4.返回值:int 类型的数字;
(1)在父进程中:成功 返回值是子进程的pid号 >0
失败 返回-1;
(2)在子进程中:成功 返回值 0
失败 无
5.getpid()函数
pid_t getpid(void);
1.功能:获得调用该函数进程的pid
2.参数:缺省
3.返回值:进程的pid
6.getppid()函数
pid_t getppid(void);
1.功能:获得调用该函数进程的父进程pid号
2.参数:缺省
3.返回值:返回父进程id号
五.父子进程
1.子进程是父进程的副本,子进程获得父进程数据段,堆、栈正文段共享;
2.区别:
(1)fork的返回值 父的是大于0,子是等于0;
(2)pid不同 子相对于父至少要加个1;
写时复制
1.定义:写时复制是计算机编程里的一种优化策略。它的核心思想在于,进行数据修
改操作时,并非马上复制整个数据对象,而是要等到真正需要修改数据的那个时刻才执
行复制操作。这样做能够避免不必要的数据复制,进而提升系统性能,提高资源利用
率。
2.优点:提高效率、创建子进程速度快、开的空间少、回收速度快
六.进程的终止(8种情况)
1.主动退出
(1)main 中 return
(2)exit(), c库函数,会执行io库的清理工作,关闭所有的流,以及所有打开的文
件。已经清理函数(atexit);(函数一调,进程结束,再退之前释放该释放的资
源)
(3)_exit,_Exit 会关闭所有的已经打开的文件,不执行清理函数。(单调函数,进程
结束,但清理的相对较少)
(4) 主线程退出
(5)主线程调用pthread_exit
2.异常终止
(6)abort(),该函数禁止应用层调用,发生严重错误系统调用;
(7)signal kill pid 有权限的发送信号(内存访问错误则发送信号结束)
(8)最后一个线程被pthread_cancle(线程属于进程的一部分,进程里面无线程会退
出)