linux基本概念(一)----进程和线程

先给自己打个广告,本人的微信公众号正式上线了,搜索:张笑生的地盘,主要关注嵌入式软件开发,足球等等,希望大家多多关注,有问题可以直接留言给我,一定尽心尽力回答大家的问题
在这里插入图片描述

一 why

今天这篇文章主要以基本概念为主,没有相关的源码,可能看起来比较抽象和枯燥,但是我还是建议大家认真读一读这个文章,在读的过程中多思考文章中提出的相关问题,这个对我们打好基础至关重要,我们不能只停留在编写代码实现功能的层次上,我们也需要对一些底层的逻辑和概念有一个全面正确的认识。

进程和线程的概念非常重要,本篇博客来重点介绍两者的概念。我们在实际开发过车中,经常会听到这两个词,还包括"作业",“你开了几个线程”,“创建了几个进程”,“进程间通信”,“线程间同步”等等,如果我们不了解这些词背后的概念,非常不利于我们阅读代码,也不利于编写更优美的代码的

二 what

1. 程序
在谈进程和线程之前,我们先来看看什么是程序?我们不同语言的软件开发者,每天的工作/学习内容绝大部分,要么是在看源代码然后分析bug,要么是在编写源代码(创造bug,这里开个玩笑,因为编写的代码的过程中很有可能有bug)。

ok,那么这些源代码就是一个个程序,它是一种静态的状态,存在我们的硬盘上,服务器server上,或者云上。

所以结论就是,我们每天编写或者阅读的源代码就是一个个程序,如下就是一段程序
在这里插入图片描述
2. 进程
a. 定义
进程是具有一定独立功能的程序在一个数据集合上的一次动态执行过程它是动态的,包括创建,调度,执行和消亡。希望我们认真思考一下这个定义。
我想大家在阅读“具有一定独立功能的程序在一个数据集合上”这一句话的时候,应该会一脸茫然,这句话看着每个词都很简单,但是组合在一起表达什么意思时,就不清楚了。我们知道一个基本公式,就是程序 = 算法 + 数据结构,所以一个程序一定是对某些数据进行处理,这些数据是一个广义意义上的概念,并不单单指1,2,3…等等这样的数据。因此白话来说,程序开始运行,对数据进行分析处理的过程就是一个进程
b. 进程和程序的联系

1. 程序是产生进程的基础
2. 程序的每次执行构成不同的进程
3. 进程是程序功能的体现
4. 通过多次执行,一个程序可对应多个进程;通过调用的关系,一个进程可包括多个程序

c. 进程和程序的区别

1. 进程是动态的,程序是静态的:程序是有序代码的集合,进程是程序的执行,进程有和心态/用户态
2. 进程是暂时的,而程序是永久的,进程是一个状态变化的过程,程序可长久保存
3. 进程和程序的组成不同,进程的组成包括程序,数据和进程控制块

比喻理解进程和程序的区别

1. 有一位计算机科学家,他要给女儿做一个生日蛋糕,于是他去找了一本菜谱,跟着菜谱学做蛋糕
 菜谱 = 程序  厨师 = CPU
 原料 = 数据(不包含在程序里面); 做菜的过程 = 进程
2. 正在做蛋糕的时候,突然他的小儿子跑来,说他的手被扎破了,于是科学家又去找一本医疗手册书籍,给小儿子处理伤口,处理完之后再回来继续做蛋糕
医疗手册书籍 = 新程序 给小儿子处理伤口 = 新进程,从前进程切换到新进程,进程切换
处理完之后再回来继续做蛋糕 = 进程恢复

在这里插入图片描述
d. 进程的组成

1)代码段
(2)用户数据段
(3)系统数据段
	包括进程控制块,CPU寄存器值,堆栈,这样来看,linux中进程的概念和ucos任务的概念相类似,ucos中的任务也包括任务控制块,CPU寄存器值以及堆栈
	进程标识信息:
		(1) 进程控制块(pcb, process control block),可以完全参照ucos的tcb来理解
		它是操作系统管理控制进程运行所用的信息集合,PCB是进程存在的唯一标识
			a. 进程标识 PID
			b. 进程用户,标识进程是由哪个用户创建的
			c. 进程状态,优先级
			d. 文件描述符表
	处理机状态信息保存区
		(1) CPU寄存器值,PC寄存器,SP寄存器等等
		(2) 堆栈
	进程控制信息
		调度和状态信息
		进程间通信信息
		存储管理信息
		进程所用资源

e. 进程类型

(1) 交互进程 在shell下启动,在前台运行,也可以在后台运行
(2) 批处理进程 和在终端无关,被提交到一个作业队列中以便顺序执行
(3) 守护进程 和终端无关,一直在后台运行

f. 进程的状态

进程的生命周期
	进程创建
		引起进程创建的3个主要事件
			系统初始化时,即是INIT进程
			用户请求创建一个新进程
			正在运行的进程执行了创建进程的系统调用
	进程运行
	进程等待
	进程唤醒
	进程结束
运行态 进程正在运行,或者准备运行
等待态 进程在登台某个事件的发生
停止态 进程被终止,收到信号后可继续运行
死亡态 已经终止的进程,但pcb没有被释放

3. 线程
自从60年代最开始提出进程的概念概念,在操作系统中一直都是以进程作为独立运行的基本单位,到了80年代,人们提出了更小的能独立运行的基本单位 ---- 线程
那么问题是:为什么需要线程?请思考下面一个生活中的例子
a. 举例
从例子引入线程的概念,编写一个MP3播放软件
实现方案1:这个应该是很多人第一时间第一反应想到的方案

main()
{
	while(1)
	{
		read();           // IO 速度
		decompress();     // CPU
		play();
	}
}

这个方案从功能角度来看,确实可以实现目的,但是这个方案有什么不足呢?由于read,decompress,play是顺序执行的,而每个执行的效率和时间由每个函数的内部实现决定,如果read函数因为种种原因,比如IO速度较慢,这样play函数就不能及时运行,表现就是某段时间没有任何音频输出,造成播放不连续。

实现方案2:这是一种多进程实现方案,如果我们没有线程的概念,为了解决方案1的缺点,我们会设计多个进程,每个进程完成一个动作

//read				   //decompress             //play
main()                 main()                   main()
{                      {                        {
	while(1)           		while(1)                 while(1)
	{                       {                        {
		read();					decompress();            play();
	}						}                        }
}						}						}

这种方案确实是一种可行方案,解决了方案1中的效率问题。但是这个方案的缺点是什么呢,我们知道进程的创建需要很多开销,比如内存。不同进程之间的内存空间是相互独立的,不能互相访问,这样上面的三个进程之间的数据共享也是一个问题,需要实现进程间通信
实现方案3:我们需要一种新的实体,这个实体需要满足如下特点

实体之间可以并发地执行
实体之间共享相同的地址空间
main()
{
		read();           // IO 速度
		decompress();     // CPU
		play();
}
read()
{
	while(1)
	{
	}
}
decompress()
{
	while(1)
	{
	}
}
play()
{
	while(1)
	{
	}
}

b. 定义

线程是进程当中的一条执行流程,它是进程的一部分

c. 线程的优点和缺点

优点
	一个进程中可以同时存在多个线程
	各个线程之间可并发执行
	各个线程之间可以共享地址空间和文件等资源
缺点
	一个线程崩溃,会导致其所属进程的所有线程崩溃

在这里插入图片描述

既然程有上面的缺点,那么何时使用多线程?何时使用多进程

主要是从性能和安全性来考虑,如果考虑性能的瓶颈的话,使用线程,如果从安全性考虑的话,使用进程
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章