获得徽章 0
- day23
程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放
通过文件可以将数据持久化
C++中对文件操作需要包含头文件 < fstream >
C++中文件类型分为两种:
文本文件 - 文件以文本的ASCII码形式存储在计算机中
二进制文件 - 文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们
操作文件的三大类(这些类都属于标准模板库):
ofstream(output):写入文件操作
ifstream(input): 读取数据操作
fstream : 读写操作。一般使用这个类进行文本操作展开评论点赞 - day22
平年的2月份有28天;闰年的2月份有29天;其他月份天数一样
平年一共365天,闰年一共366天
平年与闰年的计算方法是:“四年一闰,百年不闰,四百年又闰”
公元年数可被4整除并且不能被100整除为闰年,但是整百(个位和十位均为0)的年数必须是可以被400整除的才是闰年。其他都是平年
判断是否为闰年的代码
// 判断是否为闰年
bool isLeap(int year){
if((year%4==0&&year%100!=0)||(year%400==0)){
return true;
}
else return false;
}展开评论点赞 - day21
. 破坏不剥夺条件
当一个已保持了某些不可剥夺资源的进程请求新的资源而得不到满足时,它必须释放已经保持的所有资源,待以后需要时再重新申请。这意味着,一个进程已占有的资源会被暂时释放,或者说是被剥夺,或从而破坏了不剥夺条件。
该策略实现起来比较复杂,释放已获得的资源可能造成前一阶段工作的失效,反复地申请和释放资源会增加系统开销,降低系统吞吐量。这种方法常用于状态易于保存和恢复的资源,如CPU的寄存器及内存资源,一般不能用于打印机之类的资源。
破坏不剥夺条件:
方案一:当某个进程请求新的资源得不到满足时,它必须立即释放保持的所有资源,待以后需要时再重新申请。也就是说,即使某些资源尚未使用完,也需要主动释放,从而破坏了不可剥夺条件。
方案二:当某个进程需要的资源被其他进程所占有的时候,可以由操作系统协助,将想要的资源强行剥夺。这种方式一般需要考虑各进程的优先级(比如:剥夺调度方式,就是将处理机资源强行剥夺给优先级更高的进程使用)展开评论点赞 - day20
1) 系统资源的竞争
通常系统中拥有的不可剥夺资源,其数量不足以满足多个进程运行的需要,使得进程在运行过程中,会因争夺资源而陷入僵局,如磁带机、打印机等。只有对不可剥夺资源的竞争才可能产生死锁,对可剥夺资源的竞争是不会引起死锁的。
(2) 进程推进顺序非法
进程在运行过程中,请求和释放资源的顺序不当,也同样会导致死锁。例如,并发进程P1,P2,分别保持了资源R1,R2,而进程P1申请资源R2、进程P,2申请资源R1,时,两者都会因为所需资源被占用而阻塞,于是导致死锁。
信号量使用不当也会造成死锁。进程间彼此相互等待对方发来的消息,也会使得这些进程间无法继续向前推进。例如,进程A等待进程B发的消息,进程B又在等待进程A发的消息,可以看出进程A和B不是因为竞争同一资源,而是在等待对方的资源导致死锁。
(3) 死锁产生的必要条件
产生死锁必须同时满足以下4个条件,只要其中任意一个条件不成立,死锁就不会发生。展开评论点赞 - day19
由于磁盘有移动部件且容错能力弱,因此容易导致一个或多个扇区损坏。部分磁盘甚至在出厂时就有坏块。根据所用的磁盘和控制器,对这些块有多种处理方式。
对于简单磁盘,如采用IDE控制器的磁盘,坏块可手动处理,如MS-DOS的Format命令执行逻辑格式化时会扫描磁盘以检查坏块。坏块在FAT表上会标明,因此程序不会使用它们。
对于复杂的磁盘,控制器维护磁盘内的坏块列表。这个列表在出厂低级格式化时就已初始化并在磁盘的使用过程中不断更新。低级格式化将一些块保留作为备用,操作系统看不到这些块。控制器可以采用备用块来逻辑地替代坏块,这种方案称为扇区备用。
对坏块的处理实质上就是用某种机制使系统不去使用坏块。
坏了、无法正常使用的扇区就是“坏块”。这属于硬件故障,操作系统是无法修复的。应该将坏块标记出来,以免错误地使用到它
对于简单的磁盘,可以在逻辑格式化时(建立文件系统时)对整个磁盘进行坏块检查,标明哪些扇区是坏扇区,比如:在 FAT 表上标明。(在这种方式中,坏块对操作系统不透明,操纵系统可见)
对于复杂的磁盘,磁盘控制器(磁盘设备内部的一个硬件部件)会维护一个坏块链表。
在磁盘出厂前进行低级格式化(物理格式化)时就将坏块链进行初始化。
会保留一些“备用扇区”,用于替换坏块(替换这个操作由硬件完成)。这种方案称为扇区备用。且这种处理方式中,坏块对操作系统透明,操作系统不可见。展开评论点赞 - day18
产生饥饿的主要原因是:在一个动态系统中,对于每类系统资源,操作系统需要确定一个分配策略,当多个进程同时申请某类资源时,由分配策略确定资源分配给进程的次序。有时资源分配策略可能是不公平的,即不能保证等待时间上界的存在。在这种情况下,即使系统没有发生死锁,某些进程也可能会长时间等待。当等待时间给进程推进和响应带来明显影响时,称发生了进程“饥饿”,当“饥饿”到一定程度的进程所赋予的任务即使完成也不再具有实际意义时,称该进程被“饿死”。展开评论点赞 - day17
动态扩展:
并不是在原空间之后续接新空间,而是找更大的内存空间(STL中有专门的算法去找这个内存空间),然后将原数据拷贝新空间,释放原空间
vector容器前端封闭,一般都是在尾部插入数据:push_back和删除数据:pop_back
v.rend():这个迭代器指向第一个元素的前以为
v.begin():常用的vector迭代器,指向第一个第一个元素
v.end():常用的vector迭代器,指向最后一个元素的后一位
v.rbegint():这个迭代器指向最后一个元素
vector容器的迭代器支持随机访问,可以一下跳好几个元素展开评论点赞 - day16
在多道程序系统中,由于多个进程的并发执行,改善了系统资源的利用率并提高了系统的处理能力。然而,多个进程的并发执行也带来了新的问题—死锁。所谓死锁,是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。
下面通过一些实例来说明死锁现象。
先看生活中的一个实例。在一条河上有一座桥,桥面很窄,只能容纳一辆汽车通行。若有两辆汽车分别从桥的左右两端驶上该桥,则会出现下述冲突情况:此时,左边的汽车占有桥面左边的一段,要想过桥还需等待右边的汽车让出桥面右边的一段;右边的汽车占有桥面右边的一段,要想过桥还需等待左边的汽车让出桥面左边的一段。此时,若左右两边的汽车都只能向前行驶,则两辆汽车都无法过桥。
在计算机系统中也存在类似的情况。例如,某计算机系统中只有一台打印机和一台输入设备,进程P1正占用输入设备,同时又提出使用打印机的请求,但此时打印机正被进程P2所占用,而P2在未释放打印机之前,又提出请求使用正被P1占用的输入设备。这样,两个进程相互无休止地等待下去,均无法继续执行,此时两个进程陷入死锁状态。展开评论点赞 - day15
一次性:作业必须一次性全部装入内存后才能开始运行。这会造成两个问题:①作业很大时,不能全部装入内存,导致大作业无法运行;②当大量作业要求运行时,由于内存无法容纳所有作业,因此只有少量作业能运行,导致多道程序并发度下降。
驻留性:一旦作业被装入内存,就会一直驻留在内存中,直至作业运行结束。事实上,在一个时间段内,只需要访问作业的一小部分数据即可正常运行,这就导致了内存中会驻留大量的、暂时用不到的数据,浪费了宝贵的内存资源。展开评论点赞 - day14
程序接口由一组系统调用 (也称广义指令) 组成。用户通过在程序中使用这些系统调用来请
求操作系统为其提供服务,如使用各种外部设备、 申请分配和回收内存及其他各种要求。
当前最为流行的是图形用户界面 (GUI),即图形接口。GUI最终是通过调用程序接口实现的;
用户通过鼠标和键盘在图形界面上单击或使用快捷键,就能很方便地使用操作系统。严格来说图形接口不是操作系统的一 部分,但图形接口所调用的系统调用命令是操作系统的一部分。展开评论点赞