多线程和网络编程

1996Linux2.0以后,内核才开始支持线程

在os中引入进程是为了使程序能并发执行,此时进程是一个可拥有资源的独立单位(如已打开的文件,io设备),进程也是一个可独立调度和分派的基本单位。

引入线程是为了减少程序在并发执行时的时空开销。

多线程os中的进程已不再是一个可执行的实体。对进程施加的与进程状态有关的操作,实际上是通过线程实现的

每个线程都只能属于某一个进程,一个进程至少有一个线程。

3 假如仅实现了用户级线程,则调度仍以进程为单位,用户级线程的创建、撤销、切换等所有操作均无需内核的支持。(由orange进程的调度可知,调度只不过是一种程序控制方法,没啥神秘的)

4内核级线程的一种实现方法:在系统创建一个进程时,为该进程分配一个任务数据区,其中包含若干个TCB(线程控制块),每当进程创建一个线程时,便为新线程分配一个TCB。时间片以线程为单位轮转。

接下来的一个问题是:什么时候该使用多线程编程?(这里不区分并发和并行)

在现实中一大部分问题都能使用顺序编程解决,对于某些问题并行可以更好更快的解决,有些问题使用并行是必要的。

最直观的并发编程使得我们可以将程序划分为多个分离的,独立的运行任务

好处有:

1 假如你的机器是多核的(os本身是支持线程的),那样即使你简单就把顺序执行的任务分为了多线程的,这样也显然可以使你的程序更快。

2 可以使多个不同的任务独立的运行,这样就能减少进程的阻塞时间,使程序变得更快。如word中的编辑功能和拼写错误检查功能,比较明显的例子有

产生可响应的用户界面 和多个客户端访问一个服务器模型。

3仿真问题, 游戏中多个人物的交互。这一点主要影响的是你的代码设计。

每个网络应用都是基于客户端和服务器端模型。b/s的b可以看为c。

认识到客户端和服务器都是进程,而不是常常提到的主机是很重要的。一个主机可以同时运行多个不同的客户端和服务器。

该模型完成一个任务都需要四步: c需要服务时向s发请求;s收到请求以后,对其处理(处理一般采用多线程方式);s给c一个响应,并等待下一个请求;c接到响应以后处理该响应。

明确了上述内容后,可以知道web服务器是属于网络编程的,

web服务器可以以两种方式向客户端提供数据:

1 返回请求对应的文件本身

2运行请求的文件,将运行结果返回给客户端

下面简单实现一下:

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;


public class WebServer {

/**
* @param args

调用这个类相当于启动tomcat
*/
public static void main(String[] args) {
// TODO Auto-generated method stub

int i =1;
int PORT = 8080;
ServerSocket server = null;
Socket client = null;

try {
server = new ServerSocket(PORT);
while(true){
client = server.accept();
new CommunicateThread(client,i).start();//并发服务器,服务器自己并不处理请求,而是将该请求转发给某个线程
i++;
}
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

import java.io.DataInputStream;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;


public class CommunicateThread extends Thread {

private Socket client;
private int i;
public CommunicateThread(Socket client, int i) {
// TODO Auto-generated constructor stub
this.client = client;
this.i = i;
}

public void run(){

String destIP = client.getInetAddress().toString();
int destport = client.getPort();
PrintStream outstream = null;
try {
outstream = new PrintStream(client.getOutputStream());


DataInputStream instream = new DataInputStream(client.getInputStream());
String inline = instream.readLine();

if(getRequest(inline)){
String fileName = getFileName();
File file = new File(fileName);
if(file.exists()){//请求的文件存在,则将其返回给客户端。假如是我们编的servlet或者jsp 就是一个动态执行过程。
sendFile(outstream,file);
}else{

}
}
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

private void sendFile(PrintStream outstream, File file) {
// TODO Auto-generated method stub

}

private String getFileName() {
// TODO Auto-generated method stub
return null;
}

private boolean getRequest(String inline) {//判断请求类型是否为get
// TODO Auto-generated method stub
return false;
}

}

你可能感兴趣的:(多线程,linux,IO,OS,任务)