操作系统(Operating System,简称OS)
操作系统是管理和控制计算机硬件与软件资源的计算机程序,是直接运行在“裸机”上的最基本的系统软件,任何其他软件都必须在操作系统的支持下才能运行。
操作系统不单单指的window 和 linux,而是从一个学科的角度来讲我们的操作系统,
我们开发的程序会运行在不同的机器上,比如说台式机或笔记本上包括手机,电视机顶盒
智能家居.如果要让我们写好的程序在这些设备上运行就不可避免的要和这些设备上的物理
接口打交道,这过程是非常复杂和麻烦的.我们开发系统时候,希望我们的关注点是在系统的
业务逻辑上面而不是和业务逻辑没有关系的设备的细节上面.因此就有了我们的操作系统,
它放在我们开发程序和我们的设备之间,和设备打交道的这些复杂的内容就交给了操作系统,
我们的程序只需和操作系统打交道.
操作系统还是一个比较底层的一个概念,我们在开发过程不可避免的要和一些操作系统的细节打交道这些细节的一部分就是我下面要讲述的.
- 主要讲述 进程和线程 包括如何去寻址
进程和线程之间的概念以及区别
进程
一个程序运行起来后,代码+用到的资源称之为进程,它是操作系统分配资源的基本单位.
线程
通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个进程,不然没有存在的 意义.线程可以利用进程所拥有的资源,在引入线程的操作系统中,通常都是吧进程作为分配 资源的基本单位,而吧线程作为独立运行和独立调度的基本单位,由于线程比进程更小,基本 上不拥有系统资源,故对它的调度所付出的开销就会小得多.
区别
-
从存储的角度出发分析
进程在操作系统里边界比较明显,进程和和进程之间是相对比较独立的 进程里面有很多 线程 一个操作系统可能有几十或者几百个进程在同时运行,每个进程又有少的几个,多 到几十个甚至上百个线程运行 -
内存是框在进程里面的
在电脑中 内存时4G 或 8G 那么内存为什么会框在进程里面。 是把4G 或8G的内存 切一部分给进程吗? 其实不是这样的,这里的内存指的是逻辑内存 我们都知道操作系统有32位和64位操作系统 这里的32位和64位就是在这个逻辑内存上面 是指的是寻址空间 32 2的32次方 是4G 32操作系统每个进程都会有4G 这样一个内存空间你可以用 但并不是就把这个 内存空间分配给你了 上百个进程每个进程分4G 是不可能的,不管你操作系统物理内存多大 我们在程序里看到的是各自一个寻址空间,每个进程之间内存都是互相独立的 独立原因是为了保证程序之间互不影响保证数据安全 文件/网络句柄 这些都是操作系统可以用到的资源,这些在进程中不是独立的可以抢占 -
线程
栈
栈:调用堆栈,在数据结构中堆和栈是两不同的数据结构,但是我们通常会说这个是调用堆栈, 堆是没有含意的在这个栈里,我们从主线程的入口 main 函数里会进行函数调用, 每次调用会把参数和返回地址压入栈里面一层层的在这个栈里面放进去,包括函数内部的 局部变量也会放到栈中PC (program counter) 程序计数器指针
是存放当前或者下一条指令 执行的地址所以我们操作系统真正运行的是一个一个的线程, 进程只是一个容器,线程才是我们计算机真正运行的单元 每个线程都有一个PC指针,这个指针是指向这串代码所在的内存 计算机大部分都是存储程序行的:就是说我们的数据和程序同时存储在同一片内存中. 内存里既有程序又有变量,所以PC 就是指向我们的内存的缓冲区溢出
缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量 溢出的数据覆盖在合法数据上。比方说有一个地方是需要用户输入名字, 黑客利用这个输入数据, 数据的长度超出缓冲区, 溢出的数据覆盖在合法数据 相当于代码植入,TLS thread local storage
线程自己独立的内存.
存储和寻址
存储
存储是操作系统里面比较重要的一块 操作系统的存储方式是结构化的
硬盘(存储数据量很大几T 机械硬盘和固态硬盘)
内存(只要关机就没有的数据 8G 16G 可以更加快速的进行随机访问)
缓存(这是cup里面的cup 不仅是运算的模块还有缓存)
寄存器(距离cpu 运算单元最近的部分)
存储是从慢到快
价格是从低到高

谷歌的搜索 放到内存里面 基于内存做出来的搜索系统
寻址
给了一个地址 怎么在这个层次行的 空间中 找出对应的数据
寻址空间(就是我们每一个进程,所能取到的地址范围)
这个空间和从物理内存中空间是没有任何关系的
这个空间根据操作系统的 32位和64位有关系
int n = *p -> mov eax,[EBX] (汇编)
指针p-> 逻辑内存 进程独立 2 ^32 或 2^64
找到了逻辑内存的地址,怎么找到数据实际存在的位置,
逻辑内存的地址和实际物理内存的地址建立一对应的关系,对应到物理内存上
问题是逻辑内存这么大,如何对应到物理内存中去(就是有可能在物理内存中, 有可能不在)
操作系统会在硬盘中开辟一个空间所谓虚拟内存 有一个虚拟内存
通过分页 到物理内存中去的
物理内存放的下吗? 这个时候会根据算法来找 这个过程就叫做分页或者交换
在window 下C 盘有一个很大的文件 没办法访问 这个就是windows 分配的一个虚拟空间
我们现在确保物理内存中 已经有了这个所需的地址了
我接下来只需要把这个地址的值放到 寄存器中
在一个良好的计算机中 绝大部分的数据 已经在我们的物理内存中了
但是如果内存使用量过多的话 就会发生频繁的分页这样就会导致系统很慢