操作系统学习(二)-- 操作系统之进程与线程
2017-07-04 00:22
253 查看
操作系统之进程与线程
L8 CPU管理的直观观点
管理CPPU,设定PC初值,然后按顺序从内存中取值执行fprintfIO指令,执行时间比没有IO指令的慢很多,执行IO的时候CPU等着,利用率比较低。
一个CPU上交替的执行多个程序:并发,PC的切换!
每一个程序有一个存放信息的结构体:PCB,切换PC时的信息(位置,变量信息等)。
![](http://i.imgur.com/KODIyqp.png)
进程概念--运行中的程序 和静态程序不同。
进程有开始和结束,会走走停停,需要记录变量等,程序都没有这些特点。
L9 多进程图像
pid进程号,多进程图像![](http://i.imgur.com/mUS9cqQ.png)
多进程图像从启动开始到关机结束都存在。
![](http://i.imgur.com/T9QfUkU.png)
1.多进程如何组织? ----PCB+状态+队列
Process Control Block(PCB):用来记录进程信息的数据结构
就绪队列,等待队列...
进程状态图
![](http://i.imgur.com/9N4IccA.png)
2.多进程如何交替?
schedule中
getNext()选择就绪队列中的PCB,就是任务调度,后续学习。
进程调度:FIFO(没有考虑进程执行的任务区别),Priority(进程优先级怎么设定,有些进程饥饿)
![](http://i.imgur.com/UinHjCx.png)
交替的三个部分:队列操作,+调度+切换
![](http://i.imgur.com/VqeqISh.png)
多进程如何影响?
多个进程同时在内存中,会有相互影响,进程一可能访问进程二的内存,这样可能改变了数据
多进程地址分离:映射表(每个进程有自己的映射表)
![](http://i.imgur.com/IyBveFV.png)
多进程如何合作?
共享数据,有可能访问冲突。
实际:生产者-消费者实例
有问题出现,进程同步(合理的推进顺序)
上锁实现
总结
![](http://i.imgur.com/cTHidxc.png)
L10 用户级线程
指令切换,但是映射表不切换(内存)交替执行才是并发
![](http://i.imgur.com/uwp2t7N.png)
实现线程的切换
![](http://i.imgur.com/ENjAumz.png)
核心是
yeild函数
![](http://i.imgur.com/ian1L8r.png)
TCB线程控制块和栈相互配合
![](http://i.imgur.com/taMMvj1.png)
两个线程一个栈,就会乱
线程切换,首先将栈切换回去
TCB全局的数据结构
esp实际就是寄存器,TCB的元素
![](http://i.imgur.com/QjOSnSw.png)
两个TCB,两个栈,切换的PC在栈中
![](http://i.imgur.com/diYgB9H.png)
用户级线程也可以实现线程的切换,都用用户控制
核心级线程
当核心级线程切换时,用户级线程内核不可见,看不到用户级线程,所以用户级线程都不会执行
![](http://i.imgur.com/xNyKAlE.png)
核心级线程并发性更好
![](http://i.imgur.com/7CYy03T.png)
L11 内核级线程
Kernel Threads切换指令流+切换资源(映射表)--->切换进程;进程都在内核进行
MMC实际就是内存映射表,多核公有MMC;实际就是多线程
多核处理需要核心级线程才能发挥价值
每个线程分配一个CPU核
区别并发(两个程序交替执行)和并行(多线程在多核上同时处理)
![](http://i.imgur.com/nzwYl4B.png)
两套栈是核心级线程的关键(内核栈和用户栈)
只有中断(调用硬件)才能进入内核栈
一套栈的样子!
![](http://i.imgur.com/rG9QfEJ.png)
内核线程switch_to的五段论
![](http://i.imgur.com/4J7avrp.png)
L12 核心级线程实现实例
核心级线程的两套栈,核心是内核栈![](http://i.imgur.com/X88RORD.png)
不仅栈要切换,PC也要切换
内核线程switch_to的五段论
![](http://i.imgur.com/4J7avrp.png)
切换五段论也就核心的几句话
INT,
sys_fork->schedule->switch_to,
ret_from_sys_call
TSS ? 初始化
![](http://i.imgur.com/y5jGVAB.png)
copy_process的细节,get_free_page的到空闲页内存,mem_map每页的大小4k,malloc是用户态内存申请
创建的进程,在内核栈中分开的,在用户栈中共用栈
![](http://i.imgur.com/767kYF0.png)
eax=0进行子进程,
exa!=0进行父进程
![](http://i.imgur.com/rJghClD.png)
L13 操作系统的结构
Linux Kernel Source Tree
研究和实践复杂系统的能力
CPU取址执行
用户态和内核态的切换
fork()就是系统调用,
int 0x80
先创建两个子进程,形成就绪队列;然后父进程阻塞,调用
schdule,运行子进程,完成后调度
schedule -- swtich to next下一个就绪队列的子进程。切换就是改变PC地址,时钟中断进行A,B切换
![](http://i.imgur.com/fWN7D4V.png)
相关文章推荐
- 现代操作系统学习之进程与线程
- 操作系统学习笔记----进程/线程模型
- 操作系统学习笔记——进程与线程联系与区别
- 操作系统基础学习之进程线程
- 操作系统学习:进程与线程
- 操作系统学习基础-进程和线程
- 操作系统学习笔记----进程/线程模型
- 现代操作系统学习(2)———进程与线程
- 操作系统学习——进程中的线程
- 【学习笔记】【深入解析Windows操作系统(第四版)】【进程、线程】
- 操作系统学习:线程 与 进程
- 操作系统笔记(二)---进程、线程
- Linux进程线程学习笔记:进程间通信 之 管道
- 操作系统之进程和线程--uC/os-II实例--建立任务
- 操作系统笔记(二)---进程、线程
- Linux进程线程学习笔记:进程创建
- 学习进程和线程时的一点基础笔记(一)---------基础片
- Linux进程线程学习笔记
- Linux进程线程学习笔记:进程控制
- 学习:进程与线程