现代操作系统之进程与线程(上)

进程

基本概念

一个进程就是一个正在执行程序的实例,包括程序计数器、寄存器和变量当前的值。从概念上说,每个进程拥有它自己的虚拟cpu。实际上,每个瞬间CPU只能运行一个进程。

在对进程编程时不能对时序做任何确定对假设。


创建进程

常见情况:
  1. 系统初始化
  2. 执行政治运行对进程所调用的进程创建系统调用
  3. 用户请求创建一个新进程
  4. 一个批处理作业的初始化

在任务可以轻易划分成若干相关但没有相互作用但进程时,创建新进程就特别有效果

从技术上看,所有新进程都是由一个已存在但进程执行了一个用于创建进程但系统调用而创建的,并且直接或间接指导该进程中运行的程序。

在UNIX系统中,只有fork可以用来创建新进程

UNIX中,紫禁城的初始地址时副进程的一个副本,但是涉及两个不同的地址空间,不可泄内存去时共享的。所以对于新进程时可能共享创建者的其它资源。而windows中父子进程地址从开始就不同


进程终止

进程推出由一下条件引起:
  1. 正常推出(自愿)
  2. 出错退出(自愿)
  3. 严重错误(非自愿)
  4. 被其他进程杀死(非自愿)

在杀死其他进程中需要确定授权才可以(UNIX中为kill,WIN32中为TerminateProcess)

进程的层次

在UNIX中,进程和它所有子女即后裔足层一个晋城组,信号将被发送到相关进程诅的所有成员。每个进程都以分别捕获、忽略或采取默认行动(被该信号杀死)

win32中所有进程地位相同,唯一的不同在于父进程会获得一个句柄(可转让)。

UNIX进程不能剥夺其子进程的继承权


进程的状态

进程状态由三种——运行态、就绪态和阻塞态。

阻塞态不能运行,就算是CPU空闲也不能运行。

操作系统最底层是调度程序。


进程的实现

操作系统维护一张进程表(结构数组),表中存储进程信息。

终端硬件将程序计数器、程序状态字、有时还有一个或多个寄存器雅茹对战,计算机随即跳转到中断向量所指示的地址。


多道程序设计模型

假设一个进程等待IO操作的时间预期停留在内存中的时间比为p,当内存中同时由n个进程时,则所有n个进程都在等待IO的概率为p的n次方,所以CPU利用率为1-P的n次方。



线程

线程是轻量级的进程,代价更小,切换速度更快,还可以共享变量。

一种组织服务器的模型是允许把服务器编写为一个顺序线程的集合。在分派线程的程序中包含以后 一个无限循环,改虚幻用来获得工作请求并将工作请求分派给工作线程。每个工作线程会从阻塞到就绪,处理完成后再次变为阻塞。


多进程是的顺序进程的思想被保留下来,这种顺序进程阻塞了系统调用,但仍旧实现但并行性。而单线程虽然保留了阻塞系统调用的简易性,但是放弃了性能。异步运用了非阻塞和中国年的伏安,通过并行性实现了高性能,但是给编程增加了困难。



经典线程模型

进程用于把资源集中到一起,而线程则是在CPU上被调度执行的实体。

同一个进程中的多个线程,是对同一台计算机上并行运行多个进程的模拟。前者多线程共享同一个地址空间和其它资源。而在后一种情形中,多个进程共享物理内存,磁盘等资源。


线程概念试图实现的是共享一组资源的多个线程的执行能力,以便这些线程可以为完成某一个任务共同 工作。

和进程一样,线程有四种状态——运行,阻塞、就绪或终止。

每个线程都有自己的堆栈,其中存放一些响应过程的局部变量还有完成之后使用的返回地址。

在多线程情况下,进程通常会从当前的单个线程开始。不论有无层次关系,创建线程通常都返回一个线程标识符,该标识符就是新线程的名字。

一个线程可以等待一个(特定)的线程推出,这个过程阻塞调用指导那个特定线程退出。

不同于进程,(线程库无法利用始终强制终端线程让出CPU。)

POSIX线程

Prhtead是IEEE定义的线程标准

每一个都有一个标识符,一组寄存器(包括程序计数器)和一组存储在结构中的属性。



用户线程

整个线程报放在用户空间中,内核对线程包一无所知。

用户及线程包可以在不支持线程对操作系统上实现。

在用户空间管理线程时,每个进程需要有其专业的线程包,用来跟中国年该线程表中的线程。这些表和内核中国年的进程表类似,不过它仅仅记录各个线程的属性。

当一个线程转换到就绪状态或阻塞状态时,在该县城表中存放重新启动该线程所需的信息。

只要堆栈指针和程序计数器一切换,新的线程就自动投入运行。

进行类似与这样的线程切换至少要比陷入内核快一个数量级,这也是用户及线程包的优点。

用户级线程的另一个有点是允许每个进程自己订制的调度算法,而且还具有很好的扩展性。(内核线程需要一些固定的表格空间和对战空间,如果内核级线程过多会出问题)


用户级线程确定也很多:
  1. 如何实现阻塞系统调用。
  2. 如果一个线程引起也没故障,内核由于甚至不知道有线程存在,通常会把整个进程阻塞指导磁盘IO完成未知,尽管其它线程可以允许
  3. 如果一个线程开始允许,则该进程中的其他线程不可允许,除非第一个线程自动放弃cpu。

内核线程

内核线程不再需要运行时系统,每个进程中也没有线程表,线程表处于内核中。当创建或销毁线程时,会出发系统调用,

线程表可以说是传统进程表的子集。

所有能够阻塞线程的调用都以系统调用的形式实现,这雨运行时系统过程相比,代价相当可观。而当一个线程阻塞时,内核根据其选择,可以允许同一个进程中的另一个线程。

信号是发给进程而不是线程的,线程可以注册它感兴趣的信号。

调度程序激活机制

尽管内核级线程在一些关键点上由于用户级线程,但是内核级线程较慢。

(回头复习)


弹出式线程

一个消息到来导致系统创建一个处理该消息的线程,则称为但出事线程。其好处在于线程没有历史,所有新线程都一样,因此可以快速创建,而对于消息来说,消息到达与处理开始直接的时间非常短。

在使用弹出式线程之前,需要提前计划。在内核级空间允许弹出式线程通常比在用户空间容易且快捷,但是一旦出错危害更大。

使用单线程代码多线程化

对于线程是全局变量,并不意味着对于进程同样是全局变量。

有时候线程会有私有的全局变量,就算不同线程声明的同一个变量也是两个独立的变量。

将单一线程程序转化为多线程存在一个问题——很多库不可重复载入。
类似的情况还有内存分派。

一种解决方案是设置二进制位来标志是否在使用,如果存在使用则阻塞。

多线程的另一个问题是堆栈,由内核不了解所有堆栈,则可能导致线程堆报错。

综上,改写程序时不进行重新设计是不可能的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值