首页 > 系统相关 >[八股]多进程编程

[八股]多进程编程

时间:2023-09-05 16:44:23浏览次数:29  
标签:八股 调用 return 编程 调度 阻塞 exit 进程

进程调度策略:

先来先服务。

短作业优先

最短剩余时间优先

优先级调度

时间片轮转

 

进程调度的发起来区分:抢占式、非抢占。

非抢占就是主动调度的(自己CPU用不上了,可以交出CPU使用),抢占式就是进程以外的中断事件返回时,或者一些状态切换过程中被动发生的,被标记为可调度并没有正常向下执行。

不管是哪一种都调用了schedule函数,这个函数调度器中最重要的函数做两件事,1.进程任务队列选下一个任务2.切换上下文到下一个任务。

 

 

进程三个状态,运行态就绪态阻塞态。

就绪到运行:被调度

运行到阻塞:交出CPU使用

阻塞到就绪:阻塞结束了进入就绪队列等待准备被调度。

运行到就绪:时间片结束了非阻塞以外的原因交出CPU使用。

执行正常退出会进入终止状态,父进程收尸了就结束,不然就处于僵尸进程状态。父进程挂了没回收,就变成孤儿进程,父进程变init

 如何收尸wait()阻塞直至任意一个进程结束,或者waitpid()指定一个进程号结束,默认是阻塞状态,也可以设置非阻塞。

如何获得当前线程id getpid;如果获得父进程id getppid

如何杀死一个进程 kill -9 pid,僵尸进程没办法用kill杀死

 

如何创建多进程,使用fork。

fork的返回值有两个,对于主进程,返回值是大于0的值(子进程的pid)。对于子进程返回值是0。

编程时可以通过判断返回的id,让子进程主进程执行不同的逻辑。

多进程编程相比于多线程编程的优势在于稳定,子进程崩溃了或者怎样不会对主进程的数据进行破坏,不会影响主进程的运行。

子进程会继承父进程的文件描述符,环境、堆栈、代码区数据区,内存映射区

子进程在继承父进程的地址空间的时候采用的读时共享,写时拷贝的策略,当子进程不需要对空间内容进行修改时可以提高运行效率,降低内存使用。拷贝会被延迟到需要进行修改的时刻。

多进程还可以在子进程的if判断逻辑中通过exec函数族去执行其他的程序,将子进程的内存空间用新的程序数据覆盖。

一个函数执行完毕会以return返回,表明调用的堆栈要返回了,要释放压栈创建的临时变量那些。

main->return->exit->_exit

但是main函数的的结束还宣告了这个进程的结束,所以在return了之后还隐式调用了exit()

  • return() 代表调用栈的返回,exit()代表一个过程的结束。
  • 从main函数退出,会隐式的调用exit()函数,并将return的返回值作为status传递给exit()
  • 从exit()退出,会先调用退出程序,刷新stdio流缓冲区,使用由status提供的值执行_exit()系统调用,_exit()系统调用会关闭打开的文件描述符、释放内存。
  • return 是关键字,exit()是库函数。

 

进程间通信方式:

 

1.管道(匿名有名)

匿名管道只能用于具有关系的进程间的通信(父子,兄弟)  有名管道FIFO,使用方式就是提供一个路径名,跟打开文件读取是一样的,mkfifo。

2.信号

3.共享内存+信号量

4.消息队列

5.socket

标签:八股,调用,return,编程,调度,阻塞,exit,进程
From: https://www.cnblogs.com/synapse331/p/17679980.html

相关文章

  • Android并发编程高级面试题汇总(含详细解析 十七)
    Android并发编程高级面试题汇总最全最细面试题讲解持续更新中......
  • 3天上手Ascend C编程丨带你认识Ascend C基本概念及常用接口
    本文分享自《 【2023·CANN训练营第一季】——AscendC算子开发入门——第一次课(核函数的定义及实现)》,作者:dayao。AscendC是CANN针对算子开发场景推出的编程语言,原生支持C和C++标准规范,最大化匹配用户开发习惯;通过多层接口抽象、自动并行计算、孪生调试等关键技术,极大提高算......
  • 五、进程调度/页面置换/磁盘调度
    小林coding《图解系统:调度算法》笔记参考:geeksforgeeks: CPUSchedulinginOperatingSystemsuic:CPUScheduling 进程调度TIP我知道很多人会问,线程不是操作系统的调度单位吗?为什么这里参与调度的是进程?先提前说明,这里的进程指只有主线程的进程,所以调度主线程就等于调......
  • twincat3编程规范
    twincat编程遵循IEC61131-3标准1.声明变量及数据类型:变量名不区分大小写;变量名首字符是字母或下划线,由字母、数字、下划线组成;变量名不能包含空格、连续下划线、特殊字符;声明输入输出变量,例如:regwordout AT%Q* :WORD;   regwordin AT%I* :WORD;断电保持变量PE......
  • Microsoft Visual Studio 2022(编程工具)下载 中文版介绍
    微软强调VisualStudio2022将完全支持.NET6及其统一框架,用于Windows和Mac开发者的Web、客户端和移动应用程序。软件地址:看置顶贴软件功能一、开发:编写没什么错误的代码遇到困难时使用IntelliSense代码建议快速准确地键入变量。无论导航到所需的任何文件、类型、成员......
  • 21-面向对象编程-多态参数
    多态参数方法定义的形参类型为父类类型,实参类型允许为子类类型 员工类(父类):publicclassEmpolyee{privateStringname;privatedoublesalary;publicEmpolyee(Stringname,doublesalary){this.name=name;this.salary=salary;......
  • MASM32编程状态栏显示字符动画,按钮跑马灯
    一、需求分析由于sysInfo扫描的内容比较多,打算为它增加一点动画效果,提醒用户程序正在运行,耐心等待。二、构建测试窗口测试窗口上放置有一个按钮,按钮上的初始文字是“开始扫描”;并使用状态栏,状态栏初始状态不显示文字。;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<......
  • go并发编程系列七:开学季抢票返程
    背景:学校开学,3位同学要买票回校上课了,就有了这样一个购票程序,当然,实际情况复杂的多,本文仅供参考。packagemainimport("fmt""sync")typeTrainstruct{stationmap[string]intmusync.Mutex}funcNewTrain()*Train{return&Train{station:......
  • Java 编程中的魔法之门:探索I/O流的奇妙世界
    文章目录什么是I/O流?I/O流的层次结构1.字节流(ByteStreams)2.字符流(CharacterStreams)3.缓冲流(BufferedStreams)4.数据流(DataStreams)5.对象流(ObjectStreams)I/O流的应用场景1.文件操作2.网络通信3.用户输入输出4.数据持久化5.图像、音频、视频处理示例:读写文件数据总......
  • Shell脚本Kill并重启进程
    #!/bin/bashJAR_PATH=kill.jarPID=$(ps-ef|grep$JAR_PATH|grep-vgrep|awk'{print$2}')if[-z$PID]thenecho"serviceisalreadystopped"elseecho"kill$PID"kill-9$PIDfisleep1nohupjava-jar......