二、操作系统
操作系统
进程
进程的概念
一个进程是某种类型的一个活动,他有程序,输入,输出,以及状态。单个的处理器可以被若干个进程共享,他是用某种调度算法决定何时停止一个进程的工作,并准想另一个进程提供服务。cpu 的每个核每次只能运行一个进程。每个进程都有一个地址空间和一个控制线程
- 进程的创建
-
系统初始化
-
正在运行的程序执行了创建进程的系统调用
-
用户请求创建一个新锦成
-
一个批处理作业的初始化
前台进程:和用户交互完成工作的进程。
后台进程:(守护进程,)一直在后台运行,在需要的时候被调用
- 什么时候创建进程更加合适
当所要做的事很容易划分为
在unix中,只有一个系统调用(户系统内核交互的命令)fork可以创建新进程;fork后,这两个进程(父进程和子进程)会拥有相同的内存映像,同样的环境字符串和同样的打开文件。子进程执行execve或其他系统调用修改内存映像成为新程序。分为两步的原因是,在execve之前,允许孩子进程处理文件描述符。
在win中,创建新进程,父进程会通过传入参数将需要的信息传递给子进程来创建。
创建进程后父子进程地址空间是不同的。从上可见,unix初始创建进程时,字进程的初始的地址空间是父进程的一个副本,这种情况子进程共享父进程内存,但写操作会复制内存来进行操作。(写时复制)
- 进程的终止
自愿(正常退出和错误退出)和非自愿(严重错误和被其他进程杀死)
正常退出中,unix中调用exit,win调用exitprocess
- 进程的状态
运行态(正在占用cpu运行),就绪态,阻塞态
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AByLrizC-1609681368107)(evernotecid://997274DB-5796-41BC-8683-0CC751CD0C4B/appyinxiangcom/21253932/ENResource/p31)]
- 进程的实现
实现进程模型是通过维护进程表(也叫进程控制块)来实现的(一个结构数组)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SChpacMM-1609681368111)(evernotecid://997274DB-5796-41BC-8683-0CC751CD0C4B/appyinxiangcom/21253932/ENResource/p32)]
进程间通信
-
原因:竞争条件:在协作的过程中可能会共享一些彼此都能读写的公共存储区,当两个以上进程读写某些共享数据时,最后的结果取决于进程运行的精确时序,成为竞争条件,竞争条件的形成会使程序在运行中出现一些不可思议的错误。
-
解决:为了保持进程间通信中避免产生竞争条件,就必须确保当一个进程正使用一个共享变量时,其他进程不能这么操作,即保证互斥。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9kojFkDJ-1609681368115)(evernotecid://997274DB-5796-41BC-8683-0CC751CD0C4B/appyinxiangcom/21253932/ENResource/p49)]
保证互斥有以下不同的方案:
- 忙等待互斥:
-
屏蔽中断:进程进入临界区之后立即屏蔽中断,并在离开之前再打开中断。缺点是:屏蔽中断对于操作系统是一种有用的技术,但对于用户进程掌握屏蔽中断并不安全也不适用
-
锁变量:设置一个共享锁,初值为0,进程进入临界区时先测试这把锁,为0则设为1 并使用;为1则不能使用。缺点:测试和设置有时间间隙,容易发生问题(参考数据库)
-
严格轮换法:
和2类似,但是是使用一个初值为0的变量,每个进程都循环获取该变量的值,当达到该进程想要的值时,该进程使用,使用后变量值+1。这种也成为自旋锁。缺点:进程0之外的进程因循环被阻塞
- peterson 解法:
同样使用变量记录临界区使用情况,但是同时获取临界区值时,后者会覆盖前者。
总结:可以看出忙等待互斥有一个特性就是,忙等待,即当一个进程想进入临界区时,先检查是否允许进入,若不允许,则原地等待,直到允许为止。我们希望进程无法进入临界区应该阻塞,而不是忙等待, 睡眠与唤醒:
生产者消费者问题,两个进程共享一个公共固定大小的缓冲区,其中一个是生产者将消息放入缓冲区,另一个是消费者,从缓冲区读取信息。但缓冲区满则生产者睡眠或者消息为空则消费者睡眠(s