进程:
进程的含义?
进程是一个程序执行的过程,会去分配内存资源,cpu的调度
进程分类:
1、交互式进程
2、批处理进程 shell脚本
3、 守护进程
进程与程序的区别:
1)程序是永存,进程是暂时的
2)进程有程序状态的变化,程序没有
3)进程可以并发,程序无并发
4)进程与进程会存在竞争计算机的资源
5)一个程序可以运行多次,变成多个进程
一个进程可以运行一个或多个程序
进程的作用:
并发并行(各执行各的)
进程的状态:
4.进程的状态:
3个状态,就绪→执行态→阻塞(等待,睡眠)基本操作系统
linux中的状态,运行态,睡眠态,僵尸态,暂停态。
使用了一个结构体pcb(进程控制块),用于存储进程的数据,实现控制进程
(1)运行态(running):进程占有处理器正在运行。
(2)就绪态(ready):进程具备运行条件,等待系统分配处理器以便运行。
(3)阻塞态(blocked):又称为或睡眠(sleep)态,指进程不具备运行条件,正在等待某个事件的完成。
(4)僵尸态(zombie):子运行完,父没运行完,子进程会以终止状态保持在进程表中,并且会一直在等待父进程读取才能退出。
(5)孤儿态:父运行完,子没运行完,子处于托管状态,加重系统负担
进程的调度,进程上下文切换
内核主要功能之一就是完成进程调度, 硬件,bios,io,文件系统,驱动
调度算法, other,idle
rr,fifo
宏观并行(从人的视角,程序是多个运行)
微观串行(从计算机的视角,一次只能运行一行代码,也就是说这一时刻只能运行一个进程)
查询进程相关命令
1.ps aux
查看进程相关信息
1.就绪态、运行态 R
2.睡眠态、等待态
可唤醒等待态 S
不可唤醒等待态 D
3.停止态 T
4.僵尸态 Z
5.结束态
2.top
根据CPU占用率查看进程相关信息
3.killall -9 进程名
发送信号 进程名对应的所有进程
killall a.out
内存分布:
0-3G,是进程的空间,3G-4G是内核的空间
虚拟地址:
在逻辑上不存在,即无法成为可供硬件读取的电信号,但实际占有内存空间,保护了程序运行
fork():
父进程从文件头开始走,子进程从fork的位置开始走
pid_t fork(); 叉子
一次调用,会返回两次。
子进程先运行和是父进程先进程,顺序不确定。
变量不共享。
子进程复制父进程的0到3g空间(物理内存)和父进程内核中的PCB,但id号不同。
功能:通过该函数可以从当前进程中克隆一个同名新进程。
克隆的进程称为子进程,原有的进程称为 父进程。
子进程是父进程的完全拷贝。
子进程的执行过程是从fork函数之后执行。
子进程与父进程具有相同的代码逻辑。
返回值:int 类型的数字。
在父进程中:成功 返回值是子进程的pid号 >0
失败 返回-1;
在子进程中:成功 返回值 0
失败 无
fork()&&fork()||fork();
生成几个子进程?5个
首先,fork看做一个变两个,一个父一个子,并且,根据其子进程只会从生成该子节点的fork()开始运行,可以理解为从该节点处开始分叉
这里还要知道逻辑运算符的截断特性(短路特性),(即已经确定结果的值时,不会继续往后运行),给fork加上编号(1&&2||3),
在父进程中运行时:此时1返回值为1,在最上层展开分支;判断2,返回值也为1,在第二层的1后展开分支,||运算的结果此时已经能确定,不会去运行3
注意:此时相当于这个父节点有两个子节点
父进程运行完:
在子进程中运行时:此时1返回值为0,不会去判断2,只会执行3,也就是所有子节点分叉一次
最终结果:
2.getpid
pid_t getpid(void);
功能:
获得调用该函数进程的pid
参数:
缺省
返回值:
进程的pid
3.getppid
pid_t getppid(void);
功能:
获得调用该函数进程的父进程pid号
参数:
缺省
返回值:
返回父进程id号
父子进程的关系:
子进程是父进程的副本。子进程获得父进程数据段,堆,栈,正文段共享。
在fork之后,一般情况那个会先运行,是不确定的。如果非要确定那个要先运行,需要IPC机制。
区别:
1)fork的返回值
2)pid不同