芯片组对于服务器而言的重要性是什么?
如果说中央处理器(CPU)是整个电脑系统的大脑,那么芯片组将是整个身体的心脏。在电脑界称设计芯片组的厂家为Core Logic,Core的中文意义是核心或中心,光从字面的意义就足以看出其重要性。对于主板而言,芯片组几乎决定了这块主板的功能,进而影响到整个电脑系统性能的发挥,芯片组是主板的灵魂。芯片组性能的优劣,决定了主板性能的好坏与级别的高低。这是因为目前CPU的型号与种类繁多、功能特点不一,如果芯片组不能与CPU良好地协同工作,将严重地影响计算机的整体性能甚至不能正常工作。主板芯片组几乎决定着主板的全部功能,其中CPU的类型、主板的系统总线频率,内存类型、容量和性能,显卡插槽规格是由芯片组中的北桥芯片决定的;而扩展槽的种类与数量、扩展接口的类型和数量(如USB20/11,IEEE1394,串口,并口,笔记本的VGA输出接口)等,是由芯片组的南桥决定的。还有些芯片组由于纳入了3D加速显示(集成显示芯片)、AC’97声音解码等功能,还决定着计算机系统的显示性能和音频播放性能等。
Intel VT-x开启对电脑系统没有影响,对运行虚拟机有帮助。
VT-x是intel运用Virtualization虚拟化技术中的一个指令集,是CPU的硬件虚拟化技术,VT可以同时提升虚拟化效率和虚拟机的安全性,在x86平台上的VT技术,一般称之为VT-x,而在Itanium平台上的VT技术,被称之为VT-i。
为解决纯软件虚拟化解决方案在可靠性、安全性和性能上的不足,Intel在它的硬件产品上引入了Intel VT(Virtualization Technology,虚拟化技术)。2005年8月,Intel首次公布了针对硬件辅助虚拟化的Vanderpool(Intel VT虚拟化技术的前身)技术细节。Vanderpool技术通过增加新的指令,使得Intel处理器支持硬件虚拟化。2005年11月,Intel宣布,虚拟化技术Vanderpool改成VT,被Acer和联想应用在其基于Intel Pentium 4的PC上。
Intel VT可以让一个CPU工作起来像多个CPU在并行运行,从而使得在一部电脑内同时运行多个操作系统成为可能。这种VT技术并不是一个新鲜事物,市面上已经有一些软件可以达到虚拟多系统的目的,比如VMware workstation、Virtual PC等,使用这种技术就可以单CPU模拟多CPU并行,可以实现单机同时运行多操作系统。
扩展资料:
Intel VT-d,VT-d进行的改动还有很多,如硬件缓冲、地址翻译等,通过这些种种措施,VT-d实现了北桥芯片级别的I/O设备虚拟化。VT-d最终体现到虚拟化模型上的就是新增加了两种设备虚拟化方式:
直接I/O设备分配, 虚拟机直接分配物理I/O设备给虚拟机,这个模型下,虚拟机内部的驱动程序直接和硬件设备直接通信,只需要经过少量,或者不经过VMM的管理。为了系统的健壮性,需要硬件的虚拟化支持,以隔离和保护硬件资源只给指定的虚拟机使用,硬件同时还需要具备多个I/O容器分区来同时为多个虚拟机服务,这个模型几乎完全消除了在VMM中运行驱动程序的需求。例如CPU,虽然CPU不算是通常意义的I/O设备——不过它确实就是通过这种方式分配给虚拟机,当然CPU的资源还处在VMM的管理之下。
运用VT-d技术,虚拟机得以使用直接I/O设备分配方式或者I/O设备共享方式来代替传统的设备模拟/额外设备接口方式,从而大大提升了虚拟化的I/O性能。
VT-d技术:
我们知道对于服务器而言,很重要的一个组成部分就I/O,CPU的计算能力提升虽然可以更快地处理数据,但是前提是数据能够顺畅的到达CPU,因此,无论是存储,还是网络,以及图形卡、内存等,I/O能力都是企业级架构的一个重要部分。为此,人们不但在传输带宽上投资(比如从百兆以太网到千兆以太网再到万兆以太网),还在各种系统和架构上进行了大量的投入(比如吞吐量更高的RAID系列、多层数据中心)
I/O虚拟化的关键在于解决I/O设备与虚拟机数据交换的问题,而这部分主要相关的是DMA直接内存存取,以及IRQ中断请求,只要解决好这两个方面的隔离、保护以及性能问题,就是成功的I/O虚拟化。和处理器上的Intel VT-i和VT-x一样,Intel VT-d技术是一种基于North Bridge北桥芯片的硬件辅助虚拟化技术,通过在北桥中内置提供DMA虚拟化和IRQ虚拟化硬件,实现了新型的I/O虚拟化方式,Intel VT-d能够在虚拟环境中大大地提升 I/O 的可靠性、灵活性与性能。
参考资料:
用tcp无法达到广播模式效果,这个我已经尝试过很多次,A客户端的信息可以传到B,但B传不到A。而且无法像聊天室那样两个客户端同时交互。
以下是我用tcp做得聊天程序,用tcp大概只能到这效果了。
import javaawt;
import javaawtevent;
import javaapplet;
import javanet;
import javaio;
import javautil;
public class ChatClient extends Applet {
TextField tfName = new TextField(15); //姓名输入文本域
Button btConnect = new Button("连接"); //连接按钮
Button btDisconnect = new Button("断开连接");
TextArea tfChat = new TextArea(8,27); //显示聊天信息文本框
Button btSend = new Button("发送");
TextField tfMessage = new TextField(30); //聊天输入
javaawtList list1 = new javaawtList(9); //显示在线用户信息
Socket socket=null; //连接端口
PrintStream ps=null; //输出流
Listen listen=null; //监听线程
public void init() { //Applet初始化
tfChatsetEditable(false); //设置信息显示框为不可编辑
Panel panel1 = new Panel(); //实例化面板
Panel panel2 = new Panel();
Panel panel3 = new Panel();
tfChatsetBackground(Colorwhite); //设置组件背景颜色
panel1setBackground(Colororange);
panel2setBackground(Colorpink);
panel3setBackground(Colororange);
panel1add(new Label("姓名:")); //增加组件到面板上
panel1add(tfName);
panel1add(btConnect);
panel1add(btDisconnect);
panel2add(tfChat);
panel2add(list1);
panel3add(new Label("聊天信息"));
panel3add(tfMessage);
panel3add(btSend);
setLayout(new BorderLayout()); //设置Applet布局管理器
add(panel1, BorderLayoutNORTH); //增加面板到Applet上
add(panel2, BorderLayoutCENTER);
add(panel3, BorderLayoutSOUTH);
}
public boolean action(Event evt,Object obj){ //事件处理
try{
if(evttarget==btConnect){ //点击连接按钮
if (socket==null){
socket=new Socket(InetAddressgetLocalHost(),5656); //实例化一个套接字
ps=new PrintStream(socketgetOutputStream()); //获取输出流
StringBuffer info=new StringBuffer("INFO: ");
String userinfo=tfNamegetText()+":"+InetAddressgetLocalHost()toString();
psprintln(infoappend(userinfo)); //输出信息
psflush();
listen=new Listen(this,tfNamegetText(),socket); //实例化监听线程
listenstart(); //启动线程
}
}
else if(evttarget==btDisconnect){ //点击断开连接按钮
disconnect(); //调用断开连接方法
}
else if(evttarget==btSend){ //点击发送按钮
if(socket!=null){
StringBuffer msg=new StringBuffer("MSG: ");
String msgtxt=new String(tfMessagegetText());
psprintln(msgappend(tfMessagegetText())); //发送信息
psflush();
}
}
}
catch (Exception ex){
exprintStackTrace(); //输出错误信息
}
return true;
}
public void disconnect() { //断开连接方法
if(socket!=null){
psprintln("QUIT"); //发送信息
psflush();
}
}
class Listen extends Thread{ //监听服务器传送的信息
String name=null; //用户名
BufferedReader reader ; //输入流
PrintStream ps=null; //输出流
Socket socket=null; //本地套接字
ChatClient client=null; //客户端ChatClient实例
public Listen(ChatClient p,String n,Socket s) {
client=p;
name=n;
socket=s;
try{
reader = new BufferedReader(new InputStreamReader(sgetInputStream())); //获取输入流
ps=new PrintStream(sgetOutputStream()); //获取输出流
}
catch(IOException ex){
clientdisconnect(); //出错则断开连接
exprintStackTrace(); //输出错误信息
}
}
public void run(){
String msg=null;
while(socket!=null){
try{
msg=readerreadLine(); //读取服务器端传来信息
}
catch(IOException ex){
clientdisconnect(); //出错则断开连接
exprintStackTrace(); //输出错误信息
}
if (msg==null) { //从服务器传来的信息为空则断开此次连接
clientlisten=null;
clientsocket=null;
clientlist1removeAll();
return;
}
StringTokenizer st=new StringTokenizer(msg,":"); //分解字符串
String keyword=stnextToken();
if(keywordequals("newUser")) { //新用户连接信息
clientlist1removeAll(); //移除原有用户名
while(sthasMoreTokens()) { //取得目前所有聊天室用户名
String str=stnextToken();
clientlist1add(str); //增加到用户列表中
}
}
else if(keywordequals("MSG")) { //聊天信息
String usr=stnextToken();
clienttfChatappend(usr); //增加聊天信息到信息显示框
clienttfChatappend(stnextToken("\0"));
clienttfChatappend("\n");
}
else if(keywordequals("QUIT")) { //断天连接信息
Systemoutprintln("Quit");
try{
clientlisten=null;
clientsocketclose(); //关闭端口
clientsocket=null;
}
catch(IOException e){}
clientlist1removeAll(); //移除用户列表
return;
}
}
}
}
}
import javanet;
import javaio;
import javautil;
public class ChatServer {
static int port=5656; //端口号
static Vector clients=new Vector(10); //存储连接客户信息
static ServerSocket server=null; //建立服务器socket
static Socket socket=null; //套接字连接
public ChatServer() {
try {
Systemerrprintln("Server start");
server=new ServerSocket(port); //初始化服务器套接字
while(true){
socket=serveraccept(); //等待连接
Systemerrprintln(socketgetInetAddress()+"连接\n"); //得到客户机地址
Client client=new Client(socket); //实例化一个客户线程
clientsaddElement(client); //增加客户线程到向量中
clientstart(); //启动线程
notifyChatRoom(); //监视聊天室连接变化
}
}
catch(Exception ex) {
exprintStackTrace(); //输出出错信息
}
}
public static void notifyChatRoom() {
StringBuffer newUser=new StringBuffer("newUser");
for(int i=0;i<clientssize();i++){
Client c=(Client)clientselementAt(i);
newUserappend(":"+cname); //客户端姓名字符串
}
sendClients(newUser); //发送信息到客户端
}
public static void sendClients(StringBuffer message){
for(int i=0;i<clientssize();i++){
Client client=(Client)clientselementAt(i); //分别得到每个客户端的连接
clientsend(message); //发送信息
}
}
public void closeAll() { //关闭所有连接
while(clientssize()>0) { //遍历整个Vector
Client client=(Client)clientsfirstElement(); //得到一个客户端
try{
clientsocketclose(); //关闭端口
}
catch(IOException ex){
exprintStackTrace(); //输出错误信息
}
clientsremoveElement(client); //移出客户端信息
}
}
public static void disconnect(Client c){ //断开客户端
try{
Systemerrprintln(cip+"断开连接\n");
csend(new StringBuffer("QUIT")); //向客户发送断开连接信息
csocket=null; //关闭端口
}
catch(Exception ex){
exprintStackTrace();
}
clientsremoveElement(c); //移出客户端信息
}
public static void main(String[] args) {
new ChatServer(); //实例化一个ChatServer类
}
class Client extends Thread {
Socket socket; //连接端口
String name; //用户姓名
String ip; //客户端IP地址
BufferedReader reader ; //输入流
PrintStream ps; //输出流
public Client(Socket s){
socket=s;
try{
reader = new BufferedReader(new InputStreamReader(sgetInputStream())); //得到输入流
ps=new PrintStream(sgetOutputStream()); //得到输出流
String info=readerreadLine(); //读取接受到的信息
StringTokenizer stinfo=new StringTokenizer(info,":"); //分解字符串
String head=stinfonextToken(); //获取关键字
if(stinfohasMoreTokens())
name=stinfonextToken(); //获取用户名
if(stinfohasMoreTokens())
ip=stinfonextToken(); //获取IP地址
}
catch(IOException ex){
exprintStackTrace();
}
}
public void send(StringBuffer msg) {
psprintln(msg); //输出信息
psflush();
}
public void run(){
while(true){
String line=null;
try{
line=readerreadLine(); //读取数据流
}
catch(IOException ex){
exprintStackTrace(); //输出错误信息
ChatServerdisconnect(this); //断开连接
ChatServernotifyChatRoom(); //更新信息
return;
}
if(line==null){ //客户离开
ChatServerdisconnect(this);
ChatServernotifyChatRoom();
return;
}
StringTokenizer st=new StringTokenizer(line,":"); //分解字符串
String keyword=stnextToken();
if(keywordequals("MSG")){ //发送来的是聊天信息
StringBuffer msg=new StringBuffer("MSG:");
msgappend(name); //在信息上增加用户名
msgappend(stnextToken("\0"));
ChatServersendClients(msg); //发送聊天语句到各个客户端
}
else if(keywordequals("QUIT")){ //退出命令
ChatServerdisconnect(this); //断开连接
ChatServernotifyChatRoom(); //刷新信息
}
}
}
}
}
0条评论