🚩OS - 操作系统
目录
注意
本文最后更新于 2023-01-02,文中内容可能已过时。
进程间通信的方式有哪几种?
- 无名管道( pipe ):父子进程通信
- 高级管道(popen):将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程
- 有名管道 (named pipe):它允许无亲缘关系进程间的通信
- 消息队列( message queue ):克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
- 信号量( semophore ):作为一种锁机制
- 信号 ( sinal ):用于通知接收进程某个事件已经发生
- 共享内存( shared memory ):映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问
- 套接字( socket ):可用于不同机器间的进程通信
用户态和核心态的区别?
Linux系统仅采用ring 0 和 ring 3 这2个权限:
- ring 0 权限最高,可以使用所有 C P U 指令集
- ring 3 权限最低,仅能使用常规 C P U 指令集,不能使用操作硬件资源的 C P U 指令集,比如 I O 读写、网卡访问、申请内存都不行。
用户态与内核态的概念就是C P U 指令集权限的区别,进程中要读写 I O,必然会用到 ring 0 级别的 C P U 指令集,而此时 C P U 的指令集操作权限只有 ring 3,为了可以操作ring 0 级别的 C P U 指令集, C P U 切换指令集操作权限级别为 ring 0,C P U再执行相应的ring 0 级别的 C P U 指令集(内核代码),执行的内核代码会使用当前进程的内核栈。
什么是僵尸进程?应该怎么去操作?
僵尸进程:不会占用系统的实际资源,因为它的资源已经被释放,但它们会占用系统的进程表资源,如果太多的僵尸进程积累,可能会导致进程表资源的耗尽,从而影响系统的正常运行。
- 等待子进程: 在父进程中使用
wait()
或waitpid()
系统调用来等待子进程的退出状态。 - 通知父进程:子进程通知父进程来处理终止状态。
- 定期清理:编写一个定期清理僵尸进程的脚本,定期检查进程表并清理已终止但未被父进程处理的僵尸进程。