操作系统知识点

本文详细探讨了操作系统中的线程概念,包括进程与线程的区别、线程的五种状态、阻塞的三种情况以及创建线程的三种方法。此外,还讨论了线程同步的方式、同步与异步I/O的区别以及协程的优势和局限性。最后,简述了虚拟内存的重要性和作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、进程&线程

进程:执行着的应用程序,不同的进程使用不同的内存空间
线程:进程内部的一个执行序列。一个进程可以有多个线程,而所有的线程共享一片相同的内存空间,线程又叫做轻量级进程。

2、线程的状态(5个)

  1. 新建状态:使用 new /Thread类/其子类建立一个线程对象后,处于新建状态。
  2. 就绪状态:调用了start()方法,线程进入就绪状态。处于就绪队列中等待调度就绪状态:调用了start()方法,线程进入就绪状态。处于就绪队列中等待调度
  3. 运行状态:获取CPU 资源,就可以执行run(),此时线程便处于运行状态。可以变为阻塞状态、就绪状态和死亡状态运行状态:获取CPU 资源,就可以执行run(),此时线程便处于运行状态。可以变为阻塞状态、就绪状态和死亡状态
  4. 阻塞状态:一个线程执行了sleep(睡眠)/suspend(挂起)等方法,失去所占用资源之后,进入阻塞状态。在睡眠时间到/获得资源后可以重新进入就绪状态。阻塞状态:一个线程执行了sleep(睡眠)/suspend(挂起)等方法,失去所占用资源之后,进入阻塞状态。在睡眠时间到/获得资源后可以重新进入就绪状态。
    分为三种:
    a. 等待阻塞:运行状态中的线程执行 wait() 方法,使线程进入到等待阻塞状态。
    b. 同步阻塞:线程在获取synchronized同步锁失败(因为同步锁被其他线程占用)。
    c. 其他阻塞:通过调用线程的 sleep() 或 join() 发出了 I/O 请求时,线程就会进入到阻塞状态。当sleep() 状态超时,join() 等待线程终止或超时,或者 I/O 处理完毕,线程重新转入就绪状态。
  5. 死亡状态: 线程完成任务或者其他终止条件发生时,该线程就切换到终止状态。

3、阻塞状态的三种情况:

a. 位于对象等待池中的阻塞:执行了wait()
b. 位于对象锁中的阻塞:某对象的同步锁被其他线程占用,JVM把这个线程放入这个对象的锁池中
c. 其他的阻塞状态:执行了sleep()/调用其他线程的join()/发出I/O请求

4、创建线程(三种方法)

① 通过实现 Runnable 接口;
② 通过继承 Thread 类本身;
③ 通过 Callable 和 Future 创建线程。

创建线程的三种方式的对比:
a. 实现Runnable、Callable接口的方式创建多线程时,线程类还可以继承其他类。
b. 继承Thread 类的方式创建多线程时,编写简单,访问当前线程直接使用this即可
c. Callable的call()可以返回值和抛出异常,而Runnable的run()没有这些功能。Callable可以返回装载有计算结果的Future对象。

5、停止线程的方法(3种)

① 使用退出标志,run()方法结束之后
② 使用thread的interrupt()
③ 使用thread的stop()强行终止

6、sleep()\wait()\yield()区别

 Sleep() & yield():
sleep():让当前正在执行的线程休眠
yield():暂停当前正在执行的线程对象,并执行其他线程,交出CPU使用时间
① sleep会给其他线程运行的机会,而不考虑优先级,yield只给同优先级或者更高的机会
② 线程执行sleep后跳转到阻塞,而yield跳转到就绪
③ sleep抛出InterruptedException异常,而yield没有抛出异常
④ sleep有更好的移植性

 Sleep() & wait()
① Sleep:是thread类的方法,会使线程暂停执行指定时间而将机会让给其他线程,但监控任然保持,暂停后会自动恢复,不会释放对象锁
② Wait:是Objeck类的方法,调用wait会导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有重新获得对象锁才能进入运行状态

7、进程&线程间的通信方式

(1)进程间通信方式:
管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
信号量( semophore ): 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
共享内存( shared memory ):共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。

(2)线程间通信方式:

  • 全局变量;
  • Messages消息机制;
  • CEvent对象(MFC中的一种线程通信对象,通过其触发状态的改变实现同步与通信)。

8、线程同步的方式

 Linux:   互斥锁、条件变量和信号量

9、同步&异步IO

A. 同步:就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。
B. 异步:当一个异步过程调用发出后,调用者不会立刻得到结果。实际处理这个调用的部件是在调用发出后,通过状态、通知来通知调用者,或通过回调函数处理这个调用。

同步通信和异步通信的区别?
答:
1) 同步通信要求接收端时钟频率和发送端时钟频率一致,发送端发送连续的比特流;异步通信时不要求接收端时钟和发送端时钟同步,发送端发送完一个字节后,可经过任意长的时间间隔再发送下一个字节。
2) 同步通信效率高;异步通信效率低。
3) 同步通信较复杂,双方时钟的允许误差较小;异步通信简单,双方时钟可允许一定误差。

10、协程

(1)定义:协程是一种用户态的轻量级线程。
协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此:协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置;线程是抢占式,而协程是协作式;
(2)协程的优点:跨平台跨体系架构无需线程上下文切换的开销无需原子操作锁定及同步的开销方便切换控制流,简化编程模型高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题。所以很适合用于高并发处理。协程的缺点:
(3)无法利用多核资源:协程的本质是个单线程,它不能同时将 单个CPU 的多个核用上,协程需要和进程配合才能运行在多CPU;进行阻塞(Blocking)操作(如IO时)会阻塞掉整个程序:这一点和事件驱动一样,可以使用异步IO操作来解决。

11、虚拟内存的概念与介绍

(1)虚拟内存:允许将一个作业分多次调入内存,需要时就调入,不需要的就先放在外存。因此,虚拟内存的实需要建立在离散分配的内存管理方式的基础上。虚拟内存的实现有以下三种方式:#请求分页存储管理#请求分段存储管理#请求段页式存储管理

(2)虚拟内存的意义:
① 虚拟内存可以使得物理内存更加高效。虚拟内存使用置换方式,需要的页就置换进来,不需要的置换出去,使得内存中只保存了需要的页,提高了利用率,也避免了不必要的写入与擦除;
② 使用虚拟地址可以使内存的管理更加便捷。在程序编译的时候就会生成虚拟地址,该虚拟地址并不是对应一个物理地址,使得也就极大地减少了地址被占用的冲突,减少管理难度;
③ 为了安全性的考虑。在使用虚拟地址的时候,暴露给程序员永远都是虚拟地址,而具体的物理地址在哪里,这个只有系统才了解。这样就提
高了系统的封装性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值