目录
小程一言
本操作系统专栏,是小程在学操作系统的过程中的第一步,是在学习操作系统的笔记的前提下,加上自己的心得,以及资料的搜集,共同整合而成。小程在学习过程中,难免疏漏,希望各位前辈批评指正。
最主要参考书籍:现代操作系统
书中内容有些生硬,so小程参考其他书籍内容进行了一些加工
这本书饱受诟病的原因是流传思想有些过时,但是计算机有过时的思想吗?,底层逻辑的稳定是整个计算机的基石。现在的所有思想都是在基石之上。
面向群体:在校大学生,想要补齐基础知识短板的在职人员
专栏链接: link
基础概念
-
进程:进程是计算机中运行的程序的实例。每个进程都有自己的地址空间、内存、文件描述符和其他系统资源。进程之间是相互独立的,每个进程都有自己的内存空间,不同进程之间不能直接访问对方的内存。
-
线程:线程是进程中的一个执行单元,一个进程可以包含多个线程。线程共享进程的地址空间和系统资源,但每个线程有自己的栈空间和寄存器。多线程可以提高程序的并发性和性能。
-
进程间通信:进程之间可以通过各种方式进行通信,如管道、消息队列、共享内存、信号量等。进程间通信是实现进程协作和数据共享的重要手段。
-
线程同步:多线程之间需要协调和同步执行,以避免竞争条件和数据不一致的问题。常用的线程同步方式包括互斥锁、条件变量、信号量等。
-
进程调度:操作系统负责对进程进行调度,决定哪个进程在什么时候执行。常见的调度算法包括先来先服务(FCFS)、最短作业优先(SJF)、时间片轮转等。
-
线程调度:线程调度是操作系统对线程进行调度的过程,决定哪个线程在什么时候执行。线程调度可以基于优先级、时间片轮转、多级反馈队列等算法。
-
并发:并发是指系统能够同时处理多个任务的能力。多进程、多线程和异步编程都是实现并发的方式。
-
并行:并行是指系统能够同时执行多个任务的能力。多核处理器和分布式系统可以实现并行处理。
-
死锁:死锁是指多个进程或线程因互相等待对方释放资源而无法继续执行的情况。死锁是多线程编程中常见的问题,需要合理设计和使用同步机制来避免。
线程详解
线程是操作系统中的另一个重要概念,它是进程中的执行单元,可以看作是进程中的子任务。一个进程可以包含多个线程,这些线程共享进程的地址空间和其他资源,但每个线程有自己的堆栈空间和程序计数器。
线程是操作系统进行CPU调度的基本单位,多个线程可以在同一个进程内并发执行,提高了系统的并发性能。在多核处理器系统中,多个线程可以同时运行在不同的核心上,实现真正的并行处理。
与进程不同的是,线程之间可以共享数据,因为它们共享进程的地址空间。线程之间的通信更加高效,可以通过共享的内存进行数据交换。但同时,线程之间的数据共享也增加了编程的复杂性,需要谨慎处理数据的同步和互斥。
线程可以分为用户线程和内核线程。用户线程是由用户空间的线程库实现的,操作系统并不直接支持,内核只知道整个进程,无法感知用户线程的存在。内核线程则是由操作系统内核管理的线程,操作系统可以直接对其进行调度和管理。
so,线程是操作系统中的重要概念,它是进程中的执行单元,可以实现并发执行、提高系统性能。线程之间可以共享数据,但需要注意数据同步和互斥。线程的引入使得程序设计更加灵活,能够更好地利用多核处理器系统的性能。
进程详解
进程是操作系统中的一个基本概念,是一个正在运行的程序的实例。当一个程序被执行时,操作系统会为其创建一个进程,进程包含了程序的代码、数据、堆栈等信息,以及所需的系统资源。每个进程都有自己独立的内存空间,使得不同进程之间的数据相互隔离,确保了系统的稳定性和安全性。
进程在操作系统中扮演着重要的角色,它是系统资源分配的基本单位,操作系统通过进程来管理系统资源的分配和调度。每个进程都有自己的进程控制块(PCB),用于记录进程的状态、优先级、资源占用情况等信息,操作系统通过管理这些信息来对进程进行调度和控制。
进程可以通过创建子进程来实现并发执行,子进程可以独立运行,也可以与父进程共享资源。进程之间可以通过进程间通信(IPC)来实现数据交换和协作。常见的进程间通信方式包括管道、消息队列、共享内存等。
so,进程是操作系统中的一个重要概念,它代表了一个正在运行的程序的实例,是系统资源分配和调度的基本单位,通过进程可以实现并发执行、资源管理和进程间通信,是操作系统中的核心概念之一。
进程间通信
进程间通信(IPC)是指不同进程之间进行数据交换和共享信息的过程。在操作系统中,进程间通信是非常重要的,因为不同的进程需要相互协作、共享数据和资源。
常见的进程间通信方式
-
管道:管道是一种半双工的通信方式,可以在父子进程或者兄弟进程之间进行通信。管道有两种类型,分为无名管道和命名管道。
-
消息队列:消息队列是一种消息传递的方式,可以在不同进程之间传递数据。消息队列可以实现进程之间的异步通信。
-
共享内存:共享内存是一种高效的进程间通信方式,多个进程可以在共享内存中读写数据。共享内存可以实现进程之间的快速数据交换。
-
信号量:信号量是一种用于进程同步和互斥的机制,可以控制进程对共享资源的访问。
-
套接字:套接字是一种网络编程中常用的通信方式,可以在不同主机之间进行进程间通信。
以上是一些常见的进程间通信方式,不同的场景和需求可以选择适合的通信方式来实现进程间的数据交换和共享。
调度
在操作系统中,调度(Scheduling)是指操作系统决定哪个进程在何时执行的过程。操作系统的调度器负责管理和调度系统中的进程,以确保系统资源的有效利用和进程之间的公平竞争。
常用调度算法
-
先来先服务:按照进程到达的顺序进行调度,先到达的进程先执行。
-
最短作业优先:选择执行时间最短的进程先执行,以减少平均等待时间。
-
优先级调度:根据进程的优先级进行调度,优先级高的进程先执行。
-
时间片轮转:每个进程被分配一个时间片,当时间片用完时,切换到下一个进程执行,确保每个进程都有机会执行。
-
多级反馈队列调度:将进程根据优先级划分到不同的队列中,每个队列有不同的调度算法,进程根据执行情况在不同队列之间切换。
调度算法的选择取决于系统的需求和性能要求,不同的算法有不同的优缺点。好的调度算法能够提高系统的性能和响应速度,确保系统资源的有效利用。操作系统的调度器通常会根据当前系统的负载情况和进程的状态来选择合适的调度算法进行进程调度。
重要问题
哲学家进餐问题
这是一个经典的并发编程问题,用来说明在共享资源的情况下可能发生的死锁问题。
问题的描述
假设有五位哲学家围坐在一张圆桌前,每位哲学家面前放着一只筷子,而每两只筷子之间放着一碗意大利面。哲学家的生活包括思考和进餐,当哲学家思考时,不需要任何资源,但当他们饿了时,需要同时拿起他们左右两边的筷子才能进餐。问题在于,如果每位哲学家都拿起自己左边的筷子,那么所有哲学家都会陷入死锁状态,无法继续进餐。
策略
- 引入资源层次性:引入资源的层次性,例如规定哲学家必须按照一定顺序去拿筷子,或者只允许一部分哲学家同时进餐。
2.** 引入超时机制**:规定哲学家在一定时间内没有成功拿到筷子就会放下已经拿到的筷子,避免死锁的发生。
-
使用信号量或互斥锁:使用信号量或互斥锁来保护共享资源,确保一次只有一个哲学家可以拿起筷子。
-
破坏循环等待:规定哲学家顺序拿筷子,或者引入一个资源请求的排序机制,避免循环等待。
哲学家进餐问题是一个经典的并发编程问题,通过解决这个问题可以深入理解并发编程中的死锁和资源竞争问题,以及如何设计合理的资源分配策略来避免这些问题的发生。
读者-写者问题
读者写者问题也是一个经典的并发编程问题,
问题的描述
描述了多个读者和写者对共享资源的访问问题。在这个问题中,多个读者可以同时访问共享资源,但写者在访问共享资源时必须独占资源,读者和写者之间需要进行合适的同步,以确保数据的一致性和避免竞争条件。
两种情况
-
a.是读者优先:允许多个读者同时访问共享资源,但写者必须独占资源。在这种情况下,应该尽量减少写者的等待时间,以避免读者频繁访问共享资源导致写者长时间无法访问资源。
-
b.是写者优先:写者优先访问共享资源,读者需要等待写者释放资源后才能访问。这种情况下,需要确保写者能够及时访问资源,以避免数据不一致的情况发生。
策略
-
使用信号量或互斥锁:使用信号量或互斥锁来保护共享资源,确保在任何时刻只有一个写者或多个读者可以访问资源。
-
使用条件变量:使用条件变量来实现读者写者之间的同步,读者在访问资源时等待写者释放资源,写者在访问资源时等待所有读者释放资源。
-
给予优先级:根据读者和写者的优先级给予不同的访问权限,例如读者优先或写者优先的策略。
总结
进程(Process)和线程(Thread)是操作系统中用于实现并发执行的基本概念,它们都代表着程序的执行单元,但在实现方式和特点上有一些不同。
进程
- 进程是程序在执行过程中的一个实例,是系统资源分配的基本单位。
- 每个进程有独立的内存空间,包括代码段、数据段、堆和栈。
- 进程之间相互独立,通过进程间通信(IPC)来进行数据交换和协作。
- 进程拥有自己的进程控制块(PCB),用于保存进程的状态信息和运行轨迹。
- 进程的创建、销毁和切换开销较大,因为需要保存和恢复整个进程的上下文。
线程
- 线程是进程内的一个执行单元,是CPU调度的基本单位。
- 同一进程内的线程共享相同的内存空间和资源,包括代码段、数据段、堆和栈。
- 线程之间可以直接访问进程内的共享数据,因此需要注意线程安全性和同步问题。
- 线程的创建、销毁和切换开销相对较小,因为线程共享进程的资源和上下文。
- 多线程编程可以提高程序的并发性和性能,但也会增加编程复杂度和引入竞态条件。
一句话
进程是操作系统中资源分配的基本单位,而线程是程序执行的基本单位。