进程状态及进程的基本操作
操作系统为每个进程分配一个独一无二的数字编号,这个编号称为进程标识符
正整数[ 2 - cat/proc/sys/kernel/pid_max ) 操作系统选择下一个没有被使用的编号作为进程编号
0--内核进程
1--由0号进程产生,第一个用户态进程
进程创建的一般过程
1.给新进分配一个标识符。在内核中分配一个PCB2.复制父进程的环境(PCB中的信息)
3.分配资源(程序,数据,栈,地址空间等)
4.复制父进程地址空间的内容。
5.将进程置成就绪状态,放入就绪队列
pid_t fork(void) //创建进程
1.功能:创建子进程
2.返回:失败返回-1, 成功,父进程返回子进程id,子进程返回0;
3.调用fork之后通常要用if进行分流
fork()注意:
1.调用fork后, 父子进程交替运行,
2.如果父进程先死,子进程变为孤儿进程,,孤儿进程会被1号进程收养
3.如果子进程先死,就会变成僵尸进程。 处理僵尸进程-----结束父进程
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
pid_t pid;
printf("before fork: %d\n", getpid());
pid = fork();
if(pid == -1) {
fprintf(stderr, "fork err\n");
exit(1);
}
if(pid == 0){
printf("this is child, myid = %d, parentid = %d\n", getpid(), getppid());
sleep(1);
}
else if(pid > 0){
printf("this is parent, myid = %d, mychildid is %d\n", getpid(), pid);
sleep(1);
}
printf("finish\n");
}
子进程继承父进程的那些东西?
1.地址空间2.进程上下文(除PCB外的)
3.进程堆栈 写时拷贝
4.内存信息
5.文件描述符 --- 父进程打开的文件也要继承
6.信号设置情况
7.父进程的调度优先级 缺省为0 , -20 到 19 nice renice修正
8.当前路径
9.根路径
10.控制终端
11.进程组 --- 父进程和子进程缺省为同一进程组
12.资源限制
哪些不继承?
父进程的锁子进程不继承
父进程ID子进程不继承
父进程未决的信号,子进程清除掉
孤儿进程:
一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被1号init进程所收养,
并由该1号进程对它们完成回收工作。
僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有获取子进程的状态信息,那么子进程的进程描述符仍然保存在
系统中,并会一直等待父进程读取退出状态码。这种进程称之为僵死进程。
危害:
状态僵尸进程一直保持在Z状态不退出,系统就一直要维护僵尸进程的PCB(进程的退出状态),造成系统资源的浪费。
前面我们知道系统会为每个进程分配一个进程标识符,进程标识符是有限的,当僵尸进程过多时,会导致进程标识符无法分配。
父进程创建了大量的子进程而不进行回收,就会造成内存内存泄漏。
孤儿进程最后会由init进程接管,所以造成的危害较小。
env 查看所有环境变量
在父bash定义的变量 ,在子bash无法使用
本地变量:只能在本进程使用, aaa = 'hehe'
环境变量:本进程和子进程都能使用
export aaa 把aaa设置成环境变量
子进程定义的环境变量父进程无法使用
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
putenv("c=czf"); //增加或修改环境变量
pid_t pid;
pid = fork();
if(pid == 0){
printf("child %s\n", getenv("c")); //取得环境变量的内容
}else if(pid > 0){
printf("parent %s\n", getenv("c"));
}
return 0;
}
进程优先级:
CPU资源分配的先后顺序,即进程的优先权。
优先权高的优先执行。配置进程优先级可以有效系统性能。
启动前调整:nice
nice -n -5 ./a.out
调整已存在的进程优先级:renice
renice -5 -p 1234 //1234为进程的pid
top命令:
进入top -> 按r ->输入pid ->输入nice值
智能推荐
(二)进程管理之进程状态及组织方式
操作系统:linux 处理器:arm 内核版本:4.x 目录: 进程状态 R (TASK_RUNNING) S (TASK_INTERRUPTIBLE) D (TASK_UNINTERRUPTIBLE) Z(EXIT_ZOMBIE) 其他进程状态 组织方式 进程状态 执行ps aux命令可以看到进程有以下这些状态: 他们的含义可以通过man ps找到: 主要关注以下几个状态: R (TASK_RU...
linux进程地址空间--vma的基本操作
在32位的系统上,线性地址空间可达到4GB,这4GB一般按照3:1的比例进行分配,也就是说用户进程享有前3GB线性地址空间,而内核独享最后1GB线性地址空间。由于虚拟内存的引入,每个进程都可拥有3GB的虚拟内存,并且用户进程之间的地址空间是互不可见、互不影响的,也就是说即使两个进程对同一个地址进行操作,也不会产生问题。在前面介绍的一些分配内存的途径中,无论是伙伴系统中分配页的函数,还是slab分配...
Linux进程的基本操作:fork vfork exec
进程创建 进入进程的运行状态时,需要首先创建一个新的进程。在Linux系统中,提供了几个关于创建新进程的操作函数,如fork()函数、vfork()函数和exec()函数族等。 1.fork()函数 fork()函数的功能是创建一个新的进程,新进程为当前进程的子进程,那么当前的进程就被称为父进程。在一个函数中,可以通过fork()函数的返回值判断进程是在子进程中还是父进程中。fork()函数的调用...
Python+Selenium+Autolt选择本地文件上传至网站
如果网站有上传文件的功能,selenium不提供对本地元素的定位,如何使用python选择本地文件进行上传呢 可以使用Autolt工具上传文件: 1、下载网址:https://www.autoitscript.com/site/autoit/downloads/ 2、点击“Downlad ZIP”下载 3、解压缩下载的ZIP文件 4、打开脚本编辑器文件夹,有一个SciTE....
数据结构系列之一-线性表
数据结构系列--线性表 慧子和她的3D 慧子和她的3D 暑期工作搞不下去,不如趁着现在整块时间搞编程。学习资料书《大话数据结构》,前面两章的铺垫感性知识,看看过,从第三章开始正餐。 01 — 线性表 线性表:零个或多个数据元素的有限序列。用数学语言表达: ...
猜你喜欢
Linux系统的远程操作练习
目录 一、将虚拟机Ubuntu系统的网络连接设置为“桥接模式”,并配置Ubuntu的IP、网关参数 二、在win10系统下用putty登录ubuntu系统 三、VNC server VNC viewer 思考 一、将虚拟机Ubuntu系统的网络连接设置为“桥接模式”,并配置Ubuntu的IP、网关参数 1.打开虚拟机,进入设置 点击网络适配器,选择桥...
ORACLE----TimeStamp(时间戳)自动更新
之前对id的自增长进行了设置,原以为时间戳的更新也类似,使用序列之类的,但最终发现跟序列没半毛钱关系。触发器是肯定要用的,但编写脚本也是需要的。 (1)创建触发器 图2中,我们要选择事件(即例子中的INSERT,UPDATE),触发时间(即INSERT,UPDATE事件的前或后,例子中是before),列(例子中为MODIFIED_DATE,为TimeStamp类型),新旧值(为系统默认值OLD和...
LeetCode(剑指offer-tree)-面试题26. 树的子结构
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构) B是A的子结构, 即 A中有出现和B相同的结构和节点值。 例如: 树的遍历方式为:前序遍历 给定的树 A: 给定的树 B: 返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。 示例 1: 示例 2: 限制: 题源链接:https://leetcode-cn.com/problems/shu-de-z...
大数据笔记14:Zebra项目分析与实施
第14天——Zebra项目分析与实施 第一部分 Zebra项目概述 一、Zebra项目介绍 二、日志数据结构分析 三、数据以| 分割后,每个数据项的含义 四、Zebra项目整体架构 (一)技术架构 (二)工程架构 五、Zebra业务说明 六、Zebra项目设计思想 第二部分 Zebra项目实施过程 一、创建Maven项目ZebraProject 二、zebra_jobtra...
