嵌入式系统方向学习笔记11(附加作业创建三个进程交替打印ABC)

本文详细介绍了Linux系统中的进程管理,包括进程控制、进程分类、进程状态转换和Linux进程调度策略。重点讲解了进程的并发执行、虚拟内存机制、进程属性如PID、PPID等,以及进程创建的fork和vfork函数。此外,还提供了查看和管理进程的命令如ps、kill和renice,并展示了创建三个进程交替打印ABC的代码示例。
摘要由CSDN通过智能技术生成

笔记系列

嵌入式系统方向学习笔记7
嵌入式系统方向学习笔记8
嵌入式系统方向学习笔记9
嵌入式系统方向学习笔记10



进程

1、什么是进程:
进程是可并发执行的程序,是一个在数据集合上的运行过程当一个程序开始执行后,在开始执行到结束这段时间里,它内存中的部分被称为进程
2、 通俗讲:
程序:在硬盘上的可执行文件
进程:正在执行中的程序


一、进程控制

1、什么是进程:进程是可并发执行的程序,是一个在数据集合上的运行过程
当一个程序开始执行后,在开始执行到结束这段时间里,它内存中的部分被称为进程
通俗讲:程序:在硬盘上的可执行文件
进程:正在执行中的程序

2、什么是并发:多进程同时运行,多个任务同时交替执行

3、虚拟内存
Linux虚拟内存管理技术:
物理内存:实际处理器中的内存模块(几百M)
—————将硬盘中的一部分存储单元拿来当作内存使用(4G,受操作系统的寻址范围的影响)
Ox00000000~oxf f f f f f f

操作系统:内核空间(高地址1g)和用户空间(底地址3g)

好处:有效防止内核空间被破环/防止恶意窥探(映射到虚拟内存中)/拓展内存空间

如何再虚拟内存上找数据:虚拟内存加偏移量

二、进程的分类

1.引入库

1、守护进程
2、批处理进程
3、交互进程

2.进程属性

进程的ID(PID):是唯一的数值,用来区分进程
父进程的ID:PPID
启动进程的用户ID:UID
进程的状态:运行R,休眠S,僵尸进程Z
进程优先级
进程占用资源的大小(内存,cpu)

进程号
ps命令:查看Linux系统中的进程

l:长格式输出
u:按用户名和启动时间的顺序来显示进程
f:按树状格式来显示进程
a:显示所有用户所以进程
x:显示无控制终端进程
在这里插入图片描述
•USER:用户名称

• PID:进程号

• %CPU:进程占用CPU的百分比

• %MEM:进程占用物理内存的百分比

• VSZ:进程占用的虚拟内存大小(单位:KB)

• RSS:进程占用的物理内存大小(单位:KB)

• TT:终端名称,缩写 .

• TTY:完整的终端名称

• STAT:进程状态,其中S-睡眠,s-表示该进程是会话的先导进程,N-表示进程拥有比普通

优先级更低的优先级,R-正在运行,D-短期等待,Z-僵死进程,T-被跟踪或者被停止等等

• STARTED:进程的启动时间

• TIME:CPU时间,即进程使用CPU的总时间

• COMMAND:启动进程所用的命令和参数,如果过长会被截断显示

搜索进程
搜索进程

kill:kill+[选项]+进程号 -9:强制终止、
pkill:pkill + 程序名
xkill:在桌面上杀死图像化界面
renice:改变进程的优先级,通过改变进程ID(PID)来改变谦让度,进而达到改变进程的优先级
(renice 谦让度 PID)

3.进程的状态转换

  1. 就绪:当进程已分配到除cpu以外的所有必要资源,只要获得处理器就可以立即执行
  2. 执行:已经获取处理器,正在执行
  3. 阻塞:正在执行的进程,由于等待某个事件的发送而无法执行时,便放弃处理机会而处于阻塞状态
    并发的本质:时间片轮询

4.Linux进程调度

  1. FCFS也叫FIFO,先来先处理,缺点:对于短的任务可能会变的非常缓慢
  2. 时间片轮询算法:周期性的切换,存在切换时间片的时间会比执行程序时间还费资源的情况
  3. STCF:短任务优先算法(抢占式和非抢占式)
  4. 银行家算法:
    优先级反转

三、创建进程

fork()函数:它是有两个返回值,0是子进程,-1是失败, >0是父进程
getpid():获取当前进程号
getppid():获取当前父亲进程号
父进程与子进程跑在不同的内存空间:父进程也子进程有自己的独立空间

早期:fork函数运行之后,子进程会复制父进程的堆栈数据空间
优化:读时不管,写时复制
fork函数创建的父子进程是竞争关系,不能判定是谁先执行

vfork():创建一个进程

保证子进程先动
当子进程调用exit()函数后,父进程往下执行
不会继承父进程的页面


作业

创建三个进程交替打印ABC

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>

int main()
{
    int i;
    for(i=0;i<10;i++){
    pid_t pid = vfork();
   
    if( -1 == pid){
    
	perror("fork error");
    }

    if(0 == pid){
    
	printf("A");
	exit(1);
    }
    else{
    
	printf("B");


	pid_t  pid1= vfork();

	if(0 == pid1){

	 printf("C");

	exit(1);
	}
    }

    }

    printf("\n");
}

运行结果
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陌&M~F

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值