操作系统基础知识
计算机基础知识主要讲到两个重要的主题:
- 操作系统为程序分配内存的策略
- 线程和线程安全
程序运行内存分配策略
传统策略
和物理地址一一对应,会有如下问题
地址空间不隔离 所有的程序都直接访问物理地址,恶意程序可以很容易的修改其他程序的内存数据,已达到破坏的目的;非恶意的程序不小心修改了其他程序的数据会导致其他程序出问题
内存使用效率低 内存是有限的,需要运行一个程序C而内存中的空闲内存不足时需要把内存中的某个程序所有数据换出到磁盘中,再把程序C的数据写入到内存中,整个过程会有大量的数据换入换出,导致效率低下
程序运行的地址不稳地 程序每次转载运行时,都需要在内存中分配一块足够大的空闲区域,这个空闲区域的地址是不固定的,这个程序的编写带来了一定的麻烦,因为程序编写是,他访问的指令和跳转地址大多是固定的,这会涉及到程序的重定向问题。
分段策略
分段策略可以解决传统策略中的第一个和第三个问题,但是第二个问题依然存在
分页方式
虚拟存储的实现需要依赖硬件的支持,CPU采用一个叫MMU(Memory Management Unit)的部件来进行页映射
线程
线程,有时被称为轻量级的进程,是程序流执行的最小单元,一个线程有线程ID、当前指令指针、寄存器集合和堆栈组成。通常,一个进程由多个线程组成,各个线程共享程序的内存空间(代码段、数据段、堆栈)以及一些进程级的资源(如文件的打开和信号)
线程有以下三个状态:
- 运行
- 就绪 CPU被占用或者CPU时间片用完
- 等待 等待某一事件(通常是IO)
线程状态转换图:
在多线程环境下,两个线程同时进行如下操作,有可能遇到线程安全问题:
在多线程环境下,有可能出现如下的结果
和预期的不一致,其实这个场景可能得到0、1、2三种结果,多个线程共享数据会导致意想不到的结果,可以使用锁的机制实现多线程的数据共享处理。