知识点3

1 运算符的重载

          (1)只能使用成员函数重载的运算符有:=、()、[]、->、new、delete。 

          (2)单目运算符最好重载为成员函数。
          (3) 对于复合的赋值运算符如+=、-=、*=、/=、&=、!=、~=、%=、>>=、<<=建议重载为成员函数。
          (4) 对于其它运算符,建议重载为友元函数。 
运算符重载的方法是定义一个重载运算符的函数,在需要执行被重载的运算符时,系统就自动调用该函数,以实现相应的运算。也就是说, 运算符重载是通过定义函数实现的运算符重载实质上是函数的重载。重载运算符的函数一般格式如下: 
          函数类型 operator 运算符名称 (形参表列)
          { 
          对运算符的重载处理
          } 
重载为 类成员函数时参数个数=原操作数个数-1(后置++、--除外)

重载为友元函数时 参数个数=原操作数个数,且至少应该有一个自定义类型的形参

 2 硬盘接口

硬盘接口是硬盘与主机系统间的连接部件,作用是在硬盘缓存和主机内存之间传输数据

1.IDE 电子集成驱动器,将硬盘控制器与盘体集成在一起的硬盘驱动器,普通PC的标准接口,现已被淘汰; 
2、SCSI 小型计算机系统接口,广泛应用于 小型机 上的高速数据传输技术。SCSI接口具有应用范围广、多任务、 带宽 大、CPU占用率低,以及热插拔 等优点,但较高的价格使得它很难如IDE硬盘般普及,因此SCSI硬盘主要应用于中、高端 服务器 和高档工作站中。 

3、SATA 串口硬盘,是未来PC机硬盘的趋势, 串行接口 还具有结构简单、支持热插拔的优点; 

3  工作集

工作集是指在某段时间间隔 ∆ 里,进程实际要访问的页面的集合。

两个进程的相对速度取决于两个进程的相对复杂度和分配到的CPU时间。

4 特权指令

特权指令是指只允许操作系统使用,而不允许一般用户使用的指令。特权指令是机器指令,而系统调用往往以函数调用的形式出现,实现操作系统有n个进程,共享的同类资源数为m,则避免死锁的最少资源数是n(m-1)+1 提供的子功能


5 临界资源 和临界区

是指每次仅允许一个进程访问的资源。 属于临界资源的硬件有打印机、磁带机等,软件有消息缓冲队列、变量、数组、缓冲区等。 诸进程间应采取互斥方式,实现对这种资源的共享。

临界区每个进程中访问临界资源的 那段代码称为临界区一个临界资源可以对应多个临界区(right)
显然,若能保证诸进程互斥地进入自己的临界区,便可实现诸进程对临界资源的互斥访问。为此,每个进程在进入临界区之前,应先对欲访问的临界资源进行检查,看它是否正被访问。如果此刻该临界资源未被访问,进程便可进入临界区对该资源进行访问,并设置它正被访问的标志;如果此刻该临界资源正被某进程访问,则本进程不能进入临界区。
进程特点: 动态性、并发性、独立性、异步性 

异步性:进程以各自独立的、不可预知的速度向前推进。 

6 调度和调页

调度(页面置换算法):内存到外存,调页:外存到内存

调页算法有中断请求调页和预调页技术

进程运行时候如果访问的页面不在内存而需要调入,但是内存中没有空闲区,就需要从内存中调出一页程序或者数据,送入磁盘的对换,选择调出页面的算法是页面置换算法,比如FIFO算法、LRU算法、colck算法 

7 CPU

CPU不能读取硬盘上的数据,但是能直接访问内存储器;CPU主要包括运算器和控制器;CPU是整个计算机的核心部件,主要用于控制计算机的操作。

8 用户线程

由于用户线程不依赖于操作系统内核,因此操作系统内核是不知道用户线程的存在的,用户线程是由用户来管理和调度的,用户利用线程库提供的应用程序编程接口(API)来创建、同步、调度和管理线程。所以,用户线程的调度在用户程序内部进行,通常采用非抢占式和更简单的规则,也无须用户态和核心态切换,所以速度很快。由于操作系统不知道用户线程的存在,所以操作系统把CPU的时间片分配给用户进程,再由用户进程的管理器将时间分配给用户线程。那么,用户进程能得到的时间片即为所有用户线程共享。同一进程下的所有用户线程共享一块时间片

9 操作系统状态转换

活动就绪------suspend------>静止就绪
活动就绪<------active------静止就绪
活动阻塞------suspend------>静止阻塞

活动阻塞<------active------静止阻塞

10 死锁

定义 :在一个进程集合中,所有的进程都在等待只能由该进程集合中的其它进程才能引发的事件,这就是死锁

解释 :由于进程集合中的所有进程都在等待集合中的其它进程引发唤醒该进程的事件,所以所有进程都会阻塞而无法向前推进。

一般大多数的等待事件都是释放进程集合中其它进程所占有的资源,也叫资源死锁。


资源死锁的四大必须条件 :
1>互斥条件: 
  每个资源要么已经分配给了一个进程,要么是可用的。即就是资源非共享
2>占有和等待条件:  已经得到资源的进程还能继续请求新的资源
3>不可抢占条件:   当一个资源分配给了一个进程后,其它需要该资源的进程不能强制性获得该资源,除非该资源的当前占有者显示地释放该资源 

4>环路等待: 死锁发生时,系统中一定有由两个或两个以上的进程组成的一条环路,环路上的每个进程都在等待下一个进程所占有的资源

死锁预防

防止死锁的发生只需破坏死锁产生的四个必要条件之一即可。
1) 破坏互斥条件
如果允许系统资源都能共享使用,则系统不会进入死锁状态。但有些资源根本不能同时访问,如打印机等临界资源只能互斥使用。所以,破坏互斥条件而预防死锁的方法不太可行,而且在有的场合应该保护这种互斥性。
2) 破坏不剥夺条件
当一个已保持了某些不可剥夺资源的进程,请求新的资源而得不到满足时,它必须释放已经保持的所有资源,待以后需要时再重新申请。这意味着,一个进程已占有的资源会被暂时释放,或者说是被剥夺了,或从而破坏了不可剥夺条件。 
该策略实现起来比较复杂,释放已获得的资源可能造成前一阶段工作的失效,反复地申请和释放资源会增加系统开销,降低系统吞吐量。这种方法常用于状态易于保存和恢复的资源,如CPU的寄存器及内存资源,一般不能用于打印机之类的资源。
3) 破坏请求和保持条件
釆用预先静态分配方法
,即进程在运行前一次申请完它所需要的全部资源,在它的资源未满足前,不把它投入运行。一旦投入运行后,这些资源就一直归它所有,也不再提出其他资源请求,这样就可以保证系统不会发生死锁。 
这种方式实现简单,但缺点也显而易见,系统资源被严重浪费,其中有些资源可能仅在运行初期或运行快结束时才使用,甚至根本不使用。而且 还会导致“饥饿”现象,当由于个别资源长期被其他进程占用时,将致使等待该资源的进程迟迟不能开始运行。
4) 破坏循环等待条件
为了破坏循环等待条件,可釆用顺序资源分配法。首先给系统中的资源编号,规定每个进程,必须按编号递增的顺序请求资源,同类资源一次申请完。也就是说,只要进程提出申请分配资源Ri,则该进程在以后的资源申请中,只能申请编号大于Ri的资源。 

这种方法存在的问题是,编号必须相对稳定,这就限制了新类型设备的增加;尽管在为资源编号时已考虑到大多数作业实际使用这些资源的顺序,但也经常会发生作业使用资源的顺序与系统规定顺序不同的情况,造成资源的浪费;此外,这种按规定次序申请资源的方法,也必然会给用户的编程带来麻烦。

死锁避免

避免死锁同样是属于事先预防的策略,但并不是事先釆取某种限制措施破坏死锁的必要条件,而是在资源动态分配过程中,防止系统进入不安全状态,以避免发生死锁。这种方法所施加的限制条件较弱,可以获得较好的系统性能。
1. 系统安全状态
避免死锁的方法中,允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次资源分配的安全性。若此次分配不会导致系统进入不安全状态,则将资源分配给进程; 否则,让进程等待。 
所谓安全状态,是指系统能按某种进程推进顺序( P1, P2, ..., Pn),为每个进程Pi分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可顺序地完成。此时称 P1, P2, ..., Pn 为安全序列。如果系统无法找到一个安全序列,则称系统处于不安全状态。 
并非所有的不安全状态都是死锁状态,但当系统进入不安全状态后,便可能进入死锁状态;反之,只要系统处于安全状态,系统便可以避免进入死锁状态。
2. 银行家算法

银行家算法是最著名的死锁避免算法。它提出的思想是:把操作系统看做是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。

死锁的检测:

前面绍的死锁预防和避免算法,都是在为进程分配资源时施加限制条件或进行检测,若系统为进程分配资源时不釆取任何措施,则应该提供死锁检测和解除的手段。

可以通过将资源分配图简化的方法来检测系统状态S是否为死锁状态。简化方法如下: 

1) 在资源分配图中,找出既不阻塞又不是孤点的进程Pi( 即找出一条有向边与它相连,且该有向边对应资源的申请数量小于等于系统中已有空闲资源数量。若所有的连接该进程的边均满足上述条件,则这个进程能继续运行直至完成,然后释放它所占有的所有资源)。消去它所有的请求边和分配边,使之成为孤立的结点。

2) 进程Pi所释放的资源,可以唤醒某些因等待这些资源而阻塞的进程,原来的阻塞进程可能变为非阻塞进程。

S为死锁的条件是当且仅当S状态的资源分配图是不可完全简化的,该条件为死锁定理。

死锁的解除
一旦检测出死锁,就应立即釆取相应的措施,以解除死锁。死锁解除的主要方法有: 
1) 资源剥夺法。挂起某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但应防止被挂起的进程长时间得不到资源,而处于资源匮乏的状态。 
2) 撤销进程法。强制撤销部分、甚至全部死锁进程并剥夺这些进程的资源。撤销的原则可以按进程优先级和撤销进程代价的高低进行。
3) 进程回退法。让一(多)个进程回退到足以回避死锁的地步,进程回退时自愿释放资源而不是被剥夺。要求系统保持进程的历史信息,设置还原点。

11 进程和线程

进程分为基本的三个状态:运行、就绪、阻塞/等待。 
A. 高优先级的抢占CPU,使得原来处于运行状态的进程转变为就绪状态。 
B. 阻塞的进程等待某件事情的发生,一旦发生则它的运行条件已经满足,从阻塞进入就绪状态。
C. 时间片轮转使得每个进程都有一小片时间来获得CPU运行,当时间片到时从运行状态变为就绪状态。 
D. 自旋锁(spinlock)是一种保护临界区最常见的技术。在同一时刻只能有一个进程获得自旋锁,其他企图获得自旋锁的任何进程将一直进行尝试(即自旋,不断地测试变量),除此以外不能做任何事情。因此 没有获得自旋锁的进程在获取锁之前处于忙等(阻塞状态)。 “阻塞状态”又叫“等待状态或者封锁状态”,

线程和进程的区别联系: 
1,进程:子进程是父进程的复制品。子进程获得父进程数据空间、堆和栈的复制品。 
2,线程:相对与进程而言,线程是一个更加接近与执行体的概念,它可以与同进程的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。 
两者都可以提高程序的并发度,提高程序运行效率和响应时间。 
线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源管理和保护;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。 

根本区别就一点:用多进程 每个进程有自己的地址空间(address space),线程则共享地址空间。所有其它区别都是由此而来的: 
1、速度:线程产生的速度快,线程间的通讯快、切换快等,因为他们在同一个地址空间内。 
2、资源利用率:线程的资源利用率比较好也是因为他们在同一个地址空间内。 
3、同步问题:线程使用公共变量/内存时需要使用同步机制还是因为他们在同一个地址空间内 


12 Linux 配置文件

/etc/下的文件是为系统的所有用户设置的,也就是系统的默认配置

/etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行. 并从/etc/profile.d目录的配置文件中搜集shell的设置. 

/etc/bashrc:为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取. 

~/ 家目录下的文件是当前用户的信息设置

~/.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该 
文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件. 此文件类似于/etc/profile,也是需要需要重启才会生效
~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该 
该文件被读取. 
~/.bash_logout:当每次退出系统(退出bash shell)时,执行该文件. 
=============================== 
所以 
/home/oracle/.bash_profile oracle用户的配置 
/etc/skel/.bash_profile 默认配置 

/root/.bash_profile root用户的配置

profile 是登录配置,重启生效,bashrc是窗口配置,新窗口生效

/etc/profile对所有用户生效,

~/.bash_profile只对当前用户生效。

 ~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该文件被读取.(每个用户都有一个.bashrc文件,在用户目录下) 此文件类似于/etc/bashrc,不需要重启生效,重新打开一个bash即可生效

 /etc/bashrc对所有用户新打开的bash都生效,但~/.bashrc只对当前用户新打开的bash生效。

bash_profile是在你每次登录的时候执行。bashrc是在你新开了一个命令窗口时执行。
bashrc 和.bashrc 有什么区别?
前者是全局,后者是个人

.bash_profile 类似于编程中的构造函数,当登录shell时,shell会寻找该文件做环境初始化。
.bashrc 是在bash环境时.bash_profile的替补。
.bash_logout 类似于编程中的析构函数,当登录shell退出时,shell会寻找该文件,并按其指示办事。 
/etc/profile是系统文件,对系统下全体用户起作用

猜你喜欢

转载自blog.csdn.net/liu_fei_er/article/details/80241115