操作系统常见问题
程序员文章站
2022-03-04 14:50:15
...
1.操作系统的用户态和核心态切换条件以及为什么要切换
进程在用户空间运行时,被称为进程的用户态,而陷入内核空间的时候,被称为进程的内核态。进程通过系统调用进入内核态
同个进程用户态和内核态切换条件:
- 发生系统调用时:这是处于用户态的进程主动请求切换到内核态的一种方式。用户态的进程通过系统调用申请使用操作系统提供的系统调用服务例程来处理任务。而系统调用的机制,其核心仍是使用了操作系统为用户特别开发的一个中断机制来实现的,即软中断。
- 产生异常时:当CPU执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行的进程切换到处理此异常的内核相关的程序中,也就是转到了内核态,如缺页异常。
- 外设产生中断时:当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作的完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。
为什么要有用户态和内核态切换:
由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据, 并发送到网络, CPU划分出两个权限等级 – 用户态和内核态。
进程为什么切换:
- 为了保证所有进程可以得到公平调度,CPU 时间被划分为一段段的时间片,这些时间片再被轮流分配给各个进程。
- 进程在系统资源不足(比如内存不足)时,要等到资源满足后才可以运行,这个时候进程也会被挂起,并由系统调度其他进程运行。
- 当进程通过睡眠函数 sleep 这样的方法将自己主动挂起时,自然也会重新调度。
- 当有优先级更高的进程运行时,为了保证高优先级进程的运行,当前进程会被挂起,由高优先级进程来运行
- 发生硬件中断时,CPU 上的进程会被中断挂起,转而执行内核中的中断服务程序。
2.线程间的通信方式
锁机制,信号量机制(Semaphore),信号机制(Signal),violate全局变量-共享内存,wait/notify
参见:https://blog.csdn.net/J080624/article/details/87454764
3.进程间通信方式
管道/匿名管道(pipe) 管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道。有名管道(FIFO),信号(Signal),消息(Message)队列,共享内存(share memory),信号量(semaphore),套接字(socket) 参见: https://www.jianshu.com/p/c1015f5ffa74