操作系统 || 线程

线程作为处理机调度的基本单位,提高了进程执行效率。操作系统可通过内核态或用户态进行线程管理,内核态管理简化编程但效率较低,用户态管理灵活性高但难以实现进程的多道编程。现代操作系统结合两者,实现更高效的线程切换。多线程编程中,创建线程使用pthread库,并需要注意线程同步问题。
摘要由CSDN通过智能技术生成


进程

  • 一个正在运行的程序,资源分配的基本单位

线程

  • 进程内部的一条执行路径(序列),调度基本单位

1.引入

线程是处理机调度的基本单位,线程模式下,在一个进程中至少要有一个线程

提高进程执行效率,

2.线程管理

方式:线程控制块

里面包含维持线程的各种信息

线程在进程中共享的资源不需要放在线程控制块中,而是存放在进程控制块中

在这里插入图片描述

3.线程实现

操作系统进行管理线程:内核态

线程控制块存放在内核空间

好处:

1> 用户编程简单,无需管理线程的调度

2> 如果有线程阻塞,操作系统可以调用另一个线程执行,操作系统能够监听所有线程

缺点:

1> 效率低;每次都要陷入到内核中,由操作系统调度

2> 占用了内核资源,很快就会耗尽内核空间

建立进程线程,但内核空间满了,则会导致内核空间溢出,操作系统停止运转

3> 内核态需要修改操作系统

进程管理线程:用户态

用户自己写执行系统作调度器,专门负责线程调度

用户态下写出的调度器也是线程,没有能力强行夺走控制权

优点:

1> 灵活性:操作系统不知道线程的存在,在任何操作系统都能执行

2> 线程切换快 :无需陷入到内核态

3> 不用修改操作系统

缺点:

1> 程序很难写

2> 无法实现进程的多道编程线程阻塞会导致整个进程阻塞

在一道线程受阻,无法交出控制权(无法执行交出CPU的指令),整个进程无法推进,则操作系统将CPU交给另一个进程

线程阻塞导致进程阻塞解决办法

(1)不让线程阻塞:在执行系统调用前,先确认是否会发生阻塞,写一个包裹(wrap)将系统调用包裹起来,用户想要进行系统调用则要通过wrap,会阻塞就禁止调用

(2)阻塞后激活同进程的其他线程:调度器激活

受阻后CPU控制权回到操作系统手里,在它进行进程切换之前,先去询问受阻的进程是否有其他线程可以执行,有则将CPU交给执行系统线程,给该进程第二次机会让其继续执行,“第二机会”

现代操作系统线程实现

同时实现内核态和用户态线程管理:

用户态的执行系统负责进程内部线程在非阻塞时的切换

内核态的操作系统负责阻塞线程的切换

分配线程时,将执行阻塞操作的线程设为内核态线程

4.多线程

  • 多线程:
  1. 创建线程:
    #include<pthread.h>//引入的头文件
    pthread_create() //创建线程
    pthread_exit() //退出线程
    exit() //退出进程
    pthread_join() //获取线程id

vi main.c

#include<stdio.h>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值