操作系统知识整理

进程和线程

进程是操作系统对一个正在运行的程序的一种抽象,在一个系统上可以同时运行多个进程,而每个进程都好像在独占地使用硬件。
进程是资源的分配和调度的一个独立单元,
线程是CPU调度的基本单元(是进程内的执行单元),线程是轻量级的进程,它的创建和销毁所需要的时间比进程小很多,所有操作系统中的执行功能都是创建线程去完成的,线程中执行时一般都要进行同步和互斥,因为他们共享同一进程的所有资源

超线程:又称同时多线程,是一项允许一个CPU执行多个控制流的技术,即允许两个不同的线程互补冲突的同时使用一个CPU,提高CPU的利用率。例如,可以在一个线程执行整数指令集的时候,而恰好在这个时候,另一个线程执行浮点指令集,而这两个指令集分数与整数指令单元和浮点指令单元来执行。那么我就可以同时执行这两个线程,这就叫超线程。

进程间通信

进程间通信(IPC)五种方式:管道,消息队列,信号量,共享内存,套接口
最快的通信方式:共享内存
管道:通常指无名管道,其是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端,只能用于具有亲缘关系的进程间的通信(父子进程或者兄弟进程)
FIFO,又叫命名管道,是一种文件类型
消息队列:消息的链接表,存放在内核中,一个消息队列由一个标示符(即队列ID)来标识
信号量:信号量是一个计数器,用于实现进程间的互斥和同步,而不是用来存储进程间的通信数据,信号量基于OS的PV操作,程序对信号量的操作都是源自操作

共享内存:是指两个或多个进程共享一个指定的存储区,是最快的一种IPC,因为进程是直接对内存进行读取的,且因为多个进程是可以同时操作的,所以需要进行同步
信号量+共享内存通常结合在一起使用,信号量用来同步对共享内存的访问
套接口(socket,streams)
父子进程内存空间相互独立,全局变量也只能在同一进程的多个进程间共享。fork后子进程是父进程的完全复制,不管什么变量,fork后父子进程中都是一样的,但是两者之间没有关系,任何一个进程修改变量后另一个进程都不知道,更不可能访问另一个进程中的全局变量

线程间通信

信号量

信号量机制
引例 生产者– 消费者问题
Producer: 生产者,每隔几秒生成一个物品,放到缓冲区里。 buffer的容量都是有限的,所以要及时取走
Consumer: 消费者,一旦发现缓冲区里有物品,即刻取走。(一个写,一个读),如何及时取走呢?
轮询机制和信号量机制
Consumer线程不知道何时有物品可取,只是不停地去查询。(比如,每隔50ms查询一次,以便及时取走)
while(1)
{
OS_Thread::Msleep(5);
g_mutex.Lock();
if(g_count > 0) 轮询机制的缺点:查询不能太频繁(浪费CPU),也不能太不频繁,buffer会满
{ 最好有一个通知机制:信号量机制
}
g_mutex.Unlock();
}
轮询的间隔不能太大:如果10秒钟才轮询一次,那缓冲区里的物品可能已经堆积如山了。

信号量:Semaphore,用于实现线程间的通知机制(和Mutex一样,是一个系统级对象)
OS_Semaphore g_sem(0);信号量被定义且初始化为0
第一个线程: Producer
g_sem.Post(); // 通知,放入buffer时调用,信号量是有值的,g_sem.Post()使其加1,当有多个生产者时(即多个post,互不影响,大家都各自加自己的1,但wait还是只能一次减1,慢慢来)
第二个线程:Consumer
g_sem.Wait(); // 等待通知,如果信号量的值大于0,g_sem.Wait()会使其减1,如果信号量为0,则线程等待,线程在等待时是不耗用CPU的,超时等待:
int ret = g_sem.Wait(1000); // ms 等于0说明没有超时
if(ret != 0) // 如果返回值不为0,表明已经超时
{
// 超时处理
}

虚拟内存

虚拟内存是一个抽象的概念,它为每个进程提供了一个假象,即每个进程都在独占的使用主存。每个进程看到的内存都是一致的,成为虚拟地址空间。
Linux为例,每个进程的代码都是从同一固定地址开始的,地址从小到大分别是:程序代码和数据区,堆,共享库(在地址空间的中间部分用来存放如C标准库和数学库这样的共享库的代码和数据),栈和内核虚拟内存(存放操作系统的代码和数据)
加上你的计算机是32位的,那么他的地址总线决定了他可以寻址00xFFFFFFFF(4G)的地址空间,如果你的计算机只有256M的物理内存0x0x0FFFFFF(256M),那么要运行一个需要2G的程序怎么处理?
先了解一下计算机的内存分页机制
计算机会对虚拟内存地址空间(32位为4G)分页产生页(page),对物理内存地址空间(假设256M)分页产生页帧(page frame),这个页和页帧的大小是一样大的。在计算机上有一个页表(page table),就是映射虚拟内存页到物理内存页的,更确切的说是页号到页帧号的映射,而且是一对一的映射。
但是虚拟内存页的个数 > 物理内存页帧的个数,岂不是有些虚拟内存页的地址永远没有对应的物理内存地址空间?
不是的,操作系统是这样处理的。操作系统有个页面失效功能(page fault),操作系统找到一个最少使用的页帧,让他失效,并把它写入磁盘,随后把需要访问的页放到页帧中,并修改页表中的映射,这样就保证所有的页都有被调度的可能了。这就是处理虚拟内存地址到物理内存的步骤。 这就是页面调度算法的来源
总结:虚拟内存地址的大小是地址总数位数相关(可以理解为虚存的大小就是地址寄存器能够表示的地址数量),物理内存地址的大小跟物理内存条的容量相关。
2^10=1024 2^32 = 4G 2^20=1MB
求主存页表应该有多少数目? 用主存大小除以页面大小即可

死锁和解决死锁

如果一个进程集合中的每个进程都在等待只能由该进程集合中其他进程才能引发的事件,那么该进程集合就是死锁的。
死锁的四大条件:
互斥条件,不可剥夺条件,循环等待条件,请求与保持条件
死锁的预防:基本思想是进程申请资源时遵循某种协议,从而打破产生死锁的四个必要条件的一个。
互斥条件不可打破,所以预防常用手段是:允许剥夺其他进程的资源,一次性分配所有资源(破坏请求与保持),有序分配资源(破坏循环等待)
死锁的避免: 银行家算法
不需要实现采用限制措施破坏死锁产生的条件,只需要在资源的动态分配过程中采用某种策略防止系统进入不安全状态,从而避免死锁:银行家算法:实质是设法保证系统动态分配资源后不会进入不安全状态。每次分配之前检查是否有足够的剩余资源能满足距离最大请求最近的客户,如果有,则认为这笔贷款是可以收回的,继续检查下一个客户,如果所有的投资都能够收回,那么该状态是安全的。找到一个可以成功收回的序列即可。

页面置换算法

CAP理论

C consistency,一致性,是指每一次读操作,要么能够读到最新写入的数据,要么错误
A availability,可用性,是指对于每一次请求,都能够得到一个及时,非错的响应,但是不保证请求的结果是基于最新写入的数据。
P partition tolerance 分区容错性:是指由于节点之间的网络问题,及时一些消息丢包或者延迟,整个系统能够继续提高服务(提供一致性或可用性)
CAP理论是说对于分布式数据存储,最多只能同时满足C A P中的两者。

因为分区在分布式系统中是难以避免的,而节点之间的复制一定需要时间(延迟),所以如果要保证一致性(对所有的请求都能够读取到最新的数据),那么势必在一定的时间内要牺牲可用性(不可读取的),反之亦然(CAP猜想起源于1998年,在2002年得到了证明,变成了定理)。有人提出,在分布式系统中,计算是相对容易的,难点在于状态的维护,对于分布式存储系统,数据的一致性是很难保证的,而传统的关系型数据库优先考虑的是一致性而不是可用性,因此提出了ACID四大事物特性。而分布式系统更看重的是可用性而不是一致性,一致性通过BASE(Basically Available,Soft state,Eventual consistency)来保证。简而言之,BASE通过最终一致性来尽量保证服务的可用性,ACID和BASE只是一个度的问题,并不是两个极端。所以在2012CAP理论的提出者更新了CAP理论,更新大意是:
CAP理论并不是说三者必须选择两者,首先只要是分布式系统就可能存在分区,但是分区出现的概率是很小的(否则就要去优化网络或硬件),CAP理论在大多数时候允许完美的C和A,只有分区存在的时间段内才需要C和A之间权衡,其次C和A(一致性和可用性)之间是一个度的问题,因此当代CAP实践的目标应该是针对具体的应用,在合理范围内最大化数据的一致性和可用性的效力。

注意一点:分区是一个想对的概念,当超过预定的通信时限,即系统不能在时限内达到数据一致性,就意味着发生了分区的情况,必须就在当前操作进行C和A的选择。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值