操作系统Day02
僵尸进程:
僵尸进程是什么,为什么会产⽣?
如果⼀个进程已经终⽌,但是它的⽗进程尚未调⽤ wait() 或 waitpid() 对它进⾏清理,这时的
进程状态称为僵死状态,处于僵死状态的进程称为僵尸进程。
等待子进程结束:
wait():会引起程序阻塞
waitpid():非阻塞,只会等待pid参数指定的子进程。对waitpid,最好在⼦进程退出后调⽤。使⽤SIGCHLD信号通知⽗进程,⼦进程结束
子进程退出会给父进程发送SIGCHLD信号,我们可以通过signal(SIGCHLD, SIG_IGN)来忽略子进程的结束信号,由内核来回收。
并发服务器常常fork很多⼦进程,⼦进程终结之后需要服务器进程去wait清理资源。如果将此信号的处理⽅式设为忽略,可让内核把僵尸⼦进程转交给init进程去处理,省去了⼤量僵尸进程占⽤系统资源。
僵尸进程产⽣原因:
任何⼀个⼦进程(init除外)在exit()之后,并⾮马上就消失掉,⽽是留下⼀个称为僵尸进程
(Zombie)的数据结构,等待⽗进程处理。这是每个⼦进程在结束时都要经过的阶段。如果⼦进
程在exit()之后,⽗进程没有来得及处理,这时⽤ps命令就能看到⼦进程的状态是“Z”;
解决方法:
当系统中出现了僵尸进程时,我们是⽆法通过 kill 命令把它清除掉的。但是我们可以杀死它的
父进程,让他变成孤儿进程,并进⼀步被系统中管理的孤儿进程的进程收养并清理。
父子进程:
代码段,堆栈段,数据段。
除了PID号几乎一样。共享全部数据,但是对数据的修改,子进程采用写时复制技术,操作公共数据的副本。
如果⼦进程想要运⾏⾃⼰的代码段,还可以通过调⽤execv()函数重新加载新的代码段,之后就和⽗进程独⽴开了。
进程调度算法:
先来先服务:
优点:公平,简单
缺点:有利于长作业,不利于短作业。短作业会过长等待
最短作业优先:
优点:最短的平均等待时间,平均周转时间
缺点:对长作业不利
高响应比优先
响应比:(等待时间+要求服务时间)/要求服务时间
优缺点:综合考虑等待时间和运行时间
对长作业来说,随着等待时间越来越长,响应比也会越来越大,避免了长作业的饥饿时间
最短剩余时间优先:
长进程饥饿
优先级调度算法
优点:可灵活的调整对各种作业/进程的偏好程度,适用于实时操作系统。
缺点:若有源源不断高优先作业进来,可能导致低优先级作业的饥饿
时间片轮转算法
适用于分时操作系统,公平且响应快。
不区分任务的优先级,频繁的切换系统会带来一定的开销。
进程通信:
同主机通信:⽆名管道、有名管道、信号、消息队列、共享内存、信号量、存储映射
不同主机通信:socket
无名管道:
半双工同一时刻单向,数据从管道一端写入,另一端读出,先入先出。读写一次性操作,读出即从管道抛弃。
半双工同一时刻单向,数据从管道一端写入,另一端读出,先入先出。读写一次性操作,读出即从管道抛弃。
管道的数据无格式,需要读写双方进行约定,且数据不属于文件格式,存在于内存中,管道对应内存中的某一个缓冲区,大小根据系统不一。
管道只能在具有亲缘关系的进程间使用,父子进程,兄弟进程
存在阻塞方式。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!