操作系统 进程,线程,协程的区别。

8 篇文章 0 订阅
8 篇文章 0 订阅

进程、线程、协程

进程是操作系统资源分配的最小单位,线程是cpu调度的最小单位。

进程有独立的系统资源,而同一进程内的线程共享进程的大部分系统资源,包括堆、代码段、数据段,每个线程只拥有一些在运行中必不可少的私有属性,比如tcb,线程Id,栈、寄存器。

一个进程崩溃,不会对其他进程产生影响;而一个线程崩溃,会让同一进程内的其他线程也死掉。

进程在创建、切换和销毁时开销比较大,而线程比较小。进程创建的时候需要分配系统资源,而销毁的的时候需要释放系统资源。进程切换需要分两步:切换页目录、刷新TLB以使用新的地址空间;切换内核栈和硬件上下文(寄存器);而同一进程的线程间逻辑地址空间是一样的,不需要切换页目录、刷新TLB。

进程间通信比较复杂,而同一进程的线程由于共享代码段和数据段,所以通信比较容易。

和多线程比,协程最大的优势就是协程极高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。

协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。

协程不是被操作系统内核所管理的,而是完全由程序所控制,也就是在用户态执行。这样带来的好处是性能大幅度的提升,因为不会像线程切换那样消耗资源。

协程既不是进程也不是线程,协程仅仅是一个特殊的函数,协程它进程和进程不是一个维度的。

一个进程可以包含多个线程,一个线程可以包含多个协程。

一个线程内的多个协程虽然可以切换,但是多个协程是串行执行的,只能在一个线程内运行,没法利用 CPU 多核能力。

进程拥有的资源

一个进程拥有独立的地址空间(代码段、数据段),打开的文件描述符、自身的信号处理器、所属用户id、进程控制块、进程id、一个或多个线程

进程、线程共享资源

父子进程共享资源:共享代码段,共享文件(具体而言是共享了文件偏移量)。全局变量、栈区、堆区不共享。

父子进程间的数据共享:读时共享,写时复制。

父子进程之间能够使用全局变量通信?不能,两个进程间内存不能共享。

同一进程间的线程共享的资源有:

堆:由于堆是在进程空间中开辟出来的,所以它是理所当然地被共享的;因此new出来的都是共享的(16位平台上分全局堆和局部堆,局部堆是独享的)

全局变量:它是与具体某一函数无关的,所以也与特定线程无关;因此也是共享的

静态变量:虽然对于局部变量来说,它在代码中是“放”在某一函数中的,但是其存放位置和全局变量一样,存于堆中开辟的.bss和.data段,是共享的

文件等公用资源:这个是共享的,使用这些公共资源的线程必须同步。Win32 提供了几种同步资源的方式,包括信号、临界区、事件和互斥体。

独享的资源有:栈、寄存器。

进程的调度算法

先来先去服务:按照请求的顺序进行调度

短作业优先:按估计运行时间最短的顺序进行调度

最短剩余时间优先:按剩余运行时间的顺序进行调度

时间片轮转法:将所有就绪进程按 FCFS 的原则排成一个队列,每次调度时,把 CPU 时间分配给队首进程,该进程可以执行一个时间片。当时间片用完时,由计时器发出时钟中断,调度程序便停止该进程的执行,并将它送往就绪队列的末尾,同时继续把 CPU 时间分配给队首的进程

优先级调度:为每个进程分配一个优先级,按优先级进行调度。

虚拟内存换页的算法有哪些?(页面置换算法)

缺页中断 就是要访问的页不在主存,需要操作系统将其调入主存后再进行访问。 在这个时候,被内存映射的文件实际上成了一个分页交换文件。

最近最少使用算法(LRU):指维护一个所有页面的链表,最近最多使用的页面在表头,最近最少使用的页面在表尾,优先淘汰表尾的页面。

最少频率使用算法(LFU):它为每个页面设计了一个访问频次计数器,页面每次被访问时,频次加一,优先淘汰频次最小的页面。

先进先出算法(FIFO):维护一个所有页面的链表,最新进入的页面放在表尾,最早进入的页面放在表头。当发生缺页中断时,淘汰表头的页面,并把新页面加到表尾。缺点是有可能会将经常访问的页面淘汰。

最近未使用算法(NRU):优先淘汰没有被访问的页面。

第二次机会算法:它对先进先出算法做了改进,当页面被访问时设置该页面的R(Read)位为1。需要替换时,检查最老页面的R位,如果为0,就表示这个页面又老又没有被使用,可以置换掉;如果为1,就将R位清0,并放到链表尾部。

时钟算法:第二次机会算法需要在链表中移动页面,降低了效率,时钟算法使用环形链表将页面连接起来,再使用一个指针指向最老的页面。

最优算法:将最长时间内不再被访问的页面置换标记出来,然后把因调用这个页面而发生的缺页中断推迟到将来。是一种理论上的算法,因为无法知道一个页面多长时间不再被访问。

进程几种状态,状态转移

IO模型

阻塞、非阻塞、同步、异步

阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起,调用线程只有在得到结果之后才会返回

非阻塞:非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程

同步:指被调用方得到最终结果之后才返回给调用方

异步:指被调用方先返回应答,然后再计算调用结果,计算完最终结果后再通知并返回给调用方

阻塞、非阻塞的讨论对象是调用者;

同步、异步的讨论对象是被调用者。

5种IO模型

阻塞 IO 模型:应用进程被阻塞,直到数据从内核缓冲区复制到应用进程缓冲区中才返回。

非阻塞IO模型:进程发起 IO 系统调用后,内核返回一个错误码而不会被阻塞;应用进程可以继续执行,但是需要不断的执行系统调用来获知 I/O 是否完成。如果内核缓冲区有数据,内核就会把数据返回进程。

IO 复用模型:使用 select 或者 poll 等待数据,可以等待多个套接字中的任何一个变为可读。这一过程会被阻塞,当某一个套接字可读时返回,之后把数据从内核复制到进程中。(在多路复用 IO 模型中,会有一个线程不断去轮询多个 socket 的状态,只有当 socket 真正有读写事件时,才真正调用实际的 IO 读写操作。因为在多路复用 IO 模型中,只需要使用一个线程就可以管理多个 socket,并且只有在真正有 socket 读写事件进行时,才会使用 IO 资源,所以它大大减少了资源占用。)

信号驱动 IO 模型:当进程发起一个 IO 操作,会向内核注册一个信号处理函数,然后进程返回不阻塞;当内核数据就绪时会发送一个信号给进程,进程便在信号处理函数中调用 IO 读取数据。

异步 IO 模型:当进程发起一个 IO 操作,进程返回不阻塞,但也不能返回结果;内核把整个 IO 处理完后,会通知进程结果。如果IO操作成功则进程直接获取到数据。

select,poll和epoll的区别

区别

select()允许程序监视多个文件描述符,直到一个或多个文件描述符准备好进行某些类型的 I/O 操作。如果文件描述符可以不阻塞地执行相应的 I/O 操作(例如,read()或write()),则认为它已经准备好了。

poll 函数和 select 函数的功能类似,它等待一组 fd 中就绪的 I/O。

select,poll 是基于轮询实现的,将 fd_set 从用户空间复制到内核空间,然后让内核空间以 poll 机制来进行轮询,一旦有其中一个fd对应的设备活跃了,那么就把整个fd_set返回给客户端(复制到用户空间),再由客户端来轮询每个fd的,找出发生了IO事件的fd

epoll是基于事件驱动实现的,加入一个新的fd,会调用epoll_ctr函数为该fd注册一个回调函数,然后将该fd结点注册到内核中的epoll红黑树中,当IO事件发生时,就会调用回调函数,将该fd结点放到就绪链表中,epoll_wait函数实际上就是从这个就绪链表中获取这些fd。

水平触发、边缘触发

水平触发的意思就是说,只要条件满足,对应的事件就会一直被触发。所以如果条件满足了但未进行处理,那么就会一直被通知

边缘触发的意思就是说,条件满足后,对应的事件只会被触发一次,无论是否被处理,都只会触发一次。

对于select和poll来说,其触发都是水平触发。而epoll则有两种模式:EPOLLLT(水平触发,默认状态)和EPOLLET(边缘触发,效率高)

并不是所有的情况中epoll都是最好的,比如当fd数量比较小的时候,epoll不见得就一定比select和poll好

数据结构

select方法本质其实就是维护了一个文件描述符(fd)数组,以此为基础,实现IO多路复用的功能。这个fd数组有长度限制,在32位系统中,最大值为1024个,而在64位系统中,最大值为2048个。

poll维护了一个链表,所以从理论上,poll方法中,单个进程能监听的fd不再有数量限制

epoll_create会在内核建立一颗专门用来存放fd结点的红黑树

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

q472599451

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值