[八股]多进程编程

发布时间 2023-09-05 16:42:51作者: timeMachine331

进程调度策略:

先来先服务。

短作业优先

最短剩余时间优先

优先级调度

时间片轮转

 

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

非抢占就是主动调度的(自己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