【Linux】进程的概念
一、进程的概念
程序:代码+数据
进程:代码+数据+堆栈+PCB
程序:为了完成特定功能的一系列指令的有序集合
进程:一个具有一定独立功能的程序在数据集合上的一次动态执行过程
每个进程都有自己的状态
每个进程都有自己的虚拟地址空间
进程是操作系统分配资源的基本单位
组成:进程包含了一个程序执行过程中的所有状态信息
程序的代码
程序处理的数据
程序计数器中的
寄存器动态变化
系统资源
进程与程序的联系:
程序是进程的基础
程序每次执行构成不同的进程
进程是程序功能的体现
多次执行,一个程序可以应对多个进程,通过调用关系,一个进程可以包含多个程序(多对多)
进程与程序的区别
进程是动态的,程序是静态的,程序是有序代码的集合,进程是程序的执行,进程有核心态/用户态
进程是暂时的,程序是永久的,进程是一个状态变化的过程,程序可长久保存
进程与程序的组成不同,进程的组成包括程序、数据、和进程控制块
进程控制块(PCB---进程属性的集合)
进程信息被放在一个叫进程控制块的数据结构中,Linux中的PCB是:task_struct,它里面包含着进程的信息,并且会被装载到RAM内存中
task_struct内容
标识符:描述本进程的唯一标识符,用来区别其他进程
状态:任务状态,退出代码,退出信号等
优先级:相对于其他进程的优先级
程序计数器:程序中即将被执行的下一条指令的地址
内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块指针
上下文数据:进程执行时处理器的寄存器中的数据
I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用文件列表
记账信息:可能包括处理时间总和,使用的时钟数总和、时间限制、记帐号等
其他信息
调度:优先级、动态变化
从就绪中的程序中选择合适的放在CPU中执行
二、进程相关操作命令
cat /proc/sys/kernel/pid_max:系统ID号最大值
ps:报告系统当前进程
ps -ef
df:查看磁盘情况
df -ef
ps -ef | grep a.out |grep -v grep反向过滤
三、创建一个进程的一般工作
1.分配一个PID(从小到大找第一个没有被使用的ID)
【0—cat /proc/sys/kernel/pid_max】
0号进程是内核进程,它创建1号进程。
0号进程还将进程从物理内存搬到磁盘,和从磁盘搬到物理内存
2.分配PCB,拷贝父进程的PCB的绝大部分数据
3.给子进程分配资源
4.复制父进程地址空间
5.将子进程制成就绪状态放入就绪队列
6.pid_t fork(viod) 子进程0,父进程大于1
子进程是父进程的翻版,子进程具有父进程的栈、数据段、堆和执行文本段的拷贝。
父进程和子进程有相同的程序文本段,但各自拥有不同的堆栈、数据段、堆段拷贝
执行fork( )后每个进程均可修改自己的栈数据、堆段中变量,而不影响另一进程
pid_fork (void);
作用:创建一个进程
返回值:子进程返回0;父进程返回大于0(实际上就是子进程的PID);当前无法创建时返回-1
1.创建后,父子进程交替进行(0为子进程,父进程大于1)
2.若父进程死亡,子进程变为孤儿进程,由1号进程领养
3.若子进程死亡,成为僵尸进程
fork()创建的子进程是对父进程的栈、数据段、堆和执行文本的拷贝,但是这样做会浪费内存空间。避免这种浪费有两种方法:
1、内核将每一个进程的代码段标记为只读,从而使进程无法修改自身代码,这样子进程和父进程可以共享同一代码段,指向相同的物理内存页帧
2、对于父进程数据段、堆段和栈段的各页,内核采用写时复制技术,起初内核将进程的代码段标记为只读,使父进程和子进程指向相同的物理内存,调用fork()后内核会捕获所有子进程和父进程对代码段的修改企图,然后将要修改的代码段拷贝分配给造内核捕获的进程,之后父进程和子进程就可以修改各自的代码段拷贝,不再相互影响。
fork和vfork
fork是创建一个子进程,并把父进程的内存数据copy到子进程中。
vfork是创建一个子进程,并把子进程 和父进程的内存数据share一起共用
vfork不进行写时拷贝,性能相较于fork更好,但是vfork的实现在每个系统上面都存在错误,只有在vfork调用完后加上exec或者exit才会正确。
getpid()可以获取进程的PID;getppid()可以获取进程的父进程的PID
创建一个孤儿进程
创建一个僵尸进程
僵尸进程是不能用kill被杀死的,从系统中移除其的唯一方法就是杀掉他们的父进程(或等待其父进程终止),此时init将接管和等待这些僵尸进程,将它们清除掉。
当创建的僵尸进程过多的时候会导致以下问题:
造成内存资源的浪费
内存泄漏
维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,僵尸状态一直不退出,PCB一直都要维护
四、进程的优先级
ps -l(查看当前系统进程的优先级)
UID 执行者身份
PID 进程ID
PPID 父进程ID
PRI 进程可被执行的优先级,其值越小越早被执行
NI 进程的nice值
子进程会继承父进程的优先级,因为PCB中存储着进程的优先级,创建子进程的时候会将父进程的PCB拷贝过来。
进程的nice值
概念
- 进程的nice值 表示进程可被执行的优先级的修正数值
取值范围
nice取值范围:-20-19,总共40个级别
nice值的修改
PRI(new)=PRI(old)+nice
如:renice -5 -p 2600(将PID为2600的进程nice值修改为-5)
如:nice -n -5 ./test (开始执行指定nice值的进程)
在进程启动之前可以通过nice来调整进程的优先级
当nice的值为负值的时候,该程序的优先级值将会变小,其优先级会变高,会越快被执行。
用top命令修改已存在进程的nice
top可以查看系统所有进程的相关信息,相当于Windows的任务管理器
- “r”->输入进程PID->输入naice值 (修改已存在进程的nice值)
- “k”->输入进程PID->"enter" (杀死已存在的进程)
- “<”向上翻页 ">"向下翻页
- “q”(退出top)
进程的并行和并发
并行:多个进程在多个CPU下分别同时运行
并发:多个进程在一个CPU下采用进程切换的方式,在一段时间内,让多个进程都得以推进,一个CPU只能在某个时间内运行一个进程,不能多进程同时运行
多进程程序只可能是并行的不可能是并发的
五、环境变量
环境变量在命令行参数和PCB之间
本地变量和环境变量:
本地变量只能在当前进程使用,不能在子进程中使用
父进程定义的环境变量能在当前进程和子进程中使用
子进程定义的环境变量只能在子进程使用,不能在父进程中使用
环境变量相关指令:
export name=val (定义环境变量,=左右不能加空格)
unset avj(删除环境变量)
env 获取全部环境变量
echo $环境变量名 打印出相对应的环境变量值
unset:可以删除本地变量
设置环境变量:
当前终端设置的环境变量只能在当前终端使用,离开就没有了,且只能在当前终端当前用户下使用
如果想所有地方都能使用环境变量需要配置在 ~/.bash_profile
如果希望在配置文件中设置的变量生效,要重启(在终端启动之前会执行~/ .bash_profile和~/ .bashrc这两个文件里的内容)
在程序中获取环境变量:
获取所有的环境变量,main的第三个参数
获取某一个环境变量,val=getenv(“name”)
在程序中设置环境变量 ,putenv(“name=value”)等号左右不能有空格
查看进程树 pstree
查看进程树中bash及其前两行后两行 pstree |grep -A2 -B2 “bash”
六、程序地址空间
子进程是父进程的拷贝,当子进程修改时,先将值拷贝到另一块物理内存中,将页表中的只读改为可读可写,再修改值
因此,修改后父子进程虚拟地址相同,物理地址不同
错误处理
linux绝大部分函数出错返回值都是-1int errno;//linux函数出错后将错误编号放在errno全局变量中if(fork()==-1)errno(错误码编号)#include<errno.h>char* strerror(errno);通过错误编号,返回错误信息#include<string.h>printf("%s",strerror(errno));打印错误信息perror(cmd="fork")
{printf("%s : %s\n",cmd,strerror(errno));
}
【Linux】进程的概念相关推荐
- linux——进程的概念与状态
大家好,我是旗帜僵尸.今天我将带领大家学习进程的概念. 本篇文章将继续收录于我的linux专栏中,若想查看关于linux其它知识的文章也可以点击右方链接.旗帜僵尸--linux 文章目录 一.进程概念 ...
- Linux进程的概念
文章目录 一.冯·诺依曼体系结构 二.操作系统(operating system) 2.1 系统调用和库函数概念 三.进程 3.1 描述进程-PCB 3.2 查看进程 3.2.1 通过系统目录查看 3 ...
- Linux进程的概念笔记
1.进程的概念 表示应用程序的一次执行过程,它是应用程序的运行实例,是一个动态的过程.当一个进程开始执行的时候,就启动了这个动态过程.进程主要包括执行 的程序和数据两部分. 2.进程的三种状态:运行. ...
- linux 进程(一)---基本概念
一.进程的定义 进程是操作系统的概念,每当我们执行一个程序时,对于操作系统来讲就创建了一个进程,在这个过程中,伴随着资源的分配和释放.可以认为进程是一个程序的一次执行过程. 二.进程与程序的区别 程序 ...
- Linux 进程(一) 进程概念和进程状态(僵尸进程、孤儿进程、守护进程)
进程的概念 进程状态 僵尸进程.孤儿进程.守护进程 进程的概念 程序:一系列有序的指令集合(就是我们写的代码) 进程:进程就是程序的一次执行,是系统进行资源分配和调度的独立单位. 程序是一个没有生命的 ...
- Linux进程信号(产生、保存、处理)/可重入函数概念/volatile理解/SIGCHLD信号
首先区分一下Linux信号跟进程间通信中的信号量,它们的关系就犹如老婆跟老婆饼一样,没有一毛钱的关系. 信号的概念 信号的概念:信号是进程之间事件异步通知的一种方式,属于软中断.比如:红绿灯是一种信号 ...
- 【Linux进程概念】冯 诺依曼体系结构 操作系统 进程 fork 进程状态 优先级
文章目录 [写在前面] 一.冯 ? 诺依曼体系结构 ?? 体系结构 ?? 数据流向 ?? 实例 二.操作系统 (Operator System) ?? 概念 ?? 计算机体系及操作系统定位 ?? 管理 ...
- 【Linux】基础:进程的概念
[Linux]基础:进程概念 摘要:本文的主要目的是理解进程的概念.文章通过介绍进程的管理方式来引入进程的概念,从而提出进程的理解--PCB与程序.然后对PCB内容进行详细介绍,并同时介绍了关于进程的 ...
- < Linux >:Linux 进程概念 (1)
目录 本章重点: 一.冯诺依曼体系结构 二.操作系统(Operator System) 2.1.概念 2.2.设计 OS 的目的 2.3.定位 2.4.系统调用和库函数的概念 三.进程 3.1.进程的 ...
- Linux用户抢占和内核抢占详解(概念, 实现和触发时机)--Linux进程的管理与调度(二十)
日期 内核版本 架构 作者 GitHub CSDN 2016-07-01 Linux-4.6 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度 ...
最新文章
- 字节跳动获CVPR2021 细粒度图像竞赛双料冠军
- javascript 异常基本语法
- Get和Post请求和对应的参数获取
- java 的简单代码_java初学 简单代码
- android studio -genymotion神奇错误
- 双稳态继电器工作原理图_三招带你分清继电器与接触器
- 大咖博闻荟 | 基于NSX-T和AVI实现企业双活中心
- Android单元测试 - Sqlite、SharedPreference、Assets、文件操作 怎么测?
- 在线教育开源源码:消费者如何规避线上教育“陷阱”营销?
- 2021-02-13L:1652 2.08---2.141576L
- ibm大型机服务器虚拟化,PowerVM:IBM小型机虚拟化的利器
- Redis相关面试题
- magicbook2018+MX150+win10+显卡驱动445.87+cuda_10.0.130+cudnn_v7.6.4.38+conda4.8.3+tensorflow1.14.0
- can't find compiler executable in your configured search path's for GUN GCC Complier的应对办法
- 老男孩第十四期Python学习班之Day02
- mysql 多条件求和_sql多条件求和-sql条件求和-sql求和且和满足条件
- Java基础(三)IO流和对象流
- 干货!常见的SQL面试题:经典50例!
- 《流浪地球》登顶IMAX国产片历史最高票房
- 虚函数与纯虚函数以及虚函数表之间的关系
热门文章
- 为什么大家都买卡地亚蒂芙尼_为什么卡地亚的价格比蒂芙尼高?原来和品牌因素有关,看完秒懂!...
- 【UDS】ISO14229之0x27服务
- java框架学习路线总结
- 移动互联网时代:如何用手机精细化管理企业?
- 云图说|云数据库RDS跨区域备份
- 大话手游网页无法链接到服务器,大话西游手游网页版IE不能登录 IE无法登录解决办法...
- linux - FSCK与日志文件系统
- java三目运算符求三个数的最大值
- 源码分享-基于Spring Boot为美柚大数据研发的大数据任务调度平台
- Windows 注册表被篡改后开机蓝屏怎么办?