-
内核态(Kernel Mode):运行操作系统程序,操作硬件
用户态(User Mode):运行用户程序
-
特权指令:只能由操作系统使用、用户程序不能使用的指令。 举例:启动I/O 内存清零 修改程序状态字 设置时钟 允许/禁止终端 停机
非特权指令:用户程序可以使用的指令。 举例:控制转移 算数运算 取数指令 访管指令(使用户程序从用户态陷入内核态)
-
用户态--->内核态:唯一途径是通过系统调用,中断/异常、陷入机制(访管指令)
内核态--->用户态:设置程序状态字PSW
-
内核态与用户态是操作系统的两种运行级别,运行在用户态下的程序不能直接访问操作系统内核数据结构和程序。当我们在系统中执行一个程序时,大部分时间是运行在用户态下的,在其需要操作系统帮助完成某些它没有权力和能力完成的工作时就会切换到内核态(比如操作硬件)。
- 处于用户态执行时,进程所能访问的内存空间和对象受到限制,其所处于占有的处理器是可被抢占的。处于内核态执行时,则能访问所有的内存空间和对象,且所占有的处理器是不允许被抢占的。
- 线程是处理器调度的基本单位,进程是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位。
- 进程和线程根本区别在于 多进程中每个进程有自己的地址空间,线程则共享地址空间。
- 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信机制。
- 进程间通信目的:1).数据传输 2).资源共享 3).通知事件 4).进程控制
- 进程间通信方式:1).管道 2).消息队列 3).信号量 4).共享内存 5).命名管道(FIFO)
- 管道是用环形队列实现的,数据从写端流入从读端流出。
- 两个进程通过一个管道只能实现单向通信,如果想双向通信必须再重新创建一个管道或者使用sockpair才可以解决这类问题;
- 管道只能用于具有亲缘关系的进程间通信,例如父子,兄弟进程。
- FIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存储文件系统中。命名管道是一个设备文件,因此即使进程与创建FIFO的进程不存在亲缘关系,只要可以访问该路径,就能够通过FIFO相互通信。
- 命名管道是一个存在于硬盘上的文件,而管道是存在于内存中的特殊文件。所以当使用命名管道的时候必须先open将其打开。
- 命名管道可以用于任何两个进程之间的通信,不管这两个进程是不是父子进程,也不管这两个进程之间有没有关系。
- 信号量的本质是一种数据操作锁,用来负责数据操作过程中的互斥,同步等功能。
- 共享内存是这五种进程间通信方式中效率最高的。但是因为共享内存没有提供相应的互斥机制,所以一般共享内存都和信号量配合起来使用。
- 共享内存不涉及到内核的拷贝,进程间数据的传递就不通过执行任何进入内核的系统调用来传递彼此的数据,节省了时间
参考:
- Gizing 链接:https://www.cnblogs.com/gizing/p/10925286.html
- 知乎-linux 链接:zhuanlan.zhihu.com/p/94856678