操作系统的进程管理(汇编角度)


操作系统进程的概念最早来自于jobs(作业),前面的程序运行完,后面的才能运行,这是一个弊端。于是出现了分时的概念,程序你跑一会,我跑一会。一个程序运行起来了,它就是一个进程,如果是静态的,它就是程序。

A process includes:

program counter and other registers
text section代码段
stack放置局部分配的变量
data section
heap放置动态分配的程序
如果撞到一起会发生内存不足。理论上,一个程序申请的进程内存是0-4G
在这里插入图片描述

process state(进程状态)

new
ready(就绪)
running 运行获得了cpu资源
waiting(等待)
terminated
在这里插入图片描述

等待后不直接去运行?软件设计理念的问题,一个进程等待态当时有另一个进程在运行,会发生碰撞,增加代码的复杂度
就绪态-等待状态?等待发生的条件是出现IO请求或需要等待一个事件,所以说转去等待需要系统调用,系统调用需要cpu资源,就绪态没有cpu资源,只有运行态时才会有cpu资源。
操作系统进入等待态是应用程序主动通过一些操作进入的,需要 系统调用,进入了内核。

PCB(进程控制块)

和进行运行相关的所有信息都在里面,知道进程在内存的哪个位置,运行状态,历史记录……
进程切换时PCB的作用:保存与切换当前状态,实际就是把寄存器的内容存到内存里,然后把内存的另一块内容放到寄存器里,停止当前运行进程并调度其他进程。

多种策略:设置多个寄存器,每种进程切换一个寄存器来实现现场的保存与恢复。
在这里插入图片描述
每一个PCB是个结构体,全部组成在一起构成了一个队列,处于就绪状态的进程都放在一个就绪队列里,等待状态的进程根据等待的不同的设备放到不同的设备队列里面。
队列程序编写时应该选择哪一种数据结构:根据程序的局部性原理,选择数组

进程的创建,加载执行,等待终止

软件的自动启动,有shell(资源管理器)启动,内核会启动shell,资源管理器这样的进程,这样的进程再启动其他的程序,变成一个个的进程,形成一个树。
从资源和执行上看
父进程与子进程:
共享-嵌入式系统
继承父进程的一部分资源-unix系统
资源不共享-windows

并发执行和等待执行

进程最好是独立的,互不干扰的,有独立的内存运行空间,里面放什么?
1.子进程克隆父进程 unix-linux
2.子进程空,需要加载一个程序放到自己的内存空间 windows
unix fork()系统调用
在这里插入图片描述
一个进程在运行,执行fork()时,把当前进程所有的复制一份,pid不一样。两进程同时继续往下执行,父进程执行下一步是社么,子进程也是一样,此时父进程和子进程是两个独立的进程,访问不同的内存单元。fork返回值有OS决定,虽然两进程一样,给他们的返回值不同,给父进程返回子进程的pid,给子进程pid=0。这里子进程加载了top这个程序,占用了内存空间,这时os让父进程进入等待态,只有子进程退出后,父进程才能到就绪态重新运行。
在这里插入图片描述
在这里插入图片描述
当9012进程执行完后,9011这个父类开始继续执行复制,复制后的进程号为9013,而9012作为父类i的值还可以继续复制,所以9012衍生出了9014。只要i的值满足就可以一直复制。
在这里插入图片描述
在这里插入图片描述
windows下创建新进程的API叫做Create Process 文档 google msdn API
unix linux man查找系统调用

return 返回值 ,告诉操作系统 本次运行返回的状态,约定0表示运行正常,其他值表示返回错误。OS获得返回值没什么用,他实际上可以把返回值 返回给与其相关进程,做逻辑判断、
进程结束后的回收工作,不接受父进程回收的子进程 称作僵尸进程(zombie),占用很多进程不结束。
也可以他杀,linux 中的kill。高级用户有权限可以杀任何进程。

进程间的协作
1.独立
2.协作,有些时候是需要协作的。怎么协作?
2.1消息传递,通过内核复制,需要系统调用,一个send,一个receive,需要建立通信链路
阻塞性系统调用:请求的结果不能立即得到,当前的进程挂起,等待状态,当I/O结束(请求的事),才被唤醒
非阻塞性系统调用:当你起发起一个请求,操作系统会返回值告诉你操作有无完成,去做其他事(这样的话程序复杂度提高)
消息也有阻塞性和非阻塞性系统调用。消息在操作系统内部有缓冲区。在这里插入图片描述
2.2 共享内存,更快速
A一写,B就可以读在这里插入图片描述事实上,OS不允许两进程互相通信,需要一系列的系统调用;另外还要处理同步问题;并不是所有的OS都支持内存共享
POSIX系统两套系统调用。
通过建立一块共享的空间,一个变量指向它,另一个变量也指向它,只要它修改了,指向它的变量都会修改。

并发软件设计的主要技术路线

1.多进程编程
2.多线程
进程的特点是分离,而线程的特点是不分离,所有属于这个进程的线程共享资源
在这里插入图片描述
单线程一个时刻只有一个pc,只能执行一条指令;多线程:寄存器里有pc,可以在某一时刻有三个指令在执行,指令的执行路线(函数调用的返回值保存在栈里)如果共享栈和寄存器,就会很乱。
好处
1.快速响应:
当点击一个动作时,窗口中鼠标沙漏状,然后变白色,等待还是杀死他。说明这个动作复杂,cpu一直在算,cpu没机会处理界面,界面是这个程序自己画上去的,os告诉他显示界面。
去访问远端的服务器,tcp连接的等待时间,对于OS来说就需要等待,进程不会需要cpu的资源,点击会无反应。线程来做,耗时的动作交给一个线程,主线程与用户的操作交互,操作会流畅。当然进程也可以做……但是耗时耗力
2.资源共享,协作方便,节约资源。理论上,进程的创建,切换,销毁这种资源开销比进程小。
分类
1.内核级线程,现在OS都是,当有线程时,cpu调度的单位是线程,有一个Tread control block(线程控制块),与PCB一样
2.用户级线程,通过技术在自己的空间里模拟出多寄存器效果,程序自己分配时间,保存断点,恢复断点。效率高,不要系统调用;可定制性好,线程间的调度算法自己决定。缺点是如果用户线程中任何一个线程调用了阻塞性的系统调用,所有的用户线程被阻塞。不能在多个处理器上并行运行,处理器分配有OS决定,一个线程只能在一个cpu上运行。游戏里的用户级线程,每一植物和僵尸,太阳,都是一个独立的个体,主线程控制切换线程,快速轮换。
在这里插入图片描述
线程库
POsix 线程库
win32 线程库
java:语言级别的线程,有一个线程类
线程池
服务程序一启动,先建几十个线程在线程池,来一个用户程序就去拿一个线程给他,用完再放到线程池中。
linux的线程的实现:同一个系统调用克隆进程和线程,变换克隆函数的参数来区别进程线程,进程间是独立的内存,而线程间则共享内存,没有针对线程的优化。

apache和IIS

apache:多进程,进程是完全独立的,稳定安全
IIS:多线程,效率高,线程模型稳定,任何一个线程出问题,导致整个进程的崩溃。

firefox,chrome,IE

firefox,IE多线程的,网站间的密码是不能获取的(取决于cookie),不同窗口时,百度网的密码不能获取qq邮箱的密码
chrome 在浏览器当中,任何 标签和窗口包括插件都是一个独立的进程,任何一个出问题浏览器不会崩溃。用sandox对操作做了保护,只允许浏览器该干的的事情。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值