操作系统线程和进程的知识总结
2021/7/15 7:06:06
本文主要是介绍操作系统线程和进程的知识总结,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1.实现多线程
(1)继承Thread,重写run()方法
(2)实现Runnable接口,重写run()方法,然后使用Thread类来包装
(3)实现Callable接口,重写call()方法,然后使用FutureTask包装,然后使用Thread包装
2.线程的状态
创建、就绪、运行、阻塞、死亡。
3.Thread常用方法
currentThread() 当前线程
start():启动一个线程,线程之间是没有顺序的,是按照CPU分配的时间片来回切换的
run():调用线程的run方法,就是普通的方法调用,用于封装线程的代码,具体要启动一个线程来运行线程体中的代码还是通过start方法来实现,调用run()方法就是一种顺序编程不是并发编程
sleep():睡眠指定时间,程序暂停执行,时间到了会继续执行代码,如果时间未到就需要使用interrupt方法来随时唤醒。
interrupt():唤醒正在睡眠的程序。
wait():导致线程进入等待阻塞状态。
notify():该方法只能在同步方法或同步块内部调用,在该对象上调用wait方法的线程,解除其阻塞状态。
notifyAll():唤醒所有的线程。
join():让当前线程加入父线程,加入后父线程会一直wait,直到子线程执行完毕后父线程才能执行。将某个线程加入到当前线程中来,一般在某个线程和当前线程依赖关系比较强,必须先等某个线程执行完毕才能执行当前线程。一般在run()方法内使用。
yield():交出CPU的执行时间,不会释放锁,让线程进入就绪状态,等待重新获取CPU执行时间。
比喻:就像一个好人,CPU轮到她了,他却说我不急,先给其他线程用吧
4.线程组:可以对线程分组,线程组和线程组之间是有父子关系的,自定义线程组的父线程组是main线程组,main线程组的父线程组是system线程组
5.进程与线程:进程是资源分配的基本单位,它是程序执行时的一个实例。程序运行时系统就会创建一个进程,并为他分配资源,然后把进程放入进程就绪队列,进程调度器选中它时会为它分配CPU时间,程序开始真正执行。
线程是一条执行路经,是程序执行的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位,一个进程由多个线程组成,线程之间共享进程的所有资源,每个线程有自己的堆栈和局部变量。线程由CPU独立调度执行。
进程与线程之间的关系:一个程序就是一个进程,而一个程序中的多个任务被称为线程。进程是资源分配的基本单位,也是调度运行的基本单位。一个线程只能属于一个进程,一个进程可以包含多个线程,同时,一个进程至少含有一个线程。资源分配给进程,同一进程的所有线程共享该进程的所有资源。同一进程中的多个进程共享代码段(代码和常量)、数据段(全局变量和静态变量)、扩展段(堆存储)。每个线程拥有自己的栈段,又叫运行时段,用来存放所有局部变量和临时变量,即每个线程都有自己的堆栈和局部变量。
处理器分给线程,真正在处理器上运行的是线程
线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。
6.使用多线程:可以提高程序的效率。注意区别:多线程:是指一个进程中同时有多个执行路径正在执行。
并发:一个时间段中有几个程序处于已启动状态到运行完毕之间,且这几个程序都是在同一个处理机上面,但任意时刻点只有一个程序在处理及上运行。
7.进程通信和线程通信:进程通信:管道pipe通信(父子关系?、半双工)、命名管道FIFO(半双工、不一定是父子)、消息队列MessageQueue、共享存储SharedMemory、信号量、套接字、信号
线程通信:互斥锁、条件变量、读写锁
线程通信:(1)同步:多个线程之间通过synchronized关键字这种方式来实现线程间的通信
(2)while轮询的方式
(3)wait/notify机制
(4)管道通信:使用PipeInputStream和PipeOutputStream进行通信
管道:半双工,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。
命名管道:半双工的通信方式,但是它允许无亲缘关系进程间的通信。
信号:比较复杂,用于通知接收进程某个事件已经发生。
信号量:是一个计数器,可以用来控制多个进程堆共享资源的访问。
消息队列:消息的链表,存放在内核中并由消息队列标识符标识。
共享内存:映射一段能被其他进程所访问的内存。
套接字:可以用于不同设备间的进程通信。
8.进程同步:(1)临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。
优点:保证在某一时刻只有一个线程能访问数据的简便方法
缺点:只能用来同步本进程内的线程,不可以用来同步多个进程中的线程
(2)互斥量:为协调共同对一个共享资源的单独访问而设计的。只有一个,只有拥有互斥对象的线程才具有访问资源的权限。
优点:在同一进程和不同进程之间都可以实现资源的安全共享。
缺点:创建互斥量需要的资源更多,因为是跨进程的。只能指定资源被独占的方式使用
(3)信号量:为控制一个具有有限数量用户资源而设计。允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。
优点:适用于socket程序中线程的同步。
缺点:必须有公共内存,不能用于分布式操作系统。对信号量的操作分散,而且难以控制,读写和维护困难,加重了程序员的编码负担。核心操作P-V分布在各用户的程序代码中,一旦错误,后果严重。
(4)事件:用来通知线程有一些事件已经发生,从而启动后级任务的开始。
优点:时间对象通过通知操作的方式来保持线程的同步,并且可以实现不同进程的线程的同步操作。
9.死锁:在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程占有不会释放的资源而处于的一种永久等待状态。
必要条件:互斥条件、请求与保持条件、非剥夺条件、循环等待条件
避免死锁:破环循环等待条件;破坏请求与保持条件,设置超时时间;设置一个条件遍历与一个锁关联。就是变成状态转变
进程:资源分配和调度的独立单位,进程是可以独立运行的一段程序;线程:CPU分配和调度的基本单位。一个程序至少有一个进程,一个进程至少有一个线程。
10.线程的同步和互斥以及常见应用
互斥:在某一时刻,对临界资源的访问是互斥的;
同步:在互斥的基础上,实现进程之间的有序访问;
应用:多线程编程中,对临界资源的访问。
11.虚拟内存:是计算机内存管理的一种方式。使得应用程序认为它拥有连续可用的内存。但是实际上,它通常是被分割成多个物理内存碎片,还有部分暂时存放在外部磁盘存储器上,在需要时进行数据交换。
12.多进程、多线程、操作系统层面的差别和联系:
进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。进程由程序、数据集合和进程控制块构成。程序是控制进程执行的指令集,数据集合是程序在执行的时候所需要的数据和工作区;程序控制块包含进程的描述信息和控制信息,是进程存在的唯一标识。
线程:在早期的操作系统中是没有线程的概念的,但是随着计算机的发展,对CPU的要求越来越高,进程之间的切换开销太大。于是发明了线程,线程是程序执行中的一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分配的基本单位。一个进程可以一个或者多个线程,各个线程之间共享程序的内存空间。一个线程由线程ID、当前指令指针(PC)、寄存器和堆栈组成。而进程由内存空间、和一个或者多个线程构成。
差别:线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;进程之间相互独立,但同一进程中的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)及一些进程级的资源,某进程内的线程在其他进程不可见;线程上下文切换比进程上下文切换要快的多。
联系:采用时间片轮转进程调度算法,在操作系统的管理下,所有正在运行的进程轮流使用CPU,每个进程允许占用CPU的时间非常短,这样用户是根本感觉不到CPU是轮流服务的,但实际上一个时间点有且仅有一个进程占有CPU。如果计算机有多个CPU就不是这样了,如果进程数小于CPU数,不同的进程可以分配给不同的CPU来运行,这样,多个进程之间是真正同时运行的,即并行。但是如果进程数大于CPU数,则仍然需要使用并发技术。在Windows中,进行CPU分配是以线程为单位的,一个进程可能由多个线程组成。操作系统将CPU的时间片分配给多个线程,每个线程在操作系统指定的时间片内完成。操作系统不断地从一个线程的执行切换到另一个线程的执行,如此往复,宏观上来看,就好像是多个线程在一起执行。由于多个线程分属于不同的进程,就好像是多个进程在同时执行,这样就实现了多任务。所以在多CPU的计算机中,多任务的效率比较高。但是,如果在多CPU计算机中只运行一个进程(线程),就不能发挥多CPU的优势了。
这篇关于操作系统线程和进程的知识总结的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-18git仓库有更新,jenkins 自动触发拉代码怎么配置的?-icode9专业技术文章分享
- 2024-12-18Jenkins webhook 方式怎么配置指定的分支?-icode9专业技术文章分享
- 2024-12-13Linux C++项目实战入门教程
- 2024-12-13Linux C++编程项目实战入门教程
- 2024-12-11Linux部署Scrapy教程:新手入门指南
- 2024-12-11怎么将在本地创建的 Maven 仓库迁移到 Linux 服务器上?-icode9专业技术文章分享
- 2024-12-10Linux常用命令
- 2024-12-06谁看谁服! Linux 创始人对于进程和线程的理解是…
- 2024-12-04操作系统教程:新手入门及初级技巧详解
- 2024-12-04操作系统入门:新手必学指南