操作系统
1 进程基础
1.1 进程和线程的概念
1.1.1 进程
进程是系统进行分配和调度的基本单位
进程=程序+数据+PCB
PCB:进程控制模块
1.1.2 线程
线程减少系统管理的开销,使并发更快
线程共享进程资源
创建和终止花费时间更少,线程切换开销更小
1.1.3 进程于线程的区别
1.2 状态转换
运用了交换技术,在内存中暂时不能运行的进程转移到外存,腾出空间让可以运行的新进程进入内存
1.2.1 进程切换过程
- 保护现场
- 更新PCB状态
- 移动PCB到就绪或阻塞
- 调度新的进程
1.3 进程调度
- 高级调度(作业调度)
作业进入内存 - 中级调度(中程调度)
挂起的进程重新进入内存 - 低级调度(进程调度)
在内存的进程从就绪态转为运行态
1.4 中断
系统设置响应哪些中断(Linux32类),遇到中断信号后,系统保存当前线程,通过中断入口地址跳转到中断子程序,在执行完中断后,再返回恢复现场,继续运行。
1.5 进程并发
1.5.1 生产者和消费者
某一时刻只允许一个生产者或者消费者访问缓存
1.5.2 读者和写者
读取可以同时进行,写入必须使用互斥
1.5.3 单线程的处理高并发
采用I/O复用
1.5.4 并发和并行
- 并发宏观上看两个程序同时运行,微观上看两个程序交替运行
- 并行是指严格意义上的同时运行
1.5.5 临界区
使用临界资源的代码,不能被中断
临界区的互斥方法:
- 进入前屏蔽中断
- 机器指令,原子操作,改变标志和进入临界区
- 信号量方法:wait(), signal()
1.6 进程死锁
1.6.1 死锁必条件
- 互斥条件
- 请求与保持条件
- 非剥夺条件
- 循环等待条件
1.6.2 解决死锁的方法
- 预防死锁
限制死锁的条件,但会降低系统效率 - 避免死锁
预测当前资源分配是否会造成死锁 - 检测死锁
实时检测,出现死锁,及时解决
1.7 进程的通信方式
- 管道
无名管道:用于父子进程通信
命名管道:允许无亲缘关系的进程通信 - 系统IPC
消息队列
信号:用于通知某个事件已经发送
共享内存:依靠互斥锁,共用一块内存 - 套接字socket
主要用于不同主机间的进程通信
2 用户态和内核态
- 用户应用代码运行在用户态
- 系统代码(如系统服务,设备驱动)运行在内核态
从用户态到内核态的转换叫模式切换,需要软中断,进程切换一定有模式切换
3 批处理系统和分时系统
批处理系统:一个进程长时间占用CPU
分时系统:一个进程只能在一个时间片内占用CPU
4 程序内存结构
代码段:存放程序的二进制代码
数据段:存放已经初始化的全局变量
BSS端:存放未初始化的全局变量
堆区:new/malloc分配
文件映射区:mmap分配或动态链接库
栈区:局部变量
系统内核