操作系统03 进程与线程

来源:互联网 发布:五毛特效是什么软件 编辑:程序博客网 时间:2024/06/07 10:03

整型信号量
s 大于0 可用小于0不可用
p操作 wait原语句
v操作 signal
忙等待
保持关门状态 -1
优点:实现简单
原子操作 不允许中断

boot 引导
进程控制块pcb 数据结构 结构体
保存状态 是为了恢复状态
切换回来之后 进程的感觉是没有任何变化 还是占据cpu

这些构成队列
再进程调度的时候涉及队列
就绪队列
设备队列 每一个设备每一个io都有一个队列
进程在不同的队列中迁移
链表实现 因为不停的增删
实际情况 数组是核心

局部性原理
数组好 将局部相关的 放到更快的存储空间访问 提速
时间和空间的浪费由于硬件的提升已经不是问题

一个进程失去CPU的两种情况:
切换到就绪 或者 切换到阻塞
操作系统通过中断不让程序继续运行
最重要的是时钟中断

有意思:程序控制着CPU运行 那操作系统怎样不让程序继续运行?

一旦触发中断程序 那么就是操作系统控制CPU
还有就是程序自己进入等待态 那么一定是进行了系统调用一旦系统调用 那么一定就进入了操作系统内核 操作系统获得控制

开销浪费
调度算法 涉及效率
保存和恢复 基本没有什么可优化的

软件做不了的 硬件做的了

用很多的寄存器 不计成本的实现状态的保存切换
只要在不同的寄存器切换

shell 资源管理器 去启动进程
形成树
父进程和子进程

pstree 可以看到进程树

子进程复制父进程
子进程啥也没有 需要加载一个程序

fork创建子进程

Fork() 进程id不一样其他都是一样的且同时进行
复制一份什么都一样 下一步执行生么看寄存器所以下一步执行都是一样的
fork的返回值
如果返回值是0你接收到的是子进程
是1就是父进程
一个程序 一变2

top 监视所有进程的状态 每隔1秒刷新

msdn API Google搜索

man API Linux 看一个系统调用的用法
which 命令 查找命令在哪
mv 改变一个文件的名字

进程结束: 为什么return 0

没有区别
0 表示一切正常 其他表示有错误
返回值父进程会得到子进程的返回值
做后续工作

父进程给子进程收尸
僵尸进程

init 最根的进程

进程的他杀 kill
kill 进程
父进程杀子进程

进程之间的协作: 独立 协作
信息共享 速度提升 模块化 方便

协作方式 :消息传递 共享内存
同步非问题 不要向同一个地方写数据
容错的问题 写进去一个数 会变

消息传递 阻塞 非阻塞
当你请求一个消息但是并没有得到 那你就被阻塞
非阻塞 请求不能让满足 但是你还可以做后续

消息缓冲区
并发软件
多进程编程 多线程编程

sleep 等待状态
子进程的value不再是父进程的value
独立性 不同的内存
虚拟地址 不是物理地址
打印的每一个变量的地址 是在当前进程内存空间的偏移地址

父进程在前还是子进程在前 是近乎随机的
复制的是当前的父进程的状态

#include <stdio.h>#include <unistd.h>int main() {    int i;    for(i=0;i<3;i++)        fork();    sleep(30);}

线程:

进程特点是分离
线程特点是不分离

线程比进程要简单 独立寄存器和栈
代码和数据 所以属于同一个进程的线程共享
单线程进程 任意时刻只能执行一条指令
多线程进程的划分 每一个线程占用一个pc
让一个线程里有多条路线 同时发挥作用

尽量的共享
优点:快速的相应能力
窗口画出来 相应这个消息
相应度不好
如果有一个动作是耗时的
立马新建一个线程去做费时的工作 当前线程跟用户交互

资源共享 经济实惠
创建销毁 切换进程开销大于线程

用户级线程 虚拟出来的线程 效率高 都在用户空间 不涉及操作系统 可定制性好 一个线程阻塞全部线程阻塞 操作系统是以操作系统能看得到的线程单位阻塞的 致命的问题
不能在多个处理器上分配

内核级线程
线程池 先创建好
Linux将进程线程 都叫做task
clone() 没有线程的优化 对于操作系统都是进程
本身还是个进程 轻量级的进程

Apache IIS web服务器
Apache 是多进程的模式
IIS 是多线程的实现
线程的会高效一点 本身的特性决定的
进程更稳当 线程更不稳定

线程模型不稳定 一个线程崩溃全部线程崩溃
线程更安全 因为相互独立
浏览器内核
Firefox IE 线程 稳定性差
Chrome 任何一个标签 一个窗口都是一个进程
sandbox 壳