嵌入式学习之软件篇——Linux多任务编程

多任务处理机制

首先认识一下:多道程序设计

       计算机技术还不发达的时代,计算机每次只能处理单个任务,其他任务只能等待当前任务处理完成后才能被处理。
       个人理解:臂如智能手机刚兴起阶段,就已经有多任务了,但是有很多人发现杀后台现象十分严重,切换到后台的应用程序过一两分钟再切换回来时,还需要重新加载进入。这是由于CPU在处理多任务的时候为了让前台的任务流畅的执行,把后台的任务给杀掉,这样就能保证前台的应用程序能够更多的获得时间片,从而提高使用的流畅度。

  • 早期单道批处理系统,内存中仅有一道作业,该作业独占系统全部资源,致使系统的性能较差。
  • 为了进一步提高资源利用率和系统吞吐量,上世纪60年代中期,引入多道程序设让技术并由此形成了多道批处理系统。其且的就是充分要利用系统的所有资源且尽可能的让它们并行。

程序的顺序执行

  • 程序的顺序执行是指CPU严格按照程序的指令顺序执行。
  • 在现代计算机系统中程序完全的顺序执行是不可能实现。因为,只有在单用户系统、无中断的情况下,程序的顺序执行才有可能。

程序的并发执行

  • 程序的并发执行是让多个逻辑上相互独立的程序在计算机中交替执行,从而增强计算机的处理能力,提高系统资源的利用率。
  • 程序的并发执行不再具有顺序执行时的封闭性和可再现性,而是出现了一些新的特征。

时间片轮转

       Def:时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法,又称RR调度。每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。

程序执行的两种方式,单任务和多任务

  • 就绪态→运行态:CPU空闲时,进程调度程序选中一个处于就绪态的进程占用处理机。
  • 运行态→就绪态:运行进程的时间片用尽;或在可抢占的调度方式中,有更高优先级的进程处于就绪态。
  • 运行态→等待态:运行进程因等待某种资源或某事件的发生而无法运行。
  • 等待态→就绪态:进程等待的资源得到满足或某事件完成。

Linux下进程的几种状态

  • 运行态:R 此时进程正在运行,或者准备运行(就绪态)

  • 等待态 此时进程在等待一个事件的发生或某种资源
    可中断等待态, S进程在等待事件完成(浅度睡眠,可以被唤醒)
    不可中断等待态: D (不能被唤醒,通常在磁盘写入发生)

  • 停止态 :T 此时进程被中止

  • 死亡态 X 该状态是返回状态,在任务列表中看不到

返回值 代表的对象
0 父进程
>0 子进程的PID(进程 )

子进程创建成功后,关闭父进程
       由于父进程被关闭,所以此时子进程已经沦为孤儿进程,他的父亲就会变为Linux进程树中的1 进程:Init进程,由于我使用的虚拟机是64位Kali,所以用pstree命令得到的结果是systemd,在64位Ubuntu里面显示的也是systemd。但是在32位的linux系统中1 进程就是Init进程。

代码演示:
2:创建新的会话

前面已经说过什么是会话,不再重复。在这里主要说一下为什么要创建新的会话br> 由于子进程是父进程通过fork()函数生成的,而fork()函数会将父进程的会话期、进程组、控制终端等全盘复制给子进程,所以即便我们让父进程退出了,但是此时子进程还是属于父进程的会话组,并未完全独立。
所以此时需要:

让子进程摆脱原父进程会话组的控制
让子进程拜托原父进程的进程组控制
让子进程摆原脱父进程控制终端的控制

setsid()函数

头文件:#include<sys/types.h>
              #include<unistd.h>
函数原型:pid_t setsid(void);
返回值:成功,返回进程组的ID;失败返回-1。
通过man手册查看setsid()函数:

Linux文件层次结构标准

Linux下,一切皆文件。但是文件又分为8类,分别是:

这些文件都有三种权限属性:可读、可写、可执行。不同类型的文件操作权限也不同。举例来讲,我们使用vim命令创建一个.c文件,然后通过ls -l命令来查看这个文件的详细属性,就会看到下面这种效果:

嵌入式学习之软件篇------Linux多任务编程
注意图中黄色框框的内容:

三个为一组组看:
1.第一段表示文件所有者对此文件的操作权限
2.第二段表示文件所有者所在组对些文件的操作权限
3.第三段表示除上述两种外的任何用户/组对此文件的操作权限

r w x r w x r w x
read write execute read write execute read write execute

所以刚才创建的这个.c文件对文件所有者有读写权限,对于其他用户只有读权限。
回到子进程这里,我们通过fork()函数创建的子进程,全盘继承了父进程的文件权限,所以这可能会给该子进程使用文件造成一定的影响,因此需要修改文件权限掩码。
具体实现的原理是,使用三个8进制数字,每个数字通过8进制表示出来正好对应 r w x 三个文件属性,
举个栗子:

代码演示:

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年7月7日
下一篇 2022年7月7日

相关推荐