当前位置: 首页 > news >正文

多进程和多线程基础概念LINUX

进程和程序的区别

程序是静态的,它是保存在磁盘上的指令的有序集合,没有任何执行的概念进程是一个动态的概念,它是程序执行的过程,包括了动态创建、调度和销毁的整个过程

并行:在 cpu 多核的支持下,实现物理上的同时执行

并发:有限的 cpu 核芯的情况下 ,利用快速交替(时间片轮转)执行来达到宏观上的同时执行  

7094d965e38f4a4e8df3c761b2097e19.png

 

0a24a038de284c4a943240c28acd804f.png

每个任务执行的时间是由时间片来决定的

时间片:将一段时间分成多等份

eg:1s/1000=1微秒

 Linux 进程管理 :

  1. 在 Linux 系统中,管理进程使用树型管理方式。 
  2.  每个进程都需要与其它某一个进程建立父子关系,对应的进程叫做父进程。
  3. Linux 系统会为每个进程分配id ,这个id作为当前进程的唯一标识,当进程结束,则会被回收。
  4. 进程的id与父进程的id分别通过getpid()与getppid()来获取

进程空间的分配:

0e1cca853108480c9a4c44502f14fbc6.png

 用户空间的分配:

e478f1e472a84fd79a51b2da8c3b5645.png

 

  • stack : 存放非静态的局部变量
  • heap : 动态申请的内存.
  • bss : 未初始化过的全局变量(包括初始化为0的,未初始化过的静态变量(包括初始化为0).
  • data : 初始化过并且值不为0的全局变量,初始化过的不为0静态变量.
  • rodata : 只读变量(字符串之类).
  • text : 程序文本段(包括函数,符号常量)

内核态的转换: 

  1.  当用户进程需要通过内核获取资源时,会切换到内核态运行,此时当前进程会使用内核空间的资源
  2.  用户需要切换到内核态运行时,主要是通过系统调用(算法)

6fd8dd9ffce94dde8e298f8a4215777a.png

虚拟地址 : 虚拟地址并不代表真实的内存空间,而是一个用于寻址的编号

物理地址 : 是指内存设备中真实存在的存储空间的编号 

操作系统通过调用MMU式的虚拟地址与物理地址建立映射关系:

直接访问物理地址,会导致地址空间没有隔离,很容易导致数据被修改通过虚拟地址空间可以实现每个进程空间都是独立的,操作系统会映射到不用的物理地址区间,在访问时互不干扰.

1944ea96169c4794a090536b068c7297.png

进程的堆栈大小:

  1.  Linux下进程栈的默认大小是8M,可以通过 ulimit -s查看
  2.  堆的大小理论上大概等于进程虚拟空间大小-内核虚拟内存大小,Linux下,进程的高位1G留给内核,低位3G留给用户,所以进程堆大小小于3G。
  3.  最大进程数在Linux下,通过ulimit -u查看系统的最大进程数

e85c0ace78e14a12ac649b6ea60f4a4c.png

进程状态管理:

进程状态分为三个基本状态,即运行态,就绪态,阻塞态。在五态模型中,进程分为新建态、终止态,运行态,就绪态,阻塞态

三态模型:

  1.  运行(running)态:进程占有处理器正在运行。
  2.  就绪(ready)态:进程具备运行条件,等待系统分配处理器以便运行。
  3.  等待(wait)态:又称为阻塞(blocked)态或睡眠(sleep)态,指进程不具备运行条件,正在等待某个事件的完成

e1cb837cec4e44ea84c335423fcfcc96.png

 

  •  运行态(TASK_RUNNING) : 此时进程或者正在运行,或者准备运行,就绪或者正在进行都属于运行态
  • 睡眠态(TASK_SLEEP): 此时进程在等待一个事件的发生或某种系统资源可中断的睡眠(TASK_INTERRUPT) : 可以被信号唤醒或者等待事件或者资源就绪不可中断的睡眠(TASK_UNTERRUPT) : 只能等待特定的事件或者资源就绪
  • 停止态(TASK_STOPPED) : 进程暂停接受某种处理。例如:gdb调试断点信息处理。
  • 僵尸态(TASK_ZOMBIE):进程已经结束但是还没有释放进程资源

2854b4e15c28476984f8998b1c75a007.png

 

 

http://www.lryc.cn/news/430604.html

相关文章:

  • React Native的Android端fetch的网络请求FormData请求错误:TypeError:Network request failed
  • python之matplotlib (1 介绍及基本用法)
  • ROS2常用指令
  • SQL注入(原理、分类、union、POST注入)
  • 【勒索病毒应急响应流程】
  • C ++初阶:C++入门级知识点
  • php中如何高效地实现一个函数以判断给定日期是否位于多个预定义的时间范围内,同时确保代码的可读性、可维护性和性能优化
  • 存在重复元素 II(LeetCode)
  • 认知杂谈21
  • 2024前端面试题-工程化篇
  • 【附源码】Python :PYQT界面点击按钮随机变色
  • [Qt][QSS][下]详细讲解
  • RAII在实现webserver这个项目中是怎么体现的?起到了什么作用
  • QT下显示自己派生的QWidget界面(提升为)
  • jvm监控工具一览
  • 使用 Visual Studio 编辑器作为 DailyNotes 的 markdown 编辑器
  • Linux下进程间的通信--管道
  • 【算法】汉诺塔、顺序查找和二分查找法、冒泡排序、插入排序、选择排序
  • Mac电脑遇到DNS解析失败,ip可以访问,域名无法访问
  • 走进 “星星的孩子” 的世界:理解与关爱儿童自闭症
  • 【学习笔记】7、存储器、复杂可编程器件和现场可编程门阵列
  • Java面试题———RabbitMQ篇
  • 2 种方式申请免费 SSL 证书,阿里云 Certbot
  • 49.给出一个字符串数组,实现一个算法给定一组字符串,将字母异位词组合在一起
  • 如何制作统信UOS启动盘?
  • Conda命令
  • perl——获取数组中元素的索引
  • Vector vs 数组:Java中Vector相比数组的优点
  • 掌握步进电机控制算法:提升自动化精度的关键(代码示例)
  • MySQL的源码安装及基本部署(基于RHEL7.9)