一 进程实体
为什么需要进程
没有配置OS之前,资源属于当前运行的程序
配置OS之后,引入多道程序设计的概念
合理的隔离资源,运行环境,提高资源利用率
进程是系统进行资源分配和调度的基本单位
进程作为程序独立运行的载体,保障程序正常执行。
进程的存在使得操作系统资源的利用率大幅提升。
进程实体
1. 主存中的进程形态
标识符唯一标识一个进程,用于区别其他进程
状态:标记进程的进程状态,如:运行态
程序计数器:指向进程即将被执行的下一条指令的地址
内存指针:程序代码,内存数据相关指针
上下文数据:进程执行的时候,处理器存储的数据
IO状态信息:被进程IO操作所占用的文件列表
记账信息:使用处理器时间,时钟数总和
归属于 进程标识符 处理机状态 进程调度信息 进程控制信息四类
进程控制块(PCB)
用于描述和控制进程运行的通用数据结构
记录进程当前状态和控制进程运行的全部信息
PCB是使得进程能够独立运行的基本单位。
所以,PCB是操作系统进行调度经常会被读取的信息,存储于专门开辟的PCB区域内。
2. 进程与线程
进程是系统进行资源分配和调度的基本单位
线程是操作系统进行运行调度的最小单位
线程包含在进程之中,是进程中实际运行的单位
一个进程可以并发多个线程,每个线程执行不同的任务
线程共享进程的资源
二 五状态模型
就绪状态:
当进程被分配到除CPU以外所有必要的资源后
只要再获得CPU的使用权,就可以立即执行
其他资源都准备好,只差CPU资源的状态为就绪状态
在一个系统中多个处于就绪状态的进程通常排成一个队列
执行状态:
进程获得CPU,其程序正在执行称为执行状态
在单处理机中,某个时刻只能有一个进程处于执行去状态。
阻塞状态:
进程由于某种原因如:其他设备未就绪而无法继续执行,从而放弃CPU的状态称为阻塞状态。
状态切换:
创建状态:
终止状态:
状态转换:
三 进程同步
(一)为什么需要进程同步
1. 生产者-消费者问题
错误的原因在于这两个程序并发的进行
代码理解一下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <vector>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int num = 0;
void *producer(void*) {
int times = 10000000;
while(times --) {
num += 1;
}
//return;
return NULL;
}
void *comsumer(void*) {
int times = 10000000;
while(times --) {
num -= 1;
}
return NULL;
}
int main() {
printf("start in main function.\n");
pthread_t thread1, thread2;
pthread_create(&thread1, NULL, &producer, NULL);
pthread_create(&thread2, NULL, &comsumer, NULL);
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
printf("Print in main function num = %d\n", num);
return 0;
}
2. 哲学家进餐问题
极端情况如右上边所示
筷子为临界资源。
这些情况的根源问题是:彼此相互之间没有通信
如:
1. 如果生产者通知消费者我已经完成一件商品
2. 哲学家向旁边哲学家说我要进餐了
进程间的同步:对竞争资源在多进程之间进行使用次序的协调。使得并发执行的多个进程之间可以有效使用资源和相互合作。
(二)进程同步原则
临界资源:是指一些虽作为共享资源却又无法同时被多个线程共同访问的共享资源。当有进程在使用临界资源时,体啊进程必须依据操作系统中的同步机制等待占用进程释放该共享资源才可重新竞争使用共享资源。
进程间同步的四个原则:
进程间同步方法:
消息队列,共享存储,信号量
(三)线程同步
当多个进程并发使用线程资源时,会发生什么?
所以多线程也需要同步
线程同步方法:
1. 互斥量
2. 读写锁
3. 自旋锁
4. 条件变量
四 Linux的进程管理
(一)Linux进程的相关概念
进程类型:
前台进程:具有终端,可以和用户交互的进程
后台进程:没有占用终端的进程,基本不和用户交互,优先级比前台进程低。将执行的命令以“&”命令结束,
如python3 run.py &
python3 ip.py
None
connect to R1, ip is 10.1.1.1
goto enable mode
python3 ip.py &
[1] 36655
None
connect to R1, ip is 10.1.1.1
goto enable mode
[1] + done python3 ip.py
kill -9 %1 结束后台进程
守护进程:是特殊的后台进程,很多守护进程在系统引导的时候启动,一直运行到系统关闭
Linux中守护进程:crond,httpd,sshd,mysqld。进程名字以d结尾的一般是守护进程
进程标记
进程ID:是进程的唯一标记,每个进程拥有不同的ID,表现为非负整数,最大值由操作系统限定,可以用top命令来查看进程。
操作系统使用fork函数创建进程
父子进程关系可以通过pstree命令查看,感觉仅限linux的系统,起码mac不行
ID为0的进程为idle进程,是系统创建的第一个进程
ID为1的进程是init进程,是0号进程的子进程,完成系统初始化
init进程是所有用户的祖先进程
进程的状态标记:
(二)操作Linux进程的相关命令
ps,top,kill