1、操作系统的认识:
操作系统就是为“用户提供操作逻辑所有软硬件资源的工具,相当于用户与裸机进行交互的界面”。再次层面上,为了节约有限资源,操作系统的目的提升到了“充分、合理地利用计算机系统的所有软硬件资源,最大限度地让用户使用有限的硬件资源完成更多的事情”。
2、进程、程序、并发、资源共享、互斥、同步、异步、阻塞和非阻塞:
进程和程序:进程是程序的依次动态执行,程序是进程的静态文本。进程的生命周期是短暂的,随着创建、执行、睡眠到最后销毁结束,而程序则可以永久的存储在设备商。一个进程可以执行不同的程序,一个程序也可以由多个不同的进程执行。
并发:在操作系统中同时存在并行处理的多个进程。对于并发,需要考虑任务的切换或调度(调度的时机或进程下台条件、上台进程选择、调度的实际操作)、保护不同进程不会彼此影响(进程互斥)、不同进程之间的相互协调(进程同步)、不同进程之间的消息传递(进程通信)。
资源共享:由于系统中存在并发处理的进程,但是系统的软硬件资源(CPU、存储设备等)是有限的,所以存在多个进程同时使用一份资源。对于资源共享,需要考虑资源的分配、多个进程同时对一份资源请求、资源回收和资源保护等。
互斥:多个进程同时竞争只允许给一个进程使用的资源,就会产生互斥,而该资源称为临界资源。解决互斥的方法有锁、开关中断、开关中断+锁和信号量(P、V操作)。
同步:一个进程的继续执行,依赖于另一个进程的结果输出或者执行状态,就会产生进程同步,这是如果该进程需要的数据或者信号没有出现,处理器就会停下等待。
异步:对于一个进程需要的资源没有准备好,处理器将该进程暂时睡眠,然后处理其他进程,当该进程需要的资源准备完毕,处理器再将该进程唤醒,这种就是进程异步。
一般有同步阻塞、异步轮询、一部非阻塞。
3、信号量和P、V操作
信号量是一种结构体:
1 struct{2 int value;3 Queue task;4 } sem;
对于value:当value>0时,表示临界区资源的剩余量;当value<0时,|value|表示队列task中因等待该临界资源而挂起的进程数。
P操作:
1 Process P(sem s){2 s.value --;3 if(s.value < 0){4 sleep();//将该进程放到s.task中 5 }6 }
V操作:
1 Process V(sem s){2 s.value ++;3 if(s.value <= 0){4 wakeup();//从s.task队列中唤醒一个进程5 }6 }
无论何种情况,在一个完整的系统中,P、V操作总是成对出现。
对于互斥:每个临界资源对应一个信号量s,进程在访问临界区前,对s执行P操作,在离开临界区时,对s执行V操作,如下:
进程a 进程b
…… ……
P(s) P(s)
临界区s 临界区s
V(s) V(s)
对于同步,假设进程a需要进程b的输出结果result,该result对应信号量r,当进程a需要result时,对r执行P操作,当进程b产生result时,对r执行V操作。
进程a 进程b
…… ……
P(r) 产生result
操作result V(r)
4、银行家算法:避免死锁
算法思想:在进程请求资源之前
1、实际资源检测:
Request < Need
Request < Available
2、假分配检测:
假设进行分配,预测是否会产生死锁。
银行家算法更详细介绍见