进程、虚拟内存概念与扩展
2016-09-27 14:35
190 查看
进程
操作系统进程相关概念
关键名词
process:一个正在执行程序的实例,包括程序计数器、寄存器、变量的当前值。critical region:对共享内存进行访问的程序片段
semaphore:可以同时操作共享内存的数目
mutex:两种状态解锁和枷锁
进程线程区别
进程:每个进程都有一个地址空间(存放可执行的程序、程序的数据、程序堆栈)和一个控制线程。进程 | 线程 |
---|---|
地址空间、全局变量、打开的文件 | 程序计数器 |
子进程 | 寄存器、堆栈 |
账户信息 | 状态 |
进程、线程实现
进程维护一个数据结构:包含进程所必须的先关资源(进程控制块)线程:内核态、用户态、混合使用
进程通信
pipe(一个命令的输出作为另一个命令的输入) :shell bash(>ps -e | grep vmware //显示vmware相关进程)消息传递:kill -signal PID
套接字、共享内存、文件、信号量
进程调度
Cooperative Threads-Scheduling:程序自主控制Preemptive Threads-Scheduling:优先级队列
Java多线程相关概念
基本的线程机制
定义任务:implements Runnable
public class LiftOff implements Runnable { protected int countDown = 10; //Default private static int taskCount = 0; private final int id = taskCount++; public LiftOff(){} public LiftOff(int countDown) { this.countDown = countDown; } public String status() { return "#" + id + "(" + (countDown > 0 ? countDown : "Liftoff!") + ")."; } @Override public void run() { while(countDown-- > 0) { System.out.print(status()); Thread.yield(); } System.out.println(id); } }
Thread类:使用
new Thread(Runnable object).start()执行任务。由线程调度器调度执行。
public final static void main(String[] args) { //new LiftOff().run(); // 通过方法在一个线程内调用 for(int i = 0; i < 5; i++) { new Thread(new LiftOff()).start(); } System.out.println("Waiting for LiftOff."); }
使用Executor执行器
public static final void main(String[] args) { ExecutorService exec = Executors.newCachedThreadPool(); //Executors.newFixedThreadPool(5); //Executors.newSingleThreadExecutor(); for(int i=0; i<5; i++) { exec.execute(new LiftOff()); } exec.shutdown(); System.out.println("Waiting for LiftOff."); }
从任务中产生返回值
implements Callable<T>
休眠:
Thread.sleep(100);TimeUnit.MILLISECONDS.sleep(100);
优先级:
让步:
yield
共享受限资源
不正确访问时导致资源的竞争冲突。解决共享资源竞争:
synchronized、显示灵活的加锁
Lock:new ReentrantLock()对象
原子性与内存可见性
volatitle变量和同步加锁
原子类
AtomicInteger, AtomicLong, AtomicReference
临界区·
synchronized(this)对象同步代码块
在其他对象上加锁
synchronized(object)
线程本地存储
终结任务
统计进入各个门的人数。阻塞的方法
sleep
wait —— notify、notifyAll(signal,signalAll)
等待输入、输出
获取同步控制方法时锁不可用
线程之间的协作
wait,notify,notifyAll
生产者、消费者:BlockingQueue
线程安全性、对象的共享
race condition:由于不恰当的执行时序而出现不正确的结果。例如:check-then-act;延迟初始化
解决:
原子变量类如java.util.concurrent.atomic.AtomicLong
内置锁(复合操作):
synchronized——同步代码块、方法。内置锁的可重入性。
加锁机制既可以确保可见性又能确保原子性;volatile变量只能确保可见性。
//解决并发编程的方案 1、不在线程之间共享该状态变量 2、将状态变量修改为不可变的变量 3、在访问状态变量时使用同步锁
内存
虚拟内存
虚拟内存图解页面置换算法
关于Linux系统的swap交换空间
各种缓存实现实例
缓存更新的套路有关采用Filter实现禁用缓存和使用缓存操作实现与分析
Servlet的Filter实现页面缓存
在Servlet Filter中使用Spring容器
SpringMVC通过Redis实现缓存主页
动手写一个并发缓存框架 历程
java java local cache本地缓存的两种实现,一个基于list轮询一个基于timer定时
Redis 缓存 + Spring 的集成示例
相关文章推荐
- 应用领航:盘点那些年我们一起追过的OS
- 无奇不有!盘点各国自己开发的操作系统
- IE7降低内存和降低CPU的几个技巧
- C#线程间不能调用剪切板的解决方法
- 如何高效的使用内存
- DOS下内存的配置
- XP/win2003下发现1G的内存比512M还慢的解决方法
- 可自定义oem的萝卜家园 Ghost XP 新春装机版 V200801 下载
- PowerShell实现动态获取当前脚本运行时消耗的内存
- C#线程同步的三类情景分析
- C#获取进程或线程相关信息的方法
- 简单对比C#程序中的单线程与多线程设计
- C#停止线程的方法
- C#子线程更新UI控件的方法实例总结
- C#实现把dgv里的数据完整的复制到一张内存表的方法
- C#线程队列用法实例分析
- SQL语句实现查询SQL Server内存使用状况
- C#实现判断操作系统是否为Win8以上版本
- C语言内存对齐实例详解
- C++使用CriticalSection实现线程同步实例