定义:操作系统是控制管理计算机系统的硬软件,分配调度资源的系统软件。
目标:方便性,有效性(提高系统资源的利用率、提高系统的吞吐量),可扩充性,开放性。
最基本的特征,互为存在条件:并发,共享;
(1)并行:指两个或多个事件可以在同一个时刻发生,多核CPU可以实现并行,一个cpu同一时刻只有一个程序在运行;
(2)并发:指两个或多个事件可以在同一个时间间隔发生,用户看起来是每个程序都在运行,实际上是每个程序都交替执行。
(3)共享性:操作系统的中资源可供多个并发的程序共同使用,这种形式称之为资源共享。
虚拟和异步特性前提是具有并发性。
(4)虚拟性:表现为把一个物理实体转变为若干个逻辑实体。
(5)异步性:在多道程序环境下,允许多个进程并发执行,但由于资源等因素的限制,使进程的执行以“停停走走”的方式运行,而且每个进程执行的情况(运行、暂停、速度、完成)也是未知的。
中断机制的作用:为了在多道批处理系统中让用户进行交互;
中断产生:
中断的分类:
外中断的处理过程:
为什么需要进程:
进程控制块(PCB):用于描述和控制进程运行的通用数据结构,记录进程当前状态和控制进程运行的全部信息,是进程存在的唯一标识。
进程(Process)与线程(Thread):
区别与联系:
就绪状态:其它资源(进程控制块、内存、栈空间、堆空间等)都准备好、只差CPU的状态。
执行状态:进程获得CPU,其程序正在执行。
阻塞状态:进程因某种原因放弃CPU的状态,阻塞进程以队列的形式放置。
创建状态:创建进程时拥有PCB但其它资源尚未就绪。
终止状态:进程结束由系统清理或者归还PCB的状态。
生产者-消费者问题:有一群生产者进程在生产产品,并将这些产品提供给消费者进程进行消费,生产者进程和消费者进程可以并发执行,在两者之间设置了一个具有n个缓冲区的缓冲池,生产者进程需要将所生产的产品放到缓冲区中(+1操作),消费者进程可以从缓冲区取走产品消费(-1操作)。
产生问题:当两者并发执行时可能出差错,导致预期的结果与真实的结果不相符:当执行生产者+1和消费者-1操作之后,缓冲区的值从10变为了11。
哲学家进餐问题:有5个哲学家,他们的生活方式是交替的思考和进餐,哲学家们共同使用一张圆桌,分别坐在5张椅子上,圆桌上有5只碗和5只筷子。平时哲学家们只进行思考,饥饿时则试图取靠近他们的左右两只筷子,只有两只筷子都被拿到的时候才能进餐,否则等待,进餐完毕后,放下左右筷子进行思考。
这会导致以下的问题,筷子就相当于临界资源:
临界资源指的是一些虽作为共享资源却又无法同时被多个线程共同访问的共享资源。当有进程在使用临界资源时,其他进程必须依据操作系统的同步机制等待占用进程释放该共享资源才可重新竞争使用共享资源。
进程同步的作用:对竞争资源在多进程间进行使用次序的协调,使得并发执行的多个进程之间可以有效使用资源和相互合作。
进程间同步的四原则:
1.使用fork系统调用创建进程:使用fork系统调用无参数,fork会返回两次,分别返回子进程id和0,返回子进程id的是父进程,返回0的是子进程。
2.共享内存:在某种程度上,多进程是共同使用物理内存的,但是由于操作系统的进程管理,进程间的内存空间是独立的,因此进程默认是不能访问进程空间之外的内存空间的。
3.Unix域套接字
域套接字是一种高级的进程间通信的方法,可以用于同一机器进程间通信。
套接字(socket):为网络通信中使用的术语。
Unix系统提供的域套接字提供了网络套接字类似的功能,如Nfinx、uWSGI等。
服务端和客户端分别使用Unix域套接字的过程:
线程同步的方法:
互斥锁:互斥锁是最简单的线程同步的方法,也称为互斥量,处于两态之一的变量:解锁和加锁,两个状态可以保证资源访问的串行。 原子性:指一系列操作不可被中断的特性,要么全部执行完成,要么全部没有执行。
自旋锁:自旋锁是一种多线程同步的变量,使用自旋锁的线程会反复检查锁变量是否可用,自旋锁不会让出CPU,是一种忙等待状态,即死循环等待锁被释放,自旋锁的效率远高于互斥锁。特点:避免了进程或者线程上下文切换的开销,但是不适合在单核CPU使用。
读写锁:是一种特殊的自旋锁,允许多个读操作同时访问资源以提高读性能,但是对写操作是互斥的,即**对多读少写的操作效率提升**很显著。
条件变量:是一种相对比较复杂的线程同步方法,条件变量允许线程睡眠,直到满足某种条件,当**满足条件时,可以给该线程信号通知唤醒**。
进程的类型:
进程的标记:
操作Linux进程的相关命令:
定义:指计算机通过决策决定哪个就绪进程可以获得CPU使用权。
什么时候需要进程调度?
进程调度方式:
非抢占式调度:只能由当前运行的进程主动放弃CPU;
抢占式调度:可由操作系统剥夺当前进程的CPU使用权。
进程调度的三大机制:
就绪队列的排队机制:为了提高进程调度的效率,将就绪进程按照一定的方式排成队列,以便调度程序可以最快找到就绪进程。
选择运行进程的委派机制:调度程序以一定的策略,选择就绪进程,将CPU资源分配给它。
新老进程的上下文切换机制:保存当前进程的上下文信息,装入被委派执行进程的运行上下文。
进程调度算法:
死锁:两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。永远在互相等待的进程称为死锁进程。
饥饿:由于长期得不到资源导致进程无法推进;
死循环:代码逻辑BUG。
死锁的产生:竞争资源(共享资源数量不满足各进程需求)、进程调度顺序不当,当调度顺序为A->B->C->D时会产生死锁,但改为A->D->B->C则不会产生。
死锁的四个必要条件:
死锁的处理策略:
一.预防死锁的方法:破坏四个必要条件的中一个或多个。
二.银行家算法:检查当前资源剩余是否可以满足某个进程的最大需求;如果可以,就把该进程加入安全序列,等待进程允许完成,回收所有资源;重复1,2,直到当前没有线程等待资源;
三.死锁的检测和解除:死锁检测算法,资源剥夺法,撤销进程法(终止进程法),进程回退法;
存储管理为了确保计算机有足够的内存处理数据;确保程序可以从可用内存中获取一部分内存使用;确保程序可以归还使用后的内存以供其他程序使用。
内存分配的过程:单一连续分配(已经过时)、固定分区分配、动态分区分配(根据实际需要,动态的分配内存)。
动态分区分配算法:
内存回收的过程:
页式存储管理:将进程逻辑空间等分成若干大小的页面,相应的把物理内存空间分成与页面大小的物理块,以页面为单位把进程空间装进物理内存中分散的物理块。
页面大小应该适中,过大难以分配,过小内存碎片过多;页面大小通常是512B~8K;
现代计算机系统中,可以支持非常大的逻辑地址空间(232~264),具有32位逻辑地址空间的分页系统,规定页面大小为4KB,则在每个进程页表中的页表项可达1M(2个20)个,如果每个页表项占用1Byte,故每个进程仅仅页表就要占用1MB的内存空间。
段式存储管理:将进程逻辑空间分成若干段(不等分),段的长度由连续逻辑的长度决定。
页式和者段式存储管理相比:
段页式存储管理:现将逻辑空间按照段式管理分成若干段,再将内存空间按照页式管理分成若干页,分页可以有效提高内存利用率,分段可以更好的满足用户需求。
虚拟内存概述:是操作系统内存管理的关键技术,使得多道程序运行和大程序运行成为现实,把程序使用内存划分,将部分暂时不使用的内存放置在辅存,实际是对物理内存的扩充。
局部性原理:指CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中。
虚拟内存的置换算法:先进先出(FIFO)、最不经常使用(LFU)、最近最少使用(LRU)
虚拟内存的特征:
Buddy内存管理算法:经典的内存管理算法,为解决内存外碎片的问题,算法基于计算机处理二进制的优势具有极高的效率。
Linux交换空间:交换空间(Swap)是磁盘的一个分区,Linux内存满时,会把一些内存交换至Swap空间,Swap空间是初始化系统时配置的。
Swap空间与虚拟内存的对比:
文件的逻辑结构:
辅存的存储空间分配:
目录树:使得任何文件或目录都有唯一的路径。
Linux文件的基本操作:参考链接
Linux的文件系统:FAT、NTFS(对FAT进行改进)、EXT2/3/4(扩展文件系统,Linux的文件系统)
I/O设备的基本概念:将数据输入输出计算机的外部设备;
广义的IO设备:
IO设备的缓冲区:减少CPU处理IO请求的频率,提高CPU与IO设备之间的并行性。
SPOOLing技术:虚拟设备技术,把同步调用低速设备改为异步调用,在输入、输出之间增加了排队转储环节(输入井、输出井),SPoOLing负责输入(出)井与低速设备之间的调度,逻辑上,进程直接与高速设备交互,减少了进程的等待时间。
线程池:线程池是存放多个线程的容器,CPU调度线程执行后不会销毁线程,将线程放回线程池重新利用。
使用线程池的原因:
实现线程安全的队列Queue
实现基本任务对象Task
实现的基本功能:任务参数,任务唯一标记(UUID),任务具体的执行逻辑
实现任务处理线程ProcessThread:任务处理线程需要不断地从任务队列里取任务执行,任务处理线程需要有一个标记,标记线程什么时候应该停止。
实现的基本功能:基本属性(任务队列、标记),线程执行的逻辑(run),线程停止(stop)。
实现任务处理线程池Pool:存放多个任务处理线程,负责多个线程的启停,管理向线程池的提交任务,下发给线程去执行。
实现的基本过程:基本属性,提交任务(put,batch_put),线程启停(start,join),线程池大小(size)。
实现异步任务处理AsyncTask:给任务添加一个标记,任务完成后,则标记为完成;任务完成时可直接获取任务运行结果;任务未完成时,获取任务结果,会阻塞获取线程。
主要实现的两个函数:设置运行结果(set_result),获取运行结果(get_result)
总结:使用WebChart的步骤:一 得到要绑定的数据表二 确定显示是柱状图还是拆线图去实例拆线或是柱状实例(new)三 定义实例的样式四 给定义好的实例Data.AddX和Y的数据五 将定义好的实例Add到WebChart上并输出显示。1 首先得到要绑定到WebChart的表,实例代码如下://定义出要绑定到WebChart的表DataTable...
前言本文主要为 Python基础入门笔记(一)内容的补充。一、迭代器和生成器1.1 Python迭代器迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。迭代器有两个基本的方法:iter() 和 next(),且字符串、列表或元组对象都可用于创建迭代器,迭代器对象可以使用常规 for 语句进行遍历,也可以使用...
1.安装 apache2apt-get install apache2这里要说明一下的就是 ubuntu 下的 apache 默认网页执行文件夹在 /var/www/ 下面,配置文件在 /etc/apache2/apache2.conf ,配置文件子目录在 /etc/apache2/ 下进入火狐浏览器,键入 http://localhost ,出现 It works !代表安装成功2.安装 phpa
本文收集总结了一些前端面试题,初学者阅后也要用心钻研其中的原理,重要知识需要系统学习、透彻学习,形成自己的知识链。万不可投机取巧,临时抱佛脚只求面试侥幸混过关是错误的!也是不可能的!不可能的!不可能的!前端还是一个年轻的行业,新的行业标准, 框架, 库都不断在更新和新增,正如赫门在2015深JS大会上的《前端服务化之路》主题演讲中说的一句话:"每18至24个月,前端都会难一倍",这些...
本文转载自:http://blog.csdn.net/royal_coffee/article/details/26039052004 年 4 月 01 日dom4j 是一种解析 XML 文档的开放源代码 XML 框架。本文介绍如何使用包含在 dom4j 中的解析器创建并修改 XML 文档。dom4j API 包含一个解析 XML 文档的工具。本文中将使用这个解析器创建一个示例 XML...
1.当你遇到window10自带微软商店下载应用死活下载不来时可以使用文中办法离线下载解决2.首先知道你需下载的应用名称Instagram3.浏览器搜索微软中国官网打开官网在底部栏点击搜索输入Instagram4.点击进入应用详情页然后复制该应用url5.然后在浏览器打开 https://store.rg-adguard.net地址再把上一步的应用url粘贴到地址栏里点击勾按...
Python是目前市场上非常受欢迎的编程语言,也是一种通用性的高级编程语言,在全球范围之内,Python是非常受欢迎,在很多领域都有重要的作用,那么Python编程语言优缺点有哪些?为大家详细介绍一下。Python编程语言的优点:1、广泛的资料库:Python有一个可扩展的库,包含了各种区域代码,其中包含了字符串操作、正则表达式等,可以直接拿来使用,直接节省大量的时间。2、可扩展性:Python具...
所有表必须使用Innodb存储引擎 MySQL5.6以后的默认引擎 支持事务,行级锁,更好的恢复性,高并发下性能更好 所有表及字段都要...
很多人在学习Javascript的时候,很少去细分javascript里的类别,
f[x]表示组成 x 最少需要的邮票数量一一举例最多贴5张邮票,有三种邮票可用,分别是1分,3分,8分组成0分需要0张邮票 ——f[0]=0组成1分需要在0分的基础上加上一张1分邮票 ——f[1]= f[0]+1 =1 (单位:张)组成2分需要在1分的基础上加上一张1分邮票 ——f[2]= f[1]+1 =2组成3分需要 min{在2分的基础上加上一张1分邮票,在...
脚本调试最简单的调试方法当然是使用echo命令。你可以在任何怀疑出错的地方用echo打印变量值,这也是大部分shell程序员花费80%的时间用于调试的原因。Shell脚本的好处在于无需重新编译,而插入一个echo命令也不需要多少时间。shell也有一个真正的调试模式,如果脚本"strangescript"出错,可以使用如下命令进行调试:sh -x strang...
版权声明:本文由神州数码云基地团队整理撰写,若转载请注明出处。在实现一个数据库系统,客户端,或者中间件的时候,都需要关注数据库与客户端之间的通信,也就是数据库协议层的实现,现在业界内谈论的比较多的两种开源关系数据库就是MySQL和PostgreSQL,本篇将为大家简单解析两者的通信协议和其差异。现在市面上一些NewSQL的实现,会向上兼容MySQL或者PostgreSQL,实现他们的协议层,而这两个数据库的协议实现是完全不一样的,所以这也是我们用两者的客户端无法连接另一个数据库的原因。下面开始为大家