进程管理
进程是对运行程序的一种抽象。进程就是正在执行程序的实例。 操作系统负责管理所有正在运行的进程,操作系统会为每个进程分配特定的时间来占用 CPU,操作系统还会为每个进程分配特定的资源。
操作系统为了跟踪每个进程的活动状态,维护了一个进程表。在进程表的内部,列出了每个进程的状态以及每个进程使用的资源等。
由于IO和缓存的速度差别,通过进程的切换来在单CPU的情况下,实现一种伪并发
进程表项包含了进程状态的重要信息,包括程序计数器、堆栈指针、内存分配状况、所打开文件的状态、账号和调度信息
线程
为什么要有线程
- 多线程之间会共享同一块地址空间和所有可用数据的能力,这是进程所不具备的
- 线程要比进程更轻量级,由于线程更轻,所以它比进程更容易创建,也更容易撤销。在许多系统中,创建一个线程要比创建一个进程快 10 - 100 倍。【创建消耗低】
- 第三个原因可能是性能方面的探讨,如果多个线程都是 CPU 密集型的,那么并不能获得性能上的增强,但是如果存在着大量的计算和大量的 I/O 处理,拥有多个线程能在这些活动中彼此重叠进行,从而会加快应用程序的执行速度
线程之间共享了什么
线程不像是进程那样具备较强的独立性。 同一个进程中的所有线程都会有完全一样的地址空间,这意味着它们也共享同样的全局变量。由于每个线程都可以访问进程地址空间内每个内存地址,因此一个线程可以读取、写入甚至擦除另一个线程的堆栈。
但并不意味着堆栈是放在一起或者一个的,每个线程的堆栈放在内存中,操作系统在切换线程的时候切换堆栈寄存器的值。
如何保证线程安全
- 对非安全的代码加锁
- 使用线程安全的类
- 多线程并发情况下,线程共享的变量改为方法级的局部变量。
进程调度算法
先来先服务
短作业优先
高响应比优先调度
最短剩余时间
时间片轮转
优先级调度
多级反馈队列
进程间通信
管道pipe
半双工+数据单向流动+只能在父子进程间使用
命名管道FIFO
(无名管道:只存在于内存中的文件;命名管道:存在于实际的磁盘介质或者文件系统)
消息队列
消息队列存放在内核中,只有在内核重启(即,操作系统重启)或者显示地删除一个消息队列时,该消息队列才会被真正的删除。
消息队列克服了信号承载信息量少,管道只能承载无格式字节流(因此也可以按类型读取而不一定要先进先出)以及缓冲区大小受限等缺。
共享内存
信号量
信号量是一个计数器
socket
信号
用于通知接收进程某个事件已经发生;
内存管理
虚拟内存
为什么要有虚拟内存
虚拟内存是一种内存分配方案,是一项可以用来辅助内存分配的机制。应用程序是按页装载进内存中的。但并不是所有的页都会装载到内存中,计算机中的硬件和软件会将数据从 内存 临时传输到磁盘中来弥补内存的不足。
如果不使用虚拟内存,一旦内存全部占用,则不能运行程序。