当前位置:网站首页>进程和线程
进程和线程
2022-07-06 05:37:00 【嵌入式悦翔园】
进程和线程
1、进程
进程是操作系统提供的最古老的也是最重要的抽象概念之一,即使可以使用的CPU只有一个,但是由于它具有(伪并发)操作的能力,它可以将一个CPU模拟出多个虚拟的CPU。
1.1 什么是进程
进程是操作系统资源分配的最小单元。一个进程拥有的资源有自己的堆、栈、虚存空间、文件描述符等信息。 从编程的角度来理解进程,可以把它看作是⼀个类或一个 PCB进程控制块的结构体。
进程是操作系统对一个正在运行的程序的一种抽象,可以把进程看作程序运行的一次运行过程。
表层概念:程序一个执行实例,正在执行的程序
内核观点:担当分配系统资源(CPU,内存)的实体
在任何多道程序设计中,CPU总是由一个进程快速的切换到另一个进程,使得每个进程都能运行几十或几百毫秒,这样就会给我们多个程序同时运行的错觉,但是严格来说在某个瞬间,CPU只能处理一个进程,但在一段时间(1s)内CPU可能处理了多个程序,这样就形成了并行的错觉。
1.2 进程模型
在进程模型中,计算机上所有的可运行软件,被组织成若干顺序进程,简称进程。一个进程就是一个正在执行程序的实例,从概念上来讲,每个进程都有他自己的虚拟CPU。
举个例子:
比如我们有一个四道的程序,即这四个都拥有自己的控制流程,并且每个程序都可以独立的运行。
由于CPU是在多个进程之间来回切换的,所以每个进程的运算速度是不确定的,所以当一个进程需要严格的实时要求时,也就是某一个特定程序必须要在指定的某段时间内运行,那么必须采取特殊的方式以保证它能够在则短时间内发生。
一个进程就类似于某种类型的活动,他有程序、输入、输出以及状态。单个处理器可以被若干进程共享,它使用某种调度算法决定何时停下一个进程,转而去为另一个进程服务。
1.3 为什么要有进程
1.4 进程的创建
操作系统需要有一种方式去创建进程。一般操作系统的创建主要由以下四种方式触发:
- 系统的初始化
- 正在进行的程序执行了创建进程的系统调用
- 用户创建了一个新的进程
- 一个批处理作业的初始化
系统在初始化的过程中一般会创建若干进程,在Linux中我们可以通过ps
指令查看增在运行的进程。
除了在系统启动过程中打开的进程,一个正在运行的进程经常发出很多的系统调用,以配合自己工作,在所从事的工作可以很容易的被划分为若干相关但没有相互作用的进程时,创建新的教程就会显得特别有效果。
当我们在使用Windows时双击某个应用图标启动某个软件时就会创建一个进程,用户可以打开多个窗口,每个窗口都是一个进程。
除了上面的三种启动进程的方式外,进程还可以在系统中提交批处理作业,在系统认为可以是一个运行的用户进程,他创建了一个新的进程,并运行其输入的队列中的下一个作业。
1.5 进程的退出
进程在创建后,他就开始运行,完成其工作。但进程不是永恒的,进程迟早会结束掉,通常进程的结束由以下事件引起:
- 正常退出(自愿的)
- 出错退出(自愿的)
- 严重错误(非自愿)
- 被其他进程杀死(非自愿)
大多数进程都是由于完成自己的工作而被终止,进程终止的第二个原因是进程发生了严重的错误,例如用户输入以下命令:
cc foo.c
如果我们想要编译foo.c,但是该文件不存在,于是编译器就会自行退出。
第三个原因是由于进程引起的错误,通常是由于程序中的错误所导致,在执行到程序错误时,进程会收到信号,从而终止进程,而不是在这类错误出现时终止。
第四种终止进程的原因,一般在UNIX和Windows中都不会使用。
1.6 进程的状态
运行: 在工作中,执行程序
阻塞: 因某个事件,比如中断事件,此时该进程就会停下来,不会继续向下执行代码。例如,程序中的一段代码要求用户输入一个字母,那么当进程执行到此处时,就会停下来等待用户输入字母(陷入阻塞),直到用户在键盘上敲击了一个字母,此时操作系统才会让进程继续向下执行。阻塞时,该进程会让出CPU,因为谁也不知道,你会多久输入字母,如果你一小时之后再输入字母,难道要让其他的进程等小时吗?所以操作系统不会浪费这段时间,因此会将CPU让给其他进程,让他们先执行。
就绪: 此时进程已经进入到了就绪队列中,除了CPU之外,其他所需的所有资源已经全部得到。也是就是说,只需要得到CPU,那么就可以开始运行。
进程创建后并且拿到除CPU之外的所有资源就会进入就绪队列,此时就处于就绪态。当它经过操作系统的调度拿到CPU后,就处于运行态。若是在时间片之内执行完程序,那么该进程就会被直接撤销;若是在时间片之内没有执行完程序,那么等到时间片结束就会直接进入就绪队列,等待下次获得CPU,继续执行;若是在运行期间有中断事件到来,比如说IO事件,那么该进程就会陷入阻塞,让出CPU,直到IO事件结束,该进程才会重新进入就绪队列,等待CPU的到来。
Linux下的进程状态:
(1)运行态 R: 就绪/运行,运行状态的进程才能被操作系统调度CPU运行
(2)可中断休眠态 S: 当前的阻塞能够被中断唤醒
(3)不可中断休眠态 D: 当前的阻塞不会被中断唤醒
(4)停止态 T: 停止运行什么都不干
(5)僵死态 Z: 进程已经退出,但是资源没有完全被释放
(休眠状态于停止的区别在于:休眠状态是有工作的,他的工作就是休眠,而停止是没有工作的,什么也没干)
1.7 在Linux下与进程有关的命令
ps -ef——查看进程信息
ps -aux——查看进程信息,但是信息比上面的信息更加详细
kill 进程号——杀死进程
kill -9 进程号——强制杀死进程
2、线程
线程概念:线程进程的一个实体,是CPU调度和分派的基本单位,他是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源。
2.1 线程的状态
线程有5种不同状态,分别是:新建(New)、就绪(Runable)、运行(Running)、阻塞(Blocked)和死亡(Dead)。它们之间的转换图如下:
新建状态(New):新创建了一个线程对象。
就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。
运行状态(Running):就绪状态的线程获取了CPU使用权,执行程序代码。
阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
1、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。(wait会释放持有的锁)
2、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
3、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求。
死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。
2.2 为什么要用线程池?
1、提高程序的执行效率:
如果程序中有大量短时间任务的线程任务,由于创建和销毁线程需要和底层操作系统交互,大量时间都耗费在创建和销毁线程上,因而比较浪费时间,系统效率很低;线程池里的每一个线程任务结束后,并不会死亡,而是再次回到线程池中成为空闲状态,等待下一个对象来使用,因而借助线程池可以提高程序的执行效率。
2、 控制线程的数量,防止程序崩溃:
如果不加限制地创建和启动线程很容易造成程序崩溃,比如高并发1000W个线程,就需要有保存1000W个线程的空间,这样极易出现内存溢出;线程池中线程数量是一定的,可以有效避免出现内存溢出。
2.3 多线程的创建
第一种方式:
- 创建一个
Thread
类的子类 - 在Thread类的子类中重写
Thread
类中的run
方法,设置线程任务(开启线程任务要做什么?) - 创建
Thread
类的子类对象 - 调用
Thread
类中的方法start
方法,开启新的线程,执行run
方法
void start()
使该线程开始执行;Java虚拟机调用该线程的run方法。结果两个线程并发地运行,当前线程(main线程)和另一个线程(创建的新线程,执行其run方法)。java程序属于抢占式调度,那个线程的优先级高,那个线程优先执行,同一个优先级,随机选择一个执行。
边栏推荐
- Vulhub vulnerability recurrence 72_ uWSGI
- Jvxetable implant j-popup with slot
- [cloud native] 3.1 kubernetes platform installation kubespher
- B站刘二大人-反向传播
- Codeless June event 2022 codeless Explorer conference will be held soon; AI enhanced codeless tool launched
- Notes, continuation, escape and other symbols
- Graduation design game mall
- 【华为机试真题详解】统计射击比赛成绩
- 什么是独立IP,独立IP主机怎么样?
- Using stopwatch to count code time
猜你喜欢
Codeforces Round #804 (Div. 2) Editorial(A-B)
The ECU of 21 Audi q5l 45tfsi brushes is upgraded to master special adjustment, and the horsepower is safely and stably increased to 305 horsepower
Questions d'examen écrit classiques du pointeur
02. 开发博客项目之数据存储
SequoiaDB湖仓一体分布式数据库2022.6月刊
ArcGIS应用基础4 专题图的制作
How can large websites choose better virtual machine service providers?
【经验】win11上安装visio
[force buckle]43 String multiplication
(column 22) typical column questions of C language: delete the specified letters in the string.
随机推荐
03. Login of development blog project
Cuda11.1 online installation
Promotion hung up! The leader said it wasn't my poor skills
Redis消息队列
Vulhub vulnerability recurrence 67_ Supervisor
[untitled]
Qt TCP 分包粘包的解决方法
Check the useful photo lossless magnification software on Apple computer
嵌入式面试题(四、常见算法)
应用安全系列之三十七:日志注入
Pytorch代码注意的细节,容易敲错的地方
Fluent implements a loadingbutton with loading animation
C Advanced - data storage (Part 1)
[detailed explanation of Huawei machine test] statistics of shooting competition results
[QNX hypervisor 2.2 user manual]6.3.3 using shared memory (shmem) virtual devices
MySQL advanced learning summary 9: create index, delete index, descending index, and hide index
【LeetCode】18、四数之和
注释、接续、转义等符号
What is independent IP and how about independent IP host?
Game push image / table /cv/nlp, multi-threaded start