Linux 下多任务机制的介绍

多任务处理是指用户可以在同一时间内运行多个应用程序,每个正在执行的应用程序被称为一个任务。Linux就是一个支持多任务的操作系统,比起单任务系统它的功能增强了许多。多任务操作系统使用某种调度策略支持多个任务并发执行。事实上,处理器(单核)在某一时刻只能执行一个任务。每个任务创建时被分配时间片(ms级),任务执行(占用CPU)时,时间片递减。操作系统会在当前任务的时间片用完时调度执行其他任务。由于任务会频繁地切换执行,因此给用户多个任务同时运行的感觉。
多任务操作系统中通常有三个基本概念:任务、进程和线程。

一、任务

任务是一个逻辑概念,指由一个软件完成的活动,或者是为实现某个目的的一系列操作。通常一个任务是一个程序的一次运行,一个任务包含一个或多个完成独立功能的子任务,这个子任务是进程或线程。任务、进程和线程之间的关系如下图所示

二、进程

2.1 进程的基本概念

进程是指一个具有独立功能的程序在某个数据集合上的一次动态执行过程,它是操作系统进行资源分配和调度的基本单元。一次任务的运行可以激活多个进程,这些进程相互合作来完成该任务的一个最终目标。进程具有并发性、动态性、交互性和独立性。
Linux系统中主要包括以下三种类型的进程:

  • 交互式进程:这类进程经常与用户进行交互,需要等待用户的输入
  • 批处理进程:这类进行不必与用户进行交互,通常在后台运行
  • 守护进程:这类进程一直在后台运行,和任何终端都不关联
2.2 进程结构

进程不但包括程序的指令和数据,而且包括程序计数器和处理器的所有寄存器以及存储临时数据的进程堆栈。内核将所有进程存放在双向循环链表(进程链表)中,链表的每一项都是 task_struct,称为进程控制块(PCB)的结构。
task_struct 结构中最为重要的两个域为:state(进程状态)和 pid(进程标识符)
1.进程状态

  • 运行状态(TASK_RUNNING):进程正在运行,或者正在运行队列中等待调度
  • 可中断的阻塞状态(TASK_INTERRUPTIBLE):进程处于阻塞(睡眠)状态,正在等待某些事件发生或能够占用某些资源
  • 不可中断的阻塞状态(TASK_UNINTERRUPTIBLE):类似于可中断阻塞状态,只是它不会处理信号,把信号传递到这种状态下的进程不能改变它的状态
  • 暂停状态(TASK_STOPPED):进程的执行被暂停,当进程收到SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOU等信号时,就会进入暂停状态
  • 僵死状态(EXIT_ZOMBIE):子进程运行结束,父进程未退出,并且未使用wait函数族来回收子进程的退出状态
  • 消亡状态(EXIT_DEAD):这是最终状态,父进程调用wait函数族回收之后,子进程彻底有系统删除,不可见

2.进程标识符
Linux内核通过唯一的进程标识符PID来标识每个进程。PID存放在 task_struct 的 pid 字段中。系统可以创建的进程数目有限制,可以查看 /proc/sys/kernel/pid_max 来确定上限。

2.3 进程的创建、执行和终止
  • 通过fork()函数复制当前进程创建一个子进程
  • 通过exec函数族读取可执行文件并将其载入地址空开始运行
  • 把终止的进程设置为僵死状态,其父进程在某个时间调用wait函数族,回收子进程的退出状态,随后子进程占用的所有资源被释放
2.4 进程的内存结构

Linux操作系统采用虚拟内存管理技术,使得每个进程都有独立的地址空间,该地址空间是大小为4GB的线性虚拟空间。该技术不但更安全(用户不能直接访问物理内存),而且用户程序可以使用比实际物理内存更大的地址空间。
4GB的进程地址空间被分为两个部分------用户空间与内核空间。用户地址空间是0 ~ 3GB (0xC0000000),内核地址空间占据 3 ~ 4GB
用户空间包括以下几个功能区域(段 segment)

  • 只读段:具有只读属性,包含程序代码(.init 和 .text)和只读数据(.rodata)
  • 数据段:存放的是全局变量和静态变量。其中初始化数据段(.data)存放显示初始化的全局变量和静态变量;未初始化数据段(.bss)存放未进行显示初始化的全局变量和静态变量
  • 栈:由系统自动分配释放,存放函数的参数值、局部变量的值、返回地址等
  • 堆:存放动态分配的数据,一般由程序员动态分配和释放,若程序员不释放,程序结束时可能由操作系统回收
  • 共享库的内存映射区:Linux动态链接器和其他共享库代码的映射区域

三、线程

进程是系统中程序执行和资源分配的基本单位。每个进程都拥有自已的数据段、代码段和堆栈段,这就造成了进程在进行切换时操作系统的开销比较大。为了提高效率,操作系统又引入了另一个概念------线程,也称为轻量级进程。
一个进程可以拥有多个线程,其中每个线程共享该进程所拥有的资源,由于线程共享了进程的资源和地址空间,因此任何线程对系统资源的操作都会给其他线程带来影响。

关注我的公众号,共同交流学习嵌入式开发相关技术:

Linux多任务机制相关推荐

  1. Linux多任务编程之七:Linux守护进程及其基础实验(转)

    来源:CSDN  作者:王文松  转自Linux公社 ------------------------------------------------------------------------- ...

  2. Android多任务机制的科普(豁然开朗系列)

    为什么不需要清内存? 想当年,清内存的习惯由来已久.在 Android 还没出生,我们使用 Windows 时,总巴不得把所有没有用到的进程关掉,这样才不会"占 内存",不会&qu ...

  3. 科普:安卓的多任务机制

     为什么不需要清内存? 想当年,清内存的习惯由来已久.在Android还没出生,我们使用Windows时,总巴不得把所有没有用到的进程关掉,这样才不会"占内存",不会" ...

  4. Android多任务机制科普

    为什么不需要清内存? 想当年,清内存的习惯由来已久.在 Android 还没出生,我们使用 Windows 时,总巴不得把所有没有用到的进程关掉,这样才不会"占内存",不会&quo ...

  5. Linux多任务编程之五:exit()和_exit()函数(转)

    来源:CSDN  作者:王文松   转自:Linux公社 ----------------------------------------------------------------------- ...

  6. Linux cgroup机制分析之cpuset subsystem

    ------------------------------------------ 本文系本站原创,欢迎转载! 转载请注明出处:http://ericxiao.cublog.cn/ -------- ...

  7. linux通信机制总结

    目录 1. Linux通信机制分类简介 2. Inter-Process Communication (IPC) mechanisms: 进程间通信机制0x1: 信号量(Signals)0x2: 管道 ...

  8. Linux模块机制浅析

    Linux模块机制浅析   Linux允许用户通过插入模块,实现干预内核的目的.一直以来,对linux的模块机制都不够清晰,因此本文对内核模块的加载机制进行简单地分析. 模块的Hello World! ...

  9. 在linux c 以结构体形式写文件 结构体参数如何在函数中传递,Linux安全审计机制模块实现分析(16)-核心文件之三auditsc.c文件描述及具体变量、函数定义...

    原标题:Linux安全审计机制模块实现分析(16)-核心文件之三auditsc.c文件描述及具体变量.函数定义 2.4.3文件三auditsc.c2.4.3.1 文件描述 kernel/auditsc ...

最新文章

  1. 转 java c++互传arraylist
  2. php禁止组合热键,cad组合快捷键命令有哪些
  3. 行业观察 | 新一轮AI周期里,华为拿什么破解核心难题?
  4. 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  5. mac操作系统自带的文本编辑软件
  6. 克服DIMM近存计算系统的通信瓶颈,清华软件定义芯片团队提出DIMM间广播技术 | ISCA 2021...
  7. 服务器高并发时请求报错_基于redis的分布式锁防止高并发重复请求
  8. 【HTML 初学】1、HTML元素
  9. java 什么是servlet_JavaWeb解释一下什么是 servlet?
  10. Python升级至2.7方法
  11. faster rcnn一些博客
  12. android MVP连接服务器,Android之MVP模式实现登陆和网络数据加载
  13. ubuntu 卸载NetworkManager
  14. linux服务之irqbalance
  15. 1500页,40万字,阿里淘系技术2020技术年货来了!
  16. 手摸手。完成一个H5 抽奖功能
  17. 基于Transformer的时空融合网络地铁客流预测模型
  18. linux的adsl拨号上网,详细讲解Linux系统下ADSL拨号上网的方法
  19. 如何使用谷歌“以图找图”图片搜索功能
  20. 达叔走了,别只发声感叹就完了

热门文章

  1. 什么是过拟合(overfitting)
  2. input设置点击无边框_设置Word页眉页脚奇偶页不同
  3. 2022年零基础自学网络安全/Web安全,看这一篇就够了
  4. STM32超级简便的按键代码 只需三行 可实现短按+长按
  5. cat3速度 rj45_技术词语:4G网CAT.4和CAT.3那个快?
  6. Linux kernel的中断子系统之(二):IRQ Domain介绍
  7. 什么是Web应用防火墙
  8. Monte Carlo Integration 蒙特卡罗方法求积分 附简单例题+代码
  9. 【c语言】 有一函数: 写程序,输入x的值,输出y相应的值。用scanf函数输入x的值,求y值
  10. je学习笔记一:jsp页面