您的位置:首页 > 其它

进程、虚拟内存概念与扩展

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 的集成示例
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  操作系统 内存 线程