操作系统学习总结
1,Linux 上面 CPU 通过上下文切换达到进程的不断切换, 通过动态计算切换执行的时长叫时间片.
2, 操作系统系统进程分为内核态和用户态进程
3, 操作系统为了具备最高权限让用户进程不具备最高权限, CPU 中提供了 PSW 的寄存器中保存了进程有关的控制器, 其中分两种运行模式: 内核模式和用户模式
4, 中断用于打断 CPU 正常执行的流程, 同时能保证 CPU 控制权交给操作系统. 中断分为硬件中断和软件中断
5, 系统调用:
发起系统调用, 请求操作系统帮忙执行某些操作, 这会产生软中断;
软中断导致陷入内核, CPU 控制权交给操作系统, 操作系统处理中断, 即执行被请求的操作;
如果一切正常, 操作系统在完成操作后会恢复到断点处继续向下执行, 这会回到用户态;
用户进程取得操作系统操作的成果, 继续向下执行.
6,CPU 在空闲后执行操作系统上面的 Idle 的进程, 该进程主要计算 CPU 的空闲时间
7, 操作系统通过在物理内存上面分配一个地址空间来实现进程内存管理
管道:
管道是进程间通信方式. 没创建一个管道, 就有两个文件描述符, 一个是负责读管道的, 一个是负责写管道的. 使用管道通信时, 就是两个文件描述符加一段内核空间中的内存
管道分为匿名管道和命名管道
信号量:
1, 如果一个进程操作 P 操作(减 1 操作, 即请求一个信号灯), 如果减去之后信号量的数值为负数, 则该进程被阻塞, 如果减去之后为 0 或正数, 则放行该进程
2, 如果一个进程请求 V 操作(加 1 操作, 即释放或增加一个信号灯), 进程直接放行
3, 如果请求 V 操作, 如果加 1 之后仍为 0 或负数, 则方向该进程的同时还唤醒另一个被阻塞的进程. 如果加 1 后为正数, 则直接添加一个信号等资源
总结:
最简单的信号量当然是初始时只适用 1 个信号灯, 从而实现互诉锁 (也成为互诉量) 机制: P 是申请锁操作, 只有在有值为 1 的时候才能申请锁, 否则被阻塞; V 是释放锁, 一直被放行
锁
1, 脏读: 将缓存中修改后但没有保存的数据称为脏数据
2, 更新丢失: 同时修改数据时, 有一个进程的更新被覆盖了, 也就是丢失了
一般锁分为两类: 共享锁和互诉锁. 共享锁也称为读锁, 通常使用 S 字母表示; 互诉锁也成为排他锁或写锁, 通常使用 X 字母表示.
- S X
- S YES NO
- X NO NO
下面是兼容性介绍:
1, 当多个进程都只是读取同一份资源(即都申请 S 锁), 因为没有修改数据, 所以可以允许他们同时读取, 所以 S 锁是可以共存的
2, 如果有一个进程修改数据, 它将申请 X 锁, 这时显然不能让其他进程读取或写入数据, 所以 X 锁与 S 锁, X 锁和 X 锁都是互诉的
3, 如果一个进程正在读取数据(即已申请 S 锁), 其它进程想修改数据, 也是不允许的, 所以 S 锁和 X 锁是互诉的
程序如何变成进程
OS 要让磁盘上一个可执行格式 (不是可执行权限) 程序运行起来, 第一件事是装载 (load) 程序的相关代码以及静态数据 (例如已初始化的变量) 到内存中(具体的是到自己的虚拟地址空间, 虚拟地址空间后面介绍)
在 Unix 系统中, 设置好每个进程都关联的 3 个文件描述符: stdout,stdin,stderr),
程序都是由 main()函数作为入口, 然后 OS 将 CPU 控制权交给新创建的进程, 进程获取到 CPU 后就可以执行了
进程表和进程数据结构
内核负责管理维护所有进程, 内核在内核空间维护一个进程的数据结构, 这个数据结构中记录了所有进程, 每个进程在数据结构中都成为一个进程表项
进程表中除了记录了所有进程的 PID, 还使用一个字段记录了所有进程的指针, 指向每个进程的进程控制块
在 Linux 中进程就是一个 task_struct 数据结构, 所以 PCB 代表的就是 task_struct(一个进程)
PCB 包含了进程非常重要的信息, 是上下文切换的关键, 它保存在每个进程的内核栈中(用户栈和内核栈)
来源: http://www.bubuko.com/infodetail-3364067.html